Merge remote-tracking branch 'origin/3.0' into feature/mnode
This commit is contained in:
commit
3928668b7c
|
@ -701,7 +701,7 @@ SGlobalMerger* tscInitResObjForLocalQuery(int32_t numOfRes, int32_t rowLen, uint
|
||||||
|
|
||||||
// todo remove it
|
// todo remove it
|
||||||
int32_t doArithmeticCalculate(SQueryInfo* pQueryInfo, tFilePage* pOutput, int32_t rowSize, int32_t finalRowSize) {
|
int32_t doArithmeticCalculate(SQueryInfo* pQueryInfo, tFilePage* pOutput, int32_t rowSize, int32_t finalRowSize) {
|
||||||
int32_t maxRowSize = MAX(rowSize, finalRowSize);
|
int32_t maxRowSize = TMAX(rowSize, finalRowSize);
|
||||||
char* pbuf = calloc(1, (size_t)(pOutput->num * maxRowSize));
|
char* pbuf = calloc(1, (size_t)(pOutput->num * maxRowSize));
|
||||||
|
|
||||||
size_t size = tscNumOfFields(pQueryInfo);
|
size_t size = tscNumOfFields(pQueryInfo);
|
||||||
|
@ -965,7 +965,7 @@ SSDataBlock* doGlobalAggregate(void* param, bool* newgroup) {
|
||||||
w->ekey = *(int64_t*)(((char*)pInfoData->pData) + TSDB_KEYSIZE * (pRes->info.rows - 1));
|
w->ekey = *(int64_t*)(((char*)pInfoData->pData) + TSDB_KEYSIZE * (pRes->info.rows - 1));
|
||||||
|
|
||||||
if (pOperator->pRuntimeEnv->pQueryAttr->order.order == TSDB_ORDER_DESC) {
|
if (pOperator->pRuntimeEnv->pQueryAttr->order.order == TSDB_ORDER_DESC) {
|
||||||
SWAP(w->skey, w->ekey, TSKEY);
|
TSWAP(w->skey, w->ekey, TSKEY);
|
||||||
assert(w->skey <= w->ekey);
|
assert(w->skey <= w->ekey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ int compareSmlColKv(const void* p1, const void* p2) {
|
||||||
TAOS_SML_KV* kv2 = (TAOS_SML_KV*)p2;
|
TAOS_SML_KV* kv2 = (TAOS_SML_KV*)p2;
|
||||||
int kvLen1 = (int)strlen(kv1->key);
|
int kvLen1 = (int)strlen(kv1->key);
|
||||||
int kvLen2 = (int)strlen(kv2->key);
|
int kvLen2 = (int)strlen(kv2->key);
|
||||||
int res = strncasecmp(kv1->key, kv2->key, MIN(kvLen1, kvLen2));
|
int res = strncasecmp(kv1->key, kv2->key, TMIN(kvLen1, kvLen2));
|
||||||
if (res != 0) {
|
if (res != 0) {
|
||||||
return res;
|
return res;
|
||||||
} else {
|
} else {
|
||||||
|
@ -123,7 +123,7 @@ static int32_t buildSmlKvSchema(TAOS_SML_KV* smlKv, SHashObj* hash, SArray* arra
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
pField->bytes = MAX(pField->bytes, bytes);
|
pField->bytes = TMAX(pField->bytes, bytes);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
SSchema field = {0};
|
SSchema field = {0};
|
||||||
|
|
|
@ -1785,7 +1785,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32
|
||||||
getNewResColId(pCmd), sizeof(double), false);
|
getNewResColId(pCmd), sizeof(double), false);
|
||||||
|
|
||||||
char* name = (pItem->aliasName != NULL)? pItem->aliasName:pItem->pNode->exprToken.z;
|
char* name = (pItem->aliasName != NULL)? pItem->aliasName:pItem->pNode->exprToken.z;
|
||||||
size_t len = MIN(sizeof(pExpr->base.aliasName), pItem->pNode->exprToken.n + 1);
|
size_t len = TMIN(sizeof(pExpr->base.aliasName), pItem->pNode->exprToken.n + 1);
|
||||||
tstrncpy(pExpr->base.aliasName, name, len);
|
tstrncpy(pExpr->base.aliasName, name, len);
|
||||||
|
|
||||||
tExprNode* pNode = NULL;
|
tExprNode* pNode = NULL;
|
||||||
|
@ -2246,7 +2246,7 @@ SSchema tGetUserSpecifiedColumnSchema(SVariant* pVal, SStrToken* exprStr, const
|
||||||
if (name != NULL) {
|
if (name != NULL) {
|
||||||
tstrncpy(s.name, name, sizeof(s.name));
|
tstrncpy(s.name, name, sizeof(s.name));
|
||||||
} else {
|
} else {
|
||||||
size_t tlen = MIN(sizeof(s.name), exprStr->n + 1);
|
size_t tlen = TMIN(sizeof(s.name), exprStr->n + 1);
|
||||||
tstrncpy(s.name, exprStr->z, tlen);
|
tstrncpy(s.name, exprStr->z, tlen);
|
||||||
strdequote(s.name);
|
strdequote(s.name);
|
||||||
}
|
}
|
||||||
|
@ -2419,7 +2419,7 @@ void setResultColName(char* name, tSqlExprItem* pItem, int32_t functionId, SStrT
|
||||||
tstrncpy(name, pItem->aliasName, TSDB_COL_NAME_LEN);
|
tstrncpy(name, pItem->aliasName, TSDB_COL_NAME_LEN);
|
||||||
} else if (multiCols) {
|
} else if (multiCols) {
|
||||||
char uname[TSDB_COL_NAME_LEN] = {0};
|
char uname[TSDB_COL_NAME_LEN] = {0};
|
||||||
int32_t len = MIN(pToken->n + 1, TSDB_COL_NAME_LEN);
|
int32_t len = TMIN(pToken->n + 1, TSDB_COL_NAME_LEN);
|
||||||
tstrncpy(uname, pToken->z, len);
|
tstrncpy(uname, pToken->z, len);
|
||||||
|
|
||||||
if (tsKeepOriginalColumnName) { // keep the original column name
|
if (tsKeepOriginalColumnName) { // keep the original column name
|
||||||
|
@ -2432,7 +2432,7 @@ void setResultColName(char* name, tSqlExprItem* pItem, int32_t functionId, SStrT
|
||||||
tstrncpy(name, tmp, TSDB_COL_NAME_LEN);
|
tstrncpy(name, tmp, TSDB_COL_NAME_LEN);
|
||||||
}
|
}
|
||||||
} else { // use the user-input result column name
|
} else { // use the user-input result column name
|
||||||
int32_t len = MIN(pItem->pNode->exprToken.n + 1, TSDB_COL_NAME_LEN);
|
int32_t len = TMIN(pItem->pNode->exprToken.n + 1, TSDB_COL_NAME_LEN);
|
||||||
tstrncpy(name, pItem->pNode->exprToken.z, len);
|
tstrncpy(name, pItem->pNode->exprToken.z, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4380,7 +4380,7 @@ static void exchangeExpr(tSqlExpr* pExpr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pExpr->tokenId = optr;
|
pExpr->tokenId = optr;
|
||||||
SWAP(pExpr->pLeft, pExpr->pRight, void*);
|
TSWAP(pExpr->pLeft, pExpr->pRight, void*);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8089,7 +8089,7 @@ int32_t checkQueryRangeForFill(SSqlCmd* pCmd, SQueryInfo* pQueryInfo) {
|
||||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t timeRange = ABS(pQueryInfo->window.skey - pQueryInfo->window.ekey);
|
int64_t timeRange = TABS(pQueryInfo->window.skey - pQueryInfo->window.ekey);
|
||||||
|
|
||||||
int64_t intervalRange = 0;
|
int64_t intervalRange = 0;
|
||||||
if (pQueryInfo->interval.intervalUnit == 'n' || pQueryInfo->interval.intervalUnit == 'y') {
|
if (pQueryInfo->interval.intervalUnit == 'n' || pQueryInfo->interval.intervalUnit == 'y') {
|
||||||
|
|
|
@ -51,7 +51,7 @@ static bool validPassword(const char* passwd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pass, const char *auth, const char *db,
|
static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pass, const char *auth, const char *db,
|
||||||
uint16_t port, void (*fp)(void *, TAOS_RES *, int), void *param, TAOS **taos) {
|
void (*fp)(void *, TAOS_RES *, int), void *param, TAOS **taos) {
|
||||||
if (taos_init()) {
|
if (taos_init()) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -120,7 +120,7 @@ static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pa
|
||||||
pObj->signature = pObj;
|
pObj->signature = pObj;
|
||||||
pObj->pRpcObj = (SRpcObj *)pRpcObj;
|
pObj->pRpcObj = (SRpcObj *)pRpcObj;
|
||||||
tstrncpy(pObj->user, user, sizeof(pObj->user));
|
tstrncpy(pObj->user, user, sizeof(pObj->user));
|
||||||
secretEncryptLen = MIN(secretEncryptLen, sizeof(pObj->pass));
|
secretEncryptLen = TMIN(secretEncryptLen, sizeof(pObj->pass));
|
||||||
memcpy(pObj->pass, secretEncrypt, secretEncryptLen);
|
memcpy(pObj->pass, secretEncrypt, secretEncryptLen);
|
||||||
|
|
||||||
if (db) {
|
if (db) {
|
||||||
|
@ -186,7 +186,7 @@ static void syncConnCallback(void *param, TAOS_RES *tres, int code) {
|
||||||
TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass, const char *auth, const char *db,
|
TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass, const char *auth, const char *db,
|
||||||
uint16_t port) {
|
uint16_t port) {
|
||||||
STscObj *pObj = NULL;
|
STscObj *pObj = NULL;
|
||||||
SSqlObj *pSql = taosConnectImpl(ip, user, pass, auth, db, port, syncConnCallback, NULL, (void **)&pObj);
|
SSqlObj *pSql = taosConnectImpl(ip, user, pass, auth, db, syncConnCallback, NULL, (void **)&pObj);
|
||||||
if (pSql != NULL) {
|
if (pSql != NULL) {
|
||||||
pSql->fp = syncConnCallback;
|
pSql->fp = syncConnCallback;
|
||||||
pSql->param = pSql;
|
pSql->param = pSql;
|
||||||
|
@ -245,10 +245,10 @@ TAOS *taos_connect_c(const char *ip, uint8_t ipLen, const char *user, uint8_t us
|
||||||
char userBuf[TSDB_USER_LEN] = {0};
|
char userBuf[TSDB_USER_LEN] = {0};
|
||||||
char passBuf[TSDB_KEY_LEN] = {0};
|
char passBuf[TSDB_KEY_LEN] = {0};
|
||||||
char dbBuf[TSDB_DB_NAME_LEN] = {0};
|
char dbBuf[TSDB_DB_NAME_LEN] = {0};
|
||||||
strncpy(ipBuf, ip, MIN(TSDB_EP_LEN - 1, ipLen));
|
strncpy(ipBuf, ip, TMIN(TSDB_EP_LEN - 1, ipLen));
|
||||||
strncpy(userBuf, user, MIN(TSDB_USER_LEN - 1, userLen));
|
strncpy(userBuf, user, TMIN(TSDB_USER_LEN - 1, userLen));
|
||||||
strncpy(passBuf, pass, MIN(TSDB_KEY_LEN - 1, passLen));
|
strncpy(passBuf, pass, TMIN(TSDB_KEY_LEN - 1, passLen));
|
||||||
strncpy(dbBuf, db, MIN(TSDB_DB_NAME_LEN - 1, dbLen));
|
strncpy(dbBuf, db, TMIN(TSDB_DB_NAME_LEN - 1, dbLen));
|
||||||
return taos_connect(ipBuf, userBuf, passBuf, dbBuf, port);
|
return taos_connect(ipBuf, userBuf, passBuf, dbBuf, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,7 +262,7 @@ static void asyncConnCallback(void *param, TAOS_RES *tres, int code) {
|
||||||
TAOS *taos_connect_a(char *ip, char *user, char *pass, char *db, uint16_t port, void (*fp)(void *, TAOS_RES *, int),
|
TAOS *taos_connect_a(char *ip, char *user, char *pass, char *db, uint16_t port, void (*fp)(void *, TAOS_RES *, int),
|
||||||
void *param, TAOS **taos) {
|
void *param, TAOS **taos) {
|
||||||
STscObj *pObj = NULL;
|
STscObj *pObj = NULL;
|
||||||
SSqlObj *pSql = taosConnectImpl(ip, user, pass, NULL, db, port, asyncConnCallback, param, (void **)&pObj);
|
SSqlObj *pSql = taosConnectImpl(ip, user, pass, NULL, db, asyncConnCallback, param, (void **)&pObj);
|
||||||
if (pSql == NULL) {
|
if (pSql == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3396,7 +3396,7 @@ static void doBuildResFromSubqueries(SSqlObj* pSql) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t remain = (int32_t)(pSub->res.numOfRows - pSub->res.row);
|
int32_t remain = (int32_t)(pSub->res.numOfRows - pSub->res.row);
|
||||||
numOfRes = (int32_t)(MIN(numOfRes, remain));
|
numOfRes = (int32_t)(TMIN(numOfRes, remain));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numOfRes == 0) { // no result any more, free all subquery objects
|
if (numOfRes == 0) { // no result any more, free all subquery objects
|
||||||
|
|
|
@ -373,7 +373,7 @@ int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionI
|
||||||
*interBytes = (int16_t)sizeof(SPercentileInfo);
|
*interBytes = (int16_t)sizeof(SPercentileInfo);
|
||||||
} else if (functionId == TSDB_FUNC_LEASTSQR) {
|
} else if (functionId == TSDB_FUNC_LEASTSQR) {
|
||||||
*type = TSDB_DATA_TYPE_BINARY;
|
*type = TSDB_DATA_TYPE_BINARY;
|
||||||
*bytes = MAX(TSDB_AVG_FUNCTION_INTER_BUFFER_SIZE, sizeof(SLeastsquaresInfo)); // string
|
*bytes = TMAX(TSDB_AVG_FUNCTION_INTER_BUFFER_SIZE, sizeof(SLeastsquaresInfo)); // string
|
||||||
*interBytes = *bytes;
|
*interBytes = *bytes;
|
||||||
} else if (functionId == TSDB_FUNC_FIRST_DST || functionId == TSDB_FUNC_LAST_DST) {
|
} else if (functionId == TSDB_FUNC_FIRST_DST || functionId == TSDB_FUNC_LAST_DST) {
|
||||||
*type = TSDB_DATA_TYPE_BINARY;
|
*type = TSDB_DATA_TYPE_BINARY;
|
||||||
|
@ -1275,7 +1275,7 @@ static void max_func_merge(SQLFunctionCtx *pCtx) {
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
(num) += 1; \
|
(num) += 1; \
|
||||||
(r) += POW2(((type *)d)[i] - (delta)); \
|
(r) += TPOW2(((type *)d)[i] - (delta)); \
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stddev_function(SQLFunctionCtx *pCtx) {
|
static void stddev_function(SQLFunctionCtx *pCtx) {
|
||||||
|
@ -1314,7 +1314,7 @@ static void stddev_function(SQLFunctionCtx *pCtx) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
num += 1;
|
num += 1;
|
||||||
*retVal += POW2(((int32_t *)pData)[i] - avg);
|
*retVal += TPOW2(((int32_t *)pData)[i] - avg);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1427,7 +1427,7 @@ static void stddev_dst_function(SQLFunctionCtx *pCtx) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
num += 1;
|
num += 1;
|
||||||
*retVal += POW2(((int32_t *)pData)[i] - avg);
|
*retVal += TPOW2(((int32_t *)pData)[i] - avg);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4109,8 +4109,8 @@ static void mergeTableBlockDist(SResultRowCellInfo* pResInfo, const STableBlockD
|
||||||
pDist->totalRows += pSrc->totalRows;
|
pDist->totalRows += pSrc->totalRows;
|
||||||
|
|
||||||
if (pResInfo->hasResult == DATA_SET_FLAG) {
|
if (pResInfo->hasResult == DATA_SET_FLAG) {
|
||||||
pDist->maxRows = MAX(pDist->maxRows, pSrc->maxRows);
|
pDist->maxRows = TMAX(pDist->maxRows, pSrc->maxRows);
|
||||||
pDist->minRows = MIN(pDist->minRows, pSrc->minRows);
|
pDist->minRows = TMIN(pDist->minRows, pSrc->minRows);
|
||||||
} else {
|
} else {
|
||||||
pDist->maxRows = pSrc->maxRows;
|
pDist->maxRows = pSrc->maxRows;
|
||||||
pDist->minRows = pSrc->minRows;
|
pDist->minRows = pSrc->minRows;
|
||||||
|
|
|
@ -328,7 +328,7 @@ SSDataBlock* createOutputBuf(SExprInfo* pExpr, int32_t numOfOutput, int32_t numO
|
||||||
idata.info.bytes = pExpr[i].base.resBytes;
|
idata.info.bytes = pExpr[i].base.resBytes;
|
||||||
idata.info.colId = pExpr[i].base.resColId;
|
idata.info.colId = pExpr[i].base.resColId;
|
||||||
|
|
||||||
int32_t size = MAX(idata.info.bytes * numOfRows, minSize);
|
int32_t size = TMAX(idata.info.bytes * numOfRows, minSize);
|
||||||
idata.pData = calloc(1, size); // at least to hold a pointer on x64 platform
|
idata.pData = calloc(1, size); // at least to hold a pointer on x64 platform
|
||||||
taosArrayPush(res->pDataBlock, &idata);
|
taosArrayPush(res->pDataBlock, &idata);
|
||||||
}
|
}
|
||||||
|
@ -2643,7 +2643,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableMsg* pQueryMsg, bool
|
||||||
|
|
||||||
pQueryAttr->order.order = TSDB_ORDER_ASC;
|
pQueryAttr->order.order = TSDB_ORDER_ASC;
|
||||||
if (pQueryAttr->window.skey > pQueryAttr->window.ekey) {
|
if (pQueryAttr->window.skey > pQueryAttr->window.ekey) {
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
pQueryAttr->needReverseScan = false;
|
pQueryAttr->needReverseScan = false;
|
||||||
|
@ -2653,7 +2653,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableMsg* pQueryMsg, bool
|
||||||
if (pQueryAttr->groupbyColumn && pQueryAttr->order.order == TSDB_ORDER_DESC) {
|
if (pQueryAttr->groupbyColumn && pQueryAttr->order.order == TSDB_ORDER_DESC) {
|
||||||
pQueryAttr->order.order = TSDB_ORDER_ASC;
|
pQueryAttr->order.order = TSDB_ORDER_ASC;
|
||||||
if (pQueryAttr->window.skey > pQueryAttr->window.ekey) {
|
if (pQueryAttr->window.skey > pQueryAttr->window.ekey) {
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
pQueryAttr->needReverseScan = false;
|
pQueryAttr->needReverseScan = false;
|
||||||
|
@ -2664,7 +2664,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableMsg* pQueryMsg, bool
|
||||||
if (pQueryAttr->pointInterpQuery && pQueryAttr->interval.interval == 0) {
|
if (pQueryAttr->pointInterpQuery && pQueryAttr->interval.interval == 0) {
|
||||||
if (!QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
if (!QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
||||||
qDebug(msg, pQInfo->qId, "interp", pQueryAttr->order.order, TSDB_ORDER_ASC, pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
qDebug(msg, pQInfo->qId, "interp", pQueryAttr->order.order, TSDB_ORDER_ASC, pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
pQueryAttr->order.order = TSDB_ORDER_ASC;
|
pQueryAttr->order.order = TSDB_ORDER_ASC;
|
||||||
|
@ -2677,7 +2677,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableMsg* pQueryMsg, bool
|
||||||
qDebug(msg, pQInfo->qId, "only-first", pQueryAttr->order.order, TSDB_ORDER_ASC, pQueryAttr->window.skey,
|
qDebug(msg, pQInfo->qId, "only-first", pQueryAttr->order.order, TSDB_ORDER_ASC, pQueryAttr->window.skey,
|
||||||
pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
||||||
|
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
doUpdateLastKey(pQueryAttr);
|
doUpdateLastKey(pQueryAttr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2688,7 +2688,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableMsg* pQueryMsg, bool
|
||||||
qDebug(msg, pQInfo->qId, "only-last", pQueryAttr->order.order, TSDB_ORDER_DESC, pQueryAttr->window.skey,
|
qDebug(msg, pQInfo->qId, "only-last", pQueryAttr->order.order, TSDB_ORDER_DESC, pQueryAttr->window.skey,
|
||||||
pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
||||||
|
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
doUpdateLastKey(pQueryAttr);
|
doUpdateLastKey(pQueryAttr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2703,7 +2703,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableMsg* pQueryMsg, bool
|
||||||
qDebug(msg, pQInfo->qId, "only-first stable", pQueryAttr->order.order, TSDB_ORDER_ASC,
|
qDebug(msg, pQInfo->qId, "only-first stable", pQueryAttr->order.order, TSDB_ORDER_ASC,
|
||||||
pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
||||||
|
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
doUpdateLastKey(pQueryAttr);
|
doUpdateLastKey(pQueryAttr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2714,7 +2714,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableMsg* pQueryMsg, bool
|
||||||
qDebug(msg, pQInfo->qId, "only-last stable", pQueryAttr->order.order, TSDB_ORDER_DESC,
|
qDebug(msg, pQInfo->qId, "only-last stable", pQueryAttr->order.order, TSDB_ORDER_DESC,
|
||||||
pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
||||||
|
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
doUpdateLastKey(pQueryAttr);
|
doUpdateLastKey(pQueryAttr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2754,8 +2754,8 @@ static FORCE_INLINE bool doFilterByBlockStatistics(SQueryRuntimeEnv* pRuntimeEnv
|
||||||
static bool overlapWithTimeWindow(SQueryAttr* pQueryAttr, SDataBlockInfo* pBlockInfo) {
|
static bool overlapWithTimeWindow(SQueryAttr* pQueryAttr, SDataBlockInfo* pBlockInfo) {
|
||||||
STimeWindow w = {0};
|
STimeWindow w = {0};
|
||||||
|
|
||||||
TSKEY sk = MIN(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
TSKEY sk = TMIN(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
||||||
TSKEY ek = MAX(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
TSKEY ek = TMAX(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
||||||
|
|
||||||
if (QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
if (QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
||||||
getAlignQueryTimeWindow(pQueryAttr, pBlockInfo->window.skey, sk, ek, &w);
|
getAlignQueryTimeWindow(pQueryAttr, pBlockInfo->window.skey, sk, ek, &w);
|
||||||
|
@ -3523,7 +3523,7 @@ static void updateTableQueryInfoForReverseScan(STableQueryInfo *pTableQueryInfo)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWAP(pTableQueryInfo->win.skey, pTableQueryInfo->win.ekey, TSKEY);
|
TSWAP(pTableQueryInfo->win.skey, pTableQueryInfo->win.ekey, TSKEY);
|
||||||
pTableQueryInfo->lastKey = pTableQueryInfo->win.skey;
|
pTableQueryInfo->lastKey = pTableQueryInfo->win.skey;
|
||||||
|
|
||||||
SWITCH_ORDER(pTableQueryInfo->cur.order);
|
SWITCH_ORDER(pTableQueryInfo->cur.order);
|
||||||
|
@ -3730,7 +3730,7 @@ static void setupEnvForReverseScan(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
// reverse order time range
|
// reverse order time range
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
|
|
||||||
SET_REVERSE_SCAN_FLAG(pRuntimeEnv);
|
SET_REVERSE_SCAN_FLAG(pRuntimeEnv);
|
||||||
setQueryStatus(pRuntimeEnv, QUERY_NOT_COMPLETED);
|
setQueryStatus(pRuntimeEnv, QUERY_NOT_COMPLETED);
|
||||||
|
@ -4109,8 +4109,8 @@ void setIntervalQueryRange(SQueryRuntimeEnv *pRuntimeEnv, TSKEY key) {
|
||||||
*/
|
*/
|
||||||
STimeWindow w = TSWINDOW_INITIALIZER;
|
STimeWindow w = TSWINDOW_INITIALIZER;
|
||||||
|
|
||||||
TSKEY sk = MIN(win.skey, win.ekey);
|
TSKEY sk = TMIN(win.skey, win.ekey);
|
||||||
TSKEY ek = MAX(win.skey, win.ekey);
|
TSKEY ek = TMAX(win.skey, win.ekey);
|
||||||
getAlignQueryTimeWindow(pQueryAttr, win.skey, sk, ek, &w);
|
getAlignQueryTimeWindow(pQueryAttr, win.skey, sk, ek, &w);
|
||||||
|
|
||||||
// if (pResultRowInfo->prevSKey == TSKEY_INITIAL_VAL) {
|
// if (pResultRowInfo->prevSKey == TSKEY_INITIAL_VAL) {
|
||||||
|
@ -4235,7 +4235,7 @@ static void updateNumOfRowsInResultRows(SQueryRuntimeEnv* pRuntimeEnv, SQLFuncti
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRowCellInfo* pCell = getResultCell(pResult, j, rowCellInfoOffset);
|
SResultRowCellInfo* pCell = getResultCell(pResult, j, rowCellInfoOffset);
|
||||||
pResult->numOfRows = (uint16_t)(MAX(pResult->numOfRows, pCell->numOfRes));
|
pResult->numOfRows = (uint16_t)(TMAX(pResult->numOfRows, pCell->numOfRes));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6945,8 +6945,8 @@ SOperatorInfo* createFillOperatorInfo(SQueryRuntimeEnv* pRuntimeEnv, SOperatorIn
|
||||||
SFillColInfo* pColInfo = createFillColInfo(pExpr, numOfOutput, pQueryAttr->fillVal);
|
SFillColInfo* pColInfo = createFillColInfo(pExpr, numOfOutput, pQueryAttr->fillVal);
|
||||||
STimeWindow w = TSWINDOW_INITIALIZER;
|
STimeWindow w = TSWINDOW_INITIALIZER;
|
||||||
|
|
||||||
TSKEY sk = MIN(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
TSKEY sk = TMIN(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
||||||
TSKEY ek = MAX(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
TSKEY ek = TMAX(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
||||||
getAlignQueryTimeWindow(pQueryAttr, pQueryAttr->window.skey, sk, ek, &w);
|
getAlignQueryTimeWindow(pQueryAttr, pQueryAttr->window.skey, sk, ek, &w);
|
||||||
|
|
||||||
pInfo->pFillInfo =
|
pInfo->pFillInfo =
|
||||||
|
|
|
@ -7,7 +7,7 @@ ExternalProject_Add(traft
|
||||||
BINARY_DIR "${CMAKE_CONTRIB_DIR}/traft"
|
BINARY_DIR "${CMAKE_CONTRIB_DIR}/traft"
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
# https://answers.ros.org/question/333125/how-to-include-external-automakeautoconf-projects-into-ament_cmake/
|
# https://answers.ros.org/question/333125/how-to-include-external-automakeautoconf-projects-into-ament_cmake/
|
||||||
CONFIGURE_COMMAND COMMAND autoreconf -i COMMAND ./configure --enable-example
|
CONFIGURE_COMMAND COMMAND autoreconf -i COMMAND ./configure
|
||||||
BUILD_COMMAND "$(MAKE)"
|
BUILD_COMMAND "$(MAKE)"
|
||||||
INSTALL_COMMAND ""
|
INSTALL_COMMAND ""
|
||||||
TEST_COMMAND ""
|
TEST_COMMAND ""
|
||||||
|
|
|
@ -20,7 +20,7 @@ if(${BUILD_WITH_CRAFT})
|
||||||
endif(${BUILD_WITH_CRAFT})
|
endif(${BUILD_WITH_CRAFT})
|
||||||
|
|
||||||
if(${BUILD_WITH_TRAFT})
|
if(${BUILD_WITH_TRAFT})
|
||||||
add_subdirectory(traft)
|
# add_subdirectory(traft)
|
||||||
endif(${BUILD_WITH_TRAFT})
|
endif(${BUILD_WITH_TRAFT})
|
||||||
|
|
||||||
add_subdirectory(tdev)
|
add_subdirectory(tdev)
|
||||||
|
|
|
@ -192,9 +192,38 @@ DLL_EXPORT void taos_close_stream(TAOS_STREAM *tstr);
|
||||||
|
|
||||||
DLL_EXPORT int taos_load_table_info(TAOS *taos, const char* tableNameList);
|
DLL_EXPORT int taos_load_table_info(TAOS *taos, const char* tableNameList);
|
||||||
DLL_EXPORT TAOS_RES* taos_schemaless_insert(TAOS* taos, char* lines[], int numLines, int protocol, int precision);
|
DLL_EXPORT TAOS_RES* taos_schemaless_insert(TAOS* taos, char* lines[], int numLines, int protocol, int precision);
|
||||||
|
typedef struct tmq_t tmq_t;
|
||||||
|
typedef struct tmq_conf_t tmq_conf_t;
|
||||||
|
typedef struct tmq_list_t tmq_list_t;
|
||||||
|
|
||||||
|
typedef struct tmq_message_t tmq_message_t;
|
||||||
|
typedef struct tmq_message_topic_t tmq_message_topic_t;
|
||||||
|
typedef struct tmq_message_tb_t tmq_message_tb_t;
|
||||||
|
typedef struct tmq_tb_iter_t tmq_tb_iter_t;
|
||||||
|
typedef struct tmq_message_col_t tmq_message_col_t;
|
||||||
|
typedef struct tmq_col_iter_t tmq_col_iter_t;
|
||||||
|
|
||||||
|
DLL_EXPORT tmq_list_t* tmq_list_new();
|
||||||
|
DLL_EXPORT int32_t tmq_list_append(tmq_list_t*, char*);
|
||||||
|
|
||||||
|
DLL_EXPORT tmq_conf_t* tmq_conf_new();
|
||||||
|
|
||||||
|
DLL_EXPORT int32_t tmq_conf_set(tmq_conf_t* conf, const char* key, const char* value);
|
||||||
|
|
||||||
DLL_EXPORT TAOS_RES *taos_create_topic(TAOS* taos, const char* name, const char* sql, int sqlLen);
|
DLL_EXPORT TAOS_RES *taos_create_topic(TAOS* taos, const char* name, const char* sql, int sqlLen);
|
||||||
|
|
||||||
|
DLL_EXPORT tmq_t* taos_consumer_new(void* conn, tmq_conf_t* conf, char* errstr, int32_t errstrLen);
|
||||||
|
|
||||||
|
DLL_EXPORT TAOS_RES* tmq_subscribe(tmq_t* tmq, tmq_list_t* topic_list);
|
||||||
|
|
||||||
|
DLL_EXPORT tmq_message_t* tmq_consume_poll(tmq_t* tmq, int64_t blocking_time);
|
||||||
|
|
||||||
|
DLL_EXPORT int32_t tmq_topic_num(tmq_message_t* msg);
|
||||||
|
DLL_EXPORT char* tmq_get_topic(tmq_message_topic_t* msg);
|
||||||
|
DLL_EXPORT int32_t tmq_get_vgId(tmq_message_topic_t* msg);
|
||||||
|
DLL_EXPORT tmq_message_tb_t* tmq_get_next_tb(tmq_message_topic_t* msg, tmq_tb_iter_t* iter);
|
||||||
|
DLL_EXPORT tmq_message_col_t* tmq_get_next_col(tmq_message_tb_t* msg, tmq_col_iter_t* iter);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -136,7 +136,7 @@ typedef uint64_t TKEY;
|
||||||
#define TKEY_IS_NEGATIVE(tkey) (((tkey)&TKEY_NEGATIVE_FLAG) != 0)
|
#define TKEY_IS_NEGATIVE(tkey) (((tkey)&TKEY_NEGATIVE_FLAG) != 0)
|
||||||
#define TKEY_IS_DELETED(tkey) (((tkey)&TKEY_DELETE_FLAG) != 0)
|
#define TKEY_IS_DELETED(tkey) (((tkey)&TKEY_DELETE_FLAG) != 0)
|
||||||
#define tdSetTKEYDeleted(tkey) ((tkey) | TKEY_DELETE_FLAG)
|
#define tdSetTKEYDeleted(tkey) ((tkey) | TKEY_DELETE_FLAG)
|
||||||
#define tdGetTKEY(key) (((TKEY)ABS(key)) | (TKEY_NEGATIVE_FLAG & (TKEY)(key)))
|
#define tdGetTKEY(key) (((TKEY)TABS(key)) | (TKEY_NEGATIVE_FLAG & (TKEY)(key)))
|
||||||
#define tdGetKey(tkey) (((TSKEY)((tkey)&TKEY_VALUE_FILTER)) * (TKEY_IS_NEGATIVE(tkey) ? -1 : 1))
|
#define tdGetKey(tkey) (((TSKEY)((tkey)&TKEY_VALUE_FILTER)) * (TKEY_IS_NEGATIVE(tkey) ? -1 : 1))
|
||||||
|
|
||||||
#define MIN_TS_KEY ((TSKEY)0x8000000000000001)
|
#define MIN_TS_KEY ((TSKEY)0x8000000000000001)
|
||||||
|
|
|
@ -1520,7 +1520,8 @@ static FORCE_INLINE void* taosDecodeSMqMsg(void* buf, SMqHbMsg* pMsg) {
|
||||||
|
|
||||||
typedef struct SMqSetCVgReq {
|
typedef struct SMqSetCVgReq {
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
int64_t consumerId;
|
int64_t oldConsumerId;
|
||||||
|
int64_t newConsumerId;
|
||||||
char topicName[TSDB_TOPIC_FNAME_LEN];
|
char topicName[TSDB_TOPIC_FNAME_LEN];
|
||||||
char cgroup[TSDB_CONSUMER_GROUP_LEN];
|
char cgroup[TSDB_CONSUMER_GROUP_LEN];
|
||||||
char* sql;
|
char* sql;
|
||||||
|
@ -1551,7 +1552,8 @@ static FORCE_INLINE void* tDecodeSSubQueryMsg(void* buf, SSubQueryMsg* pMsg) {
|
||||||
static FORCE_INLINE int32_t tEncodeSMqSetCVgReq(void** buf, const SMqSetCVgReq* pReq) {
|
static FORCE_INLINE int32_t tEncodeSMqSetCVgReq(void** buf, const SMqSetCVgReq* pReq) {
|
||||||
int32_t tlen = 0;
|
int32_t tlen = 0;
|
||||||
tlen += taosEncodeFixedI32(buf, pReq->vgId);
|
tlen += taosEncodeFixedI32(buf, pReq->vgId);
|
||||||
tlen += taosEncodeFixedI64(buf, pReq->consumerId);
|
tlen += taosEncodeFixedI64(buf, pReq->oldConsumerId);
|
||||||
|
tlen += taosEncodeFixedI64(buf, pReq->newConsumerId);
|
||||||
tlen += taosEncodeString(buf, pReq->topicName);
|
tlen += taosEncodeString(buf, pReq->topicName);
|
||||||
tlen += taosEncodeString(buf, pReq->cgroup);
|
tlen += taosEncodeString(buf, pReq->cgroup);
|
||||||
tlen += taosEncodeString(buf, pReq->sql);
|
tlen += taosEncodeString(buf, pReq->sql);
|
||||||
|
@ -1563,7 +1565,8 @@ static FORCE_INLINE int32_t tEncodeSMqSetCVgReq(void** buf, const SMqSetCVgReq*
|
||||||
|
|
||||||
static FORCE_INLINE void* tDecodeSMqSetCVgReq(void* buf, SMqSetCVgReq* pReq) {
|
static FORCE_INLINE void* tDecodeSMqSetCVgReq(void* buf, SMqSetCVgReq* pReq) {
|
||||||
buf = taosDecodeFixedI32(buf, &pReq->vgId);
|
buf = taosDecodeFixedI32(buf, &pReq->vgId);
|
||||||
buf = taosDecodeFixedI64(buf, &pReq->consumerId);
|
buf = taosDecodeFixedI64(buf, &pReq->oldConsumerId);
|
||||||
|
buf = taosDecodeFixedI64(buf, &pReq->newConsumerId);
|
||||||
buf = taosDecodeStringTo(buf, pReq->topicName);
|
buf = taosDecodeStringTo(buf, pReq->topicName);
|
||||||
buf = taosDecodeStringTo(buf, pReq->cgroup);
|
buf = taosDecodeStringTo(buf, pReq->cgroup);
|
||||||
buf = taosDecodeString(buf, &pReq->sql);
|
buf = taosDecodeString(buf, &pReq->sql);
|
||||||
|
@ -1580,15 +1583,6 @@ typedef struct SMqSetCVgRsp {
|
||||||
char cGroup[TSDB_CONSUMER_GROUP_LEN];
|
char cGroup[TSDB_CONSUMER_GROUP_LEN];
|
||||||
} SMqSetCVgRsp;
|
} SMqSetCVgRsp;
|
||||||
|
|
||||||
typedef struct SMqConsumeReq {
|
|
||||||
int64_t reqId;
|
|
||||||
int64_t offset;
|
|
||||||
int64_t consumerId;
|
|
||||||
int64_t blockingTime;
|
|
||||||
char topicName[TSDB_TOPIC_FNAME_LEN];
|
|
||||||
char cgroup[TSDB_CONSUMER_GROUP_LEN];
|
|
||||||
} SMqConsumeReq;
|
|
||||||
|
|
||||||
typedef struct SMqColData {
|
typedef struct SMqColData {
|
||||||
int16_t colId;
|
int16_t colId;
|
||||||
int16_t type;
|
int16_t type;
|
||||||
|
@ -1616,12 +1610,29 @@ typedef struct SMqTopicBlk {
|
||||||
|
|
||||||
typedef struct SMqConsumeRsp {
|
typedef struct SMqConsumeRsp {
|
||||||
int64_t reqId;
|
int64_t reqId;
|
||||||
int64_t clientId;
|
int64_t consumerId;
|
||||||
int32_t bodyLen;
|
int32_t bodyLen;
|
||||||
int32_t numOfTopics;
|
int32_t numOfTopics;
|
||||||
SMqTopicData data[];
|
SMqTopicData data[];
|
||||||
} SMqConsumeRsp;
|
} SMqConsumeRsp;
|
||||||
|
|
||||||
|
// one req for one vg+topic
|
||||||
|
typedef struct SMqConsumeReq {
|
||||||
|
//0: commit only, current offset
|
||||||
|
//1: consume only, poll next offset
|
||||||
|
//2: commit current and consume next offset
|
||||||
|
int32_t reqType;
|
||||||
|
|
||||||
|
int64_t reqId;
|
||||||
|
int64_t consumerId;
|
||||||
|
int64_t blockingTime;
|
||||||
|
char cgroup[TSDB_CONSUMER_GROUP_LEN];
|
||||||
|
|
||||||
|
int64_t offset;
|
||||||
|
char topic[TSDB_TOPIC_FNAME_LEN];
|
||||||
|
} SMqConsumeReq;
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -72,15 +72,15 @@ int32_t schedulerInit(SSchedulerCfg *cfg);
|
||||||
* @param nodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
* @param nodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t scheduleExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, struct SSchJob** pJob, SQueryResult *pRes);
|
int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, struct SSchJob** pJob, SQueryResult *pRes);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process the query job, generated according to the query physical plan.
|
* Process the query job, generated according to the query physical plan.
|
||||||
* This is a asynchronized API, and is also thread-safety.
|
* This is a asynchronized API, and is also thread-safety.
|
||||||
* @param nodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
* @param pNodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t scheduleAsyncExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, struct SSchJob** pJob);
|
int32_t schedulerAsyncExecJob(void *transport, SArray *pNodeList, SQueryDag* pDag, struct SSchJob** pJob);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch query result from the remote query executor
|
* Fetch query result from the remote query executor
|
||||||
|
@ -88,7 +88,7 @@ int32_t scheduleAsyncExecJob(void *transport, SArray *nodeList, SQueryDag* pDag,
|
||||||
* @param data
|
* @param data
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t scheduleFetchRows(struct SSchJob *pJob, void **data);
|
int32_t schedulerFetchRows(struct SSchJob *pJob, void **data);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -102,7 +102,7 @@ int32_t scheduleFetchRows(struct SSchJob *pJob, void **data);
|
||||||
* Free the query job
|
* Free the query job
|
||||||
* @param pJob
|
* @param pJob
|
||||||
*/
|
*/
|
||||||
void scheduleFreeJob(void *pJob);
|
void schedulerFreeJob(void *pJob);
|
||||||
|
|
||||||
void schedulerDestroy(void);
|
void schedulerDestroy(void);
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SDiskID did;
|
SDiskID did;
|
||||||
char aname[TSDB_FILENAME_LEN]; // ABS name
|
char aname[TSDB_FILENAME_LEN]; // TABS name
|
||||||
char rname[TSDB_FILENAME_LEN]; // REL name
|
char rname[TSDB_FILENAME_LEN]; // REL name
|
||||||
STfs *pTfs;
|
STfs *pTfs;
|
||||||
} STfsFile;
|
} STfsFile;
|
||||||
|
|
|
@ -20,37 +20,37 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define POW2(x) ((x) * (x))
|
#define TPOW2(x) ((x) * (x))
|
||||||
#define ABS(x) ((x) > 0 ? (x) : -(x))
|
#define TABS(x) ((x) > 0 ? (x) : -(x))
|
||||||
|
|
||||||
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
||||||
|
|
||||||
#define SWAP(a, b, c) \
|
#define TSWAP(a, b, c) \
|
||||||
do { \
|
do { \
|
||||||
c __tmp = (c)(a); \
|
c __tmp = (c)(a); \
|
||||||
(a) = (c)(b); \
|
(a) = (c)(b); \
|
||||||
(b) = __tmp; \
|
(b) = __tmp; \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
#define TMAX(a, b) (((a) > (b)) ? (a) : (b))
|
||||||
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
#define TMIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define SWAP(a, b, c) \
|
#define TSWAP(a, b, c) \
|
||||||
do { \
|
do { \
|
||||||
typeof(a) __tmp = (a); \
|
typeof(a) __tmp = (a); \
|
||||||
(a) = (b); \
|
(a) = (b); \
|
||||||
(b) = __tmp; \
|
(b) = __tmp; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define MAX(a, b) \
|
#define TMAX(a, b) \
|
||||||
({ \
|
({ \
|
||||||
typeof(a) __a = (a); \
|
typeof(a) __a = (a); \
|
||||||
typeof(b) __b = (b); \
|
typeof(b) __b = (b); \
|
||||||
(__a > __b) ? __a : __b; \
|
(__a > __b) ? __a : __b; \
|
||||||
})
|
})
|
||||||
|
|
||||||
#define MIN(a, b) \
|
#define TMIN(a, b) \
|
||||||
({ \
|
({ \
|
||||||
typeof(a) __a = (a); \
|
typeof(a) __a = (a); \
|
||||||
typeof(b) __b = (b); \
|
typeof(b) __b = (b); \
|
||||||
|
|
|
@ -354,7 +354,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_QRY_SCH_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0710) //"Scheduler not exist")
|
#define TSDB_CODE_QRY_SCH_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0710) //"Scheduler not exist")
|
||||||
#define TSDB_CODE_QRY_TASK_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0711) //"Task not exist")
|
#define TSDB_CODE_QRY_TASK_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0711) //"Task not exist")
|
||||||
#define TSDB_CODE_QRY_TASK_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0712) //"Task already exist")
|
#define TSDB_CODE_QRY_TASK_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0712) //"Task already exist")
|
||||||
#define TSDB_CODE_QRY_RES_CACHE_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0713) //"Task result cache not exist")
|
#define TSDB_CODE_QRY_TASK_CTX_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0713) //"Task context not exist")
|
||||||
#define TSDB_CODE_QRY_TASK_CANCELLED TAOS_DEF_ERROR_CODE(0, 0x0714) //"Task cancelled")
|
#define TSDB_CODE_QRY_TASK_CANCELLED TAOS_DEF_ERROR_CODE(0, 0x0714) //"Task cancelled")
|
||||||
#define TSDB_CODE_QRY_TASK_DROPPED TAOS_DEF_ERROR_CODE(0, 0x0715) //"Task dropped")
|
#define TSDB_CODE_QRY_TASK_DROPPED TAOS_DEF_ERROR_CODE(0, 0x0715) //"Task dropped")
|
||||||
#define TSDB_CODE_QRY_TASK_CANCELLING TAOS_DEF_ERROR_CODE(0, 0x0716) //"Task cancelling")
|
#define TSDB_CODE_QRY_TASK_CANCELLING TAOS_DEF_ERROR_CODE(0, 0x0716) //"Task cancelling")
|
||||||
|
|
|
@ -34,6 +34,7 @@ extern "C" {
|
||||||
#define TD_SLIST_HEAD(sl) ((sl)->sl_head_)
|
#define TD_SLIST_HEAD(sl) ((sl)->sl_head_)
|
||||||
#define TD_SLIST_NELES(sl) ((sl)->sl_neles_)
|
#define TD_SLIST_NELES(sl) ((sl)->sl_neles_)
|
||||||
#define TD_SLIST_NODE_NEXT(sln) ((sln)->sl_next_)
|
#define TD_SLIST_NODE_NEXT(sln) ((sln)->sl_next_)
|
||||||
|
#define TD_SLIST_NODE_NEXT_WITH_FIELD(sln, field) ((sln)->field.sl_next_)
|
||||||
|
|
||||||
#define TD_SLIST_INIT(sl) \
|
#define TD_SLIST_INIT(sl) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -48,12 +49,25 @@ extern "C" {
|
||||||
TD_SLIST_NELES(sl) += 1; \
|
TD_SLIST_NELES(sl) += 1; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define TD_SLIST_PUSH_WITH_FIELD(sl, sln, field) \
|
||||||
|
do { \
|
||||||
|
TD_SLIST_NODE_NEXT_WITH_FIELD(sln, field) = TD_SLIST_HEAD(sl); \
|
||||||
|
TD_SLIST_HEAD(sl) = (sln); \
|
||||||
|
TD_SLIST_NELES(sl) += 1; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define TD_SLIST_POP(sl) \
|
#define TD_SLIST_POP(sl) \
|
||||||
do { \
|
do { \
|
||||||
TD_SLIST_HEAD(sl) = TD_SLIST_NODE_NEXT(TD_SLIST_HEAD(sl)); \
|
TD_SLIST_HEAD(sl) = TD_SLIST_NODE_NEXT(TD_SLIST_HEAD(sl)); \
|
||||||
TD_SLIST_NELES(sl) -= 1; \
|
TD_SLIST_NELES(sl) -= 1; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define TD_SLIST_POP_WITH_FIELD(sl, field) \
|
||||||
|
do { \
|
||||||
|
TD_SLIST_HEAD(sl) = TD_SLIST_NODE_NEXT_WITH_FIELD(TD_SLIST_HEAD(sl), field); \
|
||||||
|
TD_SLIST_NELES(sl) -= 1; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
// Double linked list ================
|
// Double linked list ================
|
||||||
#define TD_DLIST_NODE(TYPE) \
|
#define TD_DLIST_NODE(TYPE) \
|
||||||
struct { \
|
struct { \
|
||||||
|
@ -70,6 +84,8 @@ extern "C" {
|
||||||
|
|
||||||
#define TD_DLIST_NODE_PREV(dln) ((dln)->dl_prev_)
|
#define TD_DLIST_NODE_PREV(dln) ((dln)->dl_prev_)
|
||||||
#define TD_DLIST_NODE_NEXT(dln) ((dln)->dl_next_)
|
#define TD_DLIST_NODE_NEXT(dln) ((dln)->dl_next_)
|
||||||
|
#define TD_DLIST_NODE_PREV_WITH_FIELD(dln, field) ((dln)->field.dl_prev_)
|
||||||
|
#define TD_DLIST_NODE_NEXT_WITH_FIELD(dln, field) ((dln)->field.dl_next_)
|
||||||
#define TD_DLIST_HEAD(dl) ((dl)->dl_head_)
|
#define TD_DLIST_HEAD(dl) ((dl)->dl_head_)
|
||||||
#define TD_DLIST_TAIL(dl) ((dl)->dl_tail_)
|
#define TD_DLIST_TAIL(dl) ((dl)->dl_tail_)
|
||||||
#define TD_DLIST_NELES(dl) ((dl)->dl_neles_)
|
#define TD_DLIST_NELES(dl) ((dl)->dl_neles_)
|
||||||
|
@ -94,6 +110,20 @@ extern "C" {
|
||||||
TD_DLIST_NELES(dl) += 1; \
|
TD_DLIST_NELES(dl) += 1; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define TD_DLIST_APPEND_WITH_FIELD(dl, dln, field) \
|
||||||
|
do { \
|
||||||
|
if (TD_DLIST_HEAD(dl) == NULL) { \
|
||||||
|
TD_DLIST_NODE_PREV_WITH_FIELD(dln, field) = TD_DLIST_NODE_NEXT_WITH_FIELD(dln, field) = NULL; \
|
||||||
|
TD_DLIST_HEAD(dl) = TD_DLIST_TAIL(dl) = (dln); \
|
||||||
|
} else { \
|
||||||
|
TD_DLIST_NODE_PREV_WITH_FIELD(dln, field) = TD_DLIST_TAIL(dl); \
|
||||||
|
TD_DLIST_NODE_NEXT_WITH_FIELD(dln, field) = NULL; \
|
||||||
|
TD_DLIST_NODE_NEXT_WITH_FIELD(TD_DLIST_TAIL(dl), field) = (dln); \
|
||||||
|
TD_DLIST_TAIL(dl) = (dln); \
|
||||||
|
} \
|
||||||
|
TD_DLIST_NELES(dl) += 1; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define TD_DLIST_PREPEND(dl, dln) \
|
#define TD_DLIST_PREPEND(dl, dln) \
|
||||||
do { \
|
do { \
|
||||||
if (TD_DLIST_HEAD(dl) == NULL) { \
|
if (TD_DLIST_HEAD(dl) == NULL) { \
|
||||||
|
@ -108,6 +138,20 @@ extern "C" {
|
||||||
TD_DLIST_NELES(dl) += 1; \
|
TD_DLIST_NELES(dl) += 1; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define TD_DLIST_PREPEND_WITH_FIELD(dl, dln, field) \
|
||||||
|
do { \
|
||||||
|
if (TD_DLIST_HEAD(dl) == NULL) { \
|
||||||
|
TD_DLIST_NODE_PREV_WITH_FIELD(dln, field) = TD_DLIST_NODE_NEXT_WITH_FIELD(dln, field) = NULL; \
|
||||||
|
TD_DLIST_HEAD(dl) = TD_DLIST_TAIL(dl) = (dln); \
|
||||||
|
} else { \
|
||||||
|
TD_DLIST_NODE_PREV_WITH_FIELD(dln, field) = NULL; \
|
||||||
|
TD_DLIST_NODE_NEXT_WITH_FIELD(dln, field) = TD_DLIST_HEAD(dl); \
|
||||||
|
TD_DLIST_NODE_PREV_WITH_FIELD(TD_DLIST_HEAD(dl), field) = (dln); \
|
||||||
|
TD_DLIST_HEAD(dl) = (dln); \
|
||||||
|
} \
|
||||||
|
TD_DLIST_NELES(dl) += 1; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define TD_DLIST_POP(dl, dln) \
|
#define TD_DLIST_POP(dl, dln) \
|
||||||
do { \
|
do { \
|
||||||
if (TD_DLIST_HEAD(dl) == (dln)) { \
|
if (TD_DLIST_HEAD(dl) == (dln)) { \
|
||||||
|
@ -126,6 +170,26 @@ extern "C" {
|
||||||
TD_DLIST_NODE_PREV(dln) = TD_DLIST_NODE_NEXT(dln) = NULL; \
|
TD_DLIST_NODE_PREV(dln) = TD_DLIST_NODE_NEXT(dln) = NULL; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define TD_DLIST_POP_WITH_FIELD(dl, dln, field) \
|
||||||
|
do { \
|
||||||
|
if (TD_DLIST_HEAD(dl) == (dln)) { \
|
||||||
|
TD_DLIST_HEAD(dl) = TD_DLIST_NODE_NEXT_WITH_FIELD(dln, field); \
|
||||||
|
} \
|
||||||
|
if (TD_DLIST_TAIL(dl) == (dln)) { \
|
||||||
|
TD_DLIST_TAIL(dl) = TD_DLIST_NODE_PREV_WITH_FIELD(dln, field); \
|
||||||
|
} \
|
||||||
|
if (TD_DLIST_NODE_PREV_WITH_FIELD(dln, field) != NULL) { \
|
||||||
|
TD_DLIST_NODE_NEXT_WITH_FIELD(TD_DLIST_NODE_PREV_WITH_FIELD(dln, field), field) = \
|
||||||
|
TD_DLIST_NODE_NEXT_WITH_FIELD(dln, field); \
|
||||||
|
} \
|
||||||
|
if (TD_DLIST_NODE_NEXT_WITH_FIELD(dln, field) != NULL) { \
|
||||||
|
TD_DLIST_NODE_PREV_WITH_FIELD(TD_DLIST_NODE_NEXT_WITH_FIELD(dln, field), field) = \
|
||||||
|
TD_DLIST_NODE_PREV_WITH_FIELD(dln, field); \
|
||||||
|
} \
|
||||||
|
TD_DLIST_NELES(dl) -= 1; \
|
||||||
|
TD_DLIST_NODE_PREV_WITH_FIELD(dln, field) = TD_DLIST_NODE_NEXT_WITH_FIELD(dln, field) = NULL; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
// General double linked list
|
// General double linked list
|
||||||
typedef enum { TD_LIST_FORWARD, TD_LIST_BACKWARD } TD_LIST_DIRECTION_T;
|
typedef enum { TD_LIST_FORWARD, TD_LIST_BACKWARD } TD_LIST_DIRECTION_T;
|
||||||
|
|
||||||
|
|
|
@ -106,8 +106,8 @@ typedef struct SAppInfo {
|
||||||
char *ep;
|
char *ep;
|
||||||
int32_t pid;
|
int32_t pid;
|
||||||
int32_t numOfThreads;
|
int32_t numOfThreads;
|
||||||
|
|
||||||
SHashObj *pInstMap;
|
SHashObj *pInstMap;
|
||||||
|
pthread_mutex_t mutex;
|
||||||
} SAppInfo;
|
} SAppInfo;
|
||||||
|
|
||||||
typedef struct STscObj {
|
typedef struct STscObj {
|
||||||
|
@ -192,7 +192,7 @@ uint64_t generateRequestId();
|
||||||
void *createRequest(STscObj* pObj, __taos_async_fn_t fp, void* param, int32_t type);
|
void *createRequest(STscObj* pObj, __taos_async_fn_t fp, void* param, int32_t type);
|
||||||
void destroyRequest(SRequestObj* pRequest);
|
void destroyRequest(SRequestObj* pRequest);
|
||||||
|
|
||||||
char *getConnectionDB(STscObj* pObj);
|
char *getDbOfConnection(STscObj* pObj);
|
||||||
void setConnectionDB(STscObj* pTscObj, const char* db);
|
void setConnectionDB(STscObj* pTscObj, const char* db);
|
||||||
|
|
||||||
void taos_init_imp(void);
|
void taos_init_imp(void);
|
||||||
|
|
|
@ -67,7 +67,9 @@ static void deregisterRequest(SRequestObj* pRequest) {
|
||||||
int32_t currentInst = atomic_sub_fetch_32(&pActivity->currentRequests, 1);
|
int32_t currentInst = atomic_sub_fetch_32(&pActivity->currentRequests, 1);
|
||||||
int32_t num = atomic_sub_fetch_32(&pTscObj->numOfReqs, 1);
|
int32_t num = atomic_sub_fetch_32(&pTscObj->numOfReqs, 1);
|
||||||
|
|
||||||
tscDebug("0x%"PRIx64" free Request from connObj: 0x%"PRIx64", current:%d, app current:%d", pRequest->self, pTscObj->id, num, currentInst);
|
int64_t duration = taosGetTimestampMs() - pRequest->metric.start;
|
||||||
|
tscDebug("0x%"PRIx64" free Request from connObj: 0x%"PRIx64", reqId:0x%"PRIx64" elapsed:%"PRIu64" ms, current:%d, app current:%d", pRequest->self, pTscObj->id,
|
||||||
|
pRequest->requestId, duration, num, currentInst);
|
||||||
taosReleaseRef(clientConnRefPool, pTscObj->id);
|
taosReleaseRef(clientConnRefPool, pTscObj->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,10 +253,11 @@ void taos_init_imp(void) {
|
||||||
clientReqRefPool = taosOpenRef(40960, doDestroyRequest);
|
clientReqRefPool = taosOpenRef(40960, doDestroyRequest);
|
||||||
|
|
||||||
taosGetAppName(appInfo.appName, NULL);
|
taosGetAppName(appInfo.appName, NULL);
|
||||||
|
pthread_mutex_init(&appInfo.mutex, NULL);
|
||||||
|
|
||||||
appInfo.pid = taosGetPId();
|
appInfo.pid = taosGetPId();
|
||||||
appInfo.startTime = taosGetTimestampMs();
|
appInfo.startTime = taosGetTimestampMs();
|
||||||
appInfo.pInstMap = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
appInfo.pInstMap = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
||||||
|
|
||||||
tscDebug("client is initialized successfully");
|
tscDebug("client is initialized successfully");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ static char* getClusterKey(const char* user, const char* auth, const char* ip, i
|
||||||
return strdup(key);
|
return strdup(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
static STscObj* taosConnectImpl(const char *user, const char *auth, const char *db, uint16_t port, __taos_async_fn_t fp, void *param, SAppInstInfo* pAppInfo);
|
static STscObj* taosConnectImpl(const char *user, const char *auth, const char *db, __taos_async_fn_t fp, void *param, SAppInstInfo* pAppInfo);
|
||||||
static void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t numOfCols);
|
static void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t numOfCols);
|
||||||
|
|
||||||
TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass, const char *auth, const char *db, uint16_t port) {
|
TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass, const char *auth, const char *db, uint16_t port) {
|
||||||
|
@ -110,21 +110,25 @@ TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass,
|
||||||
}
|
}
|
||||||
|
|
||||||
char* key = getClusterKey(user, secretEncrypt, ip, port);
|
char* key = getClusterKey(user, secretEncrypt, ip, port);
|
||||||
|
SAppInstInfo** pInst = NULL;
|
||||||
|
|
||||||
// TODO: race condition here.
|
pthread_mutex_lock(&appInfo.mutex);
|
||||||
SAppInstInfo** pInst = taosHashGet(appInfo.pInstMap, key, strlen(key));
|
|
||||||
|
pInst = taosHashGet(appInfo.pInstMap, key, strlen(key));
|
||||||
if (pInst == NULL) {
|
if (pInst == NULL) {
|
||||||
SAppInstInfo* p = calloc(1, sizeof(struct SAppInstInfo));
|
SAppInstInfo* p = calloc(1, sizeof(struct SAppInstInfo));
|
||||||
p->mgmtEp = epSet;
|
p->mgmtEp = epSet;
|
||||||
p->pTransporter = openTransporter(user, secretEncrypt, tsNumOfCores);
|
p->pTransporter = openTransporter(user, secretEncrypt, tsNumOfCores);
|
||||||
/*p->pAppHbMgr = appHbMgrInit(p);*/
|
p->pAppHbMgr = appHbMgrInit(p);
|
||||||
taosHashPut(appInfo.pInstMap, key, strlen(key), &p, POINTER_BYTES);
|
taosHashPut(appInfo.pInstMap, key, strlen(key), &p, POINTER_BYTES);
|
||||||
|
|
||||||
pInst = &p;
|
pInst = &p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&appInfo.mutex);
|
||||||
|
|
||||||
tfree(key);
|
tfree(key);
|
||||||
return taosConnectImpl(user, &secretEncrypt[0], localDb, port, NULL, NULL, *pInst);
|
return taosConnectImpl(user, &secretEncrypt[0], localDb, NULL, NULL, *pInst);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t buildRequest(STscObj *pTscObj, const char *sql, int sqlLen, SRequestObj** pRequest) {
|
int32_t buildRequest(STscObj *pTscObj, const char *sql, int sqlLen, SRequestObj** pRequest) {
|
||||||
|
@ -155,7 +159,7 @@ int32_t parseSql(SRequestObj* pRequest, SQueryNode** pQuery) {
|
||||||
SParseContext cxt = {
|
SParseContext cxt = {
|
||||||
.requestId = pRequest->requestId,
|
.requestId = pRequest->requestId,
|
||||||
.acctId = pTscObj->acctId,
|
.acctId = pTscObj->acctId,
|
||||||
.db = getConnectionDB(pTscObj),
|
.db = getDbOfConnection(pTscObj),
|
||||||
.pSql = pRequest->sqlstr,
|
.pSql = pRequest->sqlstr,
|
||||||
.sqlLen = pRequest->sqlLen,
|
.sqlLen = pRequest->sqlLen,
|
||||||
.pMsg = pRequest->msgBuf,
|
.pMsg = pRequest->msgBuf,
|
||||||
|
@ -215,6 +219,8 @@ int32_t getPlan(SRequestObj* pRequest, SQueryNode* pQueryNode, SQueryDag** pDag,
|
||||||
if (pQueryNode->type == TSDB_SQL_SELECT) {
|
if (pQueryNode->type == TSDB_SQL_SELECT) {
|
||||||
setResSchemaInfo(&pRequest->body.resInfo, pSchema, numOfCols);
|
setResSchemaInfo(&pRequest->body.resInfo, pSchema, numOfCols);
|
||||||
pRequest->type = TDMT_VND_QUERY;
|
pRequest->type = TDMT_VND_QUERY;
|
||||||
|
} else {
|
||||||
|
tfree(pSchema);
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
@ -236,13 +242,12 @@ void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t
|
||||||
int32_t scheduleQuery(SRequestObj* pRequest, SQueryDag* pDag, SArray* pNodeList) {
|
int32_t scheduleQuery(SRequestObj* pRequest, SQueryDag* pDag, SArray* pNodeList) {
|
||||||
if (TSDB_SQL_INSERT == pRequest->type || TSDB_SQL_CREATE_TABLE == pRequest->type) {
|
if (TSDB_SQL_INSERT == pRequest->type || TSDB_SQL_CREATE_TABLE == pRequest->type) {
|
||||||
SQueryResult res = {.code = 0, .numOfRows = 0, .msgSize = ERROR_MSG_BUF_DEFAULT_SIZE, .msg = pRequest->msgBuf};
|
SQueryResult res = {.code = 0, .numOfRows = 0, .msgSize = ERROR_MSG_BUF_DEFAULT_SIZE, .msg = pRequest->msgBuf};
|
||||||
|
int32_t code = schedulerExecJob(pRequest->pTscObj->pAppInfo->pTransporter, NULL, pDag, &pRequest->body.pQueryJob, &res);
|
||||||
int32_t code = scheduleExecJob(pRequest->pTscObj->pAppInfo->pTransporter, NULL, pDag, &pRequest->body.pQueryJob, &res);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
// handle error and retry
|
// handle error and retry
|
||||||
} else {
|
} else {
|
||||||
if (pRequest->body.pQueryJob != NULL) {
|
if (pRequest->body.pQueryJob != NULL) {
|
||||||
scheduleFreeJob(pRequest->body.pQueryJob);
|
schedulerFreeJob(pRequest->body.pQueryJob);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,17 +256,11 @@ int32_t scheduleQuery(SRequestObj* pRequest, SQueryDag* pDag, SArray* pNodeList)
|
||||||
return pRequest->code;
|
return pRequest->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
return scheduleAsyncExecJob(pRequest->pTscObj->pAppInfo->pTransporter, pNodeList, pDag, &pRequest->body.pQueryJob);
|
return schedulerAsyncExecJob(pRequest->pTscObj->pAppInfo->pTransporter, pNodeList, pDag, &pRequest->body.pQueryJob);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct tmq_t tmq_t;
|
|
||||||
|
|
||||||
typedef struct SMqClientTopic {
|
typedef struct SMqClientVg {
|
||||||
// subscribe info
|
|
||||||
int32_t sqlLen;
|
|
||||||
char* sql;
|
|
||||||
char* topicName;
|
|
||||||
int64_t topicId;
|
|
||||||
// statistics
|
// statistics
|
||||||
int64_t consumeCnt;
|
int64_t consumeCnt;
|
||||||
// offset
|
// offset
|
||||||
|
@ -270,36 +269,160 @@ typedef struct SMqClientTopic {
|
||||||
//connection info
|
//connection info
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
|
} SMqClientVg;
|
||||||
|
|
||||||
|
typedef struct SMqClientTopic {
|
||||||
|
// subscribe info
|
||||||
|
int32_t sqlLen;
|
||||||
|
char* sql;
|
||||||
|
char* topicName;
|
||||||
|
int64_t topicId;
|
||||||
|
int32_t nextVgIdx;
|
||||||
|
SArray* vgs; //SArray<SMqClientVg>
|
||||||
} SMqClientTopic;
|
} SMqClientTopic;
|
||||||
|
|
||||||
typedef struct tmq_resp_err_t {
|
typedef struct tmq_resp_err_t {
|
||||||
int32_t code;
|
int32_t code;
|
||||||
} tmq_resp_err_t;
|
} tmq_resp_err_t;
|
||||||
|
|
||||||
typedef struct tmq_topic_vgroup_list_t {
|
typedef struct tmq_topic_vgroup_t {
|
||||||
char* topicName;
|
char* topic;
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
int64_t committedOffset;
|
int64_t commitOffset;
|
||||||
|
} tmq_topic_vgroup_t;
|
||||||
|
|
||||||
|
typedef struct tmq_topic_vgroup_list_t {
|
||||||
|
int32_t cnt;
|
||||||
|
int32_t size;
|
||||||
|
tmq_topic_vgroup_t* elems;
|
||||||
} tmq_topic_vgroup_list_t;
|
} tmq_topic_vgroup_list_t;
|
||||||
|
|
||||||
typedef void (tmq_commit_cb(tmq_t*, tmq_resp_err_t, tmq_topic_vgroup_list_t*, void* param));
|
typedef void (tmq_commit_cb(tmq_t*, tmq_resp_err_t, tmq_topic_vgroup_list_t*, void* param));
|
||||||
|
|
||||||
typedef struct tmq_conf_t{
|
struct tmq_conf_t {
|
||||||
char* clientId;
|
char clientId[256];
|
||||||
char* groupId;
|
char groupId[256];
|
||||||
char* ip;
|
char* ip;
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
tmq_commit_cb* commit_cb;
|
tmq_commit_cb* commit_cb;
|
||||||
} tmq_conf_t;
|
};
|
||||||
|
|
||||||
|
tmq_conf_t* tmq_conf_new() {
|
||||||
|
tmq_conf_t* conf = calloc(1, sizeof(tmq_conf_t));
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tmq_conf_set(tmq_conf_t* conf, const char* key, const char* value) {
|
||||||
|
if (strcmp(key, "group.id")) {
|
||||||
|
strcpy(conf->groupId, value);
|
||||||
|
}
|
||||||
|
if (strcmp(key, "client.id")) {
|
||||||
|
strcpy(conf->clientId, value);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct tmq_t {
|
struct tmq_t {
|
||||||
char groupId[256];
|
char groupId[256];
|
||||||
char clientId[256];
|
char clientId[256];
|
||||||
|
int64_t consumerId;
|
||||||
|
int64_t status;
|
||||||
STscObj* pTscObj;
|
STscObj* pTscObj;
|
||||||
tmq_commit_cb* commit_cb;
|
tmq_commit_cb* commit_cb;
|
||||||
SArray* clientTopics; // SArray<SMqClientTopic>
|
int32_t nextTopicIdx;
|
||||||
|
SArray* clientTopics; //SArray<SMqClientTopic>
|
||||||
};
|
};
|
||||||
|
|
||||||
|
tmq_t* taos_consumer_new(void* conn, tmq_conf_t* conf, char* errstr, int32_t errstrLen) {
|
||||||
|
tmq_t* pTmq = calloc(sizeof(tmq_t), 1);
|
||||||
|
if (pTmq == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
pTmq->pTscObj = (STscObj*)conn;
|
||||||
|
pTmq->status = 0;
|
||||||
|
strcpy(pTmq->clientId, conf->clientId);
|
||||||
|
strcpy(pTmq->groupId, conf->groupId);
|
||||||
|
pTmq->commit_cb = conf->commit_cb;
|
||||||
|
pTmq->consumerId = generateRequestId() & ((uint64_t)-1 >> 1);
|
||||||
|
return pTmq;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct tmq_list_t {
|
||||||
|
int32_t cnt;
|
||||||
|
int32_t tot;
|
||||||
|
char* elems[];
|
||||||
|
};
|
||||||
|
tmq_list_t* tmq_list_new() {
|
||||||
|
tmq_list_t *ptr = malloc(sizeof(tmq_list_t) + 8 * sizeof(char*));
|
||||||
|
if (ptr == NULL) {
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
ptr->cnt = 0;
|
||||||
|
ptr->tot = 8;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tmq_list_append(tmq_list_t* ptr, char* src) {
|
||||||
|
if (ptr->cnt >= ptr->tot-1) return -1;
|
||||||
|
ptr->elems[ptr->cnt] = src;
|
||||||
|
ptr->cnt++;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TAOS_RES* tmq_subscribe(tmq_t* tmq, tmq_list_t* topic_list) {
|
||||||
|
SRequestObj *pRequest = NULL;
|
||||||
|
tmq->status = 1;
|
||||||
|
int32_t sz = topic_list->cnt;
|
||||||
|
tmq->clientTopics = taosArrayInit(sz, sizeof(void*));
|
||||||
|
for (int i = 0; i < sz; i++) {
|
||||||
|
char* topicName = strdup(topic_list->elems[i]);
|
||||||
|
taosArrayPush(tmq->clientTopics, &topicName);
|
||||||
|
}
|
||||||
|
SCMSubscribeReq req;
|
||||||
|
req.topicNum = taosArrayGetSize(tmq->clientTopics);
|
||||||
|
req.consumerId = tmq->consumerId;
|
||||||
|
req.consumerGroup = strdup(tmq->groupId);
|
||||||
|
req.topicNames = tmq->clientTopics;
|
||||||
|
|
||||||
|
int tlen = tSerializeSCMSubscribeReq(NULL, &req);
|
||||||
|
void* buf = malloc(tlen);
|
||||||
|
if(buf == NULL) {
|
||||||
|
goto _return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* abuf = buf;
|
||||||
|
tSerializeSCMSubscribeReq(&abuf, &req);
|
||||||
|
/*printf("formatted: %s\n", dagStr);*/
|
||||||
|
|
||||||
|
pRequest = createRequest(tmq->pTscObj, NULL, NULL, TSDB_SQL_SELECT);
|
||||||
|
if (pRequest == NULL) {
|
||||||
|
tscError("failed to malloc sqlObj");
|
||||||
|
}
|
||||||
|
|
||||||
|
pRequest->body.requestMsg = (SDataBuf){ .pData = buf, .len = tlen };
|
||||||
|
pRequest->type = TDMT_MND_CREATE_TOPIC;
|
||||||
|
|
||||||
|
SMsgSendInfo* body = buildMsgInfoImpl(pRequest);
|
||||||
|
SEpSet epSet = getEpSet_s(&tmq->pTscObj->pAppInfo->mgmtEp);
|
||||||
|
|
||||||
|
int64_t transporterId = 0;
|
||||||
|
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &epSet, &transporterId, body);
|
||||||
|
|
||||||
|
tsem_wait(&pRequest->body.rspSem);
|
||||||
|
|
||||||
|
_return:
|
||||||
|
if (body != NULL) {
|
||||||
|
destroySendMsgInfo(body);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRequest != NULL && terrno != TSDB_CODE_SUCCESS) {
|
||||||
|
pRequest->code = terrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pRequest;
|
||||||
|
}
|
||||||
|
|
||||||
void tmq_conf_set_offset_commit_cb(tmq_conf_t* conf, tmq_commit_cb* cb) {
|
void tmq_conf_set_offset_commit_cb(tmq_conf_t* conf, tmq_commit_cb* cb) {
|
||||||
conf->commit_cb = cb;
|
conf->commit_cb = cb;
|
||||||
}
|
}
|
||||||
|
@ -327,10 +450,10 @@ SArray* tmqGetConnInfo(SClientHbKey connKey, void* param) {
|
||||||
int sz = taosArrayGetSize(clientTopics);
|
int sz = taosArrayGetSize(clientTopics);
|
||||||
for (int i = 0; i < sz; i++) {
|
for (int i = 0; i < sz; i++) {
|
||||||
SMqClientTopic* pCTopic = taosArrayGet(clientTopics, i);
|
SMqClientTopic* pCTopic = taosArrayGet(clientTopics, i);
|
||||||
if (pCTopic->vgId == -1) {
|
/*if (pCTopic->vgId == -1) {*/
|
||||||
pMqHb->status = 1;
|
/*pMqHb->status = 1;*/
|
||||||
break;
|
/*break;*/
|
||||||
}
|
/*}*/
|
||||||
}
|
}
|
||||||
kv.value = pMqHb;
|
kv.value = pMqHb;
|
||||||
kv.valueLen = sizeof(SMqHbMsg);
|
kv.valueLen = sizeof(SMqHbMsg);
|
||||||
|
@ -451,22 +574,63 @@ _return:
|
||||||
return pRequest;
|
return pRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct tmq_message_t {
|
/*typedef SMqConsumeRsp tmq_message_t;*/
|
||||||
int32_t numOfRows;
|
|
||||||
char* topicName;
|
|
||||||
TAOS_ROW row[];
|
|
||||||
} tmq_message_t;
|
|
||||||
|
|
||||||
tmq_message_t* tmq_consume_poll(tmq_t* mq, int64_t blocking_time) {
|
struct tmq_message_t {
|
||||||
|
SMqConsumeRsp rsp;
|
||||||
|
};
|
||||||
|
|
||||||
|
tmq_message_t* tmq_consume_poll(tmq_t* tmq, int64_t blocking_time) {
|
||||||
|
if (tmq->clientTopics == NULL || taosArrayGetSize(tmq->clientTopics) == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
SRequestObj *pRequest = NULL;
|
||||||
|
SMqConsumeReq req = {0};
|
||||||
|
req.reqType = 1;
|
||||||
|
req.blockingTime = blocking_time;
|
||||||
|
req.consumerId = tmq->consumerId;
|
||||||
|
strcpy(req.cgroup, tmq->groupId);
|
||||||
|
|
||||||
|
SMqClientTopic* pTopic = taosArrayGet(tmq->clientTopics, tmq->nextTopicIdx);
|
||||||
|
tmq->nextTopicIdx = (tmq->nextTopicIdx + 1) % taosArrayGetSize(tmq->clientTopics);
|
||||||
|
strcpy(req.topic, pTopic->topicName);
|
||||||
|
int32_t nextVgIdx = pTopic->nextVgIdx;
|
||||||
|
pTopic->nextVgIdx = (nextVgIdx + 1) % taosArrayGetSize(pTopic->vgs);
|
||||||
|
SMqClientVg* pVg = taosArrayGet(pTopic->vgs, nextVgIdx);
|
||||||
|
req.offset = pVg->currentOffset;
|
||||||
|
|
||||||
|
pRequest->body.requestMsg = (SDataBuf){ .pData = &req, .len = sizeof(SMqConsumeReq) };
|
||||||
|
pRequest->type = TDMT_VND_CONSUME;
|
||||||
|
|
||||||
|
SMsgSendInfo* body = buildMsgInfoImpl(pRequest);
|
||||||
|
|
||||||
|
int64_t transporterId = 0;
|
||||||
|
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &pVg->epSet, &transporterId, body);
|
||||||
|
|
||||||
|
tsem_wait(&pRequest->body.rspSem);
|
||||||
|
|
||||||
|
return (tmq_message_t*)pRequest->body.resInfo.pData;
|
||||||
|
|
||||||
|
/*tsem_wait(&pRequest->body.rspSem);*/
|
||||||
|
|
||||||
|
/*if (body != NULL) {*/
|
||||||
|
/*destroySendMsgInfo(body);*/
|
||||||
|
/*}*/
|
||||||
|
|
||||||
|
/*if (pRequest != NULL && terrno != TSDB_CODE_SUCCESS) {*/
|
||||||
|
/*pRequest->code = terrno;*/
|
||||||
|
/*}*/
|
||||||
|
|
||||||
|
/*return pRequest;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
tmq_resp_err_t* tmq_commit(tmq_t* tmq, tmq_topic_vgroup_list_t* tmq_topic_vgroup_list, int32_t async) {
|
||||||
|
SMqConsumeReq req = {0};
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmq_resp_err_t* tmq_commit(tmq_t* mq, void* callback, int32_t async) {
|
void tmq_message_destroy(tmq_message_t* tmq_message) {
|
||||||
return NULL;
|
if (tmq_message == NULL) return;
|
||||||
}
|
|
||||||
|
|
||||||
void tmq_message_destroy(tmq_message_t* mq_message) {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -491,12 +655,14 @@ TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) {
|
||||||
if (qIsDdlQuery(pQueryNode)) {
|
if (qIsDdlQuery(pQueryNode)) {
|
||||||
CHECK_CODE_GOTO(execDdlQuery(pRequest, pQueryNode), _return);
|
CHECK_CODE_GOTO(execDdlQuery(pRequest, pQueryNode), _return);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
CHECK_CODE_GOTO(getPlan(pRequest, pQueryNode, &pRequest->body.pDag, pNodeList), _return);
|
CHECK_CODE_GOTO(getPlan(pRequest, pQueryNode, &pRequest->body.pDag, pNodeList), _return);
|
||||||
CHECK_CODE_GOTO(scheduleQuery(pRequest, pRequest->body.pDag, pNodeList), _return);
|
CHECK_CODE_GOTO(scheduleQuery(pRequest, pRequest->body.pDag, pNodeList), _return);
|
||||||
pRequest->code = terrno;
|
pRequest->code = terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
taosArrayDestroy(pNodeList);
|
||||||
qDestroyQuery(pQueryNode);
|
qDestroyQuery(pQueryNode);
|
||||||
if (NULL != pRequest && TSDB_CODE_SUCCESS != terrno) {
|
if (NULL != pRequest && TSDB_CODE_SUCCESS != terrno) {
|
||||||
pRequest->code = terrno;
|
pRequest->code = terrno;
|
||||||
|
@ -541,7 +707,7 @@ int initEpSetFromCfg(const char *firstEp, const char *secondEp, SCorEpSet *pEpSe
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
STscObj* taosConnectImpl(const char *user, const char *auth, const char *db, uint16_t port, __taos_async_fn_t fp, void *param, SAppInstInfo* pAppInfo) {
|
STscObj* taosConnectImpl(const char *user, const char *auth, const char *db, __taos_async_fn_t fp, void *param, SAppInstInfo* pAppInfo) {
|
||||||
STscObj *pTscObj = createTscObj(user, auth, db, pAppInfo);
|
STscObj *pTscObj = createTscObj(user, auth, db, pAppInfo);
|
||||||
if (NULL == pTscObj) {
|
if (NULL == pTscObj) {
|
||||||
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
|
@ -599,7 +765,7 @@ static SMsgSendInfo* buildConnectMsg(SRequestObj *pRequest) {
|
||||||
|
|
||||||
STscObj *pObj = pRequest->pTscObj;
|
STscObj *pObj = pRequest->pTscObj;
|
||||||
|
|
||||||
char* db = getConnectionDB(pObj);
|
char* db = getDbOfConnection(pObj);
|
||||||
if (db != NULL) {
|
if (db != NULL) {
|
||||||
tstrncpy(pConnect->db, db, sizeof(pConnect->db));
|
tstrncpy(pConnect->db, db, sizeof(pConnect->db));
|
||||||
}
|
}
|
||||||
|
@ -690,10 +856,10 @@ TAOS *taos_connect_l(const char *ip, int ipLen, const char *user, int userLen, c
|
||||||
char userStr[TSDB_USER_LEN] = {0};
|
char userStr[TSDB_USER_LEN] = {0};
|
||||||
char passStr[TSDB_PASSWORD_LEN] = {0};
|
char passStr[TSDB_PASSWORD_LEN] = {0};
|
||||||
|
|
||||||
strncpy(ipStr, ip, MIN(TSDB_EP_LEN - 1, ipLen));
|
strncpy(ipStr, ip, TMIN(TSDB_EP_LEN - 1, ipLen));
|
||||||
strncpy(userStr, user, MIN(TSDB_USER_LEN - 1, userLen));
|
strncpy(userStr, user, TMIN(TSDB_USER_LEN - 1, userLen));
|
||||||
strncpy(passStr, pass, MIN(TSDB_PASSWORD_LEN - 1, passLen));
|
strncpy(passStr, pass, TMIN(TSDB_PASSWORD_LEN - 1, passLen));
|
||||||
strncpy(dbStr, db, MIN(TSDB_DB_NAME_LEN - 1, dbLen));
|
strncpy(dbStr, db, TMIN(TSDB_DB_NAME_LEN - 1, dbLen));
|
||||||
return taos_connect(ipStr, userStr, passStr, dbStr, port);
|
return taos_connect(ipStr, userStr, passStr, dbStr, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -711,7 +877,7 @@ void* doFetchRow(SRequestObj* pRequest) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SReqResultInfo* pResInfo = &pRequest->body.resInfo;
|
SReqResultInfo* pResInfo = &pRequest->body.resInfo;
|
||||||
int32_t code = scheduleFetchRows(pRequest->body.pQueryJob, (void **)&pResInfo->pData);
|
int32_t code = schedulerFetchRows(pRequest->body.pQueryJob, (void **)&pResInfo->pData);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
pRequest->code = code;
|
pRequest->code = code;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -831,7 +997,7 @@ void setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char* getConnectionDB(STscObj* pObj) {
|
char* getDbOfConnection(STscObj* pObj) {
|
||||||
char *p = NULL;
|
char *p = NULL;
|
||||||
pthread_mutex_lock(&pObj->mutex);
|
pthread_mutex_lock(&pObj->mutex);
|
||||||
size_t len = strlen(pObj->db);
|
size_t len = strlen(pObj->db);
|
||||||
|
|
|
@ -72,7 +72,7 @@ int processConnectRsp(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
atomic_add_fetch_64(&pTscObj->pAppInfo->numOfConns, 1);
|
atomic_add_fetch_64(&pTscObj->pAppInfo->numOfConns, 1);
|
||||||
|
|
||||||
SClientHbKey connKey = {.connId = pConnect->connId, .hbType = HEARTBEAT_TYPE_QUERY};
|
SClientHbKey connKey = {.connId = pConnect->connId, .hbType = HEARTBEAT_TYPE_QUERY};
|
||||||
/*hbRegisterConn(pTscObj->pAppInfo->pAppHbMgr, connKey, NULL);*/
|
hbRegisterConn(pTscObj->pAppInfo->pAppHbMgr, connKey, NULL);
|
||||||
|
|
||||||
// pRequest->body.resInfo.pRspMsg = pMsg->pData;
|
// pRequest->body.resInfo.pRspMsg = pMsg->pData;
|
||||||
tscDebug("0x%" PRIx64 " clusterId:%" PRId64 ", totalConn:%" PRId64, pRequest->requestId, pConnect->clusterId,
|
tscDebug("0x%" PRIx64 " clusterId:%" PRId64 ", totalConn:%" PRId64, pRequest->requestId, pConnect->clusterId,
|
||||||
|
|
|
@ -53,416 +53,419 @@ TEST(testCase, driverInit_Test) {
|
||||||
// taos_init();
|
// taos_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
//TEST(testCase, connect_Test) {
|
TEST(testCase, connect_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// if (pConn == NULL) {
|
if (pConn == NULL) {
|
||||||
// printf("failed to connect to server, reason:%s\n", taos_errstr(NULL));
|
printf("failed to connect to server, reason:%s\n", taos_errstr(NULL));
|
||||||
// }
|
}
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, create_user_Test) {
|
TEST(testCase, create_user_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'");
|
TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'");
|
||||||
// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
||||||
// printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, create_account_Test) {
|
TEST(testCase, create_account_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'");
|
TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'");
|
||||||
// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
||||||
// printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, drop_account_Test) {
|
TEST(testCase, drop_account_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "drop account aabc");
|
TAOS_RES* pRes = taos_query(pConn, "drop account aabc");
|
||||||
// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
||||||
// printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, show_user_Test) {
|
TEST(testCase, show_user_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "show users");
|
TAOS_RES* pRes = taos_query(pConn, "show users");
|
||||||
// TAOS_ROW pRow = NULL;
|
TAOS_ROW pRow = NULL;
|
||||||
//
|
|
||||||
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
// int32_t numOfFields = taos_num_fields(pRes);
|
int32_t numOfFields = taos_num_fields(pRes);
|
||||||
//
|
|
||||||
// char str[512] = {0};
|
char str[512] = {0};
|
||||||
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
// printf("%s\n", str);
|
printf("%s\n", str);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, drop_user_Test) {
|
TEST(testCase, drop_user_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "drop user abc");
|
TAOS_RES* pRes = taos_query(pConn, "drop user abc");
|
||||||
// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
||||||
// printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, show_db_Test) {
|
TEST(testCase, show_db_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "show databases");
|
TAOS_RES* pRes = taos_query(pConn, "show databases");
|
||||||
// TAOS_ROW pRow = NULL;
|
TAOS_ROW pRow = NULL;
|
||||||
//
|
|
||||||
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
// int32_t numOfFields = taos_num_fields(pRes);
|
int32_t numOfFields = taos_num_fields(pRes);
|
||||||
//
|
|
||||||
// char str[512] = {0};
|
char str[512] = {0};
|
||||||
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
// printf("%s\n", str);
|
printf("%s\n", str);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, create_db_Test) {
|
TEST(testCase, create_db_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "create database abc1 vgroups 2");
|
TAOS_RES* pRes = taos_query(pConn, "create database abc1 vgroups 2");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
// ASSERT_TRUE(pFields == NULL);
|
ASSERT_TRUE(pFields == NULL);
|
||||||
//
|
|
||||||
// int32_t numOfFields = taos_num_fields(pRes);
|
int32_t numOfFields = taos_num_fields(pRes);
|
||||||
// ASSERT_EQ(numOfFields, 0);
|
ASSERT_EQ(numOfFields, 0);
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "create database abc1 vgroups 4");
|
pRes = taos_query(pConn, "create database abc1 vgroups 4");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, create_dnode_Test) {
|
TEST(testCase, create_dnode_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "create dnode abc1 port 7000");
|
TAOS_RES* pRes = taos_query(pConn, "create dnode abc1 port 7000");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("error in create dnode, reason:%s\n", taos_errstr(pRes));
|
printf("error in create dnode, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "create dnode 1.1.1.1 port 9000");
|
pRes = taos_query(pConn, "create dnode 1.1.1.1 port 9000");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to create dnode, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create dnode, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, drop_dnode_Test) {
|
TEST(testCase, drop_dnode_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "drop dnode 3");
|
TAOS_RES* pRes = taos_query(pConn, "drop dnode 3");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("error in drop dnode, reason:%s\n", taos_errstr(pRes));
|
printf("error in drop dnode, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
// ASSERT_TRUE(pFields == NULL);
|
ASSERT_TRUE(pFields == NULL);
|
||||||
//
|
|
||||||
// int32_t numOfFields = taos_num_fields(pRes);
|
int32_t numOfFields = taos_num_fields(pRes);
|
||||||
// ASSERT_EQ(numOfFields, 0);
|
ASSERT_EQ(numOfFields, 0);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "drop dnode 4");
|
pRes = taos_query(pConn, "drop dnode 4");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("error in drop dnode, reason:%s\n", taos_errstr(pRes));
|
printf("error in drop dnode, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, use_db_test) {
|
TEST(testCase, use_db_test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
// ASSERT_TRUE(pFields == NULL);
|
ASSERT_TRUE(pFields == NULL);
|
||||||
//
|
|
||||||
// int32_t numOfFields = taos_num_fields(pRes);
|
int32_t numOfFields = taos_num_fields(pRes);
|
||||||
// ASSERT_EQ(numOfFields, 0);
|
ASSERT_EQ(numOfFields, 0);
|
||||||
//
|
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
// TEST(testCase, drop_db_test) {
|
TEST(testCase, drop_db_test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// showDB(pConn);
|
showDB(pConn);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "drop database abc1");
|
TAOS_RES* pRes = taos_query(pConn, "drop database abc1");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to drop db, reason:%s\n", taos_errstr(pRes));
|
printf("failed to drop db, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// showDB(pConn);
|
showDB(pConn);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "create database abc1");
|
pRes = taos_query(pConn, "create database abc1");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("create to drop db, reason:%s\n", taos_errstr(pRes));
|
printf("create to drop db, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, create_stable_Test) {
|
TEST(testCase, create_stable_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1 vgroups 2");
|
TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1 vgroups 2");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "create table if not exists abc1.st1(ts timestamp, k int) tags(a int)");
|
pRes = taos_query(pConn, "create table if not exists abc1.st1(ts timestamp, k int) tags(a int)");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("error in create stable, reason:%s\n", taos_errstr(pRes));
|
printf("error in create stable, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
// ASSERT_TRUE(pFields == NULL);
|
ASSERT_TRUE(pFields == NULL);
|
||||||
//
|
|
||||||
// int32_t numOfFields = taos_num_fields(pRes);
|
int32_t numOfFields = taos_num_fields(pRes);
|
||||||
// ASSERT_EQ(numOfFields, 0);
|
ASSERT_EQ(numOfFields, 0);
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "create stable if not exists abc1.`123_$^)` (ts timestamp, `abc` int) tags(a int)");
|
pRes = taos_query(pConn, "create stable if not exists abc1.`123_$^)` (ts timestamp, `abc` int) tags(a int)");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to create super table 123_$^), reason:%s\n", taos_errstr(pRes));
|
printf("failed to create super table 123_$^), reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "use abc1");
|
pRes = taos_query(pConn, "use abc1");
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// pRes = taos_query(pConn, "drop stable `123_$^)`");
|
pRes = taos_query(pConn, "drop stable `123_$^)`");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to drop super table 123_$^), reason:%s\n", taos_errstr(pRes));
|
printf("failed to drop super table 123_$^), reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, create_table_Test) {
|
TEST(testCase, create_table_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k int)");
|
pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k int)");
|
||||||
// ASSERT_EQ(taos_errno(pRes), 0);
|
ASSERT_EQ(taos_errno(pRes), 0);
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k blob)");
|
pRes = taos_query(pConn, "create table if not exists tm0(ts timestamp, k blob)");
|
||||||
// ASSERT_NE(taos_errno(pRes), 0);
|
ASSERT_NE(taos_errno(pRes), 0);
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, create_ctable_Test) {
|
TEST(testCase, create_ctable_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to use db, reason:%s\n", taos_errstr(pRes));
|
printf("failed to use db, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int ) tags(a int)");
|
pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int ) tags(a int)");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to create stable, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create stable, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "create table tm0 using st1 tags(1)");
|
pRes = taos_query(pConn, "create table tm0 using st1 tags(1)");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to create child table tm0, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create child table tm0, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, show_stable_Test) {
|
TEST(testCase, show_stable_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != nullptr);
|
assert(pConn != nullptr);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "show abc1.stables");
|
TAOS_RES* pRes = taos_query(pConn, "show abc1.stables");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to show stables, reason:%s\n", taos_errstr(pRes));
|
printf("failed to show stables, reason:%s\n", taos_errstr(pRes));
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// ASSERT_TRUE(false);
|
ASSERT_TRUE(false);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// TAOS_ROW pRow = NULL;
|
TAOS_ROW pRow = NULL;
|
||||||
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
// int32_t numOfFields = taos_num_fields(pRes);
|
int32_t numOfFields = taos_num_fields(pRes);
|
||||||
//
|
|
||||||
// char str[512] = {0};
|
char str[512] = {0};
|
||||||
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
// printf("%s\n", str);
|
printf("%s\n", str);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, show_vgroup_Test) {
|
TEST(testCase, show_vgroup_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to use db, reason:%s\n", taos_errstr(pRes));
|
printf("failed to use db, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "show vgroups");
|
pRes = taos_query(pConn, "show vgroups");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to show vgroups, reason:%s\n", taos_errstr(pRes));
|
printf("failed to show vgroups, reason:%s\n", taos_errstr(pRes));
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// ASSERT_TRUE(false);
|
ASSERT_TRUE(false);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// TAOS_ROW pRow = NULL;
|
TAOS_ROW pRow = NULL;
|
||||||
//
|
|
||||||
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
// int32_t numOfFields = taos_num_fields(pRes);
|
int32_t numOfFields = taos_num_fields(pRes);
|
||||||
//
|
|
||||||
// char str[512] = {0};
|
char str[512] = {0};
|
||||||
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
// printf("%s\n", str);
|
printf("%s\n", str);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//TEST(testCase, create_multiple_tables) {
|
TEST(testCase, create_multiple_tables) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// ASSERT_NE(pConn, nullptr);
|
ASSERT_NE(pConn, nullptr);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to use db, reason:%s\n", taos_errstr(pRes));
|
printf("failed to use db, reason:%s\n", taos_errstr(pRes));
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "create table t_2 using st1 tags(1)");
|
pRes = taos_query(pConn, "create table t_2 using st1 tags(1)");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes));
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// ASSERT_TRUE(false);
|
ASSERT_TRUE(false);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// pRes = taos_query(pConn, "create table t_3 using st1 tags(2)");
|
pRes = taos_query(pConn, "create table t_3 using st1 tags(2)");
|
||||||
// if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes));
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// ASSERT_TRUE(false);
|
ASSERT_TRUE(false);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// TAOS_ROW pRow = NULL;
|
TAOS_ROW pRow = NULL;
|
||||||
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
// int32_t numOfFields = taos_num_fields(pRes);
|
int32_t numOfFields = taos_num_fields(pRes);
|
||||||
//
|
|
||||||
// char str[512] = {0};
|
char str[512] = {0};
|
||||||
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
// printf("%s\n", str);
|
printf("%s\n", str);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
//
|
|
||||||
// for (int32_t i = 0; i < 20; ++i) {
|
for (int32_t i = 0; i < 20; ++i) {
|
||||||
// char sql[512] = {0};
|
char sql[512] = {0};
|
||||||
// snprintf(sql, tListLen(sql),
|
snprintf(sql, tListLen(sql),
|
||||||
// "create table t_x_%d using st1 tags(2) t_x_%d using st1 tags(5) t_x_%d using st1 tags(911)", i,
|
"create table t_x_%d using st1 tags(2) t_x_%d using st1 tags(5) t_x_%d using st1 tags(911)", i,
|
||||||
// (i + 1) * 30, (i + 2) * 40);
|
(i + 1) * 30, (i + 2) * 40);
|
||||||
// TAOS_RES* pres = taos_query(pConn, sql);
|
TAOS_RES* pres = taos_query(pConn, sql);
|
||||||
// if (taos_errno(pres) != 0) {
|
if (taos_errno(pres) != 0) {
|
||||||
// printf("failed to create table %d\n, reason:%s", i, taos_errstr(pres));
|
printf("failed to create table %d\n, reason:%s", i, taos_errstr(pres));
|
||||||
// }
|
}
|
||||||
// taos_free_result(pres);
|
taos_free_result(pres);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// taos_close(pConn);
|
taos_close(pConn);
|
||||||
//}
|
}
|
||||||
|
|
||||||
TEST(testCase, show_table_Test) {
|
TEST(testCase, show_table_Test) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "show tables");
|
TAOS_RES* pRes = taos_query(pConn, "show tables");
|
||||||
|
ASSERT_NE(taos_errno(pRes), 0);
|
||||||
|
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to show tables, reason:%s\n", taos_errstr(pRes));
|
printf("expected failed to show tables, reason:%s\n", taos_errstr(pRes));
|
||||||
taos_free_result(pRes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "show abc1.tables");
|
pRes = taos_query(pConn, "show abc1.tables");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to show tables, reason:%s\n", taos_errstr(pRes));
|
printf("failed to show tables, reason:%s\n", taos_errstr(pRes));
|
||||||
|
@ -485,88 +488,87 @@ TEST(testCase, show_table_Test) {
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TEST(testCase, drop_stable_Test) {
|
TEST(testCase, drop_stable_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
assert(pConn != nullptr);
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "create database abc1");
|
|
||||||
// if (taos_errno(pRes) != 0) {
|
|
||||||
// printf("error in creating db, reason:%s\n", taos_errstr(pRes));
|
|
||||||
// }
|
|
||||||
// taos_free_result(pRes);
|
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "use abc1");
|
|
||||||
// if (taos_errno(pRes) != 0) {
|
|
||||||
// printf("error in using db, reason:%s\n", taos_errstr(pRes));
|
|
||||||
// }
|
|
||||||
// taos_free_result(pRes);
|
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "drop stable st1");
|
|
||||||
// if (taos_errno(pRes) != 0) {
|
|
||||||
// printf("failed to drop stable, reason:%s\n", taos_errstr(pRes));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
|
||||||
// taos_close(pConn);
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//TEST(testCase, generated_request_id_test) {
|
|
||||||
// SHashObj* phash = taosHashInit(10000, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK);
|
|
||||||
//
|
|
||||||
// for (int32_t i = 0; i < 50000; ++i) {
|
|
||||||
// uint64_t v = generateRequestId();
|
|
||||||
// void* result = taosHashGet(phash, &v, sizeof(v));
|
|
||||||
// if (result != nullptr) {
|
|
||||||
// printf("0x%lx, index:%d\n", v, i);
|
|
||||||
// }
|
|
||||||
// assert(result == nullptr);
|
|
||||||
// taosHashPut(phash, &v, sizeof(v), NULL, 0);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// taosHashCleanup(phash);
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//TEST(testCase, create_topic_Test) {
|
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
|
||||||
// assert(pConn != NULL);
|
|
||||||
//
|
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
|
||||||
// if (taos_errno(pRes) != 0) {
|
|
||||||
// printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
|
||||||
// }
|
|
||||||
// taos_free_result(pRes);
|
|
||||||
//
|
|
||||||
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
|
||||||
// ASSERT_TRUE(pFields == nullptr);
|
|
||||||
//
|
|
||||||
// int32_t numOfFields = taos_num_fields(pRes);
|
|
||||||
// ASSERT_EQ(numOfFields, 0);
|
|
||||||
//
|
|
||||||
// taos_free_result(pRes);
|
|
||||||
//
|
|
||||||
// char* sql = "select * from tu";
|
|
||||||
// pRes = taos_create_topic(pConn, "test_topic_1", sql, strlen(sql));
|
|
||||||
// taos_free_result(pRes);
|
|
||||||
// taos_close(pConn);
|
|
||||||
//}
|
|
||||||
|
|
||||||
//TEST(testCase, insert_test) {
|
TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1");
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
if (taos_errno(pRes) != 0) {
|
||||||
// ASSERT_NE(pConn, nullptr);
|
printf("error in creating db, reason:%s\n", taos_errstr(pRes));
|
||||||
//
|
}
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
taos_free_result(pRes);
|
||||||
// taos_free_result(pRes);
|
|
||||||
//
|
pRes = taos_query(pConn, "use abc1");
|
||||||
// pRes = taos_query(pConn, "insert into t_2 values(now, 1)");
|
if (taos_errno(pRes) != 0) {
|
||||||
// if (taos_errno(pRes) != 0) {
|
printf("error in using db, reason:%s\n", taos_errstr(pRes));
|
||||||
// printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes));
|
}
|
||||||
// taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
// ASSERT_TRUE(false);
|
|
||||||
// }
|
pRes = taos_query(pConn, "drop stable st1");
|
||||||
//
|
if (taos_errno(pRes) != 0) {
|
||||||
// taos_free_result(pRes);
|
printf("failed to drop stable, reason:%s\n", taos_errstr(pRes));
|
||||||
// taos_close(pConn);
|
}
|
||||||
//}
|
|
||||||
|
taos_free_result(pRes);
|
||||||
|
taos_close(pConn);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testCase, generated_request_id_test) {
|
||||||
|
SHashObj* phash = taosHashInit(10000, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < 50000; ++i) {
|
||||||
|
uint64_t v = generateRequestId();
|
||||||
|
void* result = taosHashGet(phash, &v, sizeof(v));
|
||||||
|
if (result != nullptr) {
|
||||||
|
printf("0x%lx, index:%d\n", v, i);
|
||||||
|
}
|
||||||
|
assert(result == nullptr);
|
||||||
|
taosHashPut(phash, &v, sizeof(v), NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosHashCleanup(phash);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testCase, create_topic_Test) {
|
||||||
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
assert(pConn != NULL);
|
||||||
|
|
||||||
|
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
}
|
||||||
|
|
||||||
|
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
|
ASSERT_TRUE(pFields == nullptr);
|
||||||
|
|
||||||
|
int32_t numOfFields = taos_num_fields(pRes);
|
||||||
|
ASSERT_EQ(numOfFields, 0);
|
||||||
|
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
char* sql = "select * from tu";
|
||||||
|
pRes = taos_create_topic(pConn, "test_topic_1", sql, strlen(sql));
|
||||||
|
taos_free_result(pRes);
|
||||||
|
taos_close(pConn);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testCase, insert_test) {
|
||||||
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
ASSERT_NE(pConn, nullptr);
|
||||||
|
|
||||||
|
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "insert into t_2 values(now, 1)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes));
|
||||||
|
taos_free_result(pRes);
|
||||||
|
ASSERT_TRUE(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
taos_free_result(pRes);
|
||||||
|
taos_close(pConn);
|
||||||
|
}
|
||||||
|
|
||||||
TEST(testCase, projection_query_tables) {
|
TEST(testCase, projection_query_tables) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
|
|
@ -630,7 +630,7 @@ void operateVal(void *dst, void *s1, void *s2, int32_t optr, int32_t type) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SWAP(a, b, c) \
|
#define TSWAP(a, b, c) \
|
||||||
do { \
|
do { \
|
||||||
typeof(a) __tmp = (a); \
|
typeof(a) __tmp = (a); \
|
||||||
(a) = (b); \
|
(a) = (b); \
|
||||||
|
@ -642,35 +642,35 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:
|
||||||
case TSDB_DATA_TYPE_UINT: {
|
case TSDB_DATA_TYPE_UINT: {
|
||||||
SWAP(*(int32_t *)(pLeft), *(int32_t *)(pRight), int32_t);
|
TSWAP(*(int32_t *)(pLeft), *(int32_t *)(pRight), int32_t);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
case TSDB_DATA_TYPE_UBIGINT:
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP: {
|
case TSDB_DATA_TYPE_TIMESTAMP: {
|
||||||
SWAP(*(int64_t *)(pLeft), *(int64_t *)(pRight), int64_t);
|
TSWAP(*(int64_t *)(pLeft), *(int64_t *)(pRight), int64_t);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
SWAP(*(double *)(pLeft), *(double *)(pRight), double);
|
TSWAP(*(double *)(pLeft), *(double *)(pRight), double);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
case TSDB_DATA_TYPE_USMALLINT: {
|
case TSDB_DATA_TYPE_USMALLINT: {
|
||||||
SWAP(*(int16_t *)(pLeft), *(int16_t *)(pRight), int16_t);
|
TSWAP(*(int16_t *)(pLeft), *(int16_t *)(pRight), int16_t);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
SWAP(*(float *)(pLeft), *(float *)(pRight), float);
|
TSWAP(*(float *)(pLeft), *(float *)(pRight), float);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
case TSDB_DATA_TYPE_UTINYINT: {
|
case TSDB_DATA_TYPE_UTINYINT: {
|
||||||
SWAP(*(int8_t *)(pLeft), *(int8_t *)(pRight), int8_t);
|
TSWAP(*(int8_t *)(pLeft), *(int8_t *)(pRight), int8_t);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,6 +116,7 @@ static void dndInitMsgFp(STransMgmt *pMgmt) {
|
||||||
// Requests handled by VNODE
|
// Requests handled by VNODE
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_SUBMIT)] = dndProcessVnodeWriteMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_SUBMIT)] = dndProcessVnodeWriteMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_QUERY)] = dndProcessVnodeQueryMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_QUERY)] = dndProcessVnodeQueryMsg;
|
||||||
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_QUERY_CONTINUE)] = dndProcessVnodeQueryMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_FETCH)] = dndProcessVnodeFetchMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_FETCH)] = dndProcessVnodeFetchMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_ALTER_TABLE)] = dndProcessVnodeWriteMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_ALTER_TABLE)] = dndProcessVnodeWriteMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_UPDATE_TAG_VAL)] = dndProcessVnodeWriteMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_UPDATE_TAG_VAL)] = dndProcessVnodeWriteMsg;
|
||||||
|
|
|
@ -892,7 +892,7 @@ int32_t dndPutReqToVQueryQ(SDnode *pDnode, SRpcMsg *pMsg) {
|
||||||
SVnodeObj *pVnode = dndAcquireVnode(pDnode, pHead->vgId);
|
SVnodeObj *pVnode = dndAcquireVnode(pDnode, pHead->vgId);
|
||||||
if (pVnode == NULL) return -1;
|
if (pVnode == NULL) return -1;
|
||||||
|
|
||||||
int32_t code = dndWriteRpcMsgToVnodeQueue(pVnode->pFetchQ, pMsg, false);
|
int32_t code = dndWriteRpcMsgToVnodeQueue(pVnode->pQueryQ, pMsg, false);
|
||||||
dndReleaseVnode(pDnode, pVnode);
|
dndReleaseVnode(pDnode, pVnode);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -910,11 +910,11 @@ static int32_t dndInitVnodeWorkers(SDnode *pDnode) {
|
||||||
SVnodesMgmt *pMgmt = &pDnode->vmgmt;
|
SVnodesMgmt *pMgmt = &pDnode->vmgmt;
|
||||||
|
|
||||||
int32_t maxFetchThreads = 4;
|
int32_t maxFetchThreads = 4;
|
||||||
int32_t minFetchThreads = MIN(maxFetchThreads, pDnode->env.numOfCores);
|
int32_t minFetchThreads = TMIN(maxFetchThreads, pDnode->env.numOfCores);
|
||||||
int32_t minQueryThreads = MAX((int32_t)(pDnode->env.numOfCores * pDnode->cfg.ratioOfQueryCores), 1);
|
int32_t minQueryThreads = TMAX((int32_t)(pDnode->env.numOfCores * pDnode->cfg.ratioOfQueryCores), 1);
|
||||||
int32_t maxQueryThreads = minQueryThreads;
|
int32_t maxQueryThreads = minQueryThreads;
|
||||||
int32_t maxWriteThreads = MAX(pDnode->env.numOfCores, 1);
|
int32_t maxWriteThreads = TMAX(pDnode->env.numOfCores, 1);
|
||||||
int32_t maxSyncThreads = MAX(pDnode->env.numOfCores / 2, 1);
|
int32_t maxSyncThreads = TMAX(pDnode->env.numOfCores / 2, 1);
|
||||||
|
|
||||||
SWorkerPool *pPool = &pMgmt->queryPool;
|
SWorkerPool *pPool = &pMgmt->queryPool;
|
||||||
pPool->name = "vnode-query";
|
pPool->name = "vnode-query";
|
||||||
|
|
|
@ -19,14 +19,14 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
#include "cJSON.h"
|
#include "cJSON.h"
|
||||||
|
#include "scheduler.h"
|
||||||
#include "sync.h"
|
#include "sync.h"
|
||||||
#include "tmsg.h"
|
|
||||||
#include "thash.h"
|
#include "thash.h"
|
||||||
#include "tlist.h"
|
#include "tlist.h"
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
|
#include "tmsg.h"
|
||||||
#include "trpc.h"
|
#include "trpc.h"
|
||||||
#include "ttimer.h"
|
#include "ttimer.h"
|
||||||
#include "scheduler.h"
|
|
||||||
|
|
||||||
#include "mnode.h"
|
#include "mnode.h"
|
||||||
|
|
||||||
|
@ -37,12 +37,42 @@ extern "C" {
|
||||||
extern int32_t mDebugFlag;
|
extern int32_t mDebugFlag;
|
||||||
|
|
||||||
// mnode log function
|
// mnode log function
|
||||||
#define mFatal(...) { if (mDebugFlag & DEBUG_FATAL) { taosPrintLog("MND FATAL ", 255, __VA_ARGS__); }}
|
#define mFatal(...) \
|
||||||
#define mError(...) { if (mDebugFlag & DEBUG_ERROR) { taosPrintLog("MND ERROR ", 255, __VA_ARGS__); }}
|
{ \
|
||||||
#define mWarn(...) { if (mDebugFlag & DEBUG_WARN) { taosPrintLog("MND WARN ", 255, __VA_ARGS__); }}
|
if (mDebugFlag & DEBUG_FATAL) { \
|
||||||
#define mInfo(...) { if (mDebugFlag & DEBUG_INFO) { taosPrintLog("MND ", 255, __VA_ARGS__); }}
|
taosPrintLog("MND FATAL ", 255, __VA_ARGS__); \
|
||||||
#define mDebug(...) { if (mDebugFlag & DEBUG_DEBUG) { taosPrintLog("MND ", mDebugFlag, __VA_ARGS__); }}
|
} \
|
||||||
#define mTrace(...) { if (mDebugFlag & DEBUG_TRACE) { taosPrintLog("MND ", mDebugFlag, __VA_ARGS__); }}
|
}
|
||||||
|
#define mError(...) \
|
||||||
|
{ \
|
||||||
|
if (mDebugFlag & DEBUG_ERROR) { \
|
||||||
|
taosPrintLog("MND ERROR ", 255, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#define mWarn(...) \
|
||||||
|
{ \
|
||||||
|
if (mDebugFlag & DEBUG_WARN) { \
|
||||||
|
taosPrintLog("MND WARN ", 255, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#define mInfo(...) \
|
||||||
|
{ \
|
||||||
|
if (mDebugFlag & DEBUG_INFO) { \
|
||||||
|
taosPrintLog("MND ", 255, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#define mDebug(...) \
|
||||||
|
{ \
|
||||||
|
if (mDebugFlag & DEBUG_DEBUG) { \
|
||||||
|
taosPrintLog("MND ", mDebugFlag, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#define mTrace(...) \
|
||||||
|
{ \
|
||||||
|
if (mDebugFlag & DEBUG_TRACE) { \
|
||||||
|
taosPrintLog("MND ", mDebugFlag, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
MND_AUTH_ACCT_START = 0,
|
MND_AUTH_ACCT_START = 0,
|
||||||
|
@ -96,13 +126,13 @@ typedef struct {
|
||||||
ETrnPolicy policy;
|
ETrnPolicy policy;
|
||||||
int32_t code;
|
int32_t code;
|
||||||
int32_t failedTimes;
|
int32_t failedTimes;
|
||||||
void *rpcHandle;
|
void* rpcHandle;
|
||||||
void *rpcAHandle;
|
void* rpcAHandle;
|
||||||
SArray *redoLogs;
|
SArray* redoLogs;
|
||||||
SArray *undoLogs;
|
SArray* undoLogs;
|
||||||
SArray *commitLogs;
|
SArray* commitLogs;
|
||||||
SArray *redoActions;
|
SArray* redoActions;
|
||||||
SArray *undoActions;
|
SArray* undoActions;
|
||||||
} STrans;
|
} STrans;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -135,28 +165,28 @@ typedef struct {
|
||||||
ESyncState role;
|
ESyncState role;
|
||||||
int32_t roleTerm;
|
int32_t roleTerm;
|
||||||
int64_t roleTime;
|
int64_t roleTime;
|
||||||
SDnodeObj *pDnode;
|
SDnodeObj* pDnode;
|
||||||
} SMnodeObj;
|
} SMnodeObj;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t id;
|
int32_t id;
|
||||||
int64_t createdTime;
|
int64_t createdTime;
|
||||||
int64_t updateTime;
|
int64_t updateTime;
|
||||||
SDnodeObj *pDnode;
|
SDnodeObj* pDnode;
|
||||||
} SQnodeObj;
|
} SQnodeObj;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t id;
|
int32_t id;
|
||||||
int64_t createdTime;
|
int64_t createdTime;
|
||||||
int64_t updateTime;
|
int64_t updateTime;
|
||||||
SDnodeObj *pDnode;
|
SDnodeObj* pDnode;
|
||||||
} SSnodeObj;
|
} SSnodeObj;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t id;
|
int32_t id;
|
||||||
int64_t createdTime;
|
int64_t createdTime;
|
||||||
int64_t updateTime;
|
int64_t updateTime;
|
||||||
SDnodeObj *pDnode;
|
SDnodeObj* pDnode;
|
||||||
} SBnodeObj;
|
} SBnodeObj;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -201,7 +231,7 @@ typedef struct {
|
||||||
int64_t updateTime;
|
int64_t updateTime;
|
||||||
int8_t superUser;
|
int8_t superUser;
|
||||||
int32_t acctId;
|
int32_t acctId;
|
||||||
SHashObj *prohibitDbHash;
|
SHashObj* prohibitDbHash;
|
||||||
} SUserObj;
|
} SUserObj;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -272,7 +302,7 @@ typedef struct {
|
||||||
int32_t numOfColumns;
|
int32_t numOfColumns;
|
||||||
int32_t numOfTags;
|
int32_t numOfTags;
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
SSchema *pSchema;
|
SSchema* pSchema;
|
||||||
} SStbObj;
|
} SStbObj;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -287,8 +317,9 @@ typedef struct {
|
||||||
int64_t signature;
|
int64_t signature;
|
||||||
int32_t commentSize;
|
int32_t commentSize;
|
||||||
int32_t codeSize;
|
int32_t codeSize;
|
||||||
char *pComment;
|
char* pComment;
|
||||||
char *pCode;
|
char* pCode;
|
||||||
|
char pData[];
|
||||||
} SFuncObj;
|
} SFuncObj;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -300,8 +331,8 @@ typedef struct {
|
||||||
int32_t numOfRows;
|
int32_t numOfRows;
|
||||||
int32_t numOfReads;
|
int32_t numOfReads;
|
||||||
int32_t payloadLen;
|
int32_t payloadLen;
|
||||||
void *pIter;
|
void* pIter;
|
||||||
SMnode *pMnode;
|
SMnode* pMnode;
|
||||||
char db[TSDB_DB_FNAME_LEN];
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
int16_t offset[TSDB_MAX_COLUMNS];
|
int16_t offset[TSDB_MAX_COLUMNS];
|
||||||
int32_t bytes[TSDB_MAX_COLUMNS];
|
int32_t bytes[TSDB_MAX_COLUMNS];
|
||||||
|
@ -327,6 +358,7 @@ typedef struct SMqTopicConsumer {
|
||||||
|
|
||||||
typedef struct SMqConsumerEp {
|
typedef struct SMqConsumerEp {
|
||||||
int32_t vgId; // -1 for unassigned
|
int32_t vgId; // -1 for unassigned
|
||||||
|
int32_t status;
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
int64_t consumerId; // -1 for unassigned
|
int64_t consumerId; // -1 for unassigned
|
||||||
int64_t lastConsumerHbTs;
|
int64_t lastConsumerHbTs;
|
||||||
|
@ -338,6 +370,7 @@ typedef struct SMqConsumerEp {
|
||||||
static FORCE_INLINE int32_t tEncodeSMqConsumerEp(void** buf, SMqConsumerEp* pConsumerEp) {
|
static FORCE_INLINE int32_t tEncodeSMqConsumerEp(void** buf, SMqConsumerEp* pConsumerEp) {
|
||||||
int32_t tlen = 0;
|
int32_t tlen = 0;
|
||||||
tlen += taosEncodeFixedI32(buf, pConsumerEp->vgId);
|
tlen += taosEncodeFixedI32(buf, pConsumerEp->vgId);
|
||||||
|
tlen += taosEncodeFixedI32(buf, pConsumerEp->status);
|
||||||
tlen += taosEncodeSEpSet(buf, &pConsumerEp->epSet);
|
tlen += taosEncodeSEpSet(buf, &pConsumerEp->epSet);
|
||||||
tlen += taosEncodeFixedI64(buf, pConsumerEp->consumerId);
|
tlen += taosEncodeFixedI64(buf, pConsumerEp->consumerId);
|
||||||
tlen += tEncodeSSubQueryMsg(buf, &pConsumerEp->qExec);
|
tlen += tEncodeSSubQueryMsg(buf, &pConsumerEp->qExec);
|
||||||
|
@ -346,6 +379,7 @@ static FORCE_INLINE int32_t tEncodeSMqConsumerEp(void** buf, SMqConsumerEp* pCon
|
||||||
|
|
||||||
static FORCE_INLINE void* tDecodeSMqConsumerEp(void** buf, SMqConsumerEp* pConsumerEp) {
|
static FORCE_INLINE void* tDecodeSMqConsumerEp(void** buf, SMqConsumerEp* pConsumerEp) {
|
||||||
buf = taosDecodeFixedI32(buf, &pConsumerEp->vgId);
|
buf = taosDecodeFixedI32(buf, &pConsumerEp->vgId);
|
||||||
|
buf = taosDecodeFixedI32(buf, &pConsumerEp->status);
|
||||||
buf = taosDecodeSEpSet(buf, &pConsumerEp->epSet);
|
buf = taosDecodeSEpSet(buf, &pConsumerEp->epSet);
|
||||||
buf = taosDecodeFixedI64(buf, &pConsumerEp->consumerId);
|
buf = taosDecodeFixedI64(buf, &pConsumerEp->consumerId);
|
||||||
buf = tDecodeSSubQueryMsg(buf, &pConsumerEp->qExec);
|
buf = tDecodeSSubQueryMsg(buf, &pConsumerEp->qExec);
|
||||||
|
@ -353,15 +387,16 @@ static FORCE_INLINE void* tDecodeSMqConsumerEp(void** buf, SMqConsumerEp* pConsu
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
//unit for rebalance
|
// unit for rebalance
|
||||||
typedef struct SMqSubscribeObj {
|
typedef struct SMqSubscribeObj {
|
||||||
char key[TSDB_SUBSCRIBE_KEY_LEN];
|
char key[TSDB_SUBSCRIBE_KEY_LEN];
|
||||||
int32_t epoch;
|
int32_t epoch;
|
||||||
//TODO: replace with priority queue
|
// TODO: replace with priority queue
|
||||||
int32_t nextConsumerIdx;
|
int32_t nextConsumerIdx;
|
||||||
SArray* availConsumer; // SArray<int64_t> (consumerId)
|
SArray* availConsumer; // SArray<int64_t> (consumerId)
|
||||||
SArray* assigned; // SArray<SMqConsumerEp>
|
SArray* assigned; // SArray<SMqConsumerEp>
|
||||||
SArray* unassignedConsumer; // SArray<SMqConsumerEp>
|
SArray* idleConsumer; // SArray<SMqConsumerEp>
|
||||||
|
SArray* lostConsumer; // SArray<SMqConsumerEp>
|
||||||
SArray* unassignedVg; // SArray<SMqConsumerEp>
|
SArray* unassignedVg; // SArray<SMqConsumerEp>
|
||||||
} SMqSubscribeObj;
|
} SMqSubscribeObj;
|
||||||
|
|
||||||
|
@ -383,17 +418,17 @@ static FORCE_INLINE SMqSubscribeObj* tNewSubscribeObj() {
|
||||||
free(pSub);
|
free(pSub);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
pSub->unassignedConsumer = taosArrayInit(0, sizeof(SMqConsumerEp));
|
pSub->idleConsumer = taosArrayInit(0, sizeof(SMqConsumerEp));
|
||||||
if (pSub->assigned == NULL) {
|
if (pSub->assigned == NULL) {
|
||||||
taosArrayDestroy(pSub->availConsumer);
|
taosArrayDestroy(pSub->availConsumer);
|
||||||
taosArrayDestroy(pSub->unassignedConsumer);
|
taosArrayDestroy(pSub->idleConsumer);
|
||||||
free(pSub);
|
free(pSub);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
pSub->unassignedVg = taosArrayInit(0, sizeof(SMqConsumerEp));
|
pSub->unassignedVg = taosArrayInit(0, sizeof(SMqConsumerEp));
|
||||||
if (pSub->assigned == NULL) {
|
if (pSub->assigned == NULL) {
|
||||||
taosArrayDestroy(pSub->availConsumer);
|
taosArrayDestroy(pSub->availConsumer);
|
||||||
taosArrayDestroy(pSub->unassignedConsumer);
|
taosArrayDestroy(pSub->idleConsumer);
|
||||||
taosArrayDestroy(pSub->unassignedVg);
|
taosArrayDestroy(pSub->unassignedVg);
|
||||||
free(pSub);
|
free(pSub);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -421,10 +456,10 @@ static FORCE_INLINE int32_t tEncodeSubscribeObj(void** buf, const SMqSubscribeOb
|
||||||
tlen += tEncodeSMqConsumerEp(buf, pCEp);
|
tlen += tEncodeSMqConsumerEp(buf, pCEp);
|
||||||
}
|
}
|
||||||
|
|
||||||
sz = taosArrayGetSize(pSub->unassignedConsumer);
|
sz = taosArrayGetSize(pSub->idleConsumer);
|
||||||
tlen += taosEncodeFixedI32(buf, sz);
|
tlen += taosEncodeFixedI32(buf, sz);
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
SMqConsumerEp* pCEp = taosArrayGet(pSub->unassignedConsumer, i);
|
SMqConsumerEp* pCEp = taosArrayGet(pSub->idleConsumer, i);
|
||||||
tlen += tEncodeSMqConsumerEp(buf, pCEp);
|
tlen += tEncodeSMqConsumerEp(buf, pCEp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -456,22 +491,22 @@ static FORCE_INLINE void* tDecodeSubscribeObj(void* buf, SMqSubscribeObj* pSub)
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
pSub->unassignedConsumer = taosArrayInit(sz, sizeof(SMqConsumerEp));
|
pSub->idleConsumer = taosArrayInit(sz, sizeof(SMqConsumerEp));
|
||||||
if (pSub->unassignedConsumer == NULL) {
|
if (pSub->idleConsumer == NULL) {
|
||||||
taosArrayDestroy(pSub->assigned);
|
taosArrayDestroy(pSub->assigned);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
SMqConsumerEp cEp;
|
SMqConsumerEp cEp;
|
||||||
buf = tDecodeSMqConsumerEp(buf, &cEp);
|
buf = tDecodeSMqConsumerEp(buf, &cEp);
|
||||||
taosArrayPush(pSub->unassignedConsumer, &cEp);
|
taosArrayPush(pSub->idleConsumer, &cEp);
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
pSub->unassignedVg = taosArrayInit(sz, sizeof(SMqConsumerEp));
|
pSub->unassignedVg = taosArrayInit(sz, sizeof(SMqConsumerEp));
|
||||||
if (pSub->unassignedVg == NULL) {
|
if (pSub->unassignedVg == NULL) {
|
||||||
taosArrayDestroy(pSub->assigned);
|
taosArrayDestroy(pSub->assigned);
|
||||||
taosArrayDestroy(pSub->unassignedConsumer);
|
taosArrayDestroy(pSub->idleConsumer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
@ -486,8 +521,8 @@ static FORCE_INLINE void* tDecodeSubscribeObj(void* buf, SMqSubscribeObj* pSub)
|
||||||
typedef struct SMqCGroup {
|
typedef struct SMqCGroup {
|
||||||
char name[TSDB_CONSUMER_GROUP_LEN];
|
char name[TSDB_CONSUMER_GROUP_LEN];
|
||||||
int32_t status; // 0 - uninitialized, 1 - wait rebalance, 2- normal
|
int32_t status; // 0 - uninitialized, 1 - wait rebalance, 2- normal
|
||||||
SList *consumerIds; // SList<int64_t>
|
SList* consumerIds; // SList<int64_t>
|
||||||
SList *idleVGroups; // SList<int32_t>
|
SList* idleVGroups; // SList<int32_t>
|
||||||
} SMqCGroup;
|
} SMqCGroup;
|
||||||
|
|
||||||
typedef struct SMqTopicObj {
|
typedef struct SMqTopicObj {
|
||||||
|
@ -500,24 +535,23 @@ typedef struct SMqTopicObj {
|
||||||
int32_t version;
|
int32_t version;
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
int32_t sqlLen;
|
int32_t sqlLen;
|
||||||
char *sql;
|
char* sql;
|
||||||
char *logicalPlan;
|
char* logicalPlan;
|
||||||
char *physicalPlan;
|
char* physicalPlan;
|
||||||
//SHashObj *cgroups; // SHashObj<SMqCGroup>
|
// SHashObj *cgroups; // SHashObj<SMqCGroup>
|
||||||
//SHashObj *consumers; // SHashObj<SMqConsumerObj>
|
// SHashObj *consumers; // SHashObj<SMqConsumerObj>
|
||||||
} SMqTopicObj;
|
} SMqTopicObj;
|
||||||
|
|
||||||
// TODO: add cache and change name to id
|
// TODO: add cache and change name to id
|
||||||
typedef struct SMqConsumerTopic {
|
typedef struct SMqConsumerTopic {
|
||||||
char name[TSDB_TOPIC_FNAME_LEN];
|
char name[TSDB_TOPIC_FNAME_LEN];
|
||||||
int32_t epoch;
|
int32_t epoch;
|
||||||
//TODO: replace with something with ep
|
// vg assigned to the consumer on the topic
|
||||||
//SList *vgroups; // SList<int32_t>
|
SArray* pVgInfo; // SArray<int32_t>
|
||||||
//vg assigned to the consumer on the topic
|
|
||||||
SArray *pVgInfo; // SArray<int32_t>
|
|
||||||
} SMqConsumerTopic;
|
} SMqConsumerTopic;
|
||||||
|
|
||||||
static FORCE_INLINE SMqConsumerTopic* tNewConsumerTopic(int64_t consumerId, SMqTopicObj* pTopic, SMqSubscribeObj* pSub) {
|
static FORCE_INLINE SMqConsumerTopic* tNewConsumerTopic(int64_t consumerId, SMqTopicObj* pTopic,
|
||||||
|
SMqSubscribeObj* pSub) {
|
||||||
SMqConsumerTopic* pCTopic = malloc(sizeof(SMqConsumerTopic));
|
SMqConsumerTopic* pCTopic = malloc(sizeof(SMqConsumerTopic));
|
||||||
if (pCTopic == NULL) {
|
if (pCTopic == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -566,10 +600,11 @@ static FORCE_INLINE void* tDecodeSMqConsumerTopic(void* buf, SMqConsumerTopic* p
|
||||||
|
|
||||||
typedef struct SMqConsumerObj {
|
typedef struct SMqConsumerObj {
|
||||||
int64_t consumerId;
|
int64_t consumerId;
|
||||||
|
int64_t connId;
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
char cgroup[TSDB_CONSUMER_GROUP_LEN];
|
char cgroup[TSDB_CONSUMER_GROUP_LEN];
|
||||||
SArray *topics; // SArray<SMqConsumerTopic>
|
SArray* topics; // SArray<SMqConsumerTopic>
|
||||||
//SHashObj *topicHash; //SHashObj<SMqTopicObj>
|
// SHashObj *topicHash; //SHashObj<SMqTopicObj>
|
||||||
} SMqConsumerObj;
|
} SMqConsumerObj;
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeSMqConsumerObj(void** buf, const SMqConsumerObj* pConsumer) {
|
static FORCE_INLINE int32_t tEncodeSMqConsumerObj(void** buf, const SMqConsumerObj* pConsumer) {
|
||||||
|
@ -601,12 +636,12 @@ static FORCE_INLINE void* tDecodeSMqConsumerObj(void* buf, SMqConsumerObj* pCons
|
||||||
|
|
||||||
typedef struct SMqSubConsumerObj {
|
typedef struct SMqSubConsumerObj {
|
||||||
int64_t consumerUid; // if -1, unassigned
|
int64_t consumerUid; // if -1, unassigned
|
||||||
SList *vgId; // SList<int32_t>
|
SList* vgId; // SList<int32_t>
|
||||||
} SMqSubConsumerObj;
|
} SMqSubConsumerObj;
|
||||||
|
|
||||||
typedef struct SMqSubCGroupObj {
|
typedef struct SMqSubCGroupObj {
|
||||||
char name[TSDB_CONSUMER_GROUP_LEN];
|
char name[TSDB_CONSUMER_GROUP_LEN];
|
||||||
SList *consumers; // SList<SMqConsumerObj>
|
SList* consumers; // SList<SMqConsumerObj>
|
||||||
} SMqSubCGroupObj;
|
} SMqSubCGroupObj;
|
||||||
|
|
||||||
typedef struct SMqSubTopicObj {
|
typedef struct SMqSubTopicObj {
|
||||||
|
@ -619,30 +654,30 @@ typedef struct SMqSubTopicObj {
|
||||||
int32_t version;
|
int32_t version;
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
int32_t sqlLen;
|
int32_t sqlLen;
|
||||||
char *sql;
|
char* sql;
|
||||||
char *logicalPlan;
|
char* logicalPlan;
|
||||||
char *physicalPlan;
|
char* physicalPlan;
|
||||||
SList *cgroups; // SList<SMqSubCGroupObj>
|
SList* cgroups; // SList<SMqSubCGroupObj>
|
||||||
} SMqSubTopicObj;
|
} SMqSubTopicObj;
|
||||||
|
|
||||||
typedef struct SMqConsumerSubObj {
|
typedef struct SMqConsumerSubObj {
|
||||||
int64_t topicUid;
|
int64_t topicUid;
|
||||||
SList *vgIds; // SList<int64_t>
|
SList* vgIds; // SList<int64_t>
|
||||||
} SMqConsumerSubObj;
|
} SMqConsumerSubObj;
|
||||||
|
|
||||||
typedef struct SMqConsumerHbObj {
|
typedef struct SMqConsumerHbObj {
|
||||||
int64_t consumerId;
|
int64_t consumerId;
|
||||||
SList *consumerSubs; // SList<SMqConsumerSubObj>
|
SList* consumerSubs; // SList<SMqConsumerSubObj>
|
||||||
} SMqConsumerHbObj;
|
} SMqConsumerHbObj;
|
||||||
|
|
||||||
typedef struct SMqVGroupSubObj {
|
typedef struct SMqVGroupSubObj {
|
||||||
int64_t topicUid;
|
int64_t topicUid;
|
||||||
SList *consumerIds; // SList<int64_t>
|
SList* consumerIds; // SList<int64_t>
|
||||||
} SMqVGroupSubObj;
|
} SMqVGroupSubObj;
|
||||||
|
|
||||||
typedef struct SMqVGroupHbObj {
|
typedef struct SMqVGroupHbObj {
|
||||||
int64_t vgId;
|
int64_t vgId;
|
||||||
SList *vgSubs; // SList<SMqVGroupSubObj>
|
SList* vgSubs; // SList<SMqVGroupSubObj>
|
||||||
} SMqVGroupHbObj;
|
} SMqVGroupHbObj;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -662,11 +697,11 @@ typedef struct SMnodeMsg {
|
||||||
char user[TSDB_USER_LEN];
|
char user[TSDB_USER_LEN];
|
||||||
char db[TSDB_DB_FNAME_LEN];
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
int32_t acctId;
|
int32_t acctId;
|
||||||
SMnode *pMnode;
|
SMnode* pMnode;
|
||||||
int64_t createdTime;
|
int64_t createdTime;
|
||||||
SRpcMsg rpcMsg;
|
SRpcMsg rpcMsg;
|
||||||
int32_t contLen;
|
int32_t contLen;
|
||||||
void *pCont;
|
void* pCont;
|
||||||
} SMnodeMsg;
|
} SMnodeMsg;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -234,7 +234,7 @@ int32_t mndGetDnodeSize(SMnode *pMnode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool mndIsDnodeOnline(SMnode *pMnode, SDnodeObj *pDnode, int64_t curMs) {
|
bool mndIsDnodeOnline(SMnode *pMnode, SDnodeObj *pDnode, int64_t curMs) {
|
||||||
int64_t interval = ABS(pDnode->lastAccessTime - curMs);
|
int64_t interval = TABS(pDnode->lastAccessTime - curMs);
|
||||||
if (interval > 3500 * pMnode->cfg.statusInterval) {
|
if (interval > 3500 * pMnode->cfg.statusInterval) {
|
||||||
if (pDnode->rebootTime > 0) {
|
if (pDnode->rebootTime > 0) {
|
||||||
pDnode->offlineReason = DND_REASON_STATUS_MSG_TIMEOUT;
|
pDnode->offlineReason = DND_REASON_STATUS_MSG_TIMEOUT;
|
||||||
|
|
|
@ -261,7 +261,7 @@ static int32_t mndSaveQueryStreamList(SConnObj *pConn, SHeartBeatReq *pReq) {
|
||||||
pConn->pQueries = calloc(sizeof(SQueryDesc), QUERY_SAVE_SIZE);
|
pConn->pQueries = calloc(sizeof(SQueryDesc), QUERY_SAVE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
pConn->numOfQueries = MIN(QUERY_SAVE_SIZE, numOfQueries);
|
pConn->numOfQueries = TMIN(QUERY_SAVE_SIZE, numOfQueries);
|
||||||
|
|
||||||
int32_t saveSize = pConn->numOfQueries * sizeof(SQueryDesc);
|
int32_t saveSize = pConn->numOfQueries * sizeof(SQueryDesc);
|
||||||
if (saveSize > 0 && pConn->pQueries != NULL) {
|
if (saveSize > 0 && pConn->pQueries != NULL) {
|
||||||
|
|
|
@ -98,7 +98,8 @@ static int32_t mndProcessMqTimerMsg(SMnodeMsg *pMsg) {
|
||||||
// build msg
|
// build msg
|
||||||
SMqSetCVgReq req = {
|
SMqSetCVgReq req = {
|
||||||
.vgId = pCEp->vgId,
|
.vgId = pCEp->vgId,
|
||||||
.consumerId = consumerId,
|
.oldConsumerId = -1,
|
||||||
|
.newConsumerId = consumerId,
|
||||||
};
|
};
|
||||||
strcpy(req.cgroup, cgroup);
|
strcpy(req.cgroup, cgroup);
|
||||||
strcpy(req.topicName, topic);
|
strcpy(req.topicName, topic);
|
||||||
|
@ -152,6 +153,7 @@ static int mndInitUnassignedVg(SMnode *pMnode, SMqTopicObj *pTopic, SArray *unas
|
||||||
//convert dag to msg
|
//convert dag to msg
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
SMqConsumerEp CEp;
|
SMqConsumerEp CEp;
|
||||||
|
CEp.status = 0;
|
||||||
CEp.lastConsumerHbTs = CEp.lastVgHbTs = -1;
|
CEp.lastConsumerHbTs = CEp.lastVgHbTs = -1;
|
||||||
STaskInfo* pTaskInfo = taosArrayGet(pArray, i);
|
STaskInfo* pTaskInfo = taosArrayGet(pArray, i);
|
||||||
tConvertQueryAddrToEpSet(&CEp.epSet, &pTaskInfo->addr);
|
tConvertQueryAddrToEpSet(&CEp.epSet, &pTaskInfo->addr);
|
||||||
|
@ -171,7 +173,8 @@ static int mndBuildMqSetConsumerVgReq(SMnode *pMnode, STrans *pTrans, SMqConsume
|
||||||
SVgObj *pVgObj = mndAcquireVgroup(pMnode, vgId);
|
SVgObj *pVgObj = mndAcquireVgroup(pMnode, vgId);
|
||||||
SMqSetCVgReq req = {
|
SMqSetCVgReq req = {
|
||||||
.vgId = vgId,
|
.vgId = vgId,
|
||||||
.consumerId = pConsumer->consumerId,
|
.oldConsumerId = -1,
|
||||||
|
.newConsumerId = pConsumer->consumerId,
|
||||||
};
|
};
|
||||||
strcpy(req.cgroup, pConsumer->cgroup);
|
strcpy(req.cgroup, pConsumer->cgroup);
|
||||||
strcpy(req.topicName, pTopic->name);
|
strcpy(req.topicName, pTopic->name);
|
||||||
|
@ -451,12 +454,13 @@ static int32_t mndProcessSubscribeReq(SMnodeMsg *pMsg) {
|
||||||
|
|
||||||
SMqTopicObj *pTopic = mndAcquireTopic(pMnode, newTopicName);
|
SMqTopicObj *pTopic = mndAcquireTopic(pMnode, newTopicName);
|
||||||
if (pTopic == NULL) {
|
if (pTopic == NULL) {
|
||||||
/*terrno = */
|
mError("topic being subscribed not exist: %s", newTopicName);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SMqSubscribeObj *pSub = mndAcquireSubscribe(pMnode, consumerGroup, newTopicName);
|
SMqSubscribeObj *pSub = mndAcquireSubscribe(pMnode, consumerGroup, newTopicName);
|
||||||
if (pSub == NULL) {
|
if (pSub == NULL) {
|
||||||
|
mDebug("create new subscription, group: %s, topic %s", consumerGroup, newTopicName);
|
||||||
pSub = tNewSubscribeObj();
|
pSub = tNewSubscribeObj();
|
||||||
if (pSub == NULL) {
|
if (pSub == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -464,14 +468,15 @@ static int32_t mndProcessSubscribeReq(SMnodeMsg *pMsg) {
|
||||||
}
|
}
|
||||||
// set unassigned vg
|
// set unassigned vg
|
||||||
mndInitUnassignedVg(pMnode, pTopic, pSub->unassignedVg);
|
mndInitUnassignedVg(pMnode, pTopic, pSub->unassignedVg);
|
||||||
|
//TODO: disable alter
|
||||||
}
|
}
|
||||||
taosArrayPush(pSub->availConsumer, &consumerId);
|
taosArrayPush(pSub->availConsumer, &consumerId);
|
||||||
|
|
||||||
// TODO: no need
|
|
||||||
SMqConsumerTopic *pConsumerTopic = tNewConsumerTopic(consumerId, pTopic, pSub);
|
SMqConsumerTopic *pConsumerTopic = tNewConsumerTopic(consumerId, pTopic, pSub);
|
||||||
taosArrayPush(pConsumer->topics, pConsumerTopic);
|
taosArrayPush(pConsumer->topics, pConsumerTopic);
|
||||||
|
|
||||||
if (taosArrayGetSize(pConsumerTopic->pVgInfo) > 0) {
|
if (taosArrayGetSize(pConsumerTopic->pVgInfo) > 0) {
|
||||||
|
ASSERT(taosArrayGetSize(pConsumerTopic->pVgInfo) == 1);
|
||||||
int32_t vgId = *(int32_t *)taosArrayGetLast(pConsumerTopic->pVgInfo);
|
int32_t vgId = *(int32_t *)taosArrayGetLast(pConsumerTopic->pVgInfo);
|
||||||
// send setmsg to vnode
|
// send setmsg to vnode
|
||||||
if (mndBuildMqSetConsumerVgReq(pMnode, pTrans, pConsumer, pConsumerTopic, pTopic) < 0) {
|
if (mndBuildMqSetConsumerVgReq(pMnode, pTrans, pConsumer, pConsumerTopic, pTopic) < 0) {
|
||||||
|
@ -479,8 +484,7 @@ static int32_t mndProcessSubscribeReq(SMnodeMsg *pMsg) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
taosArrayDestroy(pConsumerTopic->pVgInfo);
|
|
||||||
free(pConsumerTopic);
|
|
||||||
SSdbRaw *pRaw = mndSubActionEncode(pSub);
|
SSdbRaw *pRaw = mndSubActionEncode(pSub);
|
||||||
/*sdbSetRawStatus(pRaw, SDB_STATUS_READY);*/
|
/*sdbSetRawStatus(pRaw, SDB_STATUS_READY);*/
|
||||||
mndTransAppendRedolog(pTrans, pRaw);
|
mndTransAppendRedolog(pTrans, pRaw);
|
||||||
|
@ -533,12 +537,12 @@ static int32_t mndProcessSubscribeReq(SMnodeMsg *pMsg) {
|
||||||
|
|
||||||
if (mndTransPrepare(pMnode, pTrans) != 0) {
|
if (mndTransPrepare(pMnode, pTrans) != 0) {
|
||||||
mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
|
mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
|
||||||
|
if (newSub) taosArrayDestroy(newSub);
|
||||||
mndTransDrop(pTrans);
|
mndTransDrop(pTrans);
|
||||||
mndReleaseConsumer(pMnode, pConsumer);
|
mndReleaseConsumer(pMnode, pConsumer);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: free memory
|
|
||||||
if (newSub) taosArrayDestroy(newSub);
|
if (newSub) taosArrayDestroy(newSub);
|
||||||
mndTransDrop(pTrans);
|
mndTransDrop(pTrans);
|
||||||
mndReleaseConsumer(pMnode, pConsumer);
|
mndReleaseConsumer(pMnode, pConsumer);
|
||||||
|
|
|
@ -56,7 +56,7 @@ static int32_t mndRestoreWal(SMnode *pMnode) {
|
||||||
int64_t last = walGetLastVer(pWal);
|
int64_t last = walGetLastVer(pWal);
|
||||||
mDebug("start to restore sdb wal, sdb ver:%" PRId64 ", wal first:%" PRId64 " last:%" PRId64, lastSdbVer, first, last);
|
mDebug("start to restore sdb wal, sdb ver:%" PRId64 ", wal first:%" PRId64 " last:%" PRId64, lastSdbVer, first, last);
|
||||||
|
|
||||||
first = MAX(lastSdbVer + 1, first);
|
first = TMAX(lastSdbVer + 1, first);
|
||||||
for (int64_t ver = first; ver >= 0 && ver <= last; ++ver) {
|
for (int64_t ver = first; ver >= 0 && ver <= last; ++ver) {
|
||||||
if (walReadWithHandle(pHandle, ver) < 0) {
|
if (walReadWithHandle(pHandle, ver) < 0) {
|
||||||
mError("failed to read by wal handle since %s, ver:%" PRId64, terrstr(), ver);
|
mError("failed to read by wal handle since %s, ver:%" PRId64, terrstr(), ver);
|
||||||
|
|
|
@ -459,7 +459,7 @@ static bool mndGetVgroupMaxReplicaFp(SMnode *pMnode, void *pObj, void *p1, void
|
||||||
int32_t *pNumOfVgroups = p3;
|
int32_t *pNumOfVgroups = p3;
|
||||||
|
|
||||||
if (pVgroup->dbUid == uid) {
|
if (pVgroup->dbUid == uid) {
|
||||||
*pReplica = MAX(*pReplica, pVgroup->replica);
|
*pReplica = TMAX(*pReplica, pVgroup->replica);
|
||||||
(*pNumOfVgroups)++;
|
(*pNumOfVgroups)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -163,10 +163,10 @@ static int32_t sdbInsertRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSdb->keyTypes[pRow->type] == SDB_KEY_INT32) {
|
if (pSdb->keyTypes[pRow->type] == SDB_KEY_INT32) {
|
||||||
pSdb->maxId[pRow->type] = MAX(pSdb->maxId[pRow->type], *((int32_t *)pRow->pObj));
|
pSdb->maxId[pRow->type] = TMAX(pSdb->maxId[pRow->type], *((int32_t *)pRow->pObj));
|
||||||
}
|
}
|
||||||
if (pSdb->keyTypes[pRow->type] == SDB_KEY_INT64) {
|
if (pSdb->keyTypes[pRow->type] == SDB_KEY_INT64) {
|
||||||
pSdb->maxId[pRow->type] = MAX(pSdb->maxId[pRow->type], *((int32_t *)pRow->pObj));
|
pSdb->maxId[pRow->type] = TMAX(pSdb->maxId[pRow->type], *((int32_t *)pRow->pObj));
|
||||||
}
|
}
|
||||||
pSdb->tableVer[pRow->type]++;
|
pSdb->tableVer[pRow->type]++;
|
||||||
|
|
||||||
|
@ -421,13 +421,13 @@ int32_t sdbGetMaxId(SSdb *pSdb, ESdbType type) {
|
||||||
while (ppRow != NULL) {
|
while (ppRow != NULL) {
|
||||||
SSdbRow *pRow = *ppRow;
|
SSdbRow *pRow = *ppRow;
|
||||||
int32_t id = *(int32_t *)pRow->pObj;
|
int32_t id = *(int32_t *)pRow->pObj;
|
||||||
maxId = MAX(id, maxId);
|
maxId = TMAX(id, maxId);
|
||||||
ppRow = taosHashIterate(hash, ppRow);
|
ppRow = taosHashIterate(hash, ppRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosRUnLockLatch(pLock);
|
taosRUnLockLatch(pLock);
|
||||||
|
|
||||||
maxId = MAX(maxId, pSdb->maxId[type]);
|
maxId = TMAX(maxId, pSdb->maxId[type]);
|
||||||
return maxId + 1;
|
return maxId + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "executor.h"
|
#include "executor.h"
|
||||||
#include "vnode.h"
|
|
||||||
#include "mallocator.h"
|
#include "mallocator.h"
|
||||||
#include "meta.h"
|
#include "meta.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
@ -29,6 +28,7 @@
|
||||||
#include "trpc.h"
|
#include "trpc.h"
|
||||||
#include "ttimer.h"
|
#include "ttimer.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
#include "vnode.h"
|
||||||
#include "wal.h"
|
#include "wal.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -153,6 +153,7 @@ typedef struct STqTaskItem {
|
||||||
int64_t offset;
|
int64_t offset;
|
||||||
void* dst;
|
void* dst;
|
||||||
qTaskInfo_t task;
|
qTaskInfo_t task;
|
||||||
|
SSubQueryMsg* pQueryMsg;
|
||||||
} STqTaskItem;
|
} STqTaskItem;
|
||||||
|
|
||||||
// new version
|
// new version
|
||||||
|
@ -164,7 +165,6 @@ typedef struct STqBuffer {
|
||||||
|
|
||||||
typedef struct STqTopicHandle {
|
typedef struct STqTopicHandle {
|
||||||
char topicName[TSDB_TOPIC_FNAME_LEN];
|
char topicName[TSDB_TOPIC_FNAME_LEN];
|
||||||
char cgroup[TSDB_TOPIC_FNAME_LEN];
|
|
||||||
char* sql;
|
char* sql;
|
||||||
char* logicalPlan;
|
char* logicalPlan;
|
||||||
char* physicalPlan;
|
char* physicalPlan;
|
||||||
|
@ -177,6 +177,7 @@ typedef struct STqTopicHandle {
|
||||||
typedef struct STqConsumerHandle {
|
typedef struct STqConsumerHandle {
|
||||||
int64_t consumerId;
|
int64_t consumerId;
|
||||||
int64_t epoch;
|
int64_t epoch;
|
||||||
|
char cgroup[TSDB_TOPIC_FNAME_LEN];
|
||||||
SArray* topics; // SArray<STqClientTopic>
|
SArray* topics; // SArray<STqClientTopic>
|
||||||
} STqConsumerHandle;
|
} STqConsumerHandle;
|
||||||
|
|
||||||
|
@ -318,7 +319,7 @@ int tqSendLaunchQuery(STqMsgItem*, int64_t offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp);
|
int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp);
|
||||||
int32_t tqProcessSetConnReq(STQ* pTq, SMqSetCVgReq* pReq);
|
int32_t tqProcessSetConnReq(STQ* pTq, char* msg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,8 +44,10 @@ extern int32_t tqDebugFlag;
|
||||||
// delete persistent storage for meta info
|
// delete persistent storage for meta info
|
||||||
// int tqDropTCGroup(STQ*, const char* topic, int cgId);
|
// int tqDropTCGroup(STQ*, const char* topic, int cgId);
|
||||||
|
|
||||||
int tqSerializeGroup(const STqGroup*, STqSerializedHead**);
|
//int tqSerializeGroup(const STqGroup*, STqSerializedHead**);
|
||||||
const void* tqDeserializeGroup(const STqSerializedHead* pHead, STqGroup** ppGroup);
|
//const void* tqDeserializeGroup(const STqSerializedHead* pHead, STqGroup** ppGroup);
|
||||||
|
int tqSerializeConsumer(const STqConsumerHandle*, STqSerializedHead**);
|
||||||
|
const void* tqDeserializeConsumer(const STqSerializedHead* pHead, STqConsumerHandle**);
|
||||||
static int FORCE_INLINE tqQueryExecuting(int32_t status) { return status; }
|
static int FORCE_INLINE tqQueryExecuting(int32_t status) { return status; }
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -587,7 +587,11 @@ char *metaTbCursorNext(SMTbCursor *pTbCur) {
|
||||||
pBuf = value.data;
|
pBuf = value.data;
|
||||||
metaDecodeTbInfo(pBuf, &tbCfg);
|
metaDecodeTbInfo(pBuf, &tbCfg);
|
||||||
if (tbCfg.type == META_SUPER_TABLE) {
|
if (tbCfg.type == META_SUPER_TABLE) {
|
||||||
|
free(tbCfg.name);
|
||||||
|
free(tbCfg.stbCfg.pTagSchema);
|
||||||
continue;
|
continue;
|
||||||
|
} else if (tbCfg.type == META_CHILD_TABLE) {
|
||||||
|
kvRowFree(tbCfg.ctbCfg.pTag);
|
||||||
}
|
}
|
||||||
return tbCfg.name;
|
return tbCfg.name;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -68,7 +68,7 @@ STQ* tqOpen(const char* path, SWal* pWal, SMeta* pMeta, STqCfg* tqConfig, SMemAl
|
||||||
// TODO: error code of buffer pool
|
// TODO: error code of buffer pool
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
pTq->tqMeta = tqStoreOpen(path, (FTqSerialize)tqSerializeGroup, (FTqDeserialize)tqDeserializeGroup, free, 0);
|
pTq->tqMeta = tqStoreOpen(path, (FTqSerialize)tqSerializeConsumer, (FTqDeserialize)tqDeserializeConsumer, free, 0);
|
||||||
if (pTq->tqMeta == NULL) {
|
if (pTq->tqMeta == NULL) {
|
||||||
free(pTq);
|
free(pTq);
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -81,6 +81,10 @@ STQ* tqOpen(const char* path, SWal* pWal, SMeta* pMeta, STqCfg* tqConfig, SMemAl
|
||||||
}
|
}
|
||||||
|
|
||||||
void tqClose(STQ* pTq) {
|
void tqClose(STQ* pTq) {
|
||||||
|
if (pTq) {
|
||||||
|
tfree(pTq->path);
|
||||||
|
free(pTq);
|
||||||
|
}
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -478,6 +482,59 @@ int tqConsume(STQ* pTq, STqConsumeReq* pMsg) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int tqSerializeConsumer(const STqConsumerHandle* pConsumer, STqSerializedHead** ppHead) {
|
||||||
|
int32_t num = taosArrayGetSize(pConsumer->topics);
|
||||||
|
int32_t sz = sizeof(STqSerializedHead) + sizeof(int64_t) * 2 + TSDB_TOPIC_FNAME_LEN + num * (sizeof(int64_t) + TSDB_TOPIC_FNAME_LEN);
|
||||||
|
if (sz > (*ppHead)->ssize) {
|
||||||
|
void* tmpPtr = realloc(*ppHead, sz);
|
||||||
|
if (tmpPtr == NULL) {
|
||||||
|
free(*ppHead);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
*ppHead = tmpPtr;
|
||||||
|
(*ppHead)->ssize = sz;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* ptr = (*ppHead)->content;
|
||||||
|
*(int64_t*)ptr = pConsumer->consumerId;
|
||||||
|
ptr = POINTER_SHIFT(ptr, sizeof(int64_t));
|
||||||
|
*(int64_t*)ptr = pConsumer->epoch;
|
||||||
|
ptr = POINTER_SHIFT(ptr, sizeof(int64_t));
|
||||||
|
memcpy(ptr, pConsumer->topics, TSDB_TOPIC_FNAME_LEN);
|
||||||
|
ptr = POINTER_SHIFT(ptr, TSDB_TOPIC_FNAME_LEN);
|
||||||
|
*(int32_t*)ptr = num;
|
||||||
|
ptr = POINTER_SHIFT(ptr, sizeof(int32_t));
|
||||||
|
for (int32_t i = 0; i < num; i++) {
|
||||||
|
STqTopicHandle* pTopic = taosArrayGet(pConsumer->topics, i);
|
||||||
|
memcpy(ptr, pTopic->topicName, TSDB_TOPIC_FNAME_LEN);
|
||||||
|
ptr = POINTER_SHIFT(ptr, TSDB_TOPIC_FNAME_LEN);
|
||||||
|
*(int64_t*)ptr = pTopic->committedOffset;
|
||||||
|
POINTER_SHIFT(ptr, sizeof(int64_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const void* tqDeserializeConsumer(const STqSerializedHead* pHead, STqConsumerHandle** ppConsumer) {
|
||||||
|
STqConsumerHandle* pConsumer = *ppConsumer;
|
||||||
|
const void* ptr = pHead->content;
|
||||||
|
pConsumer->consumerId = *(int64_t*)ptr;
|
||||||
|
ptr = POINTER_SHIFT(ptr, sizeof(int64_t));
|
||||||
|
pConsumer->epoch = *(int64_t*)ptr;
|
||||||
|
ptr = POINTER_SHIFT(ptr, sizeof(int64_t));
|
||||||
|
memcpy(pConsumer->cgroup, ptr, TSDB_TOPIC_FNAME_LEN);
|
||||||
|
ptr = POINTER_SHIFT(ptr, TSDB_TOPIC_FNAME_LEN);
|
||||||
|
int32_t sz = *(int32_t*)ptr;
|
||||||
|
ptr = POINTER_SHIFT(ptr, sizeof(int32_t));
|
||||||
|
pConsumer->topics = taosArrayInit(sz, sizeof(STqTopicHandle));
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
/*STqTopicHandle* topicHandle = */
|
||||||
|
/*taosArrayPush(pConsumer->topics, );*/
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
int tqSerializeGroup(const STqGroup* pGroup, STqSerializedHead** ppHead) {
|
int tqSerializeGroup(const STqGroup* pGroup, STqSerializedHead** ppHead) {
|
||||||
// calculate size
|
// calculate size
|
||||||
int sz = tqGroupSSize(pGroup) + sizeof(STqSerializedHead);
|
int sz = tqGroupSSize(pGroup) + sizeof(STqSerializedHead);
|
||||||
|
@ -608,6 +665,7 @@ int tqItemSSize() {
|
||||||
// mainly for executor
|
// mainly for executor
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp) {
|
int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp) {
|
||||||
SMqConsumeReq* pReq = pMsg->pCont;
|
SMqConsumeReq* pReq = pMsg->pCont;
|
||||||
|
@ -625,7 +683,14 @@ int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp) {
|
||||||
|
|
||||||
for (int i = 0; i < sz; i++) {
|
for (int i = 0; i < sz; i++) {
|
||||||
STqTopicHandle* pTopic = taosArrayGet(pConsumer->topics, i);
|
STqTopicHandle* pTopic = taosArrayGet(pConsumer->topics, i);
|
||||||
|
//TODO: support multiple topic in one req
|
||||||
|
if (strcmp(pTopic->topicName, pReq->topic) != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fetchOffset == -1) {
|
||||||
|
fetchOffset = pTopic->committedOffset + 1;
|
||||||
|
}
|
||||||
int8_t pos;
|
int8_t pos;
|
||||||
int8_t skip = 0;
|
int8_t skip = 0;
|
||||||
SWalHead* pHead;
|
SWalHead* pHead;
|
||||||
|
@ -670,6 +735,23 @@ int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (pDataBlock != NULL) {
|
if (pDataBlock != NULL) {
|
||||||
|
SMqTbData tbData = {
|
||||||
|
.uid = pDataBlock->info.uid,
|
||||||
|
.numOfCols = pDataBlock->info.numOfCols,
|
||||||
|
.numOfRows = pDataBlock->info.rows,
|
||||||
|
};
|
||||||
|
for (int i = 0; i < pDataBlock->info.numOfCols; i++) {
|
||||||
|
SColumnInfoData* pColData = taosArrayGet(pDataBlock->pDataBlock, i);
|
||||||
|
int32_t sz = pColData->info.bytes * pDataBlock->info.rows;
|
||||||
|
SMqColData colData = {
|
||||||
|
.bytes = pColData->info.bytes,
|
||||||
|
.colId = pColData->info.colId,
|
||||||
|
.type = pColData->info.type,
|
||||||
|
};
|
||||||
|
memcpy(colData.data, pColData->pData, colData.bytes * pDataBlock->info.rows);
|
||||||
|
memcpy(&tbData.colData[i], &colData, sz);
|
||||||
|
}
|
||||||
|
/*pDataBlock->info.*/
|
||||||
taosArrayPush(pRes, pDataBlock);
|
taosArrayPush(pRes, pDataBlock);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
|
@ -692,29 +774,34 @@ int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp) {
|
||||||
pTopic->buffer.lastOffset = pReq->offset;
|
pTopic->buffer.lastOffset = pReq->offset;
|
||||||
}
|
}
|
||||||
// put output into rsp
|
// put output into rsp
|
||||||
|
SMqConsumeRsp rsp = {
|
||||||
|
.consumerId = consumerId,
|
||||||
|
.numOfTopics = 1
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// launch query
|
|
||||||
// get result
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqProcessSetConnReq(STQ* pTq, SMqSetCVgReq* pReq) {
|
int32_t tqProcessSetConnReq(STQ* pTq, char* msg) {
|
||||||
|
SMqSetCVgReq req;
|
||||||
|
tDecodeSMqSetCVgReq(msg, &req);
|
||||||
STqConsumerHandle* pConsumer = calloc(sizeof(STqConsumerHandle), 1);
|
STqConsumerHandle* pConsumer = calloc(sizeof(STqConsumerHandle), 1);
|
||||||
if (pConsumer == NULL) {
|
if (pConsumer == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
strcpy(pConsumer->cgroup, req.cgroup);
|
||||||
|
pConsumer->topics = taosArrayInit(0, sizeof(STqTopicHandle));
|
||||||
|
|
||||||
STqTopicHandle* pTopic = calloc(sizeof(STqTopicHandle), 1);
|
STqTopicHandle* pTopic = calloc(sizeof(STqTopicHandle), 1);
|
||||||
if (pTopic == NULL) {
|
if (pTopic == NULL) {
|
||||||
free(pConsumer);
|
free(pConsumer);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
strcpy(pTopic->topicName, pReq->topicName);
|
strcpy(pTopic->topicName, req.topicName);
|
||||||
strcpy(pTopic->cgroup, pReq->cgroup);
|
strcpy(pTopic->sql, req.sql);
|
||||||
strcpy(pTopic->sql, pReq->sql);
|
strcpy(pTopic->logicalPlan, req.logicalPlan);
|
||||||
strcpy(pTopic->logicalPlan, pReq->logicalPlan);
|
strcpy(pTopic->physicalPlan, req.physicalPlan);
|
||||||
strcpy(pTopic->physicalPlan, pReq->physicalPlan);
|
|
||||||
|
|
||||||
pTopic->buffer.firstOffset = -1;
|
pTopic->buffer.firstOffset = -1;
|
||||||
pTopic->buffer.lastOffset = -1;
|
pTopic->buffer.lastOffset = -1;
|
||||||
|
@ -724,9 +811,9 @@ int32_t tqProcessSetConnReq(STQ* pTq, SMqSetCVgReq* pReq) {
|
||||||
for (int i = 0; i < TQ_BUFFER_SIZE; i++) {
|
for (int i = 0; i < TQ_BUFFER_SIZE; i++) {
|
||||||
pTopic->buffer.output[i].status = 0;
|
pTopic->buffer.output[i].status = 0;
|
||||||
STqReadHandle* pReadHandle = tqInitSubmitMsgScanner(pTq->pMeta);
|
STqReadHandle* pReadHandle = tqInitSubmitMsgScanner(pTq->pMeta);
|
||||||
pTopic->buffer.output[i].task = qCreateStreamExecTaskInfo(&pReq->msg, pReadHandle);
|
pTopic->buffer.output[i].task = qCreateStreamExecTaskInfo(&req.msg, pReadHandle);
|
||||||
}
|
}
|
||||||
// write mq meta
|
taosArrayPush(pConsumer->topics, pTopic);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -459,7 +459,7 @@ static int tsdbCompactMeta(STsdbRepo *pRepo) {
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (pReadh->pDCols[0]->numOfRows - ridx == 0) break;
|
if (pReadh->pDCols[0]->numOfRows - ridx == 0) break;
|
||||||
int rowsToMerge = MIN(pReadh->pDCols[0]->numOfRows - ridx, defaultRows - pComph->pDataCols->numOfRows);
|
int rowsToMerge = TMIN(pReadh->pDCols[0]->numOfRows - ridx, defaultRows - pComph->pDataCols->numOfRows);
|
||||||
|
|
||||||
tdMergeDataCols(pComph->pDataCols, pReadh->pDCols[0], rowsToMerge, &ridx, pCfg->update != TD_ROW_PARTIAL_UPDATE);
|
tdMergeDataCols(pComph->pDataCols, pReadh->pDCols[0], rowsToMerge, &ridx, pCfg->update != TD_ROW_PARTIAL_UPDATE);
|
||||||
|
|
||||||
|
|
|
@ -836,7 +836,7 @@ static int tsdbScanAndTryFixFS(STsdb *pRepo) {
|
||||||
// return -1;
|
// return -1;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// maxBufSize = MAX(maxBufSize, rInfo.size);
|
// maxBufSize = TMAX(maxBufSize, rInfo.size);
|
||||||
|
|
||||||
// if (tsdbSeekMFile(pMFile, rInfo.size, SEEK_CUR) < 0) {
|
// if (tsdbSeekMFile(pMFile, rInfo.size, SEEK_CUR) < 0) {
|
||||||
// tsdbError("vgId:%d failed to lseek file %s since %s", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pMFile),
|
// tsdbError("vgId:%d failed to lseek file %s since %s", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pMFile),
|
||||||
|
|
|
@ -153,8 +153,8 @@ int tsdbLoadDataFromCache(STable *pTable, SSkipListIterator *pIter, TSKEY maxKey
|
||||||
if (fKey == INT64_MAX && rowKey == INT64_MAX) break;
|
if (fKey == INT64_MAX && rowKey == INT64_MAX) break;
|
||||||
|
|
||||||
if (fKey < rowKey) {
|
if (fKey < rowKey) {
|
||||||
pMergeInfo->keyFirst = MIN(pMergeInfo->keyFirst, fKey);
|
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, fKey);
|
||||||
pMergeInfo->keyLast = MAX(pMergeInfo->keyLast, fKey);
|
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, fKey);
|
||||||
|
|
||||||
filterIter++;
|
filterIter++;
|
||||||
if (filterIter >= nFilterKeys) {
|
if (filterIter >= nFilterKeys) {
|
||||||
|
@ -170,8 +170,8 @@ int tsdbLoadDataFromCache(STable *pTable, SSkipListIterator *pIter, TSKEY maxKey
|
||||||
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
||||||
pMergeInfo->rowsInserted++;
|
pMergeInfo->rowsInserted++;
|
||||||
pMergeInfo->nOperations++;
|
pMergeInfo->nOperations++;
|
||||||
pMergeInfo->keyFirst = MIN(pMergeInfo->keyFirst, rowKey);
|
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, rowKey);
|
||||||
pMergeInfo->keyLast = MAX(pMergeInfo->keyLast, rowKey);
|
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, rowKey);
|
||||||
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,12 +196,12 @@ int tsdbLoadDataFromCache(STable *pTable, SSkipListIterator *pIter, TSKEY maxKey
|
||||||
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
||||||
pMergeInfo->rowsUpdated++;
|
pMergeInfo->rowsUpdated++;
|
||||||
pMergeInfo->nOperations++;
|
pMergeInfo->nOperations++;
|
||||||
pMergeInfo->keyFirst = MIN(pMergeInfo->keyFirst, rowKey);
|
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, rowKey);
|
||||||
pMergeInfo->keyLast = MAX(pMergeInfo->keyLast, rowKey);
|
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, rowKey);
|
||||||
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
||||||
} else {
|
} else {
|
||||||
pMergeInfo->keyFirst = MIN(pMergeInfo->keyFirst, fKey);
|
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, fKey);
|
||||||
pMergeInfo->keyLast = MAX(pMergeInfo->keyLast, fKey);
|
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, fKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -714,8 +714,8 @@ int tsdbLoadDataFromCache(STable *pTable, SSkipListIterator *pIter, TSKEY maxKey
|
||||||
if (fKey == INT64_MAX && rowKey == INT64_MAX) break;
|
if (fKey == INT64_MAX && rowKey == INT64_MAX) break;
|
||||||
|
|
||||||
if (fKey < rowKey) {
|
if (fKey < rowKey) {
|
||||||
pMergeInfo->keyFirst = MIN(pMergeInfo->keyFirst, fKey);
|
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, fKey);
|
||||||
pMergeInfo->keyLast = MAX(pMergeInfo->keyLast, fKey);
|
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, fKey);
|
||||||
|
|
||||||
filterIter++;
|
filterIter++;
|
||||||
if (filterIter >= nFilterKeys) {
|
if (filterIter >= nFilterKeys) {
|
||||||
|
@ -731,8 +731,8 @@ int tsdbLoadDataFromCache(STable *pTable, SSkipListIterator *pIter, TSKEY maxKey
|
||||||
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
||||||
pMergeInfo->rowsInserted++;
|
pMergeInfo->rowsInserted++;
|
||||||
pMergeInfo->nOperations++;
|
pMergeInfo->nOperations++;
|
||||||
pMergeInfo->keyFirst = MIN(pMergeInfo->keyFirst, rowKey);
|
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, rowKey);
|
||||||
pMergeInfo->keyLast = MAX(pMergeInfo->keyLast, rowKey);
|
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, rowKey);
|
||||||
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -757,12 +757,12 @@ int tsdbLoadDataFromCache(STable *pTable, SSkipListIterator *pIter, TSKEY maxKey
|
||||||
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
||||||
pMergeInfo->rowsUpdated++;
|
pMergeInfo->rowsUpdated++;
|
||||||
pMergeInfo->nOperations++;
|
pMergeInfo->nOperations++;
|
||||||
pMergeInfo->keyFirst = MIN(pMergeInfo->keyFirst, rowKey);
|
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, rowKey);
|
||||||
pMergeInfo->keyLast = MAX(pMergeInfo->keyLast, rowKey);
|
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, rowKey);
|
||||||
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
||||||
} else {
|
} else {
|
||||||
pMergeInfo->keyFirst = MIN(pMergeInfo->keyFirst, fKey);
|
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, fKey);
|
||||||
pMergeInfo->keyLast = MAX(pMergeInfo->keyLast, fKey);
|
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, fKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -504,7 +504,7 @@ void tsdbResetQueryHandle(tsdbReadHandleT queryHandle, STsdbQueryCond *pCond) {
|
||||||
if (emptyQueryTimewindow(pTsdbReadHandle)) {
|
if (emptyQueryTimewindow(pTsdbReadHandle)) {
|
||||||
if (pCond->order != pTsdbReadHandle->order) {
|
if (pCond->order != pTsdbReadHandle->order) {
|
||||||
pTsdbReadHandle->order = pCond->order;
|
pTsdbReadHandle->order = pCond->order;
|
||||||
SWAP(pTsdbReadHandle->window.skey, pTsdbReadHandle->window.ekey, int64_t);
|
TSWAP(pTsdbReadHandle->window.skey, pTsdbReadHandle->window.ekey, int64_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -971,7 +971,7 @@ static bool hasMoreDataInCache(STsdbReadHandle* pHandle) {
|
||||||
pHandle->cur.mixBlock = true;
|
pHandle->cur.mixBlock = true;
|
||||||
|
|
||||||
if (!ASCENDING_TRAVERSE(pHandle->order)) {
|
if (!ASCENDING_TRAVERSE(pHandle->order)) {
|
||||||
SWAP(win->skey, win->ekey, TSKEY);
|
TSWAP(win->skey, win->ekey, TSKEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -1074,8 +1074,8 @@ static int32_t loadBlockInfo(STsdbReadHandle * pTsdbReadHandle, int32_t index, i
|
||||||
assert(pCheckInfo->lastKey >= pTsdbReadHandle->window.ekey && pTsdbReadHandle->window.skey >= pTsdbReadHandle->window.ekey);
|
assert(pCheckInfo->lastKey >= pTsdbReadHandle->window.ekey && pTsdbReadHandle->window.skey >= pTsdbReadHandle->window.ekey);
|
||||||
}
|
}
|
||||||
|
|
||||||
s = MIN(pCheckInfo->lastKey, pTsdbReadHandle->window.ekey);
|
s = TMIN(pCheckInfo->lastKey, pTsdbReadHandle->window.ekey);
|
||||||
e = MAX(pCheckInfo->lastKey, pTsdbReadHandle->window.ekey);
|
e = TMAX(pCheckInfo->lastKey, pTsdbReadHandle->window.ekey);
|
||||||
|
|
||||||
// discard the unqualified data block based on the query time window
|
// discard the unqualified data block based on the query time window
|
||||||
int32_t start = binarySearchForBlock(pCompInfo->blocks, compIndex->numOfBlocks, s, TSDB_ORDER_ASC);
|
int32_t start = binarySearchForBlock(pCompInfo->blocks, compIndex->numOfBlocks, s, TSDB_ORDER_ASC);
|
||||||
|
@ -1240,7 +1240,7 @@ static int32_t handleDataMergeIfNeeded(STsdbReadHandle* pTsdbReadHandle, SBlock*
|
||||||
// update the last key value
|
// update the last key value
|
||||||
pCheckInfo->lastKey = cur->win.ekey + step;
|
pCheckInfo->lastKey = cur->win.ekey + step;
|
||||||
if (!ASCENDING_TRAVERSE(pTsdbReadHandle->order)) {
|
if (!ASCENDING_TRAVERSE(pTsdbReadHandle->order)) {
|
||||||
SWAP(cur->win.skey, cur->win.ekey, TSKEY);
|
TSWAP(cur->win.skey, cur->win.ekey, TSKEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
cur->mixBlock = true;
|
cur->mixBlock = true;
|
||||||
|
@ -1795,7 +1795,7 @@ static void copyAllRemainRowsFromFileBlock(STsdbReadHandle* pTsdbReadHandle, STa
|
||||||
int32_t end = endPos;
|
int32_t end = endPos;
|
||||||
|
|
||||||
if (!ASCENDING_TRAVERSE(pTsdbReadHandle->order)) {
|
if (!ASCENDING_TRAVERSE(pTsdbReadHandle->order)) {
|
||||||
SWAP(start, end, int32_t);
|
TSWAP(start, end, int32_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(pTsdbReadHandle->outputCapacity >= (end - start + 1));
|
assert(pTsdbReadHandle->outputCapacity >= (end - start + 1));
|
||||||
|
@ -2020,7 +2020,7 @@ static void doMergeTwoLevelData(STsdbReadHandle* pTsdbReadHandle, STableCheckInf
|
||||||
((pos < endPos || cur->lastKey < pTsdbReadHandle->window.ekey) && !ASCENDING_TRAVERSE(pTsdbReadHandle->order)));
|
((pos < endPos || cur->lastKey < pTsdbReadHandle->window.ekey) && !ASCENDING_TRAVERSE(pTsdbReadHandle->order)));
|
||||||
|
|
||||||
if (!ASCENDING_TRAVERSE(pTsdbReadHandle->order)) {
|
if (!ASCENDING_TRAVERSE(pTsdbReadHandle->order)) {
|
||||||
SWAP(cur->win.skey, cur->win.ekey, TSKEY);
|
TSWAP(cur->win.skey, cur->win.ekey, TSKEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
moveDataToFront(pTsdbReadHandle, numOfRows, numOfCols);
|
moveDataToFront(pTsdbReadHandle, numOfRows, numOfCols);
|
||||||
|
|
|
@ -68,7 +68,7 @@ void *vmaMalloc(SVMemAllocator *pVMA, uint64_t size) {
|
||||||
void * ptr;
|
void * ptr;
|
||||||
|
|
||||||
if (pNode->size < POINTER_DISTANCE(pNode->ptr, pNode->data) + size) {
|
if (pNode->size < POINTER_DISTANCE(pNode->ptr, pNode->data) + size) {
|
||||||
uint64_t capacity = MAX(pVMA->ssize, size);
|
uint64_t capacity = TMAX(pVMA->ssize, size);
|
||||||
pNode = vArenaNodeNew(capacity);
|
pNode = vArenaNodeNew(capacity);
|
||||||
if (pNode == NULL) {
|
if (pNode == NULL) {
|
||||||
// TODO: handle error
|
// TODO: handle error
|
||||||
|
|
|
@ -71,6 +71,7 @@ int vnodeOpenBufPool(SVnode *pVnode) {
|
||||||
|
|
||||||
void vnodeCloseBufPool(SVnode *pVnode) {
|
void vnodeCloseBufPool(SVnode *pVnode) {
|
||||||
if (pVnode->pBufPool) {
|
if (pVnode->pBufPool) {
|
||||||
|
tfree(pVnode->pBufPool->pMAF);
|
||||||
vmaDestroy(pVnode->pBufPool->inuse);
|
vmaDestroy(pVnode->pBufPool->inuse);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
|
@ -119,6 +119,7 @@ static void* loop(void* arg) {
|
||||||
pthread_mutex_unlock(&(vnodeMgr.mutex));
|
pthread_mutex_unlock(&(vnodeMgr.mutex));
|
||||||
|
|
||||||
(*(pTask->execute))(pTask->arg);
|
(*(pTask->execute))(pTask->arg);
|
||||||
|
free(pTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -25,7 +25,7 @@ int vnodeQueryOpen(SVnode *pVnode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int vnodeProcessQueryReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
int vnodeProcessQueryReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
vTrace("query message is processing");
|
vTrace("message in query queue is processing");
|
||||||
|
|
||||||
switch (pMsg->msgType) {
|
switch (pMsg->msgType) {
|
||||||
case TDMT_VND_QUERY:
|
case TDMT_VND_QUERY:
|
||||||
|
@ -39,7 +39,7 @@ int vnodeProcessQueryReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int vnodeProcessFetchReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
int vnodeProcessFetchReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
vTrace("fetch message is processed");
|
vTrace("message in fetch queue is processing");
|
||||||
switch (pMsg->msgType) {
|
switch (pMsg->msgType) {
|
||||||
case TDMT_VND_FETCH:
|
case TDMT_VND_FETCH:
|
||||||
return qWorkerProcessFetchMsg(pVnode, pVnode->pQuery, pMsg);
|
return qWorkerProcessFetchMsg(pVnode, pVnode->pQuery, pMsg);
|
||||||
|
@ -145,6 +145,15 @@ static int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
|
|
||||||
|
free(pSW->pSchema);
|
||||||
|
free(pSW);
|
||||||
|
free(pTbCfg->name);
|
||||||
|
free(pTbCfg);
|
||||||
|
if (pTbCfg->type == META_SUPER_TABLE) {
|
||||||
|
free(pTbCfg->stbCfg.pTagSchema);
|
||||||
|
} else if (pTbCfg->type == META_SUPER_TABLE) {
|
||||||
|
kvRowFree(pTbCfg->ctbCfg.pTag);
|
||||||
|
}
|
||||||
rpcMsg.handle = pMsg->handle;
|
rpcMsg.handle = pMsg->handle;
|
||||||
rpcMsg.ahandle = pMsg->ahandle;
|
rpcMsg.ahandle = pMsg->ahandle;
|
||||||
rpcMsg.pCont = pTbMetaMsg;
|
rpcMsg.pCont = pTbMetaMsg;
|
||||||
|
@ -156,8 +165,8 @@ _exit:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void freeItemHelper(void* pItem) {
|
static void freeItemHelper(void *pItem) {
|
||||||
char* p = *(char**)pItem;
|
char *p = *(char **)pItem;
|
||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,7 +203,7 @@ static int32_t vnodeGetTableList(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
|
|
||||||
int32_t rowLen =
|
int32_t rowLen =
|
||||||
(TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE) + 8 + 2 + (TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE) + 8 + 4;
|
(TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE) + 8 + 2 + (TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE) + 8 + 4;
|
||||||
//int32_t numOfTables = (int32_t)taosArrayGetSize(pArray);
|
// int32_t numOfTables = (int32_t)taosArrayGetSize(pArray);
|
||||||
|
|
||||||
int32_t payloadLen = rowLen * numOfTables;
|
int32_t payloadLen = rowLen * numOfTables;
|
||||||
// SVShowTablesFetchReq *pFetchReq = pMsg->pCont;
|
// SVShowTablesFetchReq *pFetchReq = pMsg->pCont;
|
||||||
|
@ -208,6 +217,7 @@ static int32_t vnodeGetTableList(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
STR_TO_VARSTR(p, n);
|
STR_TO_VARSTR(p, n);
|
||||||
|
|
||||||
p += (TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE);
|
p += (TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE);
|
||||||
|
free(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
pFetchRsp->numOfRows = htonl(numOfTables);
|
pFetchRsp->numOfRows = htonl(numOfTables);
|
||||||
|
@ -222,6 +232,7 @@ static int32_t vnodeGetTableList(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
};
|
};
|
||||||
|
|
||||||
rpcSendResponse(&rpcMsg);
|
rpcSendResponse(&rpcMsg);
|
||||||
|
|
||||||
taosArrayDestroyEx(pArray, freeItemHelper);
|
taosArrayDestroyEx(pArray, freeItemHelper);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ int vnodeProcessWMsgs(SVnode *pVnode, SArray *pMsgs) {
|
||||||
pMsg = *(SRpcMsg **)taosArrayGet(pMsgs, i);
|
pMsg = *(SRpcMsg **)taosArrayGet(pMsgs, i);
|
||||||
|
|
||||||
// ser request version
|
// ser request version
|
||||||
void *pBuf = POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead));
|
void * pBuf = POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead));
|
||||||
int64_t ver = pVnode->state.processed++;
|
int64_t ver = pVnode->state.processed++;
|
||||||
taosEncodeFixedU64(&pBuf, ver);
|
taosEncodeFixedU64(&pBuf, ver);
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ int vnodeProcessWMsgs(SVnode *pVnode, SArray *pMsgs) {
|
||||||
int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
SVCreateTbReq vCreateTbReq;
|
SVCreateTbReq vCreateTbReq;
|
||||||
SVCreateTbBatchReq vCreateTbBatchReq;
|
SVCreateTbBatchReq vCreateTbBatchReq;
|
||||||
void *ptr = vnodeMalloc(pVnode, pMsg->contLen);
|
void * ptr = vnodeMalloc(pVnode, pMsg->contLen);
|
||||||
if (ptr == NULL) {
|
if (ptr == NULL) {
|
||||||
// TODO: handle error
|
// TODO: handle error
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,9 @@ int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: maybe need to clear the requst struct
|
// TODO: maybe need to clear the requst struct
|
||||||
|
free(vCreateTbReq.stbCfg.pSchema);
|
||||||
|
free(vCreateTbReq.stbCfg.pTagSchema);
|
||||||
|
free(vCreateTbReq.name);
|
||||||
break;
|
break;
|
||||||
case TDMT_VND_CREATE_TABLE:
|
case TDMT_VND_CREATE_TABLE:
|
||||||
tSVCreateTbBatchReqDeserialize(POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead)), &vCreateTbBatchReq);
|
tSVCreateTbBatchReqDeserialize(POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead)), &vCreateTbBatchReq);
|
||||||
|
@ -112,9 +115,7 @@ int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TDMT_VND_MQ_SET_CONN: {
|
case TDMT_VND_MQ_SET_CONN: {
|
||||||
SMqSetCVgReq req;
|
if (tqProcessSetConnReq(pVnode->pTq, ptr) < 0) {
|
||||||
tDecodeSMqSetCVgReq(ptr, &req);
|
|
||||||
if (tqProcessSetConnReq(pVnode->pTq, &req) < 0) {
|
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -86,7 +86,7 @@ int32_t ctgGetDBVgroupFromMnode(struct SCatalog* pCatalog, void *pRpc, const SEp
|
||||||
|
|
||||||
rpcSendRecv(pRpc, (SEpSet*)pMgmtEps, &rpcMsg, &rpcRsp);
|
rpcSendRecv(pRpc, (SEpSet*)pMgmtEps, &rpcMsg, &rpcRsp);
|
||||||
if (TSDB_CODE_SUCCESS != rpcRsp.code) {
|
if (TSDB_CODE_SUCCESS != rpcRsp.code) {
|
||||||
ctgError("error rsp for use db, code:%x, db:%s", rpcRsp.code, input->db);
|
ctgError("error rsp for use db, code:%s, db:%s", tstrerror(rpcRsp.code), input->db);
|
||||||
CTG_ERR_RET(rpcRsp.code);
|
CTG_ERR_RET(rpcRsp.code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,7 +258,7 @@ int32_t ctgGetTableMetaFromMnodeImpl(struct SCatalog* pCatalog, void *pTransport
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctgError("error rsp for stablemeta from mnode, code:%x, tbName:%s", rpcRsp.code, tbFullName);
|
ctgError("error rsp for stablemeta from mnode, code:%s, tbName:%s", tstrerror(rpcRsp.code), tbFullName);
|
||||||
CTG_ERR_RET(rpcRsp.code);
|
CTG_ERR_RET(rpcRsp.code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,18 +320,17 @@ int32_t ctgGetTableMetaFromVnode(struct SCatalog* pCatalog, void *pTransporter,
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctgError("error rsp for table meta from vnode, code:%x, tbName:%s", rpcRsp.code, tNameGetTableName(pTableName));
|
ctgError("error rsp for table meta from vnode, code:%s, tbName:%s", tstrerror(rpcRsp.code), tNameGetTableName(pTableName));
|
||||||
CTG_ERR_RET(rpcRsp.code);
|
CTG_ERR_RET(rpcRsp.code);
|
||||||
}
|
}
|
||||||
|
|
||||||
code = queryProcessMsgRsp[TMSG_INDEX(TDMT_VND_TABLE_META)](output, rpcRsp.pCont, rpcRsp.contLen);
|
code = queryProcessMsgRsp[TMSG_INDEX(TDMT_VND_TABLE_META)](output, rpcRsp.pCont, rpcRsp.contLen);
|
||||||
if (code) {
|
if (code) {
|
||||||
ctgError("Process vnode tablemeta rsp failed, code:%x, tbName:%s", code, tNameGetTableName(pTableName));
|
ctgError("Process vnode tablemeta rsp failed, code:%s, tbName:%s", tstrerror(code), tNameGetTableName(pTableName));
|
||||||
CTG_ERR_RET(code);
|
CTG_ERR_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctgDebug("Got table meta from vnode, db:%s, tbName:%s", dbFullName, tNameGetTableName(pTableName));
|
ctgDebug("Got table meta from vnode, db:%s, tbName:%s", dbFullName, tNameGetTableName(pTableName));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -304,7 +304,7 @@ SSDataBlock* createOutputBuf(SExprInfo* pExpr, int32_t numOfOutput, int32_t numO
|
||||||
idata.info.bytes = pExpr[i].base.resSchema.bytes;
|
idata.info.bytes = pExpr[i].base.resSchema.bytes;
|
||||||
idata.info.colId = pExpr[i].base.resSchema.colId;
|
idata.info.colId = pExpr[i].base.resSchema.colId;
|
||||||
|
|
||||||
int32_t size = MAX(idata.info.bytes * numOfRows, minSize);
|
int32_t size = TMAX(idata.info.bytes * numOfRows, minSize);
|
||||||
idata.pData = calloc(1, size); // at least to hold a pointer on x64 platform
|
idata.pData = calloc(1, size); // at least to hold a pointer on x64 platform
|
||||||
taosArrayPush(res->pDataBlock, &idata);
|
taosArrayPush(res->pDataBlock, &idata);
|
||||||
}
|
}
|
||||||
|
@ -329,7 +329,7 @@ SSDataBlock* createOutputBuf_rv(SArray* pExprInfo, int32_t numOfRows) {
|
||||||
idata.info.bytes = pExpr->base.resSchema.bytes;
|
idata.info.bytes = pExpr->base.resSchema.bytes;
|
||||||
idata.info.colId = pExpr->base.resSchema.colId;
|
idata.info.colId = pExpr->base.resSchema.colId;
|
||||||
|
|
||||||
int32_t size = MAX(idata.info.bytes * numOfRows, minSize);
|
int32_t size = TMAX(idata.info.bytes * numOfRows, minSize);
|
||||||
idata.pData = calloc(1, size); // at least to hold a pointer on x64 platform
|
idata.pData = calloc(1, size); // at least to hold a pointer on x64 platform
|
||||||
taosArrayPush(res->pDataBlock, &idata);
|
taosArrayPush(res->pDataBlock, &idata);
|
||||||
}
|
}
|
||||||
|
@ -2679,7 +2679,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableReq* pQueryMsg, bool
|
||||||
|
|
||||||
pQueryAttr->order.order = TSDB_ORDER_ASC;
|
pQueryAttr->order.order = TSDB_ORDER_ASC;
|
||||||
if (pQueryAttr->window.skey > pQueryAttr->window.ekey) {
|
if (pQueryAttr->window.skey > pQueryAttr->window.ekey) {
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
pQueryAttr->needReverseScan = false;
|
pQueryAttr->needReverseScan = false;
|
||||||
|
@ -2689,7 +2689,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableReq* pQueryMsg, bool
|
||||||
if (pQueryAttr->groupbyColumn && pQueryAttr->order.order == TSDB_ORDER_DESC) {
|
if (pQueryAttr->groupbyColumn && pQueryAttr->order.order == TSDB_ORDER_DESC) {
|
||||||
pQueryAttr->order.order = TSDB_ORDER_ASC;
|
pQueryAttr->order.order = TSDB_ORDER_ASC;
|
||||||
if (pQueryAttr->window.skey > pQueryAttr->window.ekey) {
|
if (pQueryAttr->window.skey > pQueryAttr->window.ekey) {
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
pQueryAttr->needReverseScan = false;
|
pQueryAttr->needReverseScan = false;
|
||||||
|
@ -2700,7 +2700,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableReq* pQueryMsg, bool
|
||||||
if (pQueryAttr->pointInterpQuery && pQueryAttr->interval.interval == 0) {
|
if (pQueryAttr->pointInterpQuery && pQueryAttr->interval.interval == 0) {
|
||||||
if (!QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
if (!QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
||||||
//qDebug(msg, pQInfo->qId, "interp", pQueryAttr->order.order, TSDB_ORDER_ASC, pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
//qDebug(msg, pQInfo->qId, "interp", pQueryAttr->order.order, TSDB_ORDER_ASC, pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
pQueryAttr->order.order = TSDB_ORDER_ASC;
|
pQueryAttr->order.order = TSDB_ORDER_ASC;
|
||||||
|
@ -2713,7 +2713,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableReq* pQueryMsg, bool
|
||||||
//qDebug(msg, pQInfo->qId, "only-first", pQueryAttr->order.order, TSDB_ORDER_ASC, pQueryAttr->window.skey,
|
//qDebug(msg, pQInfo->qId, "only-first", pQueryAttr->order.order, TSDB_ORDER_ASC, pQueryAttr->window.skey,
|
||||||
// pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
// pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
||||||
|
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
doUpdateLastKey(pQueryAttr);
|
doUpdateLastKey(pQueryAttr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2724,7 +2724,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableReq* pQueryMsg, bool
|
||||||
//qDebug(msg, pQInfo->qId, "only-last", pQueryAttr->order.order, TSDB_ORDER_DESC, pQueryAttr->window.skey,
|
//qDebug(msg, pQInfo->qId, "only-last", pQueryAttr->order.order, TSDB_ORDER_DESC, pQueryAttr->window.skey,
|
||||||
// pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
// pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
||||||
|
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
doUpdateLastKey(pQueryAttr);
|
doUpdateLastKey(pQueryAttr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2739,7 +2739,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableReq* pQueryMsg, bool
|
||||||
//qDebug(msg, pQInfo->qId, "only-first stable", pQueryAttr->order.order, TSDB_ORDER_ASC,
|
//qDebug(msg, pQInfo->qId, "only-first stable", pQueryAttr->order.order, TSDB_ORDER_ASC,
|
||||||
// pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
// pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
||||||
|
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
doUpdateLastKey(pQueryAttr);
|
doUpdateLastKey(pQueryAttr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2750,7 +2750,7 @@ static void updateDataCheckOrder(SQInfo *pQInfo, SQueryTableReq* pQueryMsg, bool
|
||||||
//qDebug(msg, pQInfo->qId, "only-last stable", pQueryAttr->order.order, TSDB_ORDER_DESC,
|
//qDebug(msg, pQInfo->qId, "only-last stable", pQueryAttr->order.order, TSDB_ORDER_DESC,
|
||||||
// pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
// pQueryAttr->window.skey, pQueryAttr->window.ekey, pQueryAttr->window.ekey, pQueryAttr->window.skey);
|
||||||
|
|
||||||
SWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
TSWAP(pQueryAttr->window.skey, pQueryAttr->window.ekey, TSKEY);
|
||||||
doUpdateLastKey(pQueryAttr);
|
doUpdateLastKey(pQueryAttr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2790,8 +2790,8 @@ static void getIntermediateBufInfo(STaskRuntimeEnv* pRuntimeEnv, int32_t* ps, in
|
||||||
static bool overlapWithTimeWindow(STaskAttr* pQueryAttr, SDataBlockInfo* pBlockInfo) {
|
static bool overlapWithTimeWindow(STaskAttr* pQueryAttr, SDataBlockInfo* pBlockInfo) {
|
||||||
STimeWindow w = {0};
|
STimeWindow w = {0};
|
||||||
|
|
||||||
TSKEY sk = MIN(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
TSKEY sk = TMIN(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
||||||
TSKEY ek = MAX(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
TSKEY ek = TMAX(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
||||||
|
|
||||||
if (QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
if (QUERY_IS_ASC_QUERY(pQueryAttr)) {
|
||||||
getAlignQueryTimeWindow(pQueryAttr, pBlockInfo->window.skey, sk, ek, &w);
|
getAlignQueryTimeWindow(pQueryAttr, pBlockInfo->window.skey, sk, ek, &w);
|
||||||
|
@ -3474,7 +3474,7 @@ static void updateTableQueryInfoForReverseScan(STableQueryInfo *pTableQueryInfo)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWAP(pTableQueryInfo->win.skey, pTableQueryInfo->win.ekey, TSKEY);
|
TSWAP(pTableQueryInfo->win.skey, pTableQueryInfo->win.ekey, TSKEY);
|
||||||
pTableQueryInfo->lastKey = pTableQueryInfo->win.skey;
|
pTableQueryInfo->lastKey = pTableQueryInfo->win.skey;
|
||||||
|
|
||||||
SWITCH_ORDER(pTableQueryInfo->cur.order);
|
SWITCH_ORDER(pTableQueryInfo->cur.order);
|
||||||
|
@ -4096,8 +4096,8 @@ void setIntervalQueryRange(STaskRuntimeEnv *pRuntimeEnv, TSKEY key) {
|
||||||
*/
|
*/
|
||||||
STimeWindow w = TSWINDOW_INITIALIZER;
|
STimeWindow w = TSWINDOW_INITIALIZER;
|
||||||
|
|
||||||
TSKEY sk = MIN(win.skey, win.ekey);
|
TSKEY sk = TMIN(win.skey, win.ekey);
|
||||||
TSKEY ek = MAX(win.skey, win.ekey);
|
TSKEY ek = TMAX(win.skey, win.ekey);
|
||||||
getAlignQueryTimeWindow(pQueryAttr, win.skey, sk, ek, &w);
|
getAlignQueryTimeWindow(pQueryAttr, win.skey, sk, ek, &w);
|
||||||
|
|
||||||
// if (pResultRowInfo->prevSKey == TSKEY_INITIAL_VAL) {
|
// if (pResultRowInfo->prevSKey == TSKEY_INITIAL_VAL) {
|
||||||
|
@ -4222,7 +4222,7 @@ static void updateNumOfRowsInResultRows(STaskRuntimeEnv* pRuntimeEnv, SQLFunctio
|
||||||
}
|
}
|
||||||
|
|
||||||
// SResultRowEntryInfo* pCell = getResultCell(pResult, j, rowCellInfoOffset);
|
// SResultRowEntryInfo* pCell = getResultCell(pResult, j, rowCellInfoOffset);
|
||||||
// pResult->numOfRows = (uint16_t)(MAX(pResult->numOfRows, pCell->numOfRes));
|
// pResult->numOfRows = (uint16_t)(TMAX(pResult->numOfRows, pCell->numOfRes));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7204,8 +7204,8 @@ SOperatorInfo* createFillOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInf
|
||||||
struct SFillColInfo* pColInfo = createFillColInfo(pExpr, numOfOutput, pQueryAttr->fillVal);
|
struct SFillColInfo* pColInfo = createFillColInfo(pExpr, numOfOutput, pQueryAttr->fillVal);
|
||||||
STimeWindow w = TSWINDOW_INITIALIZER;
|
STimeWindow w = TSWINDOW_INITIALIZER;
|
||||||
|
|
||||||
TSKEY sk = MIN(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
TSKEY sk = TMIN(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
||||||
TSKEY ek = MAX(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
TSKEY ek = TMAX(pQueryAttr->window.skey, pQueryAttr->window.ekey);
|
||||||
getAlignQueryTimeWindow(pQueryAttr, pQueryAttr->window.skey, sk, ek, &w);
|
getAlignQueryTimeWindow(pQueryAttr, pQueryAttr->window.skey, sk, ek, &w);
|
||||||
|
|
||||||
pInfo->pFillInfo =
|
pInfo->pFillInfo =
|
||||||
|
|
|
@ -443,7 +443,7 @@ int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionI
|
||||||
pInfo->intermediateBytes = (int16_t)sizeof(SPercentileInfo);
|
pInfo->intermediateBytes = (int16_t)sizeof(SPercentileInfo);
|
||||||
} else if (functionId == FUNCTION_LEASTSQR) {
|
} else if (functionId == FUNCTION_LEASTSQR) {
|
||||||
pInfo->type = TSDB_DATA_TYPE_BINARY;
|
pInfo->type = TSDB_DATA_TYPE_BINARY;
|
||||||
pInfo->bytes = MAX(AVG_FUNCTION_INTER_BUFFER_SIZE, sizeof(SLeastsquaresInfo)); // string
|
pInfo->bytes = TMAX(AVG_FUNCTION_INTER_BUFFER_SIZE, sizeof(SLeastsquaresInfo)); // string
|
||||||
pInfo->intermediateBytes = pInfo->bytes;
|
pInfo->intermediateBytes = pInfo->bytes;
|
||||||
} else if (functionId == FUNCTION_FIRST_DST || functionId == FUNCTION_LAST_DST) {
|
} else if (functionId == FUNCTION_FIRST_DST || functionId == FUNCTION_LAST_DST) {
|
||||||
pInfo->type = TSDB_DATA_TYPE_BINARY;
|
pInfo->type = TSDB_DATA_TYPE_BINARY;
|
||||||
|
@ -1331,7 +1331,7 @@ static void max_func_merge(SQLFunctionCtx *pCtx) {
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
(num) += 1; \
|
(num) += 1; \
|
||||||
(r) += POW2(((type *)d)[i] - (delta)); \
|
(r) += TPOW2(((type *)d)[i] - (delta)); \
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stddev_function(SQLFunctionCtx *pCtx) {
|
static void stddev_function(SQLFunctionCtx *pCtx) {
|
||||||
|
@ -1370,7 +1370,7 @@ static void stddev_function(SQLFunctionCtx *pCtx) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
num += 1;
|
num += 1;
|
||||||
*retVal += POW2(((int32_t *)pData)[i] - avg);
|
*retVal += TPOW2(((int32_t *)pData)[i] - avg);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1484,7 +1484,7 @@ static void stddev_dst_function(SQLFunctionCtx *pCtx) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
num += 1;
|
num += 1;
|
||||||
*retVal += POW2(((int32_t *)pData)[i] - avg);
|
*retVal += TPOW2(((int32_t *)pData)[i] - avg);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4210,8 +4210,8 @@ static void mergeTableBlockDist(SResultRowEntryInfo* pResInfo, const STableBlock
|
||||||
pDist->totalRows += pSrc->totalRows;
|
pDist->totalRows += pSrc->totalRows;
|
||||||
|
|
||||||
if (pResInfo->hasResult == DATA_SET_FLAG) {
|
if (pResInfo->hasResult == DATA_SET_FLAG) {
|
||||||
pDist->maxRows = MAX(pDist->maxRows, pSrc->maxRows);
|
pDist->maxRows = TMAX(pDist->maxRows, pSrc->maxRows);
|
||||||
pDist->minRows = MIN(pDist->minRows, pSrc->minRows);
|
pDist->minRows = TMIN(pDist->minRows, pSrc->minRows);
|
||||||
} else {
|
} else {
|
||||||
pDist->maxRows = pSrc->maxRows;
|
pDist->maxRows = pSrc->maxRows;
|
||||||
pDist->minRows = pSrc->minRows;
|
pDist->minRows = pSrc->minRows;
|
||||||
|
|
|
@ -26,7 +26,7 @@ void calc_i32_i32_add(void *left, void *right, int32_t numLeft, int32_t numRight
|
||||||
int32_t *pRight = (int32_t *)right;
|
int32_t *pRight = (int32_t *)right;
|
||||||
double * pOutput = (double *)output;
|
double * pOutput = (double *)output;
|
||||||
|
|
||||||
int32_t i = (order == TSDB_ORDER_ASC) ? 0 : MAX(numLeft, numRight) - 1;
|
int32_t i = (order == TSDB_ORDER_ASC) ? 0 : TMAX(numLeft, numRight) - 1;
|
||||||
int32_t step = (order == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = (order == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
if (numLeft == numRight) {
|
if (numLeft == numRight) {
|
||||||
|
@ -181,7 +181,7 @@ _getValueAddr_fn_t getVectorValueAddrFn(int32_t srcType) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorAdd(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int32_t _ord) {
|
void vectorAdd(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int32_t _ord) {
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(pLeft->num, pRight->num) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
double *output=(double*)out;
|
double *output=(double*)out;
|
||||||
|
@ -220,7 +220,7 @@ void vectorAdd(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorSub(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int32_t _ord) {
|
void vectorSub(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int32_t _ord) {
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(pLeft->num, pRight->num) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
double *output=(double*)out;
|
double *output=(double*)out;
|
||||||
|
@ -257,7 +257,7 @@ void vectorSub(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void vectorMultiply(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int32_t _ord) {
|
void vectorMultiply(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int32_t _ord) {
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(pLeft->num, pRight->num) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
double *output=(double*)out;
|
double *output=(double*)out;
|
||||||
|
@ -296,7 +296,7 @@ void vectorMultiply(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorDivide(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int32_t _ord) {
|
void vectorDivide(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int32_t _ord) {
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(pLeft->num, pRight->num) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
double *output=(double*)out;
|
double *output=(double*)out;
|
||||||
|
@ -342,7 +342,7 @@ void vectorDivide(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out,
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorRemainder(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int32_t _ord) {
|
void vectorRemainder(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int32_t _ord) {
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(pLeft->num, pRight->num) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
double * output = (double *)out;
|
double * output = (double *)out;
|
||||||
|
@ -416,7 +416,7 @@ void vectorRemainder(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *ou
|
||||||
void vectorConcat(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int32_t _ord) {
|
void vectorConcat(SScalarFuncParam* pLeft, SScalarFuncParam* pRight, void *out, int32_t _ord) {
|
||||||
int32_t len = pLeft->bytes + pRight->bytes;
|
int32_t len = pLeft->bytes + pRight->bytes;
|
||||||
|
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(pLeft->num, pRight->num) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
char *output = (char *)out;
|
char *output = (char *)out;
|
||||||
|
|
|
@ -152,7 +152,7 @@ uint64_t fstUnFinishedNodesFindCommPrefixAndSetOutput(FstUnFinishedNodes* node,
|
||||||
uint64_t addPrefix = 0;
|
uint64_t addPrefix = 0;
|
||||||
uint8_t* data = fstSliceData(s, NULL);
|
uint8_t* data = fstSliceData(s, NULL);
|
||||||
if (t && t->inp == data[i]) {
|
if (t && t->inp == data[i]) {
|
||||||
uint64_t commPrefix = MIN(t->out, *out);
|
uint64_t commPrefix = TMIN(t->out, *out);
|
||||||
uint64_t tAddPrefix = t->out - commPrefix;
|
uint64_t tAddPrefix = t->out - commPrefix;
|
||||||
(*out) = (*out) - commPrefix;
|
(*out) = (*out) - commPrefix;
|
||||||
t->out = commPrefix;
|
t->out = commPrefix;
|
||||||
|
@ -244,8 +244,8 @@ void fstStateCompileForAnyTrans(FstCountingWriter* w, CompiledAddr addr, FstBuil
|
||||||
bool anyOuts = (node->finalOutput != 0);
|
bool anyOuts = (node->finalOutput != 0);
|
||||||
for (size_t i = 0; i < sz; i++) {
|
for (size_t i = 0; i < sz; i++) {
|
||||||
FstTransition* t = taosArrayGet(node->trans, i);
|
FstTransition* t = taosArrayGet(node->trans, i);
|
||||||
tSize = MAX(tSize, packDeltaSize(addr, t->addr));
|
tSize = TMAX(tSize, packDeltaSize(addr, t->addr));
|
||||||
oSize = MAX(oSize, packSize(t->out));
|
oSize = TMAX(oSize, packSize(t->out));
|
||||||
anyOuts = anyOuts || (t->out != 0);
|
anyOuts = anyOuts || (t->out != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1267,7 +1267,7 @@ static int32_t checkFillQueryRange(SQueryStmtInfo* pQueryInfo, SMsgBuf* pMsgBuf)
|
||||||
// return buildInvalidOperationMsg(pMsgBuf, msg1);
|
// return buildInvalidOperationMsg(pMsgBuf, msg1);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
int64_t timeRange = ABS(pQueryInfo->window.skey - pQueryInfo->window.ekey);
|
int64_t timeRange = TABS(pQueryInfo->window.skey - pQueryInfo->window.ekey);
|
||||||
|
|
||||||
int64_t intervalRange = 0;
|
int64_t intervalRange = 0;
|
||||||
if (!TIME_IS_VAR_DURATION(pQueryInfo->interval.intervalUnit)) {
|
if (!TIME_IS_VAR_DURATION(pQueryInfo->interval.intervalUnit)) {
|
||||||
|
@ -1353,7 +1353,7 @@ int32_t validateFillNode(SQueryStmtInfo *pQueryInfo, SSqlNode* pSqlNode, SMsgBuf
|
||||||
numOfFillVal = numOfFields;
|
numOfFillVal = numOfFields;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
numOfFillVal = MIN(num, numOfFields);
|
numOfFillVal = TMIN(num, numOfFields);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t j = 1;
|
int32_t j = 1;
|
||||||
|
@ -1928,7 +1928,7 @@ void setResultColName(char* name, tSqlExprItem* pItem, SToken* pToken, SToken* f
|
||||||
tstrncpy(name, pItem->aliasName, TSDB_COL_NAME_LEN);
|
tstrncpy(name, pItem->aliasName, TSDB_COL_NAME_LEN);
|
||||||
} else if (multiCols) {
|
} else if (multiCols) {
|
||||||
char uname[TSDB_COL_NAME_LEN] = {0};
|
char uname[TSDB_COL_NAME_LEN] = {0};
|
||||||
int32_t len = MIN(pToken->n + 1, TSDB_COL_NAME_LEN);
|
int32_t len = TMIN(pToken->n + 1, TSDB_COL_NAME_LEN);
|
||||||
tstrncpy(uname, pToken->z, len);
|
tstrncpy(uname, pToken->z, len);
|
||||||
|
|
||||||
if (tsKeepOriginalColumnName) { // keep the original column name
|
if (tsKeepOriginalColumnName) { // keep the original column name
|
||||||
|
@ -1944,7 +1944,7 @@ void setResultColName(char* name, tSqlExprItem* pItem, SToken* pToken, SToken* f
|
||||||
tstrncpy(name, tmp, TSDB_COL_NAME_LEN);
|
tstrncpy(name, tmp, TSDB_COL_NAME_LEN);
|
||||||
}
|
}
|
||||||
} else { // use the user-input result column name
|
} else { // use the user-input result column name
|
||||||
int32_t len = MIN(pItem->pNode->exprToken.n + 1, TSDB_COL_NAME_LEN);
|
int32_t len = TMIN(pItem->pNode->exprToken.n + 1, TSDB_COL_NAME_LEN);
|
||||||
tstrncpy(name, pItem->pNode->exprToken.z, len);
|
tstrncpy(name, pItem->pNode->exprToken.z, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2948,7 +2948,7 @@ static SSchema createConstantColumnSchema(SVariant* pVal, const SToken* exprStr,
|
||||||
if (name != NULL) {
|
if (name != NULL) {
|
||||||
tstrncpy(s.name, name, sizeof(s.name));
|
tstrncpy(s.name, name, sizeof(s.name));
|
||||||
} else {
|
} else {
|
||||||
size_t tlen = MIN(sizeof(s.name), exprStr->n + 1);
|
size_t tlen = TMIN(sizeof(s.name), exprStr->n + 1);
|
||||||
tstrncpy(s.name, exprStr->z, tlen);
|
tstrncpy(s.name, exprStr->z, tlen);
|
||||||
strdequote(s.name);
|
strdequote(s.name);
|
||||||
}
|
}
|
||||||
|
@ -3026,7 +3026,7 @@ int32_t addProjectionExprAndResColumn(SQueryStmtInfo* pQueryInfo, tSqlExprItem*
|
||||||
SSchema colSchema = createConstantColumnSchema(&pItem->pNode->value, &pItem->pNode->exprToken, pItem->aliasName);
|
SSchema colSchema = createConstantColumnSchema(&pItem->pNode->value, &pItem->pNode->exprToken, pItem->aliasName);
|
||||||
|
|
||||||
char token[TSDB_COL_NAME_LEN] = {0};
|
char token[TSDB_COL_NAME_LEN] = {0};
|
||||||
tstrncpy(token, pItem->pNode->exprToken.z, MIN(TSDB_COL_NAME_LEN, TSDB_COL_NAME_LEN));
|
tstrncpy(token, pItem->pNode->exprToken.z, TMIN(TSDB_COL_NAME_LEN, TSDB_COL_NAME_LEN));
|
||||||
|
|
||||||
STableMetaInfo* pTableMetaInfo = getMetaInfo(pQueryInfo, index.tableIndex);
|
STableMetaInfo* pTableMetaInfo = getMetaInfo(pQueryInfo, index.tableIndex);
|
||||||
SColumn c = createColumn(pTableMetaInfo->pTableMeta->uid, pTableMetaInfo->aliasName, index.type, &colSchema);
|
SColumn c = createColumn(pTableMetaInfo->pTableMeta->uid, pTableMetaInfo->aliasName, index.type, &colSchema);
|
||||||
|
|
|
@ -156,7 +156,7 @@ static int32_t buildOutput(SInsertParseContext* pCxt) {
|
||||||
taosHashGetClone(pCxt->pVgroupsHashObj, (const char*)&src->vgId, sizeof(src->vgId), &dst->vg);
|
taosHashGetClone(pCxt->pVgroupsHashObj, (const char*)&src->vgId, sizeof(src->vgId), &dst->vg);
|
||||||
dst->numOfTables = src->numOfTables;
|
dst->numOfTables = src->numOfTables;
|
||||||
dst->size = src->size;
|
dst->size = src->size;
|
||||||
SWAP(dst->pData, src->pData, char*);
|
TSWAP(dst->pData, src->pData, char*);
|
||||||
buildMsgHeader(dst);
|
buildMsgHeader(dst);
|
||||||
taosArrayPush(pCxt->pOutput->pDataBlocks, &dst);
|
taosArrayPush(pCxt->pOutput->pDataBlocks, &dst);
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,7 +135,7 @@ static SDataSink* createDataInserter(SPlanContext* pCxt, SVgDataBlocks* pBlocks,
|
||||||
SDataInserter* inserter = (SDataInserter*)initDataSink(DSINK_Insert, sizeof(SDataInserter), pRoot);
|
SDataInserter* inserter = (SDataInserter*)initDataSink(DSINK_Insert, sizeof(SDataInserter), pRoot);
|
||||||
inserter->numOfTables = pBlocks->numOfTables;
|
inserter->numOfTables = pBlocks->numOfTables;
|
||||||
inserter->size = pBlocks->size;
|
inserter->size = pBlocks->size;
|
||||||
SWAP(inserter->pData, pBlocks->pData, char*);
|
TSWAP(inserter->pData, pBlocks->pData, char*);
|
||||||
return (SDataSink*)inserter;
|
return (SDataSink*)inserter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -91,16 +91,18 @@ int32_t qCreateQueryDag(const struct SQueryNode* pNode, struct SQueryDag** pDag,
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void extractResSchema(struct SQueryDag* const* pDag, SSchema** pResSchema,
|
// extract the final result schema
|
||||||
int32_t* numOfCols) { // extract the final result schema
|
void extractResSchema(struct SQueryDag* const* pDag, SSchema** pResSchema, int32_t* numOfCols) {
|
||||||
SArray* pTopSubplan = taosArrayGetP((*pDag)->pSubplans, 0);
|
SArray* pTopSubplan = taosArrayGetP((*pDag)->pSubplans, 0);
|
||||||
|
|
||||||
SSubplan* pPlan = taosArrayGetP(pTopSubplan, 0);
|
SSubplan* pPlan = taosArrayGetP(pTopSubplan, 0);
|
||||||
SDataBlockSchema* pDataBlockSchema = &(pPlan->pDataSink->schema);
|
SDataBlockSchema* pDataBlockSchema = &(pPlan->pDataSink->schema);
|
||||||
|
|
||||||
*numOfCols = pDataBlockSchema->numOfCols;
|
*numOfCols = pDataBlockSchema->numOfCols;
|
||||||
|
if (*numOfCols > 0) {
|
||||||
*pResSchema = calloc(pDataBlockSchema->numOfCols, sizeof(SSchema));
|
*pResSchema = calloc(pDataBlockSchema->numOfCols, sizeof(SSchema));
|
||||||
memcpy((*pResSchema), pDataBlockSchema->pSchema, pDataBlockSchema->numOfCols * sizeof(SSchema));
|
memcpy((*pResSchema), pDataBlockSchema->pSchema, pDataBlockSchema->numOfCols * sizeof(SSchema));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void qSetSubplanExecutionNode(SSubplan* subplan, uint64_t templateId, SDownstreamSource* pSource) {
|
void qSetSubplanExecutionNode(SSubplan* subplan, uint64_t templateId, SDownstreamSource* pSource) {
|
||||||
|
|
|
@ -85,7 +85,7 @@ static void* pTaskQueue = NULL;
|
||||||
|
|
||||||
int32_t initTaskQueue() {
|
int32_t initTaskQueue() {
|
||||||
double factor = 4.0;
|
double factor = 4.0;
|
||||||
int32_t numOfThreads = MAX((int)(tsNumOfCores * tsNumOfThreadsPerCore / factor), 2);
|
int32_t numOfThreads = TMAX((int)(tsNumOfCores * tsNumOfThreadsPerCore / factor), 2);
|
||||||
|
|
||||||
int32_t queueSize = tsMaxConnections * 2;
|
int32_t queueSize = tsMaxConnections * 2;
|
||||||
pTaskQueue = taosInitScheduler(queueSize, numOfThreads, "tsc");
|
pTaskQueue = taosInitScheduler(queueSize, numOfThreads, "tsc");
|
||||||
|
|
|
@ -22,17 +22,17 @@ extern "C" {
|
||||||
|
|
||||||
#include "tlockfree.h"
|
#include "tlockfree.h"
|
||||||
|
|
||||||
#define QWORKER_DEFAULT_SCHEDULER_NUMBER 10000
|
#define QW_DEFAULT_SCHEDULER_NUMBER 10000
|
||||||
#define QWORKER_DEFAULT_TASK_NUMBER 10000
|
#define QW_DEFAULT_TASK_NUMBER 10000
|
||||||
#define QWORKER_DEFAULT_SCH_TASK_NUMBER 10000
|
#define QW_DEFAULT_SCH_TASK_NUMBER 10000
|
||||||
|
#define QW_DEFAULT_SHORT_RUN_TIMES 2
|
||||||
enum {
|
enum {
|
||||||
QW_PHASE_PRE_QUERY = 1,
|
QW_PHASE_PRE_QUERY = 1,
|
||||||
QW_PHASE_POST_QUERY,
|
QW_PHASE_POST_QUERY,
|
||||||
QW_PHASE_PRE_CQUERY,
|
|
||||||
QW_PHASE_POST_CQUERY,
|
|
||||||
QW_PHASE_PRE_FETCH,
|
QW_PHASE_PRE_FETCH,
|
||||||
QW_PHASE_POST_FETCH,
|
QW_PHASE_POST_FETCH,
|
||||||
|
QW_PHASE_PRE_CQUERY,
|
||||||
|
QW_PHASE_POST_CQUERY,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -83,11 +83,9 @@ typedef struct SQWMsg {
|
||||||
} SQWMsg;
|
} SQWMsg;
|
||||||
|
|
||||||
typedef struct SQWPhaseInput {
|
typedef struct SQWPhaseInput {
|
||||||
int8_t status;
|
int8_t taskStatus;
|
||||||
int8_t taskType;
|
int8_t taskType;
|
||||||
int32_t code;
|
int32_t code;
|
||||||
qTaskInfo_t taskHandle;
|
|
||||||
DataSinkHandle sinkHandle;
|
|
||||||
} SQWPhaseInput;
|
} SQWPhaseInput;
|
||||||
|
|
||||||
typedef struct SQWPhaseOutput {
|
typedef struct SQWPhaseOutput {
|
||||||
|
@ -111,6 +109,7 @@ typedef struct SQWTaskCtx {
|
||||||
void *cancelConnection;
|
void *cancelConnection;
|
||||||
|
|
||||||
bool emptyRes;
|
bool emptyRes;
|
||||||
|
bool multiExec;
|
||||||
int8_t queryContinue;
|
int8_t queryContinue;
|
||||||
int8_t queryInQueue;
|
int8_t queryInQueue;
|
||||||
int32_t rspCode;
|
int32_t rspCode;
|
||||||
|
@ -133,7 +132,7 @@ typedef struct SQWorkerMgmt {
|
||||||
int8_t nodeType;
|
int8_t nodeType;
|
||||||
int32_t nodeId;
|
int32_t nodeId;
|
||||||
SRWLatch schLock;
|
SRWLatch schLock;
|
||||||
SRWLatch ctxLock;
|
//SRWLatch ctxLock;
|
||||||
SHashObj *schHash; //key: schedulerId, value: SQWSchStatus
|
SHashObj *schHash; //key: schedulerId, value: SQWSchStatus
|
||||||
SHashObj *ctxHash; //key: queryId+taskId, value: SQWTaskCtx
|
SHashObj *ctxHash; //key: queryId+taskId, value: SQWTaskCtx
|
||||||
void *nodeObj;
|
void *nodeObj;
|
||||||
|
@ -144,6 +143,8 @@ typedef struct SQWorkerMgmt {
|
||||||
#define QW_IDS() sId, qId, tId
|
#define QW_IDS() sId, qId, tId
|
||||||
#define QW_FPARAMS() mgmt, QW_IDS()
|
#define QW_FPARAMS() mgmt, QW_IDS()
|
||||||
|
|
||||||
|
#define QW_GET_EVENT_VALUE(ctx, event) atomic_load_8(&(ctx)->events[event])
|
||||||
|
|
||||||
#define QW_IS_EVENT_RECEIVED(ctx, event) (atomic_load_8(&(ctx)->events[event]) == QW_EVENT_RECEIVED)
|
#define QW_IS_EVENT_RECEIVED(ctx, event) (atomic_load_8(&(ctx)->events[event]) == QW_EVENT_RECEIVED)
|
||||||
#define QW_IS_EVENT_PROCESSED(ctx, event) (atomic_load_8(&(ctx)->events[event]) == QW_EVENT_PROCESSED)
|
#define QW_IS_EVENT_PROCESSED(ctx, event) (atomic_load_8(&(ctx)->events[event]) == QW_EVENT_PROCESSED)
|
||||||
#define QW_SET_EVENT_RECEIVED(ctx, event) atomic_store_8(&(ctx)->events[event], QW_EVENT_RECEIVED)
|
#define QW_SET_EVENT_RECEIVED(ctx, event) atomic_store_8(&(ctx)->events[event], QW_EVENT_RECEIVED)
|
||||||
|
@ -151,9 +152,10 @@ typedef struct SQWorkerMgmt {
|
||||||
|
|
||||||
#define QW_GET_PHASE(ctx) atomic_load_8(&(ctx)->phase)
|
#define QW_GET_PHASE(ctx) atomic_load_8(&(ctx)->phase)
|
||||||
|
|
||||||
#define QW_SET_RSP_CODE(ctx, code) atomic_val_compare_exchange_32(&(ctx)->rspCode, 0, code)
|
#define QW_SET_RSP_CODE(ctx, code) atomic_store_32(&(ctx)->rspCode, code)
|
||||||
|
#define QW_UPDATE_RSP_CODE(ctx, code) atomic_val_compare_exchange_32(&(ctx)->rspCode, 0, code)
|
||||||
|
|
||||||
#define QW_IN_EXECUTOR(ctx) (QW_GET_PHASE(ctx) == QW_PHASE_PRE_QUERY || QW_GET_PHASE(ctx) == QW_PHASE_PRE_CQUERY || QW_GET_PHASE(ctx) == QW_PHASE_PRE_FETCH)
|
#define QW_IS_QUERY_RUNNING(ctx) (QW_GET_PHASE(ctx) == QW_PHASE_PRE_QUERY || QW_GET_PHASE(ctx) == QW_PHASE_PRE_CQUERY)
|
||||||
|
|
||||||
#define QW_TASK_NOT_EXIST(code) (TSDB_CODE_QRY_SCH_NOT_EXIST == (code) || TSDB_CODE_QRY_TASK_NOT_EXIST == (code))
|
#define QW_TASK_NOT_EXIST(code) (TSDB_CODE_QRY_SCH_NOT_EXIST == (code) || TSDB_CODE_QRY_TASK_NOT_EXIST == (code))
|
||||||
#define QW_TASK_ALREADY_EXIST(code) (TSDB_CODE_QRY_TASK_ALREADY_EXIST == (code))
|
#define QW_TASK_ALREADY_EXIST(code) (TSDB_CODE_QRY_TASK_ALREADY_EXIST == (code))
|
||||||
|
|
|
@ -30,6 +30,7 @@ int32_t qwProcessFetch(SQWorkerMgmt *mgmt, uint64_t sId, uint64_t qId, uint64_t
|
||||||
int32_t qwProcessDrop(SQWorkerMgmt *mgmt, uint64_t sId, uint64_t qId, uint64_t tId, SQWMsg *qwMsg);
|
int32_t qwProcessDrop(SQWorkerMgmt *mgmt, uint64_t sId, uint64_t qId, uint64_t tId, SQWMsg *qwMsg);
|
||||||
|
|
||||||
int32_t qwBuildAndSendDropRsp(void *connection, int32_t code);
|
int32_t qwBuildAndSendDropRsp(void *connection, int32_t code);
|
||||||
|
int32_t qwBuildAndSendCancelRsp(SRpcMsg *pMsg, int32_t code);
|
||||||
int32_t qwBuildAndSendFetchRsp(void *connection, SRetrieveTableRsp *pRsp, int32_t dataLength, int32_t code);
|
int32_t qwBuildAndSendFetchRsp(void *connection, SRetrieveTableRsp *pRsp, int32_t dataLength, int32_t code);
|
||||||
void qwBuildFetchRsp(void *msg, SOutputData *input, int32_t len);
|
void qwBuildFetchRsp(void *msg, SOutputData *input, int32_t len);
|
||||||
int32_t qwBuildAndSendCQueryMsg(SQWorkerMgmt *mgmt, uint64_t sId, uint64_t qId, uint64_t tId, void *connection);
|
int32_t qwBuildAndSendCQueryMsg(SQWorkerMgmt *mgmt, uint64_t sId, uint64_t qId, uint64_t tId, void *connection);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -50,6 +50,7 @@ int32_t qwBuildAndSendQueryRsp(void *connection, int32_t code) {
|
||||||
pRsp->code = code;
|
pRsp->code = code;
|
||||||
|
|
||||||
SRpcMsg rpcRsp = {
|
SRpcMsg rpcRsp = {
|
||||||
|
.msgType = TDMT_VND_QUERY_RSP,
|
||||||
.handle = pMsg->handle,
|
.handle = pMsg->handle,
|
||||||
.ahandle = pMsg->ahandle,
|
.ahandle = pMsg->ahandle,
|
||||||
.pCont = pRsp,
|
.pCont = pRsp,
|
||||||
|
@ -68,6 +69,7 @@ int32_t qwBuildAndSendReadyRsp(void *connection, int32_t code) {
|
||||||
pRsp->code = code;
|
pRsp->code = code;
|
||||||
|
|
||||||
SRpcMsg rpcRsp = {
|
SRpcMsg rpcRsp = {
|
||||||
|
.msgType = TDMT_VND_RES_READY_RSP,
|
||||||
.handle = pMsg->handle,
|
.handle = pMsg->handle,
|
||||||
.ahandle = pMsg->ahandle,
|
.ahandle = pMsg->ahandle,
|
||||||
.pCont = pRsp,
|
.pCont = pRsp,
|
||||||
|
@ -98,7 +100,7 @@ int32_t qwBuildAndSendStatusRsp(SRpcMsg *pMsg, SSchedulerStatusRsp *sStatus) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SRpcMsg rpcRsp = {
|
SRpcMsg rpcRsp = {
|
||||||
.msgType = pMsg->msgType + 1,
|
.msgType = TDMT_VND_TASKS_STATUS_RSP,
|
||||||
.handle = pMsg->handle,
|
.handle = pMsg->handle,
|
||||||
.ahandle = pMsg->ahandle,
|
.ahandle = pMsg->ahandle,
|
||||||
.pCont = pRsp,
|
.pCont = pRsp,
|
||||||
|
@ -121,6 +123,7 @@ int32_t qwBuildAndSendFetchRsp(void *connection, SRetrieveTableRsp *pRsp, int32_
|
||||||
}
|
}
|
||||||
|
|
||||||
SRpcMsg rpcRsp = {
|
SRpcMsg rpcRsp = {
|
||||||
|
.msgType = TDMT_VND_FETCH_RSP,
|
||||||
.handle = pMsg->handle,
|
.handle = pMsg->handle,
|
||||||
.ahandle = pMsg->ahandle,
|
.ahandle = pMsg->ahandle,
|
||||||
.pCont = pRsp,
|
.pCont = pRsp,
|
||||||
|
@ -138,6 +141,7 @@ int32_t qwBuildAndSendCancelRsp(SRpcMsg *pMsg, int32_t code) {
|
||||||
pRsp->code = code;
|
pRsp->code = code;
|
||||||
|
|
||||||
SRpcMsg rpcRsp = {
|
SRpcMsg rpcRsp = {
|
||||||
|
.msgType = TDMT_VND_CANCEL_TASK_RSP,
|
||||||
.handle = pMsg->handle,
|
.handle = pMsg->handle,
|
||||||
.ahandle = pMsg->ahandle,
|
.ahandle = pMsg->ahandle,
|
||||||
.pCont = pRsp,
|
.pCont = pRsp,
|
||||||
|
@ -155,6 +159,7 @@ int32_t qwBuildAndSendDropRsp(void *connection, int32_t code) {
|
||||||
pRsp->code = code;
|
pRsp->code = code;
|
||||||
|
|
||||||
SRpcMsg rpcRsp = {
|
SRpcMsg rpcRsp = {
|
||||||
|
.msgType = TDMT_VND_DROP_TASK_RSP,
|
||||||
.handle = pMsg->handle,
|
.handle = pMsg->handle,
|
||||||
.ahandle = pMsg->ahandle,
|
.ahandle = pMsg->ahandle,
|
||||||
.pCont = pRsp,
|
.pCont = pRsp,
|
||||||
|
@ -273,7 +278,7 @@ int32_t qWorkerProcessQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg) {
|
||||||
SQWorkerMgmt *mgmt = (SQWorkerMgmt *)qWorkerMgmt;
|
SQWorkerMgmt *mgmt = (SQWorkerMgmt *)qWorkerMgmt;
|
||||||
|
|
||||||
if (NULL == msg || pMsg->contLen <= sizeof(*msg)) {
|
if (NULL == msg || pMsg->contLen <= sizeof(*msg)) {
|
||||||
QW_ELOG("invalid query msg, contLen:%d", pMsg->contLen);
|
QW_ELOG("invalid query msg, msg:%p, msgLen:%d", msg, pMsg->contLen);
|
||||||
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -306,15 +311,11 @@ int32_t qWorkerProcessCQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg) {
|
||||||
SQWTaskCtx *handles = NULL;
|
SQWTaskCtx *handles = NULL;
|
||||||
SQWorkerMgmt *mgmt = (SQWorkerMgmt *)qWorkerMgmt;
|
SQWorkerMgmt *mgmt = (SQWorkerMgmt *)qWorkerMgmt;
|
||||||
|
|
||||||
if (NULL == msg || pMsg->contLen <= sizeof(*msg)) {
|
if (NULL == msg || pMsg->contLen < sizeof(*msg)) {
|
||||||
QW_ELOG("invalid cquery msg, contLen:%d", pMsg->contLen);
|
QW_ELOG("invalid cquery msg, msg:%p, msgLen:%d", msg, pMsg->contLen);
|
||||||
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
msg->sId = be64toh(msg->sId);
|
|
||||||
msg->queryId = be64toh(msg->queryId);
|
|
||||||
msg->taskId = be64toh(msg->taskId);
|
|
||||||
|
|
||||||
uint64_t sId = msg->sId;
|
uint64_t sId = msg->sId;
|
||||||
uint64_t qId = msg->queryId;
|
uint64_t qId = msg->queryId;
|
||||||
uint64_t tId = msg->taskId;
|
uint64_t tId = msg->taskId;
|
||||||
|
@ -335,14 +336,13 @@ int32_t qWorkerProcessReadyMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg){
|
||||||
return TSDB_CODE_QRY_INVALID_INPUT;
|
return TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SQWorkerMgmt *mgmt = (SQWorkerMgmt *)qWorkerMgmt;
|
||||||
SResReadyReq *msg = pMsg->pCont;
|
SResReadyReq *msg = pMsg->pCont;
|
||||||
if (NULL == msg || pMsg->contLen < sizeof(*msg)) {
|
if (NULL == msg || pMsg->contLen < sizeof(*msg)) {
|
||||||
qError("invalid task status msg");
|
QW_ELOG("invalid task ready msg, msg:%p, msgLen:%d", msg, pMsg->contLen);
|
||||||
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
SQWorkerMgmt *mgmt = (SQWorkerMgmt *)qWorkerMgmt;
|
|
||||||
|
|
||||||
msg->sId = be64toh(msg->sId);
|
msg->sId = be64toh(msg->sId);
|
||||||
msg->queryId = be64toh(msg->queryId);
|
msg->queryId = be64toh(msg->queryId);
|
||||||
msg->taskId = be64toh(msg->taskId);
|
msg->taskId = be64toh(msg->taskId);
|
||||||
|
@ -398,6 +398,7 @@ int32_t qWorkerProcessFetchMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg) {
|
||||||
SQWorkerMgmt *mgmt = (SQWorkerMgmt *)qWorkerMgmt;
|
SQWorkerMgmt *mgmt = (SQWorkerMgmt *)qWorkerMgmt;
|
||||||
|
|
||||||
if (NULL == msg || pMsg->contLen < sizeof(*msg)) {
|
if (NULL == msg || pMsg->contLen < sizeof(*msg)) {
|
||||||
|
QW_ELOG("invalid fetch msg, msg:%p, msgLen:%d", msg, pMsg->contLen);
|
||||||
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -275,10 +275,13 @@ int32_t schBuildTaskRalation(SSchJob *pJob, SHashObj *planToTask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t schRecordTaskSucceedNode(SSchTask *pTask) {
|
int32_t schRecordTaskSucceedNode(SSchJob *pJob, SSchTask *pTask) {
|
||||||
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, atomic_load_8(&pTask->candidateIdx));
|
int32_t idx = atomic_load_8(&pTask->candidateIdx);
|
||||||
|
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, idx);
|
||||||
assert(NULL != addr);
|
if (NULL == addr) {
|
||||||
|
SCH_TASK_ELOG("taosArrayGet candidate addr failed, idx:%d, size:%d", idx, (int32_t)taosArrayGetSize(pTask->candidateAddrs));
|
||||||
|
SCH_ERR_RET(TSDB_CODE_SCH_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
pTask->succeedAddr = *addr;
|
pTask->succeedAddr = *addr;
|
||||||
|
|
||||||
|
@ -578,9 +581,10 @@ int32_t schProcessOnJobFailureImpl(SSchJob *pJob, int32_t status, int32_t errCod
|
||||||
tsem_post(&pJob->rspSem);
|
tsem_post(&pJob->rspSem);
|
||||||
}
|
}
|
||||||
|
|
||||||
SCH_ERR_RET(atomic_load_32(&pJob->errCode));
|
int32_t code = atomic_load_32(&pJob->errCode);
|
||||||
|
SCH_ERR_RET(code);
|
||||||
|
|
||||||
assert(0);
|
SCH_JOB_ELOG("job errCode is invalid, errCode:%d", code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -721,7 +725,7 @@ int32_t schProcessOnTaskSuccess(SSchJob *pJob, SSchTask *pTask) {
|
||||||
|
|
||||||
SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_PARTIAL_SUCCEED);
|
SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_PARTIAL_SUCCEED);
|
||||||
|
|
||||||
SCH_ERR_JRET(schRecordTaskSucceedNode(pTask));
|
SCH_ERR_JRET(schRecordTaskSucceedNode(pJob, pTask));
|
||||||
|
|
||||||
int32_t parentNum = pTask->parents ? (int32_t)taosArrayGetSize(pTask->parents) : 0;
|
int32_t parentNum = pTask->parents ? (int32_t)taosArrayGetSize(pTask->parents) : 0;
|
||||||
if (parentNum == 0) {
|
if (parentNum == 0) {
|
||||||
|
@ -738,7 +742,7 @@ int32_t schProcessOnTaskSuccess(SSchJob *pJob, SSchTask *pTask) {
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
} else if (taskDone > pTask->level->taskNum) {
|
} else if (taskDone > pTask->level->taskNum) {
|
||||||
assert(0);
|
SCH_TASK_ELOG("taskDone number invalid, done:%d, total:%d", taskDone, pTask->level->taskNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pTask->level->taskFailed > 0) {
|
if (pTask->level->taskFailed > 0) {
|
||||||
|
@ -871,18 +875,21 @@ int32_t schHandleResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t msgType, ch
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_store_ptr(&pJob->res, rsp);
|
atomic_store_ptr(&pJob->res, rsp);
|
||||||
atomic_store_32(&pJob->resNumOfRows, rsp->numOfRows);
|
atomic_add_fetch_32(&pJob->resNumOfRows, htonl(rsp->numOfRows));
|
||||||
|
|
||||||
if (rsp->completed) {
|
if (rsp->completed) {
|
||||||
SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_SUCCEED);
|
SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_SUCCEED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SCH_TASK_DLOG("got fetch rsp, rows:%d, complete:%d", htonl(rsp->numOfRows), rsp->completed);
|
||||||
|
|
||||||
SCH_ERR_JRET(schProcessOnDataFetched(pJob));
|
SCH_ERR_JRET(schProcessOnDataFetched(pJob));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TDMT_VND_DROP_TASK: {
|
case TDMT_VND_DROP_TASK_RSP: {
|
||||||
// SHOULD NEVER REACH HERE
|
// SHOULD NEVER REACH HERE
|
||||||
assert(0);
|
SCH_TASK_ELOG("invalid status to handle drop task rsp, ref:%d", atomic_load_32(&pJob->ref));
|
||||||
|
SCH_ERR_JRET(TSDB_CODE_SCH_INTERNAL_ERROR);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -1031,6 +1038,8 @@ int32_t schAsyncSendMsg(void *transport, SEpSet* epSet, uint64_t qId, uint64_t t
|
||||||
SCH_ERR_JRET(code);
|
SCH_ERR_JRET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qDebug("QID:%"PRIx64 ",TID:%"PRIx64 " req msg sent, type:%d, %s", qId, tId, msgType, TMSG_INFO(msgType));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
@ -1288,9 +1297,11 @@ void schDropJobAllTasks(SSchJob *pJob) {
|
||||||
schDropTaskInHashList(pJob, pJob->failTasks);
|
schDropTaskInHashList(pJob, pJob->failTasks);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t schExecJobImpl(void *transport, SArray *nodeList, SQueryDag* pDag, struct SSchJob** job, bool syncSchedule) {
|
int32_t schExecJobImpl(void *transport, SArray *pNodeList, SQueryDag* pDag, struct SSchJob** job, bool syncSchedule) {
|
||||||
if (nodeList && taosArrayGetSize(nodeList) <= 0) {
|
qDebug("QID:0x%"PRIx64" job started", pDag->queryId);
|
||||||
qInfo("QID:%"PRIx64" input nodeList is empty", pDag->queryId);
|
|
||||||
|
if (pNodeList && taosArrayGetSize(pNodeList) <= 0) {
|
||||||
|
qDebug("QID:0x%"PRIx64" input exec nodeList is empty", pDag->queryId);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1302,7 +1313,10 @@ int32_t schExecJobImpl(void *transport, SArray *nodeList, SQueryDag* pDag, struc
|
||||||
|
|
||||||
pJob->attr.syncSchedule = syncSchedule;
|
pJob->attr.syncSchedule = syncSchedule;
|
||||||
pJob->transport = transport;
|
pJob->transport = transport;
|
||||||
pJob->nodeList = nodeList;
|
|
||||||
|
if (pNodeList != NULL) {
|
||||||
|
pJob->nodeList = taosArrayDup(pNodeList);
|
||||||
|
}
|
||||||
|
|
||||||
SCH_ERR_JRET(schValidateAndBuildJob(pDag, pJob));
|
SCH_ERR_JRET(schValidateAndBuildJob(pDag, pJob));
|
||||||
|
|
||||||
|
@ -1356,7 +1370,7 @@ _return:
|
||||||
|
|
||||||
*(SSchJob **)job = NULL;
|
*(SSchJob **)job = NULL;
|
||||||
|
|
||||||
scheduleFreeJob(pJob);
|
schedulerFreeJob(pJob);
|
||||||
|
|
||||||
SCH_RET(code);
|
SCH_RET(code);
|
||||||
}
|
}
|
||||||
|
@ -1401,7 +1415,7 @@ int32_t schedulerInit(SSchedulerCfg *cfg) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t scheduleExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, struct SSchJob** pJob, SQueryResult *pRes) {
|
int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, struct SSchJob** pJob, SQueryResult *pRes) {
|
||||||
if (NULL == transport || NULL == pDag || NULL == pDag->pSubplans || NULL == pJob || NULL == pRes) {
|
if (NULL == transport || NULL == pDag || NULL == pDag->pSubplans || NULL == pJob || NULL == pRes) {
|
||||||
SCH_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
SCH_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
@ -1418,12 +1432,12 @@ int32_t scheduleExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, stru
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t scheduleAsyncExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, struct SSchJob** pJob) {
|
int32_t schedulerAsyncExecJob(void *transport, SArray *pNodeList, SQueryDag* pDag, struct SSchJob** pJob) {
|
||||||
if (NULL == transport || NULL == pDag || NULL == pDag->pSubplans || NULL == pJob) {
|
if (NULL == transport || NULL == pDag || NULL == pDag->pSubplans || NULL == pJob) {
|
||||||
SCH_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
SCH_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
SCH_ERR_RET(schExecJobImpl(transport, nodeList, pDag, pJob, false));
|
SCH_ERR_RET(schExecJobImpl(transport, pNodeList, pDag, pJob, false));
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1551,7 +1565,7 @@ _return:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t scheduleFetchRows(SSchJob *pJob, void** pData) {
|
int32_t schedulerFetchRows(SSchJob *pJob, void** pData) {
|
||||||
if (NULL == pJob || NULL == pData) {
|
if (NULL == pJob || NULL == pData) {
|
||||||
SCH_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
SCH_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
@ -1616,11 +1630,12 @@ _return:
|
||||||
}
|
}
|
||||||
|
|
||||||
*pData = rsp;
|
*pData = rsp;
|
||||||
|
SCH_JOB_DLOG("empty res and set query complete, code:%x", code);
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_val_compare_exchange_8(&pJob->userFetch, 1, 0);
|
atomic_val_compare_exchange_8(&pJob->userFetch, 1, 0);
|
||||||
|
|
||||||
SCH_JOB_DLOG("fetch done, code:%s", tstrerror(code));
|
SCH_JOB_DLOG("fetch done, totalRows:%d, code:%s", pJob->resNumOfRows, tstrerror(code));
|
||||||
atomic_sub_fetch_32(&pJob->ref, 1);
|
atomic_sub_fetch_32(&pJob->ref, 1);
|
||||||
|
|
||||||
SCH_RET(code);
|
SCH_RET(code);
|
||||||
|
@ -1638,7 +1653,7 @@ int32_t scheduleCancelJob(void *job) {
|
||||||
SCH_RET(code);
|
SCH_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
void scheduleFreeJob(void *job) {
|
void schedulerFreeJob(void *job) {
|
||||||
if (NULL == job) {
|
if (NULL == job) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1667,7 +1682,8 @@ void scheduleFreeJob(void *job) {
|
||||||
|
|
||||||
usleep(1);
|
usleep(1);
|
||||||
} else {
|
} else {
|
||||||
assert(0);
|
SCH_JOB_ELOG("invalid job ref number, ref:%d", ref);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1706,7 +1722,7 @@ void scheduleFreeJob(void *job) {
|
||||||
|
|
||||||
tfree(pJob);
|
tfree(pJob);
|
||||||
|
|
||||||
qDebug("QID:%"PRIx64" job freed", queryId);
|
qDebug("QID:0x%"PRIx64" job freed", queryId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void schedulerFreeTaskList(SArray *taskList) {
|
void schedulerFreeTaskList(SArray *taskList) {
|
||||||
|
|
|
@ -334,7 +334,7 @@ void schtFreeQueryJob(int32_t freeThread) {
|
||||||
SSchJob *job = atomic_load_ptr(&pQueryJob);
|
SSchJob *job = atomic_load_ptr(&pQueryJob);
|
||||||
|
|
||||||
if (job && atomic_val_compare_exchange_ptr(&pQueryJob, job, NULL)) {
|
if (job && atomic_val_compare_exchange_ptr(&pQueryJob, job, NULL)) {
|
||||||
scheduleFreeJob(job);
|
schedulerFreeJob(job);
|
||||||
if (freeThread) {
|
if (freeThread) {
|
||||||
if (++freeNum % schtTestPrintNum == 0) {
|
if (++freeNum % schtTestPrintNum == 0) {
|
||||||
printf("FreeNum:%d\n", freeNum);
|
printf("FreeNum:%d\n", freeNum);
|
||||||
|
@ -378,7 +378,7 @@ void* schtRunJobThread(void *aa) {
|
||||||
qnodeAddr.port = 6031;
|
qnodeAddr.port = 6031;
|
||||||
taosArrayPush(qnodeList, &qnodeAddr);
|
taosArrayPush(qnodeList, &qnodeAddr);
|
||||||
|
|
||||||
code = scheduleAsyncExecJob(mockPointer, qnodeList, &dag, &job);
|
code = schedulerAsyncExecJob(mockPointer, qnodeList, &dag, &job);
|
||||||
assert(code == 0);
|
assert(code == 0);
|
||||||
|
|
||||||
execTasks = taosHashInit(5, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_ENTRY_LOCK);
|
execTasks = taosHashInit(5, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_ENTRY_LOCK);
|
||||||
|
@ -472,7 +472,7 @@ void* schtRunJobThread(void *aa) {
|
||||||
atomic_store_32(&schtStartFetch, 1);
|
atomic_store_32(&schtStartFetch, 1);
|
||||||
|
|
||||||
void *data = NULL;
|
void *data = NULL;
|
||||||
code = scheduleFetchRows(pQueryJob, &data);
|
code = schedulerFetchRows(pQueryJob, &data);
|
||||||
assert(code == 0 || code);
|
assert(code == 0 || code);
|
||||||
|
|
||||||
if (0 == code) {
|
if (0 == code) {
|
||||||
|
@ -482,7 +482,7 @@ void* schtRunJobThread(void *aa) {
|
||||||
}
|
}
|
||||||
|
|
||||||
data = NULL;
|
data = NULL;
|
||||||
code = scheduleFetchRows(pQueryJob, &data);
|
code = schedulerFetchRows(pQueryJob, &data);
|
||||||
assert(code == 0 || code);
|
assert(code == 0 || code);
|
||||||
|
|
||||||
schtFreeQueryJob(0);
|
schtFreeQueryJob(0);
|
||||||
|
@ -539,7 +539,7 @@ TEST(queryTest, normalCase) {
|
||||||
schtSetExecNode();
|
schtSetExecNode();
|
||||||
schtSetAsyncSendMsgToServer();
|
schtSetAsyncSendMsgToServer();
|
||||||
|
|
||||||
code = scheduleAsyncExecJob(mockPointer, qnodeList, &dag, &pJob);
|
code = schedulerAsyncExecJob(mockPointer, qnodeList, &dag, &pJob);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SSchJob *job = (SSchJob *)pJob;
|
SSchJob *job = (SSchJob *)pJob;
|
||||||
|
@ -594,7 +594,7 @@ TEST(queryTest, normalCase) {
|
||||||
pthread_create(&(thread1), &thattr, schtCreateFetchRspThread, job);
|
pthread_create(&(thread1), &thattr, schtCreateFetchRspThread, job);
|
||||||
|
|
||||||
void *data = NULL;
|
void *data = NULL;
|
||||||
code = scheduleFetchRows(job, &data);
|
code = schedulerFetchRows(job, &data);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SRetrieveTableRsp *pRsp = (SRetrieveTableRsp *)data;
|
SRetrieveTableRsp *pRsp = (SRetrieveTableRsp *)data;
|
||||||
|
@ -603,11 +603,11 @@ TEST(queryTest, normalCase) {
|
||||||
tfree(data);
|
tfree(data);
|
||||||
|
|
||||||
data = NULL;
|
data = NULL;
|
||||||
code = scheduleFetchRows(job, &data);
|
code = schedulerFetchRows(job, &data);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
ASSERT_TRUE(data);
|
ASSERT_TRUE(data);
|
||||||
|
|
||||||
scheduleFreeJob(pJob);
|
schedulerFreeJob(pJob);
|
||||||
|
|
||||||
schtFreeQueryDag(&dag);
|
schtFreeQueryDag(&dag);
|
||||||
|
|
||||||
|
@ -649,11 +649,11 @@ TEST(insertTest, normalCase) {
|
||||||
pthread_create(&(thread1), &thattr, schtSendRsp, &pInsertJob);
|
pthread_create(&(thread1), &thattr, schtSendRsp, &pInsertJob);
|
||||||
|
|
||||||
SQueryResult res = {0};
|
SQueryResult res = {0};
|
||||||
code = scheduleExecJob(mockPointer, qnodeList, &dag, &pInsertJob, &res);
|
code = schedulerExecJob(mockPointer, qnodeList, &dag, &pInsertJob, &res);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
ASSERT_EQ(res.numOfRows, 20);
|
ASSERT_EQ(res.numOfRows, 20);
|
||||||
|
|
||||||
scheduleFreeJob(pInsertJob);
|
schedulerFreeJob(pInsertJob);
|
||||||
|
|
||||||
schedulerDestroy();
|
schedulerDestroy();
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,12 +43,12 @@ typedef struct SSyncRaftLog SSyncRaftLog;
|
||||||
typedef struct SSyncRaftEntry SSyncRaftEntry;
|
typedef struct SSyncRaftEntry SSyncRaftEntry;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
#ifndef MIN
|
#ifndef TMIN
|
||||||
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
|
#define TMIN(x, y) (((x) < (y)) ? (x) : (y))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MAX
|
#ifndef TMAX
|
||||||
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
|
#define TMAX(x, y) (((x) > (y)) ? (x) : (y))
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ bool syncRaftProgressMaybeUpdate(SSyncRaftProgress* progress, SyncIndex lastInde
|
||||||
probeAcked(progress);
|
probeAcked(progress);
|
||||||
}
|
}
|
||||||
|
|
||||||
progress->nextIndex = MAX(progress->nextIndex, lastIndex + 1);
|
progress->nextIndex = TMAX(progress->nextIndex, lastIndex + 1);
|
||||||
|
|
||||||
return updated;
|
return updated;
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ bool syncRaftProgressMaybeDecrTo(SSyncRaftProgress* progress,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
progress->nextIndex = MAX(MIN(rejected, matchHint + 1), 1);
|
progress->nextIndex = TMAX(TMIN(rejected, matchHint + 1), 1);
|
||||||
|
|
||||||
progress->probeSent = false;
|
progress->probeSent = false;
|
||||||
return true;
|
return true;
|
||||||
|
@ -166,7 +166,7 @@ void syncRaftProgressBecomeProbe(SSyncRaftProgress* progress) {
|
||||||
if (progress->state == PROGRESS_STATE_SNAPSHOT) {
|
if (progress->state == PROGRESS_STATE_SNAPSHOT) {
|
||||||
SyncIndex pendingSnapshotIndex = progress->pendingSnapshotIndex;
|
SyncIndex pendingSnapshotIndex = progress->pendingSnapshotIndex;
|
||||||
resetProgressState(progress, PROGRESS_STATE_PROBE);
|
resetProgressState(progress, PROGRESS_STATE_PROBE);
|
||||||
progress->nextIndex = MAX(progress->matchIndex + 1, pendingSnapshotIndex + 1);
|
progress->nextIndex = TMAX(progress->matchIndex + 1, pendingSnapshotIndex + 1);
|
||||||
} else {
|
} else {
|
||||||
resetProgressState(progress, PROGRESS_STATE_PROBE);
|
resetProgressState(progress, PROGRESS_STATE_PROBE);
|
||||||
progress->nextIndex = progress->matchIndex + 1;
|
progress->nextIndex = progress->matchIndex + 1;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
set(TDB_SUBDIRS "btree" "db" "hash" "mpool" "dmgr")
|
set(TDB_SUBDIRS "db")
|
||||||
foreach(TDB_SUBDIR ${TDB_SUBDIRS})
|
foreach(TDB_SUBDIR ${TDB_SUBDIRS})
|
||||||
aux_source_directory("src/${TDB_SUBDIR}" TDB_SRC)
|
aux_source_directory("src/${TDB_SUBDIR}" TDB_SRC)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
|
@ -22,30 +22,41 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TDB_EXTERN
|
// #define TDB_EXTERN
|
||||||
#define TDB_PUBLIC
|
// #define TDB_PUBLIC
|
||||||
#define TDB_STATIC static
|
// #define TDB_STATIC static
|
||||||
|
|
||||||
typedef enum {
|
// typedef enum { TDB_BTREE_T = 0, TDB_HASH_T = 1, TDB_HEAP_T = 2 } tdb_db_t;
|
||||||
TDB_BTREE_T = 0,
|
|
||||||
TDB_HASH_T,
|
|
||||||
TDB_HEAP_T,
|
|
||||||
} tdb_db_t;
|
|
||||||
|
|
||||||
// Forward declaration
|
// // Forward declarations
|
||||||
typedef struct TDB TDB;
|
// typedef struct TDB TDB;
|
||||||
typedef struct TDB_CURSOR TDB_CURSOR;
|
// // typedef struct TDB_MPOOL TDB_MPOOL;
|
||||||
|
// // typedef struct TDB_MPFILE TDB_MPFILE;
|
||||||
|
// // typedef struct TDB_CURSOR TDB_CURSOR;
|
||||||
|
|
||||||
// SKey
|
// typedef struct {
|
||||||
typedef struct {
|
// void* bdata;
|
||||||
void* bdata;
|
// uint32_t size;
|
||||||
uint32_t size;
|
// } TDB_KEY, TDB_VALUE;
|
||||||
} TDB_KEY, TDB_VALUE;
|
|
||||||
|
|
||||||
// TDB Operations
|
// // TDB Operations
|
||||||
TDB_EXTERN int tdbCreateDB(TDB** dbpp, tdb_db_t type);
|
// int tdbCreateDB(TDB** dbpp, tdb_db_t type);
|
||||||
TDB_EXTERN int tdbOpenDB(TDB* dbp, const char* fname, const char* dbname, uint32_t flags);
|
// int tdbOpenDB(TDB* dbp, const char* fname, const char* dbname, uint32_t flags);
|
||||||
TDB_EXTERN int tdbCloseDB(TDB* dbp, uint32_t flags);
|
// int tdbCloseDB(TDB* dbp, uint32_t flags);
|
||||||
|
// int tdbPut(TDB* dbp, const TDB_KEY* key, const TDB_VALUE* value, uint32_t flags);
|
||||||
|
// int tdbGet(TDB* dbp, const TDB_KEY* key, TDB_VALUE* value, uint32_t flags);
|
||||||
|
|
||||||
|
// // TDB_MPOOL
|
||||||
|
// int tdbOpenMPool(TDB_MPOOL** mp);
|
||||||
|
// int tdbCloseMPool(TDB_MPOOL* mp);
|
||||||
|
|
||||||
|
// // TDB_MPFILE
|
||||||
|
// int tdbOpenMPFile(TDB_MPFILE** mpf, TDB_MPOOL* mp);
|
||||||
|
// int tdbCloseMPFile(TDB_MPFILE** mpf);
|
||||||
|
|
||||||
|
// // TDB_CURSOR
|
||||||
|
// int tdbOpenCursor(TDB* dbp, TDB_CURSOR** tdbcpp);
|
||||||
|
// int tdbCloseCurosr(TDB_CURSOR* tdbcp);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,86 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tdbDB.h"
|
|
||||||
#include "tdb.h"
|
|
||||||
|
|
||||||
TDB_EXTERN int tdbCreateDB(TDB** dbpp, tdb_db_t type) {
|
|
||||||
TDB* dbp;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
dbp = calloc(1, sizeof(*dbp));
|
|
||||||
if (dbp == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
dbp->pageSize = TDB_DEFAULT_PGSIZE;
|
|
||||||
dbp->type = type;
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case TDB_BTREE_T:
|
|
||||||
// ret = tdbInitBtreeDB(dbp);
|
|
||||||
// if (ret < 0) goto _err;
|
|
||||||
break;
|
|
||||||
case TDB_HASH_T:
|
|
||||||
// ret = tdbInitHashDB(dbp);
|
|
||||||
// if (ret < 0) goto _err;
|
|
||||||
break;
|
|
||||||
case TDB_HEAP_T:
|
|
||||||
// ret = tdbInitHeapDB(dbp);
|
|
||||||
// if (ret < 0) goto _err;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
*dbpp = dbp;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
_err:
|
|
||||||
if (dbp) {
|
|
||||||
free(dbp);
|
|
||||||
}
|
|
||||||
*dbpp = NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
TDB_EXTERN int tdbOpenDB(TDB* dbp, const char* fname, const char* dbname, uint32_t flags) {
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if ((dbp->fname = strdup(fname)) == NULL) {
|
|
||||||
ret = -1;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the backup file if the file not exists
|
|
||||||
|
|
||||||
// Open the file as a sub-db or a master-db
|
|
||||||
if (dbname) {
|
|
||||||
if ((dbp->dbname = strdup(dbname)) == NULL) {
|
|
||||||
ret = -1;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
// TODO: Open the DB as a SUB-DB in this file
|
|
||||||
} else {
|
|
||||||
// TODO: Open the DB as a MASTER-DB in this file
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
TDB_EXTERN int tdbCloseDB(TDB* dbp, uint32_t flags) {
|
|
||||||
// TODO
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -13,23 +13,14 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _TD_TDB_HEAP_H_
|
#include "tdb_db.h"
|
||||||
#define _TD_TDB_HEAP_H_
|
|
||||||
|
|
||||||
#include "tdbDef.h"
|
int tdbOpen(TDB **dbpp, const char *fname, const char *dbname, uint32_t flags) {
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
// TODO
|
// TODO
|
||||||
} TDB_HEAP;
|
return 0;
|
||||||
|
|
||||||
TDB_PUBLIC int tdbInitHeapDB(TDB *dbp);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_TDB_HEAP_H_*/
|
int tdbClose(TDB *dbp, uint32_t flags) {
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,379 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "tdb_mpool.h"
|
||||||
|
|
||||||
|
static int tdbGnrtFileID(const char *fname, uint8_t *fileid);
|
||||||
|
static void tdbMPoolRegFile(TDB_MPOOL *mp, TDB_MPFILE *mpf);
|
||||||
|
static void tdbMPoolUnregFile(TDB_MPOOL *mp, TDB_MPFILE *mpf);
|
||||||
|
static TDB_MPFILE *tdbMPoolGetFile(TDB_MPOOL *mp, uint8_t *fileid);
|
||||||
|
static int tdbMPoolFileReadPage(TDB_MPFILE *mpf, pgno_t pgno, void *p);
|
||||||
|
static int tdbMPoolFileWritePage(TDB_MPFILE *mpf, pgno_t pgno, const void *p);
|
||||||
|
static void tdbMPoolClockEvictPage(TDB_MPOOL *mp, pg_t **pagepp);
|
||||||
|
|
||||||
|
int tdbMPoolOpen(TDB_MPOOL **mpp, uint64_t cachesize, pgsize_t pgsize) {
|
||||||
|
TDB_MPOOL *mp = NULL;
|
||||||
|
size_t tsize;
|
||||||
|
pg_t * pagep;
|
||||||
|
|
||||||
|
// check parameters
|
||||||
|
if (!TDB_IS_PGSIZE_VLD(pgsize)) {
|
||||||
|
tdbError("invalid page size");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// allocate handle
|
||||||
|
mp = (TDB_MPOOL *)calloc(1, sizeof(*mp));
|
||||||
|
if (mp == NULL) {
|
||||||
|
tdbError("failed to malloc memory pool handle");
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize the handle
|
||||||
|
mp->cachesize = cachesize;
|
||||||
|
mp->pgsize = pgsize;
|
||||||
|
mp->npages = cachesize / pgsize;
|
||||||
|
mp->clockHand = 0;
|
||||||
|
|
||||||
|
TD_DLIST_INIT(&mp->freeList);
|
||||||
|
|
||||||
|
mp->pages = (pg_t *)calloc(mp->npages, sizeof(pg_t));
|
||||||
|
if (mp->pages == NULL) {
|
||||||
|
tdbError("failed to malloc memory pool pages");
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (frame_id_t i = 0; i < mp->npages; i++) {
|
||||||
|
mp->pages[i].p = malloc(pgsize);
|
||||||
|
if (mp->pages[i].p == NULL) {
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosInitRWLatch(&mp->pages[i].rwLatch);
|
||||||
|
mp->pages[i].frameid = i;
|
||||||
|
mp->pages[i].pgid = TDB_IVLD_PGID;
|
||||||
|
|
||||||
|
// add new page to the free list
|
||||||
|
TD_DLIST_APPEND_WITH_FIELD(&(mp->freeList), &(mp->pages[i]), free);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PGTAB_FACTOR 1.0
|
||||||
|
mp->pgtab.nbucket = mp->npages / PGTAB_FACTOR;
|
||||||
|
mp->pgtab.hashtab = (pg_list_t *)calloc(mp->pgtab.nbucket, sizeof(pg_list_t));
|
||||||
|
if (mp->pgtab.hashtab == NULL) {
|
||||||
|
tdbError("failed to malloc memory pool hash table");
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return
|
||||||
|
*mpp = mp;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
tdbMPoolClose(mp);
|
||||||
|
*mpp = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tdbMPoolClose(TDB_MPOOL *mp) {
|
||||||
|
if (mp) {
|
||||||
|
tfree(mp->pgtab.hashtab);
|
||||||
|
if (mp->pages) {
|
||||||
|
for (int i = 0; i < mp->npages; i++) {
|
||||||
|
tfree(mp->pages[i].p);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(mp->pages);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(mp);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tdbMPoolFileOpen(TDB_MPFILE **mpfp, const char *fname, TDB_MPOOL *mp) {
|
||||||
|
TDB_MPFILE *mpf;
|
||||||
|
|
||||||
|
if ((mpf = (TDB_MPFILE *)calloc(1, sizeof(*mpf))) == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mpf->fd = -1;
|
||||||
|
|
||||||
|
if ((mpf->fname = strdup(fname)) == NULL) {
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((mpf->fd = open(fname, O_CREAT | O_RDWR, 0755)) < 0) {
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbGnrtFileID(fname, mpf->fileid) < 0) {
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register current MPF to MP
|
||||||
|
tdbMPoolRegFile(mp, mpf);
|
||||||
|
|
||||||
|
*mpfp = mpf;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
tdbMPoolFileClose(mpf);
|
||||||
|
*mpfp = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tdbMPoolFileClose(TDB_MPFILE *mpf) {
|
||||||
|
if (mpf) {
|
||||||
|
if (mpf->fd > 0) {
|
||||||
|
close(mpf->fd);
|
||||||
|
}
|
||||||
|
tfree(mpf->fname);
|
||||||
|
free(mpf);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MPF_GET_PAGE_BUCKETID(fileid, pgno, nbuckets) \
|
||||||
|
({ \
|
||||||
|
uint64_t *tmp = (uint64_t *)fileid; \
|
||||||
|
(tmp[0] + tmp[1] + tmp[2] + (pgno)) % (nbuckets); \
|
||||||
|
})
|
||||||
|
|
||||||
|
int tdbMPoolFileNewPage(TDB_MPFILE *mpf, pgno_t *pgno, void *addr) {
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tdbMPoolFileFreePage(TDB_MPOOL *mpf, pgno_t *pgno, void *addr) {
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tdbMPoolFileGetPage(TDB_MPFILE *mpf, pgno_t pgno, void *addr) {
|
||||||
|
pg_t * pagep;
|
||||||
|
TDB_MPOOL *mp;
|
||||||
|
pg_list_t *pglist;
|
||||||
|
|
||||||
|
mp = mpf->mp;
|
||||||
|
|
||||||
|
// check if the page already in pool
|
||||||
|
pglist = mp->pgtab.hashtab + MPF_GET_PAGE_BUCKETID(mpf->fileid, pgno, mp->pgtab.nbucket);
|
||||||
|
pagep = TD_DLIST_HEAD(pglist);
|
||||||
|
while (pagep) {
|
||||||
|
if (memcmp(mpf->fileid, pagep->pgid.fileid, TDB_FILE_ID_LEN) == 0 && pgno == pagep->pgid.pgno) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pagep = TD_DLIST_NODE_NEXT_WITH_FIELD(pagep, hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pagep) {
|
||||||
|
// page is found
|
||||||
|
// todo: pin the page and return
|
||||||
|
*(void **)addr = pagep->p;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// page not found
|
||||||
|
pagep = TD_DLIST_HEAD(&mp->freeList);
|
||||||
|
if (pagep) {
|
||||||
|
// has free page
|
||||||
|
TD_DLIST_POP_WITH_FIELD(&(mp->freeList), pagep, free);
|
||||||
|
} else {
|
||||||
|
// no free page available
|
||||||
|
tdbMPoolClockEvictPage(mp, &pagep);
|
||||||
|
if (pagep) {
|
||||||
|
if (pagep->dirty) {
|
||||||
|
// TODO: Handle dirty page eviction
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pagep == NULL) {
|
||||||
|
// no available container page
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// load page from the disk if a container page is available
|
||||||
|
// TODO: load the page from the disk
|
||||||
|
if (tdbMPoolFileReadPage(mpf, pgno, pagep->p) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(pagep->pgid.fileid, mpf->fileid, TDB_FILE_ID_LEN);
|
||||||
|
pagep->pgid.pgno = pgno;
|
||||||
|
pagep->dirty = 0;
|
||||||
|
pagep->pinRef = 1;
|
||||||
|
|
||||||
|
// add current page to page table
|
||||||
|
TD_DLIST_APPEND_WITH_FIELD(pglist, pagep, hash);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tdbMPoolFilePutPage(TDB_MPFILE *mpf, pgno_t pgno, void *addr) {
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int tdbGnrtFileID(const char *fname, uint8_t *fileid) {
|
||||||
|
struct stat statbuf;
|
||||||
|
|
||||||
|
if (stat(fname, &statbuf) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(fileid, 0, TDB_FILE_ID_LEN);
|
||||||
|
|
||||||
|
((uint64_t *)fileid)[0] = (uint64_t)statbuf.st_ino;
|
||||||
|
((uint64_t *)fileid)[1] = (uint64_t)statbuf.st_dev;
|
||||||
|
((uint64_t *)fileid)[2] = rand();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MPF_GET_BUCKETID(fileid) \
|
||||||
|
({ \
|
||||||
|
uint64_t *tmp = (uint64_t *)fileid; \
|
||||||
|
(tmp[0] + tmp[1] + tmp[2]) % MPF_HASH_BUCKETS; \
|
||||||
|
})
|
||||||
|
|
||||||
|
static void tdbMPoolRegFile(TDB_MPOOL *mp, TDB_MPFILE *mpf) {
|
||||||
|
mpf_bucket_t *bktp;
|
||||||
|
|
||||||
|
bktp = mp->mpfht.buckets + MPF_GET_BUCKETID(mpf->fileid);
|
||||||
|
|
||||||
|
taosWLockLatch(&(bktp->latch));
|
||||||
|
|
||||||
|
TD_DLIST_APPEND_WITH_FIELD(bktp, mpf, node);
|
||||||
|
|
||||||
|
taosWUnLockLatch(&(bktp->latch));
|
||||||
|
|
||||||
|
mpf->mp = mp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static TDB_MPFILE *tdbMPoolGetFile(TDB_MPOOL *mp, uint8_t *fileid) {
|
||||||
|
TDB_MPFILE * mpf = NULL;
|
||||||
|
mpf_bucket_t *bktp;
|
||||||
|
|
||||||
|
bktp = mp->mpfht.buckets + MPF_GET_BUCKETID(fileid);
|
||||||
|
|
||||||
|
taosRLockLatch(&(bktp->latch));
|
||||||
|
|
||||||
|
mpf = TD_DLIST_HEAD(bktp);
|
||||||
|
while (mpf) {
|
||||||
|
if (memcmp(fileid, mpf->fileid, TDB_FILE_ID_LEN) == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mpf = TD_DLIST_NODE_NEXT_WITH_FIELD(mpf, node);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosRUnLockLatch(&(bktp->latch));
|
||||||
|
|
||||||
|
return mpf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tdbMPoolUnregFile(TDB_MPOOL *mp, TDB_MPFILE *mpf) {
|
||||||
|
mpf_bucket_t *bktp;
|
||||||
|
TDB_MPFILE * tmpf;
|
||||||
|
|
||||||
|
if (mpf->mp == NULL) return;
|
||||||
|
|
||||||
|
ASSERT(mpf->mp == mp);
|
||||||
|
|
||||||
|
bktp = mp->mpfht.buckets + MPF_GET_BUCKETID(mpf->fileid);
|
||||||
|
|
||||||
|
taosWLockLatch(&(bktp->latch));
|
||||||
|
|
||||||
|
tmpf = TD_DLIST_HEAD(bktp);
|
||||||
|
|
||||||
|
while (tmpf) {
|
||||||
|
if (memcmp(mpf->fileid, tmpf->fileid, TDB_FILE_ID_LEN) == 0) {
|
||||||
|
TD_DLIST_POP_WITH_FIELD(bktp, tmpf, node);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpf = TD_DLIST_NODE_NEXT_WITH_FIELD(tmpf, node);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosWUnLockLatch(&(bktp->latch));
|
||||||
|
|
||||||
|
ASSERT(tmpf == mpf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int tdbMPoolFileReadPage(TDB_MPFILE *mpf, pgno_t pgno, void *p) {
|
||||||
|
pgsize_t pgsize;
|
||||||
|
TDB_MPOOL *mp;
|
||||||
|
off_t offset;
|
||||||
|
size_t rsize;
|
||||||
|
|
||||||
|
mp = mpf->mp;
|
||||||
|
pgsize = mp->pgsize;
|
||||||
|
offset = pgno * pgsize;
|
||||||
|
|
||||||
|
// TODO: use loop to read all data
|
||||||
|
rsize = pread(mpf->fd, p, pgsize, offset);
|
||||||
|
// TODO: error handle
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int tdbMPoolFileWritePage(TDB_MPFILE *mpf, pgno_t pgno, const void *p) {
|
||||||
|
pgsize_t pgsize;
|
||||||
|
TDB_MPOOL *mp;
|
||||||
|
off_t offset;
|
||||||
|
|
||||||
|
mp = mpf->mp;
|
||||||
|
pgsize = mp->pgsize;
|
||||||
|
offset = pgno * pgsize;
|
||||||
|
|
||||||
|
lseek(mpf->fd, offset, SEEK_SET);
|
||||||
|
// TODO: handle error
|
||||||
|
|
||||||
|
write(mpf->fd, p, pgsize);
|
||||||
|
// TODO: handle error
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tdbMPoolClockEvictPage(TDB_MPOOL *mp, pg_t **pagepp) {
|
||||||
|
pg_t * pagep;
|
||||||
|
frame_id_t och;
|
||||||
|
|
||||||
|
*pagepp = NULL;
|
||||||
|
och = mp->clockHand;
|
||||||
|
|
||||||
|
do {
|
||||||
|
pagep = mp->pages + mp->clockHand;
|
||||||
|
mp->clockHand = (mp->clockHand + 1) % mp->npages;
|
||||||
|
|
||||||
|
if (pagep->pinRef == 0) {
|
||||||
|
if (pagep->rbit == 1) {
|
||||||
|
pagep->rbit = 0;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mp->clockHand == och) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} while (1);
|
||||||
|
|
||||||
|
*pagepp = pagep;
|
||||||
|
}
|
|
@ -1,74 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tdbDiskMgr.h"
|
|
||||||
|
|
||||||
struct STkvDiskMgr {
|
|
||||||
char * fname;
|
|
||||||
uint16_t pgsize;
|
|
||||||
FileFd fd;
|
|
||||||
pgid_t npgid;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define PAGE_OFFSET(PGID, PGSIZE) ((PGID) * (PGSIZE))
|
|
||||||
|
|
||||||
int tdmOpen(STkvDiskMgr **ppDiskMgr, const char *fname, uint16_t pgsize) {
|
|
||||||
STkvDiskMgr *pDiskMgr;
|
|
||||||
|
|
||||||
pDiskMgr = malloc(sizeof(*pDiskMgr));
|
|
||||||
if (pDiskMgr == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pDiskMgr->fname = strdup(fname);
|
|
||||||
if (pDiskMgr->fname == NULL) {
|
|
||||||
free(pDiskMgr);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
pDiskMgr->pgsize = pgsize;
|
|
||||||
pDiskMgr->fd = open(fname, O_CREAT | O_RDWR, 0755);
|
|
||||||
if (pDiskMgr->fd < 0) {
|
|
||||||
free(pDiskMgr->fname);
|
|
||||||
free(pDiskMgr);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
*ppDiskMgr = pDiskMgr;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int tdmClose(STkvDiskMgr *pDiskMgr) {
|
|
||||||
close(pDiskMgr->fd);
|
|
||||||
free(pDiskMgr->fname);
|
|
||||||
free(pDiskMgr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int tdmReadPage(STkvDiskMgr *pDiskMgr, pgid_t pgid, void *pData) {
|
|
||||||
taosLSeekFile(pDiskMgr->fd, PAGE_OFFSET(pgid, pDiskMgr->pgsize), SEEK_SET);
|
|
||||||
taosReadFile(pDiskMgr->fd, pData, pDiskMgr->pgsize);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int tdmWritePage(STkvDiskMgr *pDiskMgr, pgid_t pgid, const void *pData) {
|
|
||||||
taosLSeekFile(pDiskMgr->fd, PAGE_OFFSET(pgid, pDiskMgr->pgsize), SEEK_SET);
|
|
||||||
taosWriteFile(pDiskMgr->fd, pData, pDiskMgr->pgsize);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int tdmFlush(STkvDiskMgr *pDiskMgr) { return taosFsyncFile(pDiskMgr->fd); }
|
|
||||||
|
|
||||||
int32_t tdmAllocPage(STkvDiskMgr *pDiskMgr) { return pDiskMgr->npgid++; }
|
|
|
@ -1,35 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TD_TDB_BTREE_H_
|
|
||||||
#define _TD_TDB_BTREE_H_
|
|
||||||
|
|
||||||
#include "tdbDef.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
pgid_t root; // root page number
|
|
||||||
} TDB_BTREE;
|
|
||||||
|
|
||||||
TDB_PUBLIC int tdbInitBtreeDB(TDB *dbp);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_TDB_BTREE_H_*/
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TD_TDB_BUF_POOL_H_
|
|
||||||
#define _TD_TDB_BUF_POOL_H_
|
|
||||||
|
|
||||||
#include "tdbPage.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct STdbBufPool STdbBufPool;
|
|
||||||
|
|
||||||
int tbpOpen(STdbBufPool **ppTkvBufPool);
|
|
||||||
int tbpClose(STdbBufPool *pTkvBufPool);
|
|
||||||
STdbPage *tbpNewPage(STdbBufPool *pTkvBufPool);
|
|
||||||
int tbpDelPage(STdbBufPool *pTkvBufPool);
|
|
||||||
STdbPage *tbpFetchPage(STdbBufPool *pTkvBufPool, pgid_t pgid);
|
|
||||||
int tbpUnpinPage(STdbBufPool *pTkvBufPool, pgid_t pgid);
|
|
||||||
void tbpFlushPages(STdbBufPool *pTkvBufPool);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_TDB_BUF_POOL_H_*/
|
|
|
@ -1,40 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TD_TDISK_MGR_H_
|
|
||||||
#define _TD_TDISK_MGR_H_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "os.h"
|
|
||||||
|
|
||||||
#include "tdbDef.h"
|
|
||||||
|
|
||||||
typedef struct STkvDiskMgr STkvDiskMgr;
|
|
||||||
|
|
||||||
int tdmOpen(STkvDiskMgr **ppDiskMgr, const char *fname, uint16_t pgsize);
|
|
||||||
int tdmClose(STkvDiskMgr *pDiskMgr);
|
|
||||||
int tdmReadPage(STkvDiskMgr *pDiskMgr, pgid_t pgid, void *pData);
|
|
||||||
int tdmWritePage(STkvDiskMgr *pDiskMgr, pgid_t pgid, const void *pData);
|
|
||||||
int tdmFlush(STkvDiskMgr *pDiskMgr);
|
|
||||||
pgid_t tdmAllocPage(STkvDiskMgr *pDiskMgr);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_TDISK_MGR_H_*/
|
|
|
@ -1,35 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TD_TDB_HASH_H_
|
|
||||||
#define _TD_TDB_HASH_H_
|
|
||||||
|
|
||||||
#include "tdbDef.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
// TODO
|
|
||||||
} TDB_HASH;
|
|
||||||
|
|
||||||
TDB_PUBLIC int tdbInitHashDB(TDB *dbp);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_TDB_HASH_H_*/
|
|
|
@ -1,43 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TD_TKV_PAGE_H_
|
|
||||||
#define _TD_TKV_PAGE_H_
|
|
||||||
|
|
||||||
#include "os.h"
|
|
||||||
#include "tdbDef.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
pgid_t pgid;
|
|
||||||
int32_t pinCount;
|
|
||||||
bool idDirty;
|
|
||||||
char* pData;
|
|
||||||
} STdbPage;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint16_t dbver;
|
|
||||||
uint16_t pgsize;
|
|
||||||
uint32_t cksm;
|
|
||||||
} STdbPgHdr;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_TKV_PAGE_H_*/
|
|
|
@ -16,38 +16,28 @@
|
||||||
#ifndef _TD_TDB_DB_H_
|
#ifndef _TD_TDB_DB_H_
|
||||||
#define _TD_TDB_DB_H_
|
#define _TD_TDB_DB_H_
|
||||||
|
|
||||||
#include "tdb.h"
|
#include "tdb_mpool.h"
|
||||||
#include "tdbBtree.h"
|
|
||||||
#include "tdbHash.h"
|
|
||||||
#include "tdbHeap.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct TDB TDB;
|
||||||
// TODO
|
|
||||||
} TDB_MPOOL;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int fd;
|
|
||||||
} TDB_FH;
|
|
||||||
|
|
||||||
struct TDB {
|
struct TDB {
|
||||||
pgsize_t pageSize;
|
|
||||||
tdb_db_t type;
|
|
||||||
char * fname;
|
char * fname;
|
||||||
char * dbname;
|
char * dbname;
|
||||||
union {
|
TDB_MPFILE *mpf;
|
||||||
TDB_BTREE *btree;
|
// union {
|
||||||
TDB_HASH * hash;
|
// TDB_BTREE *btree;
|
||||||
TDB_HEAP * heap;
|
// TDB_HASH * hash;
|
||||||
} dbam; // db access method
|
// TDB_HEAP * heap;
|
||||||
|
// } dbam; // db access method
|
||||||
TDB_FH * fhp; // The backup file handle
|
|
||||||
TDB_MPOOL *mph; // The memory pool handle
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int tdbOpen(TDB **dbpp, const char *fname, const char *dbname, uint32_t flags);
|
||||||
|
int tdbClose(TDB *dbp, uint32_t flags);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
|
@ -13,18 +13,30 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _TD_TDB_DEF_H_
|
#ifndef _TD_TDB_INC_H_
|
||||||
#define _TD_TDB_DEF_H_
|
#define _TD_TDB_INC_H_
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
#include "tlist.h"
|
||||||
|
#include "tlockfree.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// pgno_t
|
||||||
|
typedef int32_t pgno_t;
|
||||||
|
#define TDB_IVLD_PGNO ((pgno_t)-1)
|
||||||
|
|
||||||
|
// fileid
|
||||||
|
#define TDB_FILE_ID_LEN 24
|
||||||
|
|
||||||
// pgid_t
|
// pgid_t
|
||||||
typedef int32_t pgid_t;
|
typedef struct {
|
||||||
#define TDB_IVLD_PGID ((pgid_t)-1)
|
uint8_t fileid[TDB_FILE_ID_LEN];
|
||||||
|
pgno_t pgno;
|
||||||
|
} pgid_t;
|
||||||
|
#define TDB_IVLD_PGID (pgid_t){0, TDB_IVLD_PGNO};
|
||||||
|
|
||||||
// framd_id_t
|
// framd_id_t
|
||||||
typedef int32_t frame_id_t;
|
typedef int32_t frame_id_t;
|
||||||
|
@ -34,10 +46,13 @@ typedef int32_t pgsize_t;
|
||||||
#define TDB_MIN_PGSIZE 512
|
#define TDB_MIN_PGSIZE 512
|
||||||
#define TDB_MAX_PGSIZE 16384
|
#define TDB_MAX_PGSIZE 16384
|
||||||
#define TDB_DEFAULT_PGSIZE 4096
|
#define TDB_DEFAULT_PGSIZE 4096
|
||||||
#define TDB_IS_PGSIZE_VLD(s) (((s) >= TKV_MIN_PGSIZE) && (TKV_MAX_PGSIZE <= TKV_MAX_PGSIZE))
|
#define TDB_IS_PGSIZE_VLD(s) (((s) >= TDB_MIN_PGSIZE) && ((s) <= TDB_MAX_PGSIZE))
|
||||||
|
|
||||||
|
// tdb_log
|
||||||
|
#define tdbError(var)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /*_TD_TDB_DEF_H_*/
|
#endif /*_TD_TDB_INC_H_*/
|
|
@ -0,0 +1,94 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _TD_TDB_MPOOL_H_
|
||||||
|
#define _TD_TDB_MPOOL_H_
|
||||||
|
|
||||||
|
#include "tdb_inc.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Exposed handle
|
||||||
|
typedef struct TDB_MPOOL TDB_MPOOL;
|
||||||
|
typedef struct TDB_MPFILE TDB_MPFILE;
|
||||||
|
|
||||||
|
typedef TD_DLIST_NODE(pg_t) pg_free_dlist_node_t, pg_hash_dlist_node_t;
|
||||||
|
typedef struct pg_t {
|
||||||
|
SRWLatch rwLatch;
|
||||||
|
frame_id_t frameid;
|
||||||
|
pgid_t pgid;
|
||||||
|
uint8_t dirty;
|
||||||
|
uint8_t rbit;
|
||||||
|
int32_t pinRef;
|
||||||
|
pg_free_dlist_node_t free;
|
||||||
|
pg_hash_dlist_node_t hash;
|
||||||
|
void * p;
|
||||||
|
} pg_t;
|
||||||
|
|
||||||
|
typedef TD_DLIST(pg_t) pg_list_t;
|
||||||
|
typedef struct {
|
||||||
|
SRWLatch latch;
|
||||||
|
TD_DLIST(TDB_MPFILE);
|
||||||
|
} mpf_bucket_t;
|
||||||
|
struct TDB_MPOOL {
|
||||||
|
int64_t cachesize;
|
||||||
|
pgsize_t pgsize;
|
||||||
|
int32_t npages;
|
||||||
|
pg_t * pages;
|
||||||
|
pg_list_t freeList;
|
||||||
|
frame_id_t clockHand;
|
||||||
|
struct {
|
||||||
|
int32_t nbucket;
|
||||||
|
pg_list_t *hashtab;
|
||||||
|
} pgtab; // page table, hash<pgid_t, pg_t>
|
||||||
|
struct {
|
||||||
|
#define MPF_HASH_BUCKETS 16
|
||||||
|
mpf_bucket_t buckets[MPF_HASH_BUCKETS];
|
||||||
|
} mpfht; // MPF hash table. MPFs using this MP will be put in this hash table
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MP_PAGE_AT(mp, idx) (mp)->pages[idx]
|
||||||
|
|
||||||
|
typedef TD_DLIST_NODE(TDB_MPFILE) td_mpf_dlist_node_t;
|
||||||
|
struct TDB_MPFILE {
|
||||||
|
char * fname; // file name
|
||||||
|
int fd; // fd
|
||||||
|
uint8_t fileid[TDB_FILE_ID_LEN]; // file ID
|
||||||
|
TDB_MPOOL * mp; // underlying memory pool
|
||||||
|
td_mpf_dlist_node_t node;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*=================================================== Exposed apis ==================================================*/
|
||||||
|
// TDB_MPOOL
|
||||||
|
int tdbMPoolOpen(TDB_MPOOL **mpp, uint64_t cachesize, pgsize_t pgsize);
|
||||||
|
int tdbMPoolClose(TDB_MPOOL *mp);
|
||||||
|
int tdbMPoolSync(TDB_MPOOL *mp);
|
||||||
|
|
||||||
|
// TDB_MPFILE
|
||||||
|
int tdbMPoolFileOpen(TDB_MPFILE **mpfp, const char *fname, TDB_MPOOL *mp);
|
||||||
|
int tdbMPoolFileClose(TDB_MPFILE *mpf);
|
||||||
|
int tdbMPoolFileNewPage(TDB_MPFILE *mpf, pgno_t *pgno, void *addr);
|
||||||
|
int tdbMPoolFileFreePage(TDB_MPOOL *mpf, pgno_t *pgno, void *addr);
|
||||||
|
int tdbMPoolFileGetPage(TDB_MPFILE *mpf, pgno_t pgno, void *addr);
|
||||||
|
int tdbMPoolFilePutPage(TDB_MPFILE *mpf, pgno_t pgno, void *addr);
|
||||||
|
int tdbMPoolFileSync(TDB_MPFILE *mpf);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*_TD_TDB_MPOOL_H_*/
|
|
@ -1,54 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "thash.h"
|
|
||||||
#include "tlist.h"
|
|
||||||
|
|
||||||
#include "tdbBufPool.h"
|
|
||||||
#include "tdbDiskMgr.h"
|
|
||||||
#include "tdbPage.h"
|
|
||||||
|
|
||||||
struct SFrameIdWrapper {
|
|
||||||
TD_SLIST_NODE(SFrameIdWrapper);
|
|
||||||
frame_id_t id;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct STdbBufPool {
|
|
||||||
STdbPage* pages;
|
|
||||||
STkvDiskMgr* pDiskMgr;
|
|
||||||
SHashObj* pgTb; // page_id_t --> frame_id_t
|
|
||||||
TD_SLIST(SFrameIdWrapper) freeList;
|
|
||||||
pthread_mutex_t mutex;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct STkvLRUReplacer {
|
|
||||||
} STkvLRUReplacer;
|
|
||||||
|
|
||||||
typedef struct STkvLFUReplacer {
|
|
||||||
} STkvLFUReplacer;
|
|
||||||
|
|
||||||
typedef struct STkvCLKReplacer {
|
|
||||||
} STkvCLKReplacer;
|
|
||||||
|
|
||||||
typedef enum { TKV_LRU_REPLACER = 0, TKV_LFU_REPLACER, TVK_CLK_REPLACER } tkv_replacer_t;
|
|
||||||
|
|
||||||
typedef struct STkvReplacer {
|
|
||||||
tkv_replacer_t type;
|
|
||||||
union {
|
|
||||||
STkvLRUReplacer lruRep;
|
|
||||||
STkvLFUReplacer lfuRep;
|
|
||||||
STkvCLKReplacer clkRep;
|
|
||||||
};
|
|
||||||
} STkvReplacer;
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
# tdbMPoolTest
|
||||||
|
add_executable(tdbMPoolTest "tdbMPoolTest.cpp")
|
||||||
|
target_link_libraries(tdbMPoolTest tdb gtest gtest_main)
|
||||||
|
|
||||||
# tdbTest
|
# tdbTest
|
||||||
add_executable(tdbTest "tdbTest.cpp")
|
add_executable(tdbTest "tdbTest.cpp")
|
||||||
target_link_libraries(tdbTest tdb gtest gtest_main)
|
target_link_libraries(tdbTest tdb gtest gtest_main)
|
|
@ -0,0 +1,31 @@
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "tdb_mpool.h"
|
||||||
|
|
||||||
|
TEST(tdb_mpool_test, test1) {
|
||||||
|
TDB_MPOOL * mp;
|
||||||
|
TDB_MPFILE *mpf;
|
||||||
|
pgno_t pgno;
|
||||||
|
void * pgdata;
|
||||||
|
|
||||||
|
// open mp
|
||||||
|
tdbMPoolOpen(&mp, 16384, 4096);
|
||||||
|
|
||||||
|
// open mpf
|
||||||
|
tdbMPoolFileOpen(&mpf, "test.db", mp);
|
||||||
|
|
||||||
|
#define TEST1_TOTAL_PAGES 100
|
||||||
|
for (int i = 0; i < TEST1_TOTAL_PAGES; i++) {
|
||||||
|
tdbMPoolFileNewPage(mpf, &pgno, pgdata);
|
||||||
|
|
||||||
|
*(pgno_t *)pgdata = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// close mpf
|
||||||
|
tdbMPoolFileClose(mpf);
|
||||||
|
|
||||||
|
// close mp
|
||||||
|
tdbMPoolClose(mp);
|
||||||
|
}
|
|
@ -3,8 +3,8 @@
|
||||||
#include "tdb.h"
|
#include "tdb.h"
|
||||||
|
|
||||||
TEST(tdb_api_test, tdb_create_open_close_db_test) {
|
TEST(tdb_api_test, tdb_create_open_close_db_test) {
|
||||||
int ret;
|
// int ret;
|
||||||
TDB *dbp;
|
// TDB *dbp;
|
||||||
|
|
||||||
// tdbCreateDB(&dbp, TDB_BTREE_T);
|
// tdbCreateDB(&dbp, TDB_BTREE_T);
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,7 @@ static inline int64_t walScanLogGetLastVer(SWal* pWal) {
|
||||||
|
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
stat(fnameStr, &statbuf);
|
stat(fnameStr, &statbuf);
|
||||||
int readSize = MIN(WAL_MAX_SIZE + 2, statbuf.st_size);
|
int readSize = TMIN(WAL_MAX_SIZE + 2, statbuf.st_size);
|
||||||
pLastFileInfo->fileSize = statbuf.st_size;
|
pLastFileInfo->fileSize = statbuf.st_size;
|
||||||
|
|
||||||
FileFd fd = taosOpenFileRead(fnameStr);
|
FileFd fd = taosOpenFileRead(fnameStr);
|
||||||
|
|
|
@ -98,7 +98,7 @@ void taosRemoveOldFiles(char *dirname, int32_t keepDays) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fileSec <= 100) continue;
|
if (fileSec <= 100) continue;
|
||||||
int32_t days = (int32_t)(ABS(sec - fileSec) / 86400 + 1);
|
int32_t days = (int32_t)(TABS(sec - fileSec) / 86400 + 1);
|
||||||
if (days > keepDays) {
|
if (days > keepDays) {
|
||||||
(void)remove(filename);
|
(void)remove(filename);
|
||||||
//printf("file:%s is removed, days:%d keepDays:%d", filename, days, keepDays);
|
//printf("file:%s is removed, days:%d keepDays:%d", filename, days, keepDays);
|
||||||
|
|
|
@ -353,7 +353,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_QRY_INVALID_INPUT, "invalid input")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_SCH_NOT_EXIST, "Scheduler not exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_SCH_NOT_EXIST, "Scheduler not exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_TASK_NOT_EXIST, "Task not exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_TASK_NOT_EXIST, "Task not exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_TASK_ALREADY_EXIST, "Task already exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_TASK_ALREADY_EXIST, "Task already exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_RES_CACHE_NOT_EXIST, "Task result cache not exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_TASK_CTX_NOT_EXIST, "Task context not exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_TASK_CANCELLED, "Task cancelled")
|
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_TASK_CANCELLED, "Task cancelled")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_TASK_DROPPED, "Task dropped")
|
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_TASK_DROPPED, "Task dropped")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_TASK_CANCELLING, "Task cancelling")
|
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_TASK_CANCELLING, "Task cancelling")
|
||||||
|
|
|
@ -67,7 +67,7 @@ static FORCE_INLINE void __wr_unlock(void *lock, int32_t type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t taosHashCapacity(int32_t length) {
|
static FORCE_INLINE int32_t taosHashCapacity(int32_t length) {
|
||||||
int32_t len = MIN(length, HASH_MAX_CAPACITY);
|
int32_t len = TMIN(length, HASH_MAX_CAPACITY);
|
||||||
|
|
||||||
int32_t i = 4;
|
int32_t i = 4;
|
||||||
while (i < len) i = (i << 1u);
|
while (i < len) i = (i << 1u);
|
||||||
|
|
|
@ -185,7 +185,7 @@ static void taosKeepOldLog(char *oldName) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
taosRemoveOldFiles(tsLogDir, ABS(tsLogKeepDays));
|
taosRemoveOldFiles(tsLogDir, TABS(tsLogKeepDays));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *taosThreadToOpenNewFile(void *param) {
|
static void *taosThreadToOpenNewFile(void *param) {
|
||||||
|
|
|
@ -70,11 +70,11 @@ void taosStringBuilderAppendNull(SStringBuilder* sb) { taosStringBuilderAppendSt
|
||||||
void taosStringBuilderAppendInteger(SStringBuilder* sb, int64_t v) {
|
void taosStringBuilderAppendInteger(SStringBuilder* sb, int64_t v) {
|
||||||
char buf[64];
|
char buf[64];
|
||||||
size_t len = snprintf(buf, sizeof(buf), "%" PRId64, v);
|
size_t len = snprintf(buf, sizeof(buf), "%" PRId64, v);
|
||||||
taosStringBuilderAppendStringLen(sb, buf, MIN(len, sizeof(buf)));
|
taosStringBuilderAppendStringLen(sb, buf, TMIN(len, sizeof(buf)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosStringBuilderAppendDouble(SStringBuilder* sb, double v) {
|
void taosStringBuilderAppendDouble(SStringBuilder* sb, double v) {
|
||||||
char buf[512];
|
char buf[512];
|
||||||
size_t len = snprintf(buf, sizeof(buf), "%.9lf", v);
|
size_t len = snprintf(buf, sizeof(buf), "%.9lf", v);
|
||||||
taosStringBuilderAppendStringLen(sb, buf, MIN(len, sizeof(buf)));
|
taosStringBuilderAppendStringLen(sb, buf, TMIN(len, sizeof(buf)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ int32_t createTable = 1;
|
||||||
int32_t insertData = 0;
|
int32_t insertData = 0;
|
||||||
int32_t batchNumOfTbl = 100;
|
int32_t batchNumOfTbl = 100;
|
||||||
int32_t batchNumOfRow = 1;
|
int32_t batchNumOfRow = 1;
|
||||||
|
int32_t totalRowsOfPerTbl = 1;
|
||||||
int32_t numOfVgroups = 2;
|
int32_t numOfVgroups = 2;
|
||||||
int32_t showTablesFlag = 0;
|
int32_t showTablesFlag = 0;
|
||||||
int32_t queryFlag = 0;
|
int32_t queryFlag = 0;
|
||||||
|
@ -106,14 +107,14 @@ void printCreateProgress(SThreadInfo *pInfo, int64_t t) {
|
||||||
totalTables, seconds, speed);
|
totalTables, seconds, speed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void printInsertProgress(SThreadInfo *pInfo, int64_t t) {
|
void printInsertProgress(SThreadInfo *pInfo, int64_t insertTotalRows) {
|
||||||
int64_t endMs = taosGetTimestampMs();
|
int64_t endMs = taosGetTimestampMs();
|
||||||
int64_t totalTables = t - pInfo->tableBeginIndex;
|
//int64_t totalTables = t - pInfo->tableBeginIndex;
|
||||||
float seconds = (endMs - pInfo->startMs) / 1000.0;
|
float seconds = (endMs - pInfo->startMs) / 1000.0;
|
||||||
float speed = totalTables / seconds;
|
float speed = insertTotalRows / seconds;
|
||||||
pInfo->insertDataSpeed = speed;
|
pInfo->insertDataSpeed = speed;
|
||||||
pPrint("thread:%d, %" PRId64 " rows inserted, time:%.2f sec, speed:%.1f rows/second, ", pInfo->threadIndex,
|
pPrint("thread:%d, %" PRId64 " rows inserted, time:%.2f sec, speed:%.1f rows/second, ", pInfo->threadIndex,
|
||||||
totalTables, seconds, speed);
|
insertTotalRows, seconds, speed);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int64_t getResult(TAOS_RES *tres) {
|
static int64_t getResult(TAOS_RES *tres) {
|
||||||
|
@ -181,14 +182,13 @@ void *threadFunc(void *param) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
pPrint("====before thread:%d, table range: %" PRId64 " - %" PRId64 "\n", pInfo->threadIndex, pInfo->tableBeginIndex,
|
//pPrint("====before thread:%d, table range: %" PRId64 " - %" PRId64 "\n", pInfo->threadIndex, pInfo->tableBeginIndex,
|
||||||
pInfo->tableEndIndex);
|
// pInfo->tableEndIndex);
|
||||||
|
|
||||||
pInfo->tableBeginIndex += startOffset;
|
pInfo->tableBeginIndex += startOffset;
|
||||||
pInfo->tableEndIndex += startOffset;
|
pInfo->tableEndIndex += startOffset;
|
||||||
|
|
||||||
pPrint("====after thread:%d, table range: %" PRId64 " - %" PRId64 "\n", pInfo->threadIndex, pInfo->tableBeginIndex,
|
pPrint("====thread:%d, table range: %" PRId64 " - %" PRId64 "\n", pInfo->threadIndex, pInfo->tableBeginIndex, pInfo->tableEndIndex);
|
||||||
pInfo->tableEndIndex);
|
|
||||||
|
|
||||||
sprintf(qstr, "use %s", pInfo->dbName);
|
sprintf(qstr, "use %s", pInfo->dbName);
|
||||||
TAOS_RES *pRes = taos_query(con, qstr);
|
TAOS_RES *pRes = taos_query(con, qstr);
|
||||||
|
@ -237,30 +237,27 @@ void *threadFunc(void *param) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (insertData) {
|
if (insertData) {
|
||||||
|
int64_t insertTotalRows = 0;
|
||||||
int64_t curMs = 0;
|
int64_t curMs = 0;
|
||||||
int64_t beginMs = taosGetTimestampMs();
|
int64_t beginMs = taosGetTimestampMs();
|
||||||
pInfo->startMs = beginMs;
|
pInfo->startMs = beginMs;
|
||||||
int64_t t = pInfo->tableBeginIndex;
|
int64_t t = pInfo->tableBeginIndex;
|
||||||
for (; t <= pInfo->tableEndIndex;) {
|
for (; t <= pInfo->tableEndIndex; t++) {
|
||||||
// int64_t batch = (pInfo->tableEndIndex - t);
|
//printf("table name: %"PRId64"\n", t);
|
||||||
// batch = MIN(batch, batchNum);
|
|
||||||
|
|
||||||
int32_t len = sprintf(qstr, "insert into ");
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < batchNumOfTbl;) {
|
|
||||||
int64_t ts = startTimestamp;
|
int64_t ts = startTimestamp;
|
||||||
|
for (int32_t i = 0; i < totalRowsOfPerTbl;) {
|
||||||
|
int32_t len = sprintf(qstr, "insert into ");
|
||||||
len += sprintf(qstr + len, "%s_t%" PRId64 " values ", stbName, t);
|
len += sprintf(qstr + len, "%s_t%" PRId64 " values ", stbName, t);
|
||||||
for (int32_t j = 0; j < batchNumOfRow; j++) {
|
for (int32_t j = 0; j < batchNumOfRow; j++) {
|
||||||
len += sprintf(qstr + len, "(%" PRId64 ", 6666) ", ts++);
|
len += sprintf(qstr + len, "(%" PRId64 ", 6666) ", ts++);
|
||||||
}
|
|
||||||
|
|
||||||
t++;
|
|
||||||
i++;
|
i++;
|
||||||
if (t > pInfo->tableEndIndex) {
|
insertTotalRows++;
|
||||||
|
if (i >= totalRowsOfPerTbl) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
int64_t startTs = taosGetTimestampUs();
|
int64_t startTs = taosGetTimestampUs();
|
||||||
TAOS_RES *pRes = taos_query(con, qstr);
|
TAOS_RES *pRes = taos_query(con, qstr);
|
||||||
code = taos_errno(pRes);
|
code = taos_errno(pRes);
|
||||||
|
@ -278,10 +275,12 @@ void *threadFunc(void *param) {
|
||||||
if (curMs - beginMs > 10000) {
|
if (curMs - beginMs > 10000) {
|
||||||
beginMs = curMs;
|
beginMs = curMs;
|
||||||
// printf("==== tableBeginIndex: %"PRId64", t: %"PRId64"\n", pInfo->tableBeginIndex, t);
|
// printf("==== tableBeginIndex: %"PRId64", t: %"PRId64"\n", pInfo->tableBeginIndex, t);
|
||||||
printInsertProgress(pInfo, t);
|
printInsertProgress(pInfo, insertTotalRows);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printInsertProgress(pInfo, t);
|
printInsertProgress(pInfo, insertTotalRows);
|
||||||
}
|
}
|
||||||
|
|
||||||
taos_close(con);
|
taos_close(con);
|
||||||
|
@ -319,6 +318,8 @@ void printHelp() {
|
||||||
printf("%s%s%s%d\n", indent, indent, "queryFlag, default is ", queryFlag);
|
printf("%s%s%s%d\n", indent, indent, "queryFlag, default is ", queryFlag);
|
||||||
printf("%s%s\n", indent, "-l");
|
printf("%s%s\n", indent, "-l");
|
||||||
printf("%s%s%s%d\n", indent, indent, "batchNumOfRow, default is ", batchNumOfRow);
|
printf("%s%s%s%d\n", indent, indent, "batchNumOfRow, default is ", batchNumOfRow);
|
||||||
|
printf("%s%s\n", indent, "-r");
|
||||||
|
printf("%s%s%s%d\n", indent, indent, "totalRowsOfPerTbl, default is ", totalRowsOfPerTbl);
|
||||||
|
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
@ -350,6 +351,8 @@ void parseArgument(int32_t argc, char *argv[]) {
|
||||||
batchNumOfTbl = atoi(argv[++i]);
|
batchNumOfTbl = atoi(argv[++i]);
|
||||||
} else if (strcmp(argv[i], "-l") == 0) {
|
} else if (strcmp(argv[i], "-l") == 0) {
|
||||||
batchNumOfRow = atoi(argv[++i]);
|
batchNumOfRow = atoi(argv[++i]);
|
||||||
|
} else if (strcmp(argv[i], "-r") == 0) {
|
||||||
|
totalRowsOfPerTbl = atoi(argv[++i]);
|
||||||
} else if (strcmp(argv[i], "-w") == 0) {
|
} else if (strcmp(argv[i], "-w") == 0) {
|
||||||
showTablesFlag = atoi(argv[++i]);
|
showTablesFlag = atoi(argv[++i]);
|
||||||
} else if (strcmp(argv[i], "-q") == 0) {
|
} else if (strcmp(argv[i], "-q") == 0) {
|
||||||
|
@ -370,6 +373,7 @@ void parseArgument(int32_t argc, char *argv[]) {
|
||||||
pPrint("%s insertData:%d %s", GREEN, insertData, NC);
|
pPrint("%s insertData:%d %s", GREEN, insertData, NC);
|
||||||
pPrint("%s batchNumOfTbl:%d %s", GREEN, batchNumOfTbl, NC);
|
pPrint("%s batchNumOfTbl:%d %s", GREEN, batchNumOfTbl, NC);
|
||||||
pPrint("%s batchNumOfRow:%d %s", GREEN, batchNumOfRow, NC);
|
pPrint("%s batchNumOfRow:%d %s", GREEN, batchNumOfRow, NC);
|
||||||
|
pPrint("%s totalRowsOfPerTbl:%d %s", GREEN, totalRowsOfPerTbl, NC);
|
||||||
pPrint("%s showTablesFlag:%d %s", GREEN, showTablesFlag, NC);
|
pPrint("%s showTablesFlag:%d %s", GREEN, showTablesFlag, NC);
|
||||||
pPrint("%s queryFlag:%d %s", GREEN, queryFlag, NC);
|
pPrint("%s queryFlag:%d %s", GREEN, queryFlag, NC);
|
||||||
|
|
||||||
|
|
|
@ -751,56 +751,56 @@ static int calcColWidth(TAOS_FIELD *field, int precision) {
|
||||||
|
|
||||||
switch (field->type) {
|
switch (field->type) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
return MAX(5, width); // 'false'
|
return TMAX(5, width); // 'false'
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
case TSDB_DATA_TYPE_UTINYINT:
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
return MAX(4, width); // '-127'
|
return TMAX(4, width); // '-127'
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
case TSDB_DATA_TYPE_USMALLINT:
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
return MAX(6, width); // '-32767'
|
return TMAX(6, width); // '-32767'
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:
|
||||||
case TSDB_DATA_TYPE_UINT:
|
case TSDB_DATA_TYPE_UINT:
|
||||||
return MAX(11, width); // '-2147483648'
|
return TMAX(11, width); // '-2147483648'
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
case TSDB_DATA_TYPE_UBIGINT:
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
return MAX(21, width); // '-9223372036854775807'
|
return TMAX(21, width); // '-9223372036854775807'
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
return MAX(20, width);
|
return TMAX(20, width);
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
return MAX(25, width);
|
return TMAX(25, width);
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BINARY:
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
if (field->bytes > tsMaxBinaryDisplayWidth) {
|
if (field->bytes > tsMaxBinaryDisplayWidth) {
|
||||||
return MAX(tsMaxBinaryDisplayWidth, width);
|
return TMAX(tsMaxBinaryDisplayWidth, width);
|
||||||
} else {
|
} else {
|
||||||
return MAX(field->bytes, width);
|
return TMAX(field->bytes, width);
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_NCHAR: {
|
case TSDB_DATA_TYPE_NCHAR: {
|
||||||
int16_t bytes = field->bytes * TSDB_NCHAR_SIZE;
|
int16_t bytes = field->bytes * TSDB_NCHAR_SIZE;
|
||||||
if (bytes > tsMaxBinaryDisplayWidth) {
|
if (bytes > tsMaxBinaryDisplayWidth) {
|
||||||
return MAX(tsMaxBinaryDisplayWidth, width);
|
return TMAX(tsMaxBinaryDisplayWidth, width);
|
||||||
} else {
|
} else {
|
||||||
return MAX(bytes, width);
|
return TMAX(bytes, width);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
if (args.is_raw_time) {
|
if (args.is_raw_time) {
|
||||||
return MAX(14, width);
|
return TMAX(14, width);
|
||||||
}
|
}
|
||||||
if (precision == TSDB_TIME_PRECISION_NANO) {
|
if (precision == TSDB_TIME_PRECISION_NANO) {
|
||||||
return MAX(29, width);
|
return TMAX(29, width);
|
||||||
} else if (precision == TSDB_TIME_PRECISION_MICRO) {
|
} else if (precision == TSDB_TIME_PRECISION_MICRO) {
|
||||||
return MAX(26, width); // '2020-01-01 00:00:00.000000'
|
return TMAX(26, width); // '2020-01-01 00:00:00.000000'
|
||||||
} else {
|
} else {
|
||||||
return MAX(23, width); // '2020-01-01 00:00:00.000'
|
return TMAX(23, width); // '2020-01-01 00:00:00.000'
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue