Merge branch '3.0' into test3.0/lihui
This commit is contained in:
commit
980cf46b71
|
@ -52,7 +52,7 @@ typedef struct SExprNode {
|
||||||
SArray* pAssociation;
|
SArray* pAssociation;
|
||||||
} SExprNode;
|
} SExprNode;
|
||||||
|
|
||||||
typedef enum EColumnType { COLUMN_TYPE_COLUMN = 1, COLUMN_TYPE_TAG } EColumnType;
|
typedef enum EColumnType { COLUMN_TYPE_COLUMN = 1, COLUMN_TYPE_TAG, COLUMN_TYPE_TBNAME } EColumnType;
|
||||||
|
|
||||||
typedef struct SColumnNode {
|
typedef struct SColumnNode {
|
||||||
SExprNode node; // QUERY_NODE_COLUMN
|
SExprNode node; // QUERY_NODE_COLUMN
|
||||||
|
|
|
@ -162,7 +162,7 @@ typedef struct SSyncLogStore {
|
||||||
SyncIndex (*syncLogEndIndex)(struct SSyncLogStore* pLogStore);
|
SyncIndex (*syncLogEndIndex)(struct SSyncLogStore* pLogStore);
|
||||||
bool (*syncLogIsEmpty)(struct SSyncLogStore* pLogStore);
|
bool (*syncLogIsEmpty)(struct SSyncLogStore* pLogStore);
|
||||||
int32_t (*syncLogEntryCount)(struct SSyncLogStore* pLogStore);
|
int32_t (*syncLogEntryCount)(struct SSyncLogStore* pLogStore);
|
||||||
bool (*syncLogInRange)(struct SSyncLogStore* pLogStore, SyncIndex index);
|
// bool (*syncLogInRange)(struct SSyncLogStore* pLogStore, SyncIndex index);
|
||||||
|
|
||||||
SyncIndex (*syncLogWriteIndex)(struct SSyncLogStore* pLogStore);
|
SyncIndex (*syncLogWriteIndex)(struct SSyncLogStore* pLogStore);
|
||||||
SyncIndex (*syncLogLastIndex)(struct SSyncLogStore* pLogStore);
|
SyncIndex (*syncLogLastIndex)(struct SSyncLogStore* pLogStore);
|
||||||
|
|
|
@ -2389,17 +2389,19 @@ static int32_t isSchemalessDb(STscObj *taos, SRequestObj *request) {
|
||||||
static void smlInsertCallback(void *param, void *res, int32_t code) {
|
static void smlInsertCallback(void *param, void *res, int32_t code) {
|
||||||
SRequestObj *pRequest = (SRequestObj *)res;
|
SRequestObj *pRequest = (SRequestObj *)res;
|
||||||
SSmlHandle *info = (SSmlHandle *)param;
|
SSmlHandle *info = (SSmlHandle *)param;
|
||||||
|
int32_t rows = taos_affected_rows(pRequest);
|
||||||
|
|
||||||
uDebug("SML:0x%" PRIx64 " result. code:%d, msg:%s", info->id, pRequest->code, pRequest->msgBuf);
|
uDebug("SML:0x%" PRIx64 " result. code:%d, msg:%s", info->id, pRequest->code, pRequest->msgBuf);
|
||||||
// lock
|
// lock
|
||||||
|
taosThreadSpinLock(&info->params->lock);
|
||||||
|
info->params->request->body.resInfo.numOfRows += rows;
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
taosThreadSpinLock(&info->params->lock);
|
|
||||||
info->params->request->code = code;
|
info->params->request->code = code;
|
||||||
taosThreadSpinUnlock(&info->params->lock);
|
|
||||||
}
|
}
|
||||||
|
taosThreadSpinUnlock(&info->params->lock);
|
||||||
// unlock
|
// unlock
|
||||||
|
|
||||||
printf("SML:0x%" PRIx64 " insert finished, code: %d, total: %d\n", info->id, code, info->affectedRows);
|
uDebug("SML:0x%" PRIx64 " insert finished, code: %d, rows: %d, total: %d", info->id, code, rows, info->affectedRows);
|
||||||
Params *pParam = info->params;
|
Params *pParam = info->params;
|
||||||
bool isLast = info->isLast;
|
bool isLast = info->isLast;
|
||||||
info->cost.endTime = taosGetTimestampUs();
|
info->cost.endTime = taosGetTimestampUs();
|
||||||
|
|
|
@ -1272,10 +1272,10 @@ TEST(testCase, sml_dup_time_Test) {
|
||||||
const char *sql[] = {
|
const char *sql[] = {
|
||||||
//"test_ms,t0=t c0=f 1626006833641",
|
//"test_ms,t0=t c0=f 1626006833641",
|
||||||
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=false,c1=1i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"xcxvwjvf\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000",
|
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=false,c1=1i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"xcxvwjvf\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000",
|
||||||
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=T,c1=2i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"fixrzcuq\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000",
|
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=T,c1=2i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"fixrzcuq\",c8=L\"ncharColValue\",c9=7u64 1626006834639000000",
|
||||||
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=3i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"iupzdqub\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000",
|
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=3i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"iupzdqub\",c8=L\"ncharColValue\",c9=7u64 1626006835639000000",
|
||||||
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=4i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"yvvtzzof\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000",
|
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=4i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"yvvtzzof\",c8=L\"ncharColValue\",c9=7u64 1626006836639000000",
|
||||||
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=5i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"vbxpilkj\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000"
|
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=5i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"vbxpilkj\",c8=L\"ncharColValue\",c9=7u64 1626006837639000000"
|
||||||
};
|
};
|
||||||
pRes = taos_query(taos, "use dup_time");
|
pRes = taos_query(taos, "use dup_time");
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
|
@ -127,7 +127,7 @@ int32_t tEncodeSEpSet(SEncoder *pEncoder, const SEpSet *pEp) {
|
||||||
if (tEncodeI8(pEncoder, pEp->numOfEps) < 0) return -1;
|
if (tEncodeI8(pEncoder, pEp->numOfEps) < 0) return -1;
|
||||||
for (int32_t i = 0; i < TSDB_MAX_REPLICA; i++) {
|
for (int32_t i = 0; i < TSDB_MAX_REPLICA; i++) {
|
||||||
if (tEncodeU16(pEncoder, pEp->eps[i].port) < 0) return -1;
|
if (tEncodeU16(pEncoder, pEp->eps[i].port) < 0) return -1;
|
||||||
if (tEncodeCStr(pEncoder, pEp->eps[i].fqdn) < 0) return -1;
|
if (tEncodeCStrWithLen(pEncoder, pEp->eps[i].fqdn, TSDB_FQDN_LEN) < 0) return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -3054,7 +3054,7 @@ int32_t tSerializeSConnectReq(void *buf, int32_t bufLen, SConnectReq *pReq) {
|
||||||
if (tEncodeCStr(&encoder, pReq->app) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->app) < 0) return -1;
|
||||||
if (tEncodeCStr(&encoder, pReq->db) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->db) < 0) return -1;
|
||||||
if (tEncodeCStr(&encoder, pReq->user) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->user) < 0) return -1;
|
||||||
if (tEncodeCStr(&encoder, pReq->passwd) < 0) return -1;
|
if (tEncodeCStrWithLen(&encoder, pReq->passwd, TSDB_PASSWORD_LEN) < 0) return -1;
|
||||||
if (tEncodeI64(&encoder, pReq->startTime) < 0) return -1;
|
if (tEncodeI64(&encoder, pReq->startTime) < 0) return -1;
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
|
|
@ -312,8 +312,10 @@ void buildChildTableName(RandTableName* rName) {
|
||||||
taosStringBuilderAppendStringLen(&sb, rName->sTableName, rName->sTableNameLen);
|
taosStringBuilderAppendStringLen(&sb, rName->sTableName, rName->sTableNameLen);
|
||||||
taosArraySort(rName->tags, compareKv);
|
taosArraySort(rName->tags, compareKv);
|
||||||
for (int j = 0; j < taosArrayGetSize(rName->tags); ++j) {
|
for (int j = 0; j < taosArrayGetSize(rName->tags); ++j) {
|
||||||
|
taosStringBuilderAppendChar(&sb, ',');
|
||||||
SSmlKv* tagKv = taosArrayGetP(rName->tags, j);
|
SSmlKv* tagKv = taosArrayGetP(rName->tags, j);
|
||||||
taosStringBuilderAppendStringLen(&sb, tagKv->key, tagKv->keyLen);
|
taosStringBuilderAppendStringLen(&sb, tagKv->key, tagKv->keyLen);
|
||||||
|
taosStringBuilderAppendChar(&sb, '=');
|
||||||
if (IS_VAR_DATA_TYPE(tagKv->type)) {
|
if (IS_VAR_DATA_TYPE(tagKv->type)) {
|
||||||
taosStringBuilderAppendStringLen(&sb, tagKv->value, tagKv->length);
|
taosStringBuilderAppendStringLen(&sb, tagKv->value, tagKv->length);
|
||||||
} else {
|
} else {
|
||||||
|
@ -326,9 +328,14 @@ void buildChildTableName(RandTableName* rName) {
|
||||||
tMD5Init(&context);
|
tMD5Init(&context);
|
||||||
tMD5Update(&context, (uint8_t*)keyJoined, (uint32_t)len);
|
tMD5Update(&context, (uint8_t*)keyJoined, (uint32_t)len);
|
||||||
tMD5Final(&context);
|
tMD5Final(&context);
|
||||||
uint64_t digest1 = *(uint64_t*)(context.digest);
|
|
||||||
uint64_t digest2 = *(uint64_t*)(context.digest + 8);
|
char temp[8] = {0};
|
||||||
snprintf(rName->childTableName, TSDB_TABLE_NAME_LEN, "t_%016" PRIx64 "%016" PRIx64, digest1, digest2);
|
rName->childTableName[0] = 't';
|
||||||
|
rName->childTableName[1] = '_';
|
||||||
|
for(int i = 0; i < 16; i++){
|
||||||
|
sprintf(temp, "%02x", context.digest[i]);
|
||||||
|
strcat(rName->childTableName, temp);
|
||||||
|
}
|
||||||
taosStringBuilderDestroy(&sb);
|
taosStringBuilderDestroy(&sb);
|
||||||
rName->uid = digest1;
|
rName->uid = *(uint64_t*)(context.digest);
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,7 @@ int32_t mmProcessGetLoadsReq(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
|
int32_t mmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
|
||||||
|
const STraceId *trace = &pMsg->info.traceId;
|
||||||
SDCreateMnodeReq createReq = {0};
|
SDCreateMnodeReq createReq = {0};
|
||||||
if (tDeserializeSDCreateMnodeReq(pMsg->pCont, pMsg->contLen, &createReq) != 0) {
|
if (tDeserializeSDCreateMnodeReq(pMsg->pCont, pMsg->contLen, &createReq) != 0) {
|
||||||
terrno = TSDB_CODE_INVALID_MSG;
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
@ -81,7 +82,7 @@ int32_t mmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
|
||||||
|
|
||||||
if (createReq.replica != 1) {
|
if (createReq.replica != 1) {
|
||||||
terrno = TSDB_CODE_INVALID_OPTION;
|
terrno = TSDB_CODE_INVALID_OPTION;
|
||||||
dError("failed to create mnode since %s", terrstr());
|
dGError("failed to create mnode since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +92,7 @@ int32_t mmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
|
||||||
mgmt.path = pInput->path;
|
mgmt.path = pInput->path;
|
||||||
mgmt.name = pInput->name;
|
mgmt.name = pInput->name;
|
||||||
if (mmWriteFile(&mgmt, &createReq.replicas[0], deployed) != 0) {
|
if (mmWriteFile(&mgmt, &createReq.replicas[0], deployed) != 0) {
|
||||||
dError("failed to write mnode file since %s", terrstr());
|
dGError("failed to write mnode file since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,7 +100,8 @@ int32_t mmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
|
int32_t mmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
|
||||||
SDDropMnodeReq dropReq = {0};
|
const STraceId *trace = &pMsg->info.traceId;
|
||||||
|
SDDropMnodeReq dropReq = {0};
|
||||||
if (tDeserializeSCreateDropMQSBNodeReq(pMsg->pCont, pMsg->contLen, &dropReq) != 0) {
|
if (tDeserializeSCreateDropMQSBNodeReq(pMsg->pCont, pMsg->contLen, &dropReq) != 0) {
|
||||||
terrno = TSDB_CODE_INVALID_MSG;
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -107,7 +109,7 @@ int32_t mmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
|
||||||
|
|
||||||
if (pInput->pData->dnodeId != 0 && dropReq.dnodeId != pInput->pData->dnodeId) {
|
if (pInput->pData->dnodeId != 0 && dropReq.dnodeId != pInput->pData->dnodeId) {
|
||||||
terrno = TSDB_CODE_INVALID_OPTION;
|
terrno = TSDB_CODE_INVALID_OPTION;
|
||||||
dError("failed to drop mnode since %s", terrstr());
|
dGError("failed to drop mnode since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,7 +119,7 @@ int32_t mmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
|
||||||
mgmt.path = pInput->path;
|
mgmt.path = pInput->path;
|
||||||
mgmt.name = pInput->name;
|
mgmt.name = pInput->name;
|
||||||
if (mmWriteFile(&mgmt, NULL, deployed) != 0) {
|
if (mmWriteFile(&mgmt, NULL, deployed) != 0) {
|
||||||
dError("failed to write mnode file since %s", terrstr());
|
dGError("failed to write mnode file since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
|
|
||||||
static inline int32_t mmAcquire(SMnodeMgmt *pMgmt) {
|
static inline int32_t mmAcquire(SMnodeMgmt *pMgmt) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
taosThreadRwlockRdlock(&pMgmt->lock);
|
taosThreadRwlockRdlock(&pMgmt->lock);
|
||||||
if (pMgmt->stopped) {
|
if (pMgmt->stopped) {
|
||||||
code = -1;
|
code = -1;
|
||||||
|
@ -48,7 +47,8 @@ static inline void mmSendRsp(SRpcMsg *pMsg, int32_t code) {
|
||||||
static void mmProcessRpcMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
|
static void mmProcessRpcMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
|
||||||
SMnodeMgmt *pMgmt = pInfo->ahandle;
|
SMnodeMgmt *pMgmt = pInfo->ahandle;
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
STraceId * trace = &pMsg->info.traceId;
|
|
||||||
|
const STraceId *trace = &pMsg->info.traceId;
|
||||||
dGTrace("msg:%p, get from mnode queue", pMsg);
|
dGTrace("msg:%p, get from mnode queue", pMsg);
|
||||||
|
|
||||||
switch (pMsg->msgType) {
|
switch (pMsg->msgType) {
|
||||||
|
@ -72,7 +72,7 @@ static void mmProcessRpcMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
|
||||||
mndPostProcessQueryMsg(pMsg);
|
mndPostProcessQueryMsg(pMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
dTrace("msg:%p, is freed, code:0x%x", pMsg, code);
|
dGTrace("msg:%p, is freed, code:0x%x", pMsg, code);
|
||||||
rpcFreeCont(pMsg->pCont);
|
rpcFreeCont(pMsg->pCont);
|
||||||
taosFreeQitem(pMsg);
|
taosFreeQitem(pMsg);
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,9 @@ static void mmProcessRpcMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
|
||||||
static void mmProcessSyncMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
|
static void mmProcessSyncMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
|
||||||
SMnodeMgmt *pMgmt = pInfo->ahandle;
|
SMnodeMgmt *pMgmt = pInfo->ahandle;
|
||||||
pMsg->info.node = pMgmt->pMnode;
|
pMsg->info.node = pMgmt->pMnode;
|
||||||
dTrace("msg:%p, get from mnode-sync queue", pMsg);
|
|
||||||
|
const STraceId *trace = &pMsg->info.traceId;
|
||||||
|
dGTrace("msg:%p, get from mnode-sync queue", pMsg);
|
||||||
|
|
||||||
SMsgHead *pHead = pMsg->pCont;
|
SMsgHead *pHead = pMsg->pCont;
|
||||||
pHead->contLen = ntohl(pHead->contLen);
|
pHead->contLen = ntohl(pHead->contLen);
|
||||||
|
@ -88,20 +90,22 @@ static void mmProcessSyncMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
|
||||||
|
|
||||||
int32_t code = mndProcessSyncMsg(pMsg);
|
int32_t code = mndProcessSyncMsg(pMsg);
|
||||||
|
|
||||||
dTrace("msg:%p, is freed, code:0x%x", pMsg, code);
|
dGTrace("msg:%p, is freed, code:0x%x", pMsg, code);
|
||||||
rpcFreeCont(pMsg->pCont);
|
rpcFreeCont(pMsg->pCont);
|
||||||
taosFreeQitem(pMsg);
|
taosFreeQitem(pMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int32_t mmPutMsgToWorker(SMnodeMgmt *pMgmt, SSingleWorker *pWorker, SRpcMsg *pMsg) {
|
static inline int32_t mmPutMsgToWorker(SMnodeMgmt *pMgmt, SSingleWorker *pWorker, SRpcMsg *pMsg) {
|
||||||
|
const STraceId *trace = &pMsg->info.traceId;
|
||||||
|
|
||||||
if (mmAcquire(pMgmt) == 0) {
|
if (mmAcquire(pMgmt) == 0) {
|
||||||
dTrace("msg:%p, put into %s queue, type:%s", pMsg, pWorker->name, TMSG_INFO(pMsg->msgType));
|
dGTrace("msg:%p, put into %s queue, type:%s", pMsg, pWorker->name, TMSG_INFO(pMsg->msgType));
|
||||||
taosWriteQitem(pWorker->queue, pMsg);
|
taosWriteQitem(pWorker->queue, pMsg);
|
||||||
mmRelease(pMgmt);
|
mmRelease(pMgmt);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
dTrace("msg:%p, failed to put into %s queue since %s, type:%s", pMsg, pWorker->name, terrstr(),
|
dGTrace("msg:%p, failed to put into %s queue since %s, type:%s", pMsg, pWorker->name, terrstr(),
|
||||||
TMSG_INFO(pMsg->msgType));
|
TMSG_INFO(pMsg->msgType));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -121,19 +125,17 @@ int32_t mmPutMsgToReadQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
int32_t mmPutMsgToQueryQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
int32_t mmPutMsgToQueryQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
pMsg->info.node = pMgmt->pMnode;
|
pMsg->info.node = pMgmt->pMnode;
|
||||||
if (mndPreProcessQueryMsg(pMsg) != 0) {
|
if (mndPreProcessQueryMsg(pMsg) != 0) {
|
||||||
dError("msg:%p, failed to pre-process in mnode since %s, type:%s", pMsg, terrstr(), TMSG_INFO(pMsg->msgType));
|
const STraceId *trace = &pMsg->info.traceId;
|
||||||
|
dGError("msg:%p, failed to pre-process in mnode since %s, type:%s", pMsg, terrstr(), TMSG_INFO(pMsg->msgType));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return mmPutMsgToWorker(pMgmt, &pMgmt->queryWorker, pMsg);
|
return mmPutMsgToWorker(pMgmt, &pMgmt->queryWorker, pMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mmPutMsgToFetchQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
int32_t mmPutMsgToFetchQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
pMsg->info.node = pMgmt->pMnode;
|
|
||||||
|
|
||||||
return mmPutMsgToWorker(pMgmt, &pMgmt->fetchWorker, pMsg);
|
return mmPutMsgToWorker(pMgmt, &pMgmt->fetchWorker, pMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t mmPutMsgToMonitorQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
int32_t mmPutMsgToMonitorQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
return mmPutMsgToWorker(pMgmt, &pMgmt->monitorWorker, pMsg);
|
return mmPutMsgToWorker(pMgmt, &pMgmt->monitorWorker, pMsg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,9 +17,44 @@
|
||||||
#include "dmMgmt.h"
|
#include "dmMgmt.h"
|
||||||
#include "qworker.h"
|
#include "qworker.h"
|
||||||
|
|
||||||
static void dmSendRedirectRsp(SRpcMsg *pMsg, const SEpSet *pNewEpSet);
|
static inline void dmSendRsp(SRpcMsg *pMsg) {
|
||||||
static void dmSendRsp(SRpcMsg *pMsg);
|
SMgmtWrapper *pWrapper = pMsg->info.wrapper;
|
||||||
static void dmBuildMnodeRedirectRsp(SDnode *pDnode, SRpcMsg *pMsg);
|
if (InChildProc(pWrapper)) {
|
||||||
|
dmPutToProcPQueue(&pWrapper->proc, pMsg, DND_FUNC_RSP);
|
||||||
|
} else {
|
||||||
|
rpcSendResponse(pMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void dmBuildMnodeRedirectRsp(SDnode *pDnode, SRpcMsg *pMsg) {
|
||||||
|
SEpSet epSet = {0};
|
||||||
|
dmGetMnodeEpSetForRedirect(&pDnode->data, pMsg, &epSet);
|
||||||
|
|
||||||
|
const int32_t contLen = tSerializeSEpSet(NULL, 0, &epSet);
|
||||||
|
pMsg->pCont = rpcMallocCont(contLen);
|
||||||
|
if (pMsg->pCont == NULL) {
|
||||||
|
pMsg->code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
} else {
|
||||||
|
tSerializeSEpSet(pMsg->pCont, contLen, &epSet);
|
||||||
|
pMsg->contLen = contLen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void dmSendRedirectRsp(SRpcMsg *pMsg, const SEpSet *pNewEpSet) {
|
||||||
|
SRpcMsg rsp = {.code = TSDB_CODE_RPC_REDIRECT, .info = pMsg->info};
|
||||||
|
int32_t contLen = tSerializeSEpSet(NULL, 0, pNewEpSet);
|
||||||
|
|
||||||
|
rsp.pCont = rpcMallocCont(contLen);
|
||||||
|
if (rsp.pCont == NULL) {
|
||||||
|
pMsg->code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
} else {
|
||||||
|
tSerializeSEpSet(rsp.pCont, contLen, pNewEpSet);
|
||||||
|
rsp.contLen = contLen;
|
||||||
|
}
|
||||||
|
dmSendRsp(&rsp);
|
||||||
|
rpcFreeCont(pMsg->pCont);
|
||||||
|
pMsg->pCont = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t dmProcessNodeMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg) {
|
int32_t dmProcessNodeMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg) {
|
||||||
NodeMsgFp msgFp = pWrapper->msgFps[TMSG_INDEX(pMsg->msgType)];
|
NodeMsgFp msgFp = pWrapper->msgFps[TMSG_INDEX(pMsg->msgType)];
|
||||||
|
@ -28,31 +63,38 @@ int32_t dmProcessNodeMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
dTrace("msg:%p, will be processed by %s", pMsg, pWrapper->name);
|
const STraceId *trace = &pMsg->info.traceId;
|
||||||
|
dGTrace("msg:%p, will be processed by %s", pMsg, pWrapper->name);
|
||||||
pMsg->info.wrapper = pWrapper;
|
pMsg->info.wrapper = pWrapper;
|
||||||
return (*msgFp)(pWrapper->pMgmt, pMsg);
|
return (*msgFp)(pWrapper->pMgmt, pMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) {
|
static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) {
|
||||||
SDnodeTrans * pTrans = &pDnode->trans;
|
SDnodeTrans *pTrans = &pDnode->trans;
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
SRpcMsg * pMsg = NULL;
|
SRpcMsg *pMsg = NULL;
|
||||||
SMgmtWrapper *pWrapper = NULL;
|
SMgmtWrapper *pWrapper = NULL;
|
||||||
SDnodeHandle *pHandle = &pTrans->msgHandles[TMSG_INDEX(pRpc->msgType)];
|
SDnodeHandle *pHandle = &pTrans->msgHandles[TMSG_INDEX(pRpc->msgType)];
|
||||||
|
|
||||||
STraceId *trace = &pRpc->info.traceId;
|
const STraceId *trace = &pRpc->info.traceId;
|
||||||
dGTrace("msg:%s is received, handle:%p len:%d code:0x%x app:%p refId:%" PRId64, TMSG_INFO(pRpc->msgType),
|
dGTrace("msg:%s is received, handle:%p len:%d code:0x%x app:%p refId:%" PRId64, TMSG_INFO(pRpc->msgType),
|
||||||
pRpc->info.handle, pRpc->contLen, pRpc->code, pRpc->info.ahandle, pRpc->info.refId);
|
pRpc->info.handle, pRpc->contLen, pRpc->code, pRpc->info.ahandle, pRpc->info.refId);
|
||||||
|
|
||||||
if (pRpc->msgType == TDMT_DND_NET_TEST) {
|
switch (pRpc->msgType) {
|
||||||
dmProcessNetTestReq(pDnode, pRpc);
|
case TDMT_DND_NET_TEST:
|
||||||
return;
|
dmProcessNetTestReq(pDnode, pRpc);
|
||||||
} else if (pRpc->msgType == TDMT_MND_SYSTABLE_RETRIEVE_RSP || pRpc->msgType == TDMT_VND_FETCH_RSP) {
|
return;
|
||||||
qWorkerProcessFetchRsp(NULL, NULL, pRpc, 0);
|
case TDMT_MND_SYSTABLE_RETRIEVE_RSP:
|
||||||
return;
|
case TDMT_VND_FETCH_RSP:
|
||||||
} else if (pRpc->msgType == TDMT_MND_STATUS_RSP && pEpSet != NULL) {
|
qWorkerProcessFetchRsp(NULL, NULL, pRpc, 0);
|
||||||
dmSetMnodeEpSet(&pDnode->data, pEpSet);
|
return;
|
||||||
} else {
|
case TDMT_MND_STATUS_RSP:
|
||||||
|
if (pEpSet != NULL) {
|
||||||
|
dmSetMnodeEpSet(&pDnode->data, pEpSet);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pDnode->status != DND_STAT_RUNNING) {
|
if (pDnode->status != DND_STAT_RUNNING) {
|
||||||
|
@ -73,39 +115,43 @@ static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) {
|
||||||
if (pHandle->defaultNtype == NODE_END) {
|
if (pHandle->defaultNtype == NODE_END) {
|
||||||
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
|
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
} else {
|
}
|
||||||
pWrapper = &pDnode->wrappers[pHandle->defaultNtype];
|
|
||||||
if (pHandle->needCheckVgId) {
|
pWrapper = &pDnode->wrappers[pHandle->defaultNtype];
|
||||||
if (pRpc->contLen > 0) {
|
if (pHandle->needCheckVgId) {
|
||||||
SMsgHead *pHead = pRpc->pCont;
|
if (pRpc->contLen > 0) {
|
||||||
int32_t vgId = ntohl(pHead->vgId);
|
const SMsgHead *pHead = pRpc->pCont;
|
||||||
if (vgId == QNODE_HANDLE) {
|
const int32_t vgId = ntohl(pHead->vgId);
|
||||||
|
switch (vgId) {
|
||||||
|
case QNODE_HANDLE:
|
||||||
pWrapper = &pDnode->wrappers[QNODE];
|
pWrapper = &pDnode->wrappers[QNODE];
|
||||||
} else if (vgId == SNODE_HANDLE) {
|
break;
|
||||||
|
case SNODE_HANDLE:
|
||||||
pWrapper = &pDnode->wrappers[SNODE];
|
pWrapper = &pDnode->wrappers[SNODE];
|
||||||
} else if (vgId == MNODE_HANDLE) {
|
break;
|
||||||
|
case MNODE_HANDLE:
|
||||||
pWrapper = &pDnode->wrappers[MNODE];
|
pWrapper = &pDnode->wrappers[MNODE];
|
||||||
} else {
|
break;
|
||||||
}
|
default:
|
||||||
} else {
|
break;
|
||||||
terrno = TSDB_CODE_INVALID_MSG_LEN;
|
|
||||||
goto _OVER;
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
terrno = TSDB_CODE_INVALID_MSG_LEN;
|
||||||
|
goto _OVER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dmMarkWrapper(pWrapper) != 0) {
|
if (dmMarkWrapper(pWrapper) != 0) {
|
||||||
pWrapper = NULL;
|
pWrapper = NULL;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
} else {
|
|
||||||
pRpc->info.wrapper = pWrapper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pRpc->info.wrapper = pWrapper;
|
||||||
pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM);
|
pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM);
|
||||||
if (pMsg == NULL) goto _OVER;
|
if (pMsg == NULL) goto _OVER;
|
||||||
memcpy(pMsg, pRpc, sizeof(SRpcMsg));
|
|
||||||
|
|
||||||
dTrace("msg:%p, is created, type:%s handle:%p", pMsg, TMSG_INFO(pRpc->msgType), pMsg->info.handle);
|
memcpy(pMsg, pRpc, sizeof(SRpcMsg));
|
||||||
|
dGTrace("msg:%p, is created, type:%s handle:%p", pMsg, TMSG_INFO(pRpc->msgType), pMsg->info.handle);
|
||||||
|
|
||||||
if (InParentProc(pWrapper)) {
|
if (InParentProc(pWrapper)) {
|
||||||
code = dmPutToProcCQueue(&pWrapper->proc, pMsg, DND_FUNC_REQ);
|
code = dmPutToProcCQueue(&pWrapper->proc, pMsg, DND_FUNC_REQ);
|
||||||
|
@ -115,13 +161,11 @@ static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) {
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
dTrace("failed to process msg:%p since %s, handle:%p", pMsg, terrstr(), pRpc->info.handle);
|
|
||||||
|
|
||||||
if (terrno != 0) code = terrno;
|
if (terrno != 0) code = terrno;
|
||||||
|
dGTrace("msg:%p, failed to process since %s", pMsg, terrstr());
|
||||||
|
|
||||||
if (IsReq(pRpc)) {
|
if (IsReq(pRpc)) {
|
||||||
SRpcMsg rsp = {.code = code, .info = pRpc->info};
|
SRpcMsg rsp = {.code = code, .info = pRpc->info};
|
||||||
|
|
||||||
if ((code == TSDB_CODE_NODE_NOT_DEPLOYED || code == TSDB_CODE_APP_NOT_READY) && pRpc->msgType > TDMT_MND_MSG &&
|
if ((code == TSDB_CODE_NODE_NOT_DEPLOYED || code == TSDB_CODE_APP_NOT_READY) && pRpc->msgType > TDMT_MND_MSG &&
|
||||||
pRpc->msgType < TDMT_VND_MSG) {
|
pRpc->msgType < TDMT_VND_MSG) {
|
||||||
dmBuildMnodeRedirectRsp(pDnode, &rsp);
|
dmBuildMnodeRedirectRsp(pDnode, &rsp);
|
||||||
|
@ -135,7 +179,7 @@ _OVER:
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pMsg != NULL) {
|
if (pMsg != NULL) {
|
||||||
dTrace("msg:%p, is freed", pMsg);
|
dGTrace("msg:%p, is freed", pMsg);
|
||||||
taosFreeQitem(pMsg);
|
taosFreeQitem(pMsg);
|
||||||
}
|
}
|
||||||
rpcFreeCont(pRpc->pCont);
|
rpcFreeCont(pRpc->pCont);
|
||||||
|
@ -149,11 +193,11 @@ int32_t dmInitMsgHandle(SDnode *pDnode) {
|
||||||
|
|
||||||
for (EDndNodeType ntype = DNODE; ntype < NODE_END; ++ntype) {
|
for (EDndNodeType ntype = DNODE; ntype < NODE_END; ++ntype) {
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
|
||||||
SArray * pArray = (*pWrapper->func.getHandlesFp)();
|
SArray *pArray = (*pWrapper->func.getHandlesFp)();
|
||||||
if (pArray == NULL) return -1;
|
if (pArray == NULL) return -1;
|
||||||
|
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) {
|
for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) {
|
||||||
SMgmtHandle * pMgmt = taosArrayGet(pArray, i);
|
SMgmtHandle *pMgmt = taosArrayGet(pArray, i);
|
||||||
SDnodeHandle *pHandle = &pTrans->msgHandles[TMSG_INDEX(pMgmt->msgType)];
|
SDnodeHandle *pHandle = &pTrans->msgHandles[TMSG_INDEX(pMgmt->msgType)];
|
||||||
if (pMgmt->needCheckVgId) {
|
if (pMgmt->needCheckVgId) {
|
||||||
pHandle->needCheckVgId = pMgmt->needCheckVgId;
|
pHandle->needCheckVgId = pMgmt->needCheckVgId;
|
||||||
|
@ -184,45 +228,6 @@ static inline int32_t dmSendReq(const SEpSet *pEpSet, SRpcMsg *pMsg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void dmSendRsp(SRpcMsg *pMsg) {
|
|
||||||
SMgmtWrapper *pWrapper = pMsg->info.wrapper;
|
|
||||||
if (InChildProc(pWrapper)) {
|
|
||||||
dmPutToProcPQueue(&pWrapper->proc, pMsg, DND_FUNC_RSP);
|
|
||||||
} else {
|
|
||||||
rpcSendResponse(pMsg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dmBuildMnodeRedirectRsp(SDnode *pDnode, SRpcMsg *pMsg) {
|
|
||||||
SEpSet epSet = {0};
|
|
||||||
dmGetMnodeEpSetForRedirect(&pDnode->data, pMsg, &epSet);
|
|
||||||
|
|
||||||
int32_t contLen = tSerializeSEpSet(NULL, 0, &epSet);
|
|
||||||
pMsg->pCont = rpcMallocCont(contLen);
|
|
||||||
if (pMsg->pCont == NULL) {
|
|
||||||
pMsg->code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
} else {
|
|
||||||
tSerializeSEpSet(pMsg->pCont, contLen, &epSet);
|
|
||||||
pMsg->contLen = contLen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void dmSendRedirectRsp(SRpcMsg *pMsg, const SEpSet *pNewEpSet) {
|
|
||||||
SRpcMsg rsp = {.code = TSDB_CODE_RPC_REDIRECT, .info = pMsg->info};
|
|
||||||
int32_t contLen = tSerializeSEpSet(NULL, 0, pNewEpSet);
|
|
||||||
|
|
||||||
rsp.pCont = rpcMallocCont(contLen);
|
|
||||||
if (rsp.pCont == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
} else {
|
|
||||||
tSerializeSEpSet(rsp.pCont, contLen, pNewEpSet);
|
|
||||||
rsp.contLen = contLen;
|
|
||||||
}
|
|
||||||
dmSendRsp(&rsp);
|
|
||||||
rpcFreeCont(pMsg->pCont);
|
|
||||||
pMsg->pCont = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void dmRegisterBrokenLinkArg(SRpcMsg *pMsg) {
|
static inline void dmRegisterBrokenLinkArg(SRpcMsg *pMsg) {
|
||||||
SMgmtWrapper *pWrapper = pMsg->info.wrapper;
|
SMgmtWrapper *pWrapper = pMsg->info.wrapper;
|
||||||
if (InChildProc(pWrapper)) {
|
if (InChildProc(pWrapper)) {
|
||||||
|
|
|
@ -40,18 +40,27 @@
|
||||||
#include "wal.h"
|
#include "wal.h"
|
||||||
|
|
||||||
#include "libs/function/function.h"
|
#include "libs/function/function.h"
|
||||||
// clang-format off
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define dFatal(...) { if (dDebugFlag & DEBUG_FATAL) { taosPrintLog("DND FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }}
|
// clang-format off
|
||||||
#define dError(...) { if (dDebugFlag & DEBUG_ERROR) { taosPrintLog("DND ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }}
|
|
||||||
#define dWarn(...) { if (dDebugFlag & DEBUG_WARN) { taosPrintLog("DND WARN ", DEBUG_WARN, 255, __VA_ARGS__); }}
|
#define dFatal(...) { if (dDebugFlag & DEBUG_FATAL) { taosPrintLog("DND FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }}
|
||||||
#define dInfo(...) { if (dDebugFlag & DEBUG_INFO) { taosPrintLog("DND ", DEBUG_INFO, 255, __VA_ARGS__); }}
|
#define dError(...) { if (dDebugFlag & DEBUG_ERROR) { taosPrintLog("DND ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }}
|
||||||
#define dDebug(...) { if (dDebugFlag & DEBUG_DEBUG) { taosPrintLog("DND ", DEBUG_DEBUG, dDebugFlag, __VA_ARGS__); }}
|
#define dWarn(...) { if (dDebugFlag & DEBUG_WARN) { taosPrintLog("DND WARN ", DEBUG_WARN, 255, __VA_ARGS__); }}
|
||||||
#define dTrace(...) { if (dDebugFlag & DEBUG_TRACE) { taosPrintLog("DND ", DEBUG_TRACE, dDebugFlag, __VA_ARGS__); }}
|
#define dInfo(...) { if (dDebugFlag & DEBUG_INFO) { taosPrintLog("DND ", DEBUG_INFO, 255, __VA_ARGS__); }}
|
||||||
#define dGTrace(param, ...) do { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dTrace(param ",GTID: %s", __VA_ARGS__, buf);} while(0)
|
#define dDebug(...) { if (dDebugFlag & DEBUG_DEBUG) { taosPrintLog("DND ", DEBUG_DEBUG, dDebugFlag, __VA_ARGS__); }}
|
||||||
|
#define dTrace(...) { if (dDebugFlag & DEBUG_TRACE) { taosPrintLog("DND ", DEBUG_TRACE, dDebugFlag, __VA_ARGS__); }}
|
||||||
|
|
||||||
|
#define dGFatal(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dFatal(param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define dGError(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dError(param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define dGWarn(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dWarn (param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define dGInfo(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dInfo (param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define dGDebug(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dDebug(param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define dGTrace(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dTrace(param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
DNODE = 0,
|
DNODE = 0,
|
||||||
|
@ -185,4 +194,3 @@ void dmSetMnodeEpSet(SDnodeData *pData, SEpSet *pEpSet);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /*_TD_DM_INT_H_*/
|
#endif /*_TD_DM_INT_H_*/
|
||||||
// clang-format on
|
|
||||||
|
|
|
@ -102,6 +102,7 @@ int32_t Testbase::SendShowReq(int8_t showType, const char* tb, const char* db) {
|
||||||
ASSERT(pRsp->pCont != nullptr);
|
ASSERT(pRsp->pCont != nullptr);
|
||||||
|
|
||||||
if (pRsp->contLen == 0) return -1;
|
if (pRsp->contLen == 0) return -1;
|
||||||
|
if (pRsp->code != 0) return -1;
|
||||||
|
|
||||||
showRsp = (SRetrieveMetaTableRsp*)pRsp->pCont;
|
showRsp = (SRetrieveMetaTableRsp*)pRsp->pCont;
|
||||||
showRsp->handle = htobe64(showRsp->handle); // show Id
|
showRsp->handle = htobe64(showRsp->handle); // show Id
|
||||||
|
|
|
@ -34,13 +34,20 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
#define mFatal(...) { if (mDebugFlag & DEBUG_FATAL) { taosPrintLog("MND FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }}
|
|
||||||
#define mError(...) { if (mDebugFlag & DEBUG_ERROR) { taosPrintLog("MND ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }}
|
#define mFatal(...) { if (mDebugFlag & DEBUG_FATAL) { taosPrintLog("MND FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }}
|
||||||
#define mWarn(...) { if (mDebugFlag & DEBUG_WARN) { taosPrintLog("MND WARN ", DEBUG_WARN, 255, __VA_ARGS__); }}
|
#define mError(...) { if (mDebugFlag & DEBUG_ERROR) { taosPrintLog("MND ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }}
|
||||||
#define mInfo(...) { if (mDebugFlag & DEBUG_INFO) { taosPrintLog("MND ", DEBUG_INFO, 255, __VA_ARGS__); }}
|
#define mWarn(...) { if (mDebugFlag & DEBUG_WARN) { taosPrintLog("MND WARN ", DEBUG_WARN, 255, __VA_ARGS__); }}
|
||||||
#define mDebug(...) { if (mDebugFlag & DEBUG_DEBUG) { taosPrintLog("MND ", DEBUG_DEBUG, mDebugFlag, __VA_ARGS__); }}
|
#define mInfo(...) { if (mDebugFlag & DEBUG_INFO) { taosPrintLog("MND ", DEBUG_INFO, 255, __VA_ARGS__); }}
|
||||||
#define mTrace(...) { if (mDebugFlag & DEBUG_TRACE) { taosPrintLog("MND ", DEBUG_TRACE, mDebugFlag, __VA_ARGS__); }}
|
#define mDebug(...) { if (mDebugFlag & DEBUG_DEBUG) { taosPrintLog("MND ", DEBUG_DEBUG, mDebugFlag, __VA_ARGS__); }}
|
||||||
#define mGTrace(param, ...) do { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mTrace(param ", GTID: %s", __VA_ARGS__, buf);} while(0)
|
#define mTrace(...) { if (mDebugFlag & DEBUG_TRACE) { taosPrintLog("MND ", DEBUG_TRACE, mDebugFlag, __VA_ARGS__); }}
|
||||||
|
|
||||||
|
#define mGFatal(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mFatal(param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define mGError(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mError(param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define mGWarn(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mWarn (param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define mGInfo(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mInfo (param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define mGDebug(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mDebug(param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define mGTrace(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mTrace(param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
|
|
@ -59,22 +59,28 @@ static void *mndBuildTimerMsg(int32_t *pContLen) {
|
||||||
static void mndPullupTrans(SMnode *pMnode) {
|
static void mndPullupTrans(SMnode *pMnode) {
|
||||||
int32_t contLen = 0;
|
int32_t contLen = 0;
|
||||||
void *pReq = mndBuildTimerMsg(&contLen);
|
void *pReq = mndBuildTimerMsg(&contLen);
|
||||||
SRpcMsg rpcMsg = {.msgType = TDMT_MND_TRANS_TIMER, .pCont = pReq, .contLen = contLen};
|
if (pReq != NULL) {
|
||||||
tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg);
|
SRpcMsg rpcMsg = {.msgType = TDMT_MND_TRANS_TIMER, .pCont = pReq, .contLen = contLen};
|
||||||
|
tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mndCalMqRebalance(SMnode *pMnode) {
|
static void mndCalMqRebalance(SMnode *pMnode) {
|
||||||
int32_t contLen = 0;
|
int32_t contLen = 0;
|
||||||
void *pReq = mndBuildTimerMsg(&contLen);
|
void *pReq = mndBuildTimerMsg(&contLen);
|
||||||
SRpcMsg rpcMsg = {.msgType = TDMT_MND_MQ_TIMER, .pCont = pReq, .contLen = contLen};
|
if (pReq != NULL) {
|
||||||
tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg);
|
SRpcMsg rpcMsg = {.msgType = TDMT_MND_MQ_TIMER, .pCont = pReq, .contLen = contLen};
|
||||||
|
tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mndPullupTelem(SMnode *pMnode) {
|
static void mndPullupTelem(SMnode *pMnode) {
|
||||||
int32_t contLen = 0;
|
int32_t contLen = 0;
|
||||||
void *pReq = mndBuildTimerMsg(&contLen);
|
void *pReq = mndBuildTimerMsg(&contLen);
|
||||||
SRpcMsg rpcMsg = {.msgType = TDMT_MND_TELEM_TIMER, .pCont = pReq, .contLen = contLen};
|
if (pReq != NULL) {
|
||||||
tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg);
|
SRpcMsg rpcMsg = {.msgType = TDMT_MND_TELEM_TIMER, .pCont = pReq, .contLen = contLen};
|
||||||
|
tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mndPushTtlTime(SMnode *pMnode) {
|
static void mndPushTtlTime(SMnode *pMnode) {
|
||||||
|
@ -89,10 +95,11 @@ static void mndPushTtlTime(SMnode *pMnode) {
|
||||||
int32_t contLen = sizeof(SMsgHead) + sizeof(int32_t);
|
int32_t contLen = sizeof(SMsgHead) + sizeof(int32_t);
|
||||||
SMsgHead *pHead = rpcMallocCont(contLen);
|
SMsgHead *pHead = rpcMallocCont(contLen);
|
||||||
if (pHead == NULL) {
|
if (pHead == NULL) {
|
||||||
mError("ttl time malloc err. contLen:%d", contLen);
|
sdbCancelFetch(pSdb, pIter);
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pHead->contLen = htonl(contLen);
|
pHead->contLen = htonl(contLen);
|
||||||
pHead->vgId = htonl(pVgroup->vgId);
|
pHead->vgId = htonl(pVgroup->vgId);
|
||||||
|
|
||||||
|
@ -100,13 +107,13 @@ static void mndPushTtlTime(SMnode *pMnode) {
|
||||||
*(int32_t *)(POINTER_SHIFT(pHead, sizeof(SMsgHead))) = htonl(t);
|
*(int32_t *)(POINTER_SHIFT(pHead, sizeof(SMsgHead))) = htonl(t);
|
||||||
|
|
||||||
SRpcMsg rpcMsg = {.msgType = TDMT_VND_DROP_TTL_TABLE, .pCont = pHead, .contLen = contLen};
|
SRpcMsg rpcMsg = {.msgType = TDMT_VND_DROP_TTL_TABLE, .pCont = pHead, .contLen = contLen};
|
||||||
|
|
||||||
SEpSet epSet = mndGetVgroupEpset(pMnode, pVgroup);
|
SEpSet epSet = mndGetVgroupEpset(pMnode, pVgroup);
|
||||||
int32_t code = tmsgSendReq(&epSet, &rpcMsg);
|
int32_t code = tmsgSendReq(&epSet, &rpcMsg);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
mError("ttl time seed err. code:%d", code);
|
mError("failed to send ttl time seed msg, code:0x%x", code);
|
||||||
|
} else {
|
||||||
|
mInfo("send ttl time seed msg, time:%d", t);
|
||||||
}
|
}
|
||||||
mError("ttl time seed succ. time:%d", t);
|
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -117,7 +124,7 @@ static void *mndThreadFp(void *param) {
|
||||||
setThreadName("mnode-timer");
|
setThreadName("mnode-timer");
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (lastTime % (864000) == 0) { // sleep 1 day for ttl
|
if (lastTime % 864000 == 0) {
|
||||||
mndPushTtlTime(pMnode);
|
mndPushTtlTime(pMnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -549,23 +556,25 @@ int32_t mndProcessSyncMsg(SRpcMsg *pMsg) {
|
||||||
static int32_t mndCheckMnodeState(SRpcMsg *pMsg) {
|
static int32_t mndCheckMnodeState(SRpcMsg *pMsg) {
|
||||||
if (!IsReq(pMsg)) return 0;
|
if (!IsReq(pMsg)) return 0;
|
||||||
if (mndAcquireRpcRef(pMsg->info.node) == 0) return 0;
|
if (mndAcquireRpcRef(pMsg->info.node) == 0) return 0;
|
||||||
|
if (pMsg->msgType == TDMT_MND_MQ_TIMER || pMsg->msgType == TDMT_MND_TELEM_TIMER ||
|
||||||
|
pMsg->msgType == TDMT_MND_TRANS_TIMER) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (pMsg->msgType != TDMT_MND_MQ_TIMER && pMsg->msgType != TDMT_MND_TELEM_TIMER &&
|
const STraceId *trace = &pMsg->info.traceId;
|
||||||
pMsg->msgType != TDMT_MND_TRANS_TIMER) {
|
mGError("msg:%p, failed to check mnode state since %s, type:%s", pMsg, terrstr(), TMSG_INFO(pMsg->msgType));
|
||||||
mError("msg:%p, failed to check mnode state since %s, type:%s", pMsg, terrstr(), TMSG_INFO(pMsg->msgType));
|
|
||||||
|
|
||||||
SEpSet epSet = {0};
|
SEpSet epSet = {0};
|
||||||
mndGetMnodeEpSet(pMsg->info.node, &epSet);
|
mndGetMnodeEpSet(pMsg->info.node, &epSet);
|
||||||
|
|
||||||
int32_t contLen = tSerializeSEpSet(NULL, 0, &epSet);
|
int32_t contLen = tSerializeSEpSet(NULL, 0, &epSet);
|
||||||
pMsg->info.rsp = rpcMallocCont(contLen);
|
pMsg->info.rsp = rpcMallocCont(contLen);
|
||||||
if (pMsg->info.rsp != NULL) {
|
if (pMsg->info.rsp != NULL) {
|
||||||
tSerializeSEpSet(pMsg->info.rsp, contLen, &epSet);
|
tSerializeSEpSet(pMsg->info.rsp, contLen, &epSet);
|
||||||
pMsg->info.rspLen = contLen;
|
pMsg->info.rspLen = contLen;
|
||||||
terrno = TSDB_CODE_RPC_REDIRECT;
|
terrno = TSDB_CODE_RPC_REDIRECT;
|
||||||
} else {
|
} else {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -575,17 +584,20 @@ static int32_t mndCheckMsgContent(SRpcMsg *pMsg) {
|
||||||
if (!IsReq(pMsg)) return 0;
|
if (!IsReq(pMsg)) return 0;
|
||||||
if (pMsg->contLen != 0 && pMsg->pCont != NULL) return 0;
|
if (pMsg->contLen != 0 && pMsg->pCont != NULL) return 0;
|
||||||
|
|
||||||
mError("msg:%p, failed to check msg, cont:%p contLen:%d, app:%p type:%s", pMsg, pMsg->pCont, pMsg->contLen,
|
const STraceId *trace = &pMsg->info.traceId;
|
||||||
|
mGError("msg:%p, failed to check msg, cont:%p contLen:%d, app:%p type:%s", pMsg, pMsg->pCont, pMsg->contLen,
|
||||||
pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
|
pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
|
||||||
terrno = TSDB_CODE_INVALID_MSG_LEN;
|
terrno = TSDB_CODE_INVALID_MSG_LEN;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mndProcessRpcMsg(SRpcMsg *pMsg) {
|
int32_t mndProcessRpcMsg(SRpcMsg *pMsg) {
|
||||||
SMnode *pMnode = pMsg->info.node;
|
SMnode *pMnode = pMsg->info.node;
|
||||||
|
const STraceId *trace = &pMsg->info.traceId;
|
||||||
|
|
||||||
MndMsgFp fp = pMnode->msgFp[TMSG_INDEX(pMsg->msgType)];
|
MndMsgFp fp = pMnode->msgFp[TMSG_INDEX(pMsg->msgType)];
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
mError("msg:%p, failed to get msg handle, app:%p type:%s", pMsg, pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
|
mGError("msg:%p, failed to get msg handle, app:%p type:%s", pMsg, pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
|
||||||
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
|
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -593,18 +605,17 @@ int32_t mndProcessRpcMsg(SRpcMsg *pMsg) {
|
||||||
if (mndCheckMsgContent(pMsg) != 0) return -1;
|
if (mndCheckMsgContent(pMsg) != 0) return -1;
|
||||||
if (mndCheckMnodeState(pMsg) != 0) return -1;
|
if (mndCheckMnodeState(pMsg) != 0) return -1;
|
||||||
|
|
||||||
STraceId *trace = &pMsg->info.traceId;
|
|
||||||
mGTrace("msg:%p, start to process in mnode, app:%p type:%s", pMsg, pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
|
mGTrace("msg:%p, start to process in mnode, app:%p type:%s", pMsg, pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
|
||||||
int32_t code = (*fp)(pMsg);
|
int32_t code = (*fp)(pMsg);
|
||||||
mndReleaseRpcRef(pMnode);
|
mndReleaseRpcRef(pMnode);
|
||||||
|
|
||||||
if (code == TSDB_CODE_ACTION_IN_PROGRESS) {
|
if (code == TSDB_CODE_ACTION_IN_PROGRESS) {
|
||||||
mTrace("msg:%p, won't response immediately since in progress", pMsg);
|
mGTrace("msg:%p, won't response immediately since in progress", pMsg);
|
||||||
} else if (code == 0) {
|
} else if (code == 0) {
|
||||||
mTrace("msg:%p, successfully processed", pMsg);
|
mGTrace("msg:%p, successfully processed", pMsg);
|
||||||
} else {
|
} else {
|
||||||
mError("msg:%p, failed to process since %s, app:%p type:%s", pMsg, terrstr(), pMsg->info.ahandle,
|
mGError("msg:%p, failed to process since %s, app:%p type:%s", pMsg, terrstr(), pMsg->info.ahandle,
|
||||||
TMSG_INFO(pMsg->msgType));
|
TMSG_INFO(pMsg->msgType));
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
@ -620,7 +631,6 @@ void mndSetMsgHandle(SMnode *pMnode, tmsg_t msgType, MndMsgFp fp) {
|
||||||
// Note: uid 0 is reserved
|
// Note: uid 0 is reserved
|
||||||
int64_t mndGenerateUid(char *name, int32_t len) {
|
int64_t mndGenerateUid(char *name, int32_t len) {
|
||||||
int32_t hashval = MurmurHash3_32(name, len);
|
int32_t hashval = MurmurHash3_32(name, len);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
int64_t us = taosGetTimestampUs();
|
int64_t us = taosGetTimestampUs();
|
||||||
int64_t x = (us & 0x000000FFFFFFFFFF) << 24;
|
int64_t x = (us & 0x000000FFFFFFFFFF) << 24;
|
||||||
|
|
|
@ -122,30 +122,33 @@ static SConnObj *mndCreateConn(SMnode *pMnode, const char *user, int8_t connType
|
||||||
int32_t pid, const char *app, int64_t startTime) {
|
int32_t pid, const char *app, int64_t startTime) {
|
||||||
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
|
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
|
||||||
|
|
||||||
char connStr[255] = {0};
|
char connStr[255] = {0};
|
||||||
int32_t len = snprintf(connStr, sizeof(connStr), "%s%d%d%d%s", user, ip, port, pid, app);
|
int32_t len = snprintf(connStr, sizeof(connStr), "%s%d%d%d%s", user, ip, port, pid, app);
|
||||||
uint32_t connId = mndGenerateUid(connStr, len);
|
uint32_t connId = mndGenerateUid(connStr, len);
|
||||||
if (startTime == 0) startTime = taosGetTimestampMs();
|
if (startTime == 0) startTime = taosGetTimestampMs();
|
||||||
|
|
||||||
SConnObj connObj = {.id = connId,
|
SConnObj connObj = {
|
||||||
.connType = connType,
|
.id = connId,
|
||||||
.appStartTimeMs = startTime,
|
.connType = connType,
|
||||||
.pid = pid,
|
.appStartTimeMs = startTime,
|
||||||
.ip = ip,
|
.pid = pid,
|
||||||
.port = port,
|
.ip = ip,
|
||||||
.killed = 0,
|
.port = port,
|
||||||
.loginTimeMs = taosGetTimestampMs(),
|
.killed = 0,
|
||||||
.lastAccessTimeMs = 0,
|
.loginTimeMs = taosGetTimestampMs(),
|
||||||
.killId = 0,
|
.lastAccessTimeMs = 0,
|
||||||
.numOfQueries = 0,
|
.killId = 0,
|
||||||
.pQueries = NULL};
|
.numOfQueries = 0,
|
||||||
|
.pQueries = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
connObj.lastAccessTimeMs = connObj.loginTimeMs;
|
connObj.lastAccessTimeMs = connObj.loginTimeMs;
|
||||||
tstrncpy(connObj.user, user, TSDB_USER_LEN);
|
tstrncpy(connObj.user, user, TSDB_USER_LEN);
|
||||||
tstrncpy(connObj.app, app, TSDB_APP_NAME_LEN);
|
tstrncpy(connObj.app, app, TSDB_APP_NAME_LEN);
|
||||||
|
|
||||||
int32_t keepTime = tsShellActivityTimer * 3;
|
int32_t keepTime = tsShellActivityTimer * 3;
|
||||||
SConnObj *pConn = taosCachePut(pMgmt->connCache, &connId, sizeof(uint32_t), &connObj, sizeof(connObj), keepTime * 1000);
|
SConnObj *pConn =
|
||||||
|
taosCachePut(pMgmt->connCache, &connId, sizeof(uint32_t), &connObj, sizeof(connObj), keepTime * 1000);
|
||||||
if (pConn == NULL) {
|
if (pConn == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
mError("conn:%d, failed to put into cache since %s, user:%s", connId, user, terrstr());
|
mError("conn:%d, failed to put into cache since %s, user:%s", connId, user, terrstr());
|
||||||
|
@ -174,7 +177,6 @@ static SConnObj *mndAcquireConn(SMnode *pMnode, uint32_t connId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pConn->lastAccessTimeMs = taosGetTimestampMs();
|
pConn->lastAccessTimeMs = taosGetTimestampMs();
|
||||||
|
|
||||||
mTrace("conn:%u, acquired from cache, data:%p", pConn->id, pConn);
|
mTrace("conn:%u, acquired from cache, data:%p", pConn->id, pConn);
|
||||||
return pConn;
|
return pConn;
|
||||||
}
|
}
|
||||||
|
@ -207,13 +209,14 @@ static void mndCancelGetNextConn(SMnode *pMnode, void *pIter) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
|
static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
SUserObj *pUser = NULL;
|
SUserObj *pUser = NULL;
|
||||||
SDbObj *pDb = NULL;
|
SDbObj *pDb = NULL;
|
||||||
SConnObj *pConn = NULL;
|
SConnObj *pConn = NULL;
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
SConnectReq connReq = {0};
|
SConnectReq connReq = {0};
|
||||||
char ip[30] = {0};
|
char ip[30] = {0};
|
||||||
|
const STraceId *trace = &pReq->info.traceId;
|
||||||
|
|
||||||
if (tDeserializeSConnectReq(pReq->pCont, pReq->contLen, &connReq) != 0) {
|
if (tDeserializeSConnectReq(pReq->pCont, pReq->contLen, &connReq) != 0) {
|
||||||
terrno = TSDB_CODE_INVALID_MSG;
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
@ -224,11 +227,11 @@ static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
|
||||||
|
|
||||||
pUser = mndAcquireUser(pMnode, pReq->info.conn.user);
|
pUser = mndAcquireUser(pMnode, pReq->info.conn.user);
|
||||||
if (pUser == NULL) {
|
if (pUser == NULL) {
|
||||||
mError("user:%s, failed to login while acquire user since %s", pReq->info.conn.user, terrstr());
|
mGError("user:%s, failed to login while acquire user since %s", pReq->info.conn.user, terrstr());
|
||||||
goto CONN_OVER;
|
goto CONN_OVER;
|
||||||
}
|
}
|
||||||
if (0 != strncmp(connReq.passwd, pUser->pass, TSDB_PASSWORD_LEN - 1)) {
|
if (0 != strncmp(connReq.passwd, pUser->pass, TSDB_PASSWORD_LEN - 1)) {
|
||||||
mError("user:%s, failed to auth while acquire user, input:%s", pReq->info.conn.user, connReq.passwd);
|
mGError("user:%s, failed to auth while acquire user, input:%s", pReq->info.conn.user, connReq.passwd);
|
||||||
code = TSDB_CODE_RPC_AUTH_FAILURE;
|
code = TSDB_CODE_RPC_AUTH_FAILURE;
|
||||||
goto CONN_OVER;
|
goto CONN_OVER;
|
||||||
}
|
}
|
||||||
|
@ -239,8 +242,8 @@ static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
|
||||||
pDb = mndAcquireDb(pMnode, db);
|
pDb = mndAcquireDb(pMnode, db);
|
||||||
if (pDb == NULL) {
|
if (pDb == NULL) {
|
||||||
terrno = TSDB_CODE_MND_INVALID_DB;
|
terrno = TSDB_CODE_MND_INVALID_DB;
|
||||||
mError("user:%s, failed to login from %s while use db:%s since %s", pReq->info.conn.user, ip, connReq.db,
|
mGError("user:%s, failed to login from %s while use db:%s since %s", pReq->info.conn.user, ip, connReq.db,
|
||||||
terrstr());
|
terrstr());
|
||||||
goto CONN_OVER;
|
goto CONN_OVER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -248,7 +251,7 @@ static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
|
||||||
pConn = mndCreateConn(pMnode, pReq->info.conn.user, connReq.connType, pReq->info.conn.clientIp,
|
pConn = mndCreateConn(pMnode, pReq->info.conn.user, connReq.connType, pReq->info.conn.clientIp,
|
||||||
pReq->info.conn.clientPort, connReq.pid, connReq.app, connReq.startTime);
|
pReq->info.conn.clientPort, connReq.pid, connReq.app, connReq.startTime);
|
||||||
if (pConn == NULL) {
|
if (pConn == NULL) {
|
||||||
mError("user:%s, failed to login from %s while create connection since %s", pReq->info.conn.user, ip, terrstr());
|
mGError("user:%s, failed to login from %s while create connection since %s", pReq->info.conn.user, ip, terrstr());
|
||||||
goto CONN_OVER;
|
goto CONN_OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,7 +276,7 @@ static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
|
||||||
pReq->info.rspLen = contLen;
|
pReq->info.rspLen = contLen;
|
||||||
pReq->info.rsp = pRsp;
|
pReq->info.rsp = pRsp;
|
||||||
|
|
||||||
mDebug("user:%s, login from %s:%d, conn:%u, app:%s", pReq->info.conn.user, ip, pConn->port, pConn->id, connReq.app);
|
mGDebug("user:%s, login from %s:%d, conn:%u, app:%s", pReq->info.conn.user, ip, pConn->port, pConn->id, connReq.app);
|
||||||
|
|
||||||
code = 0;
|
code = 0;
|
||||||
|
|
||||||
|
@ -302,7 +305,7 @@ static int32_t mndSaveQueryList(SConnObj *pConn, SQueryHbReqBasic *pBasic) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SAppObj *mndCreateApp(SMnode *pMnode, uint32_t clientIp, SAppHbReq* pReq) {
|
static SAppObj *mndCreateApp(SMnode *pMnode, uint32_t clientIp, SAppHbReq *pReq) {
|
||||||
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
|
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
|
||||||
|
|
||||||
SAppObj app;
|
SAppObj app;
|
||||||
|
@ -314,22 +317,19 @@ static SAppObj *mndCreateApp(SMnode *pMnode, uint32_t clientIp, SAppHbReq* pReq)
|
||||||
memcpy(&app.summary, &pReq->summary, sizeof(pReq->summary));
|
memcpy(&app.summary, &pReq->summary, sizeof(pReq->summary));
|
||||||
app.lastAccessTimeMs = taosGetTimestampMs();
|
app.lastAccessTimeMs = taosGetTimestampMs();
|
||||||
|
|
||||||
int32_t keepTime = tsShellActivityTimer * 3;
|
const int32_t keepTime = tsShellActivityTimer * 3;
|
||||||
SAppObj *pApp = taosCachePut(pMgmt->appCache, &pReq->appId, sizeof(pReq->appId), &app, sizeof(app), keepTime * 1000);
|
SAppObj *pApp = taosCachePut(pMgmt->appCache, &pReq->appId, sizeof(pReq->appId), &app, sizeof(app), keepTime * 1000);
|
||||||
if (pApp == NULL) {
|
if (pApp == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
mError("failed to app %" PRIx64 " into cache since %s", pReq->appId, terrstr());
|
mError("failed to app %" PRIx64 " into cache since %s", pReq->appId, terrstr());
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mTrace("app %" PRIx64 " is put into cache", pReq->appId);
|
mTrace("app %" PRIx64 " is put into cache", pReq->appId);
|
||||||
return pApp;
|
return pApp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mndFreeApp(SAppObj *pApp) {
|
static void mndFreeApp(SAppObj *pApp) { mTrace("app %" PRIx64 " is destroyed", pApp->appId); }
|
||||||
mTrace("app %" PRIx64 " is destroyed", pApp->appId);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static SAppObj *mndAcquireApp(SMnode *pMnode, int64_t appId) {
|
static SAppObj *mndAcquireApp(SMnode *pMnode, int64_t appId) {
|
||||||
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
|
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
|
||||||
|
@ -356,7 +356,7 @@ static void mndReleaseApp(SMnode *pMnode, SAppObj *pApp) {
|
||||||
|
|
||||||
void *mndGetNextApp(SMnode *pMnode, SCacheIter *pIter) {
|
void *mndGetNextApp(SMnode *pMnode, SCacheIter *pIter) {
|
||||||
SAppObj *pApp = NULL;
|
SAppObj *pApp = NULL;
|
||||||
bool hasNext = taosCacheIterNext(pIter);
|
bool hasNext = taosCacheIterNext(pIter);
|
||||||
if (hasNext) {
|
if (hasNext) {
|
||||||
size_t dataLen = 0;
|
size_t dataLen = 0;
|
||||||
pApp = taosCacheIterGetData(pIter, &dataLen);
|
pApp = taosCacheIterGetData(pIter, &dataLen);
|
||||||
|
@ -439,8 +439,8 @@ static SClientHbRsp *mndMqHbBuildRsp(SMnode *pMnode, SClientHbReq *pReq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndUpdateAppInfo(SMnode *pMnode, SClientHbReq *pHbReq, SRpcConnInfo *connInfo) {
|
static int32_t mndUpdateAppInfo(SMnode *pMnode, SClientHbReq *pHbReq, SRpcConnInfo *connInfo) {
|
||||||
SAppHbReq* pReq = &pHbReq->app;
|
SAppHbReq *pReq = &pHbReq->app;
|
||||||
SAppObj *pApp = mndAcquireApp(pMnode, pReq->appId);
|
SAppObj *pApp = mndAcquireApp(pMnode, pReq->appId);
|
||||||
if (pApp == NULL) {
|
if (pApp == NULL) {
|
||||||
pApp = mndCreateApp(pMnode, connInfo->clientIp, pReq);
|
pApp = mndCreateApp(pMnode, connInfo->clientIp, pReq);
|
||||||
if (pApp == NULL) {
|
if (pApp == NULL) {
|
||||||
|
@ -448,7 +448,7 @@ static int32_t mndUpdateAppInfo(SMnode *pMnode, SClientHbReq *pHbReq, SRpcConnIn
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
mDebug("a new app %" PRIx64 "created", pReq->appId);
|
mDebug("a new app %" PRIx64 "created", pReq->appId);
|
||||||
mndReleaseApp(pMnode, pApp);
|
mndReleaseApp(pMnode, pApp);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -464,7 +464,7 @@ static int32_t mndProcessQueryHeartBeat(SMnode *pMnode, SRpcMsg *pMsg, SClientHb
|
||||||
SClientHbBatchRsp *pBatchRsp) {
|
SClientHbBatchRsp *pBatchRsp) {
|
||||||
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
|
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
|
||||||
SClientHbRsp hbRsp = {.connKey = pHbReq->connKey, .status = 0, .info = NULL, .query = NULL};
|
SClientHbRsp hbRsp = {.connKey = pHbReq->connKey, .status = 0, .info = NULL, .query = NULL};
|
||||||
SRpcConnInfo connInfo = pMsg->info.conn;
|
SRpcConnInfo connInfo = pMsg->info.conn;
|
||||||
|
|
||||||
mndUpdateAppInfo(pMnode, pHbReq, &connInfo);
|
mndUpdateAppInfo(pMnode, pHbReq, &connInfo);
|
||||||
|
|
||||||
|
@ -637,9 +637,9 @@ static int32_t mndProcessKillQueryReq(SRpcMsg *pReq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
mInfo("kill query msg is received, queryId:%s", killReq.queryStrId);
|
mInfo("kill query msg is received, queryId:%s", killReq.queryStrId);
|
||||||
int32_t connId = 0;
|
int32_t connId = 0;
|
||||||
uint64_t queryId = 0;
|
uint64_t queryId = 0;
|
||||||
char* p = strchr(killReq.queryStrId, ':');
|
char *p = strchr(killReq.queryStrId, ':');
|
||||||
if (NULL == p) {
|
if (NULL == p) {
|
||||||
mError("invalid query id %s", killReq.queryStrId);
|
mError("invalid query id %s", killReq.queryStrId);
|
||||||
terrno = TSDB_CODE_MND_INVALID_QUERY_ID;
|
terrno = TSDB_CODE_MND_INVALID_QUERY_ID;
|
||||||
|
@ -853,12 +853,12 @@ static int32_t mndRetrieveQueries(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndRetrieveApps(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
|
static int32_t mndRetrieveApps(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
int32_t numOfRows = 0;
|
int32_t numOfRows = 0;
|
||||||
int32_t cols = 0;
|
int32_t cols = 0;
|
||||||
SAppObj *pApp = NULL;
|
SAppObj *pApp = NULL;
|
||||||
|
|
||||||
if (pShow->pIter == NULL) {
|
if (pShow->pIter == NULL) {
|
||||||
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
|
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
|
||||||
pShow->pIter = taosCacheCreateIter(pMgmt->appCache);
|
pShow->pIter = taosCacheCreateIter(pMgmt->appCache);
|
||||||
|
@ -931,7 +931,6 @@ static int32_t mndRetrieveApps(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlo
|
||||||
return numOfRows;
|
return numOfRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void mndCancelGetNextQuery(SMnode *pMnode, void *pIter) {
|
static void mndCancelGetNextQuery(SMnode *pMnode, void *pIter) {
|
||||||
if (pIter != NULL) {
|
if (pIter != NULL) {
|
||||||
taosCacheDestroyIter(pIter);
|
taosCacheDestroyIter(pIter);
|
||||||
|
|
|
@ -26,13 +26,21 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
#define vFatal(...) do { if (vDebugFlag & DEBUG_FATAL) { taosPrintLog("VND FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }} while(0)
|
|
||||||
#define vError(...) do { if (vDebugFlag & DEBUG_ERROR) { taosPrintLog("VND ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }} while(0)
|
#define vFatal(...) { if (vDebugFlag & DEBUG_FATAL) { taosPrintLog("VND FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }}
|
||||||
#define vWarn(...) do { if (vDebugFlag & DEBUG_WARN) { taosPrintLog("VND WARN ", DEBUG_WARN, 255, __VA_ARGS__); }} while(0)
|
#define vError(...) { if (vDebugFlag & DEBUG_ERROR) { taosPrintLog("VND ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }}
|
||||||
#define vInfo(...) do { if (vDebugFlag & DEBUG_INFO) { taosPrintLog("VND ", DEBUG_INFO, 255, __VA_ARGS__); }} while(0)
|
#define vWarn(...) { if (vDebugFlag & DEBUG_WARN) { taosPrintLog("VND WARN ", DEBUG_WARN, 255, __VA_ARGS__); }}
|
||||||
#define vDebug(...) do { if (vDebugFlag & DEBUG_DEBUG) { taosPrintLog("VND ", DEBUG_DEBUG, vDebugFlag, __VA_ARGS__); }} while(0)
|
#define vInfo(...) { if (vDebugFlag & DEBUG_INFO) { taosPrintLog("VND ", DEBUG_INFO, 255, __VA_ARGS__); }}
|
||||||
#define vTrace(...) do { if (vDebugFlag & DEBUG_TRACE) { taosPrintLog("VND ", DEBUG_TRACE, vDebugFlag, __VA_ARGS__); }} while(0)
|
#define vDebug(...) { if (vDebugFlag & DEBUG_DEBUG) { taosPrintLog("VND ", DEBUG_DEBUG, vDebugFlag, __VA_ARGS__); }}
|
||||||
#define vGTrace(param, ...) do { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vTrace(param " GTID: %s", __VA_ARGS__, buf);} while(0)//#define vDye(...) do
|
#define vTrace(...) { if (vDebugFlag & DEBUG_TRACE) { taosPrintLog("VND ", DEBUG_TRACE, vDebugFlag, __VA_ARGS__); }}
|
||||||
|
|
||||||
|
#define vGFatal(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vFatal(param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define vGError(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vError(param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define vGWarn(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vWarn (param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define vGInfo(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vInfo (param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define vGDebug(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vDebug(param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
#define vGTrace(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vTrace(param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
// vnodeCfg.c
|
// vnodeCfg.c
|
||||||
|
|
|
@ -903,7 +903,6 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
// NOTE: this operator does never check if current status is done or not
|
// NOTE: this operator does never check if current status is done or not
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
SStreamBlockScanInfo* pInfo = pOperator->info;
|
SStreamBlockScanInfo* pInfo = pOperator->info;
|
||||||
int32_t rows = 0;
|
|
||||||
|
|
||||||
pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
|
pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
|
||||||
if (pTaskInfo->code != TSDB_CODE_SUCCESS || pOperator->status == OP_EXEC_DONE) {
|
if (pTaskInfo->code != TSDB_CODE_SUCCESS || pOperator->status == OP_EXEC_DONE) {
|
||||||
|
@ -1023,9 +1022,6 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
pTaskInfo->code = terrno;
|
pTaskInfo->code = terrno;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rows = pBlockInfo->rows;
|
|
||||||
|
|
||||||
// currently only the tbname pseudo column
|
// currently only the tbname pseudo column
|
||||||
if (pInfo->numOfPseudoExpr > 0) {
|
if (pInfo->numOfPseudoExpr > 0) {
|
||||||
addTagPseudoColumnData(&pInfo->readHandle, pInfo->pPseudoExpr, pInfo->numOfPseudoExpr, pInfo->pRes);
|
addTagPseudoColumnData(&pInfo->readHandle, pInfo->pPseudoExpr, pInfo->numOfPseudoExpr, pInfo->pRes);
|
||||||
|
@ -1033,14 +1029,16 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
doFilter(pInfo->pCondition, pInfo->pRes);
|
doFilter(pInfo->pCondition, pInfo->pRes);
|
||||||
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
||||||
break;
|
if (pBlockInfo->rows > 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// record the scan action.
|
// record the scan action.
|
||||||
pInfo->numOfExec++;
|
pInfo->numOfExec++;
|
||||||
pOperator->resultInfo.totalRows += pBlockInfo->rows;
|
pOperator->resultInfo.totalRows += pBlockInfo->rows;
|
||||||
|
|
||||||
if (rows == 0) {
|
if (pBlockInfo->rows == 0) {
|
||||||
pOperator->status = OP_EXEC_DONE;
|
pOperator->status = OP_EXEC_DONE;
|
||||||
} else if (pInfo->pUpdateInfo) {
|
} else if (pInfo->pUpdateInfo) {
|
||||||
pInfo->tsArrayIndex = 0;
|
pInfo->tsArrayIndex = 0;
|
||||||
|
@ -1056,7 +1054,7 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (rows == 0) ? NULL : pInfo->pRes;
|
return (pBlockInfo->rows == 0) ? NULL : pInfo->pRes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1270,7 +1270,8 @@ static int32_t getAllIntervalWindow(SHashObj* pHashMap, SArray* resWins) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isCloseWindow(STimeWindow *pWin, STimeWindowAggSupp* pSup) {
|
bool isCloseWindow(STimeWindow *pWin, STimeWindowAggSupp* pSup) {
|
||||||
return pWin->ekey < pSup->maxTs - pSup->waterMark;
|
ASSERT(pSup->maxTs == INT64_MIN || pSup->maxTs > 0);
|
||||||
|
return pSup->maxTs != INT64_MIN && pWin->ekey < pSup->maxTs - pSup->waterMark;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t closeIntervalWindow(SHashObj* pHashMap, STimeWindowAggSupp* pSup, SInterval* pInterval,
|
static int32_t closeIntervalWindow(SHashObj* pHashMap, STimeWindowAggSupp* pSup, SInterval* pInterval,
|
||||||
|
@ -2141,7 +2142,9 @@ void compactFunctions(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx, int3
|
||||||
static void rebuildIntervalWindow(SStreamFinalIntervalOperatorInfo* pInfo, SExprSupp* pSup, SArray* pWinArray, int32_t groupId,
|
static void rebuildIntervalWindow(SStreamFinalIntervalOperatorInfo* pInfo, SExprSupp* pSup, SArray* pWinArray, int32_t groupId,
|
||||||
int32_t numOfOutput, SExecTaskInfo* pTaskInfo) {
|
int32_t numOfOutput, SExecTaskInfo* pTaskInfo) {
|
||||||
int32_t size = taosArrayGetSize(pWinArray);
|
int32_t size = taosArrayGetSize(pWinArray);
|
||||||
ASSERT(pInfo->pChildren);
|
if (!pInfo->pChildren) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (int32_t i = 0; i < size; i++) {
|
for (int32_t i = 0; i < size; i++) {
|
||||||
STimeWindow* pParentWin = taosArrayGet(pWinArray, i);
|
STimeWindow* pParentWin = taosArrayGet(pWinArray, i);
|
||||||
SResultRow* pCurResult = NULL;
|
SResultRow* pCurResult = NULL;
|
||||||
|
@ -2339,6 +2342,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
SStreamFinalIntervalOperatorInfo* pChInfo = pChildOp->info;
|
SStreamFinalIntervalOperatorInfo* pChInfo = pChildOp->info;
|
||||||
setInputDataBlock(pChildOp, pChildOp->exprSupp.pCtx, pBlock, pChInfo->order, MAIN_SCAN, true);
|
setInputDataBlock(pChildOp, pChildOp->exprSupp.pCtx, pBlock, pChInfo->order, MAIN_SCAN, true);
|
||||||
doHashInterval(pChildOp, pBlock, pBlock->info.groupId, NULL);
|
doHashInterval(pChildOp, pBlock, pBlock->info.groupId, NULL);
|
||||||
|
pChInfo->twAggSup.maxTs = TMAX(pChInfo->twAggSup.maxTs, pBlock->info.window.ekey);
|
||||||
}
|
}
|
||||||
maxTs = TMAX(maxTs, pBlock->info.window.ekey);
|
maxTs = TMAX(maxTs, pBlock->info.window.ekey);
|
||||||
}
|
}
|
||||||
|
@ -2406,7 +2410,7 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
|
||||||
initResultRowInfo(&pInfo->binfo.resultRowInfo);
|
initResultRowInfo(&pInfo->binfo.resultRowInfo);
|
||||||
pInfo->pChildren = NULL;
|
pInfo->pChildren = NULL;
|
||||||
if (numOfChild > 0) {
|
if (numOfChild > 0) {
|
||||||
pInfo->pChildren = taosArrayInit(numOfChild, sizeof(SOperatorInfo));
|
pInfo->pChildren = taosArrayInit(numOfChild, sizeof(void *));
|
||||||
for (int32_t i = 0; i < numOfChild; i++) {
|
for (int32_t i = 0; i < numOfChild; i++) {
|
||||||
SOperatorInfo* pChildOp = createStreamFinalIntervalOperatorInfo(NULL, pPhyNode, pTaskInfo, 0);
|
SOperatorInfo* pChildOp = createStreamFinalIntervalOperatorInfo(NULL, pPhyNode, pTaskInfo, 0);
|
||||||
if (pChildOp) {
|
if (pChildOp) {
|
||||||
|
|
|
@ -195,13 +195,13 @@ typedef struct SMavgInfo {
|
||||||
} SMavgInfo;
|
} SMavgInfo;
|
||||||
|
|
||||||
typedef struct SSampleInfo {
|
typedef struct SSampleInfo {
|
||||||
int32_t samples;
|
int32_t samples;
|
||||||
int32_t totalPoints;
|
int32_t totalPoints;
|
||||||
int32_t numSampled;
|
int32_t numSampled;
|
||||||
uint8_t colType;
|
uint8_t colType;
|
||||||
int16_t colBytes;
|
int16_t colBytes;
|
||||||
char* data;
|
char* data;
|
||||||
int64_t* timestamp;
|
STuplePos* tuplePos;
|
||||||
} SSampleInfo;
|
} SSampleInfo;
|
||||||
|
|
||||||
typedef struct STailItem {
|
typedef struct STailItem {
|
||||||
|
@ -4350,7 +4350,7 @@ bool getSampleFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
||||||
SColumnNode* pCol = (SColumnNode*)nodesListGetNode(pFunc->pParameterList, 0);
|
SColumnNode* pCol = (SColumnNode*)nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
SValueNode* pVal = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
|
SValueNode* pVal = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
|
||||||
int32_t numOfSamples = pVal->datum.i;
|
int32_t numOfSamples = pVal->datum.i;
|
||||||
pEnv->calcMemSize = sizeof(SSampleInfo) + numOfSamples * (pCol->node.resType.bytes + sizeof(int64_t));
|
pEnv->calcMemSize = sizeof(SSampleInfo) + numOfSamples * (pCol->node.resType.bytes + sizeof(STuplePos));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4371,25 +4371,30 @@ bool sampleFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
pInfo->data = (char*)pInfo + sizeof(SSampleInfo);
|
pInfo->data = (char*)pInfo + sizeof(SSampleInfo);
|
||||||
pInfo->timestamp = (int64_t*)((char*)pInfo + sizeof(SSampleInfo) + pInfo->samples * pInfo->colBytes);
|
pInfo->tuplePos = (STuplePos*)((char*)pInfo + sizeof(SSampleInfo) + pInfo->samples * pInfo->colBytes);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sampleAssignResult(SSampleInfo* pInfo, char* data, TSKEY ts, int32_t index) {
|
static void sampleAssignResult(SSampleInfo* pInfo, char* data, int32_t index) {
|
||||||
assignVal(pInfo->data + index * pInfo->colBytes, data, pInfo->colBytes, pInfo->colType);
|
assignVal(pInfo->data + index * pInfo->colBytes, data, pInfo->colBytes, pInfo->colType);
|
||||||
*(pInfo->timestamp + index) = ts;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doReservoirSample(SSampleInfo* pInfo, char* data, TSKEY ts, int32_t index) {
|
static void doReservoirSample(SqlFunctionCtx* pCtx, SSampleInfo* pInfo, char* data, int32_t index) {
|
||||||
pInfo->totalPoints++;
|
pInfo->totalPoints++;
|
||||||
if (pInfo->numSampled < pInfo->samples) {
|
if (pInfo->numSampled < pInfo->samples) {
|
||||||
sampleAssignResult(pInfo, data, ts, pInfo->numSampled);
|
sampleAssignResult(pInfo, data, pInfo->numSampled);
|
||||||
|
if (pCtx->subsidiaries.num > 0) {
|
||||||
|
saveTupleData(pCtx, index, pCtx->pSrcBlock, pInfo->tuplePos + pInfo->numSampled * sizeof(STuplePos));
|
||||||
|
}
|
||||||
pInfo->numSampled++;
|
pInfo->numSampled++;
|
||||||
} else {
|
} else {
|
||||||
int32_t j = taosRand() % (pInfo->totalPoints);
|
int32_t j = taosRand() % (pInfo->totalPoints);
|
||||||
if (j < pInfo->samples) {
|
if (j < pInfo->samples) {
|
||||||
sampleAssignResult(pInfo, data, ts, j);
|
sampleAssignResult(pInfo, data, j);
|
||||||
|
if (pCtx->subsidiaries.num > 0) {
|
||||||
|
copyTupleData(pCtx, index, pCtx->pSrcBlock, pInfo->tuplePos + j * sizeof(STuplePos));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4400,11 +4405,6 @@ int32_t sampleFunction(SqlFunctionCtx* pCtx) {
|
||||||
|
|
||||||
SInputColumnInfoData* pInput = &pCtx->input;
|
SInputColumnInfoData* pInput = &pCtx->input;
|
||||||
|
|
||||||
TSKEY* tsList = NULL;
|
|
||||||
if (pInput->pPTS != NULL) {
|
|
||||||
tsList = (int64_t*)pInput->pPTS->pData;
|
|
||||||
}
|
|
||||||
|
|
||||||
SColumnInfoData* pInputCol = pInput->pData[0];
|
SColumnInfoData* pInputCol = pInput->pData[0];
|
||||||
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
||||||
if (colDataIsNull_s(pInputCol, i)) {
|
if (colDataIsNull_s(pInputCol, i)) {
|
||||||
|
@ -4412,7 +4412,7 @@ int32_t sampleFunction(SqlFunctionCtx* pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
char* data = colDataGetData(pInputCol, i);
|
char* data = colDataGetData(pInputCol, i);
|
||||||
doReservoirSample(pInfo, data, /*tsList[i]*/ 0, i);
|
doReservoirSample(pCtx, pInfo, data, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
SET_VAL(pResInfo, pInfo->numSampled, pInfo->numSampled);
|
SET_VAL(pResInfo, pInfo->numSampled, pInfo->numSampled);
|
||||||
|
@ -4431,6 +4431,7 @@ int32_t sampleFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
|
||||||
int32_t currentRow = pBlock->info.rows;
|
int32_t currentRow = pBlock->info.rows;
|
||||||
for (int32_t i = 0; i < pInfo->numSampled; ++i) {
|
for (int32_t i = 0; i < pInfo->numSampled; ++i) {
|
||||||
colDataAppend(pCol, currentRow + i, pInfo->data + i * pInfo->colBytes, false);
|
colDataAppend(pCol, currentRow + i, pInfo->data + i * pInfo->colBytes, false);
|
||||||
|
setSelectivityValue(pCtx, pBlock, pInfo->tuplePos + i * sizeof(STuplePos), currentRow + i);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pInfo->numSampled;
|
return pInfo->numSampled;
|
||||||
|
|
|
@ -557,6 +557,14 @@ static SNode* physiSessionCopy(const SSessionWinodwPhysiNode* pSrc, SSessionWino
|
||||||
return (SNode*)pDst;
|
return (SNode*)pDst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SNode* physiPartitionCopy(const SPartitionPhysiNode* pSrc, SPartitionPhysiNode* pDst) {
|
||||||
|
COPY_BASE_OBJECT_FIELD(node, physiNodeCopy);
|
||||||
|
CLONE_NODE_LIST_FIELD(pExprs);
|
||||||
|
CLONE_NODE_LIST_FIELD(pPartitionKeys);
|
||||||
|
CLONE_NODE_LIST_FIELD(pTargets);
|
||||||
|
return (SNode*)pDst;
|
||||||
|
}
|
||||||
|
|
||||||
static SNode* dataBlockDescCopy(const SDataBlockDescNode* pSrc, SDataBlockDescNode* pDst) {
|
static SNode* dataBlockDescCopy(const SDataBlockDescNode* pSrc, SDataBlockDescNode* pDst) {
|
||||||
COPY_SCALAR_FIELD(dataBlockId);
|
COPY_SCALAR_FIELD(dataBlockId);
|
||||||
CLONE_NODE_LIST_FIELD(pSlots);
|
CLONE_NODE_LIST_FIELD(pSlots);
|
||||||
|
@ -702,6 +710,8 @@ SNode* nodesCloneNode(const SNode* pNode) {
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION:
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION:
|
case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION:
|
||||||
return physiSessionCopy((const SSessionWinodwPhysiNode*)pNode, (SSessionWinodwPhysiNode*)pDst);
|
return physiSessionCopy((const SSessionWinodwPhysiNode*)pNode, (SSessionWinodwPhysiNode*)pDst);
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
|
||||||
|
return physiPartitionCopy((const SPartitionPhysiNode*)pNode, (SPartitionPhysiNode*)pDst);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -257,7 +257,7 @@ static int32_t checkAuth(SInsertParseContext* pCxt, char* pDbFname, bool* pPass)
|
||||||
if (pBasicCtx->async) {
|
if (pBasicCtx->async) {
|
||||||
return getUserAuthFromCache(pCxt->pMetaCache, pBasicCtx->pUser, pDbFname, AUTH_TYPE_WRITE, pPass);
|
return getUserAuthFromCache(pCxt->pMetaCache, pBasicCtx->pUser, pDbFname, AUTH_TYPE_WRITE, pPass);
|
||||||
}
|
}
|
||||||
SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
|
SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
|
||||||
.requestId = pBasicCtx->requestId,
|
.requestId = pBasicCtx->requestId,
|
||||||
.requestObjRefId = pBasicCtx->requestRid,
|
.requestObjRefId = pBasicCtx->requestRid,
|
||||||
.mgmtEps = pBasicCtx->mgmtEpSet};
|
.mgmtEps = pBasicCtx->mgmtEpSet};
|
||||||
|
@ -270,11 +270,11 @@ static int32_t getTableSchema(SInsertParseContext* pCxt, SName* pTbName, bool is
|
||||||
if (pBasicCtx->async) {
|
if (pBasicCtx->async) {
|
||||||
return getTableMetaFromCache(pCxt->pMetaCache, pTbName, pTableMeta);
|
return getTableMetaFromCache(pCxt->pMetaCache, pTbName, pTableMeta);
|
||||||
}
|
}
|
||||||
SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
|
SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
|
||||||
.requestId = pBasicCtx->requestId,
|
.requestId = pBasicCtx->requestId,
|
||||||
.requestObjRefId = pBasicCtx->requestRid,
|
.requestObjRefId = pBasicCtx->requestRid,
|
||||||
.mgmtEps = pBasicCtx->mgmtEpSet};
|
.mgmtEps = pBasicCtx->mgmtEpSet};
|
||||||
|
|
||||||
if (isStb) {
|
if (isStb) {
|
||||||
return catalogGetSTableMeta(pBasicCtx->pCatalog, &conn, pTbName, pTableMeta);
|
return catalogGetSTableMeta(pBasicCtx->pCatalog, &conn, pTbName, pTableMeta);
|
||||||
}
|
}
|
||||||
|
@ -286,7 +286,7 @@ static int32_t getTableVgroup(SInsertParseContext* pCxt, SName* pTbName, SVgroup
|
||||||
if (pBasicCtx->async) {
|
if (pBasicCtx->async) {
|
||||||
return getTableVgroupFromCache(pCxt->pMetaCache, pTbName, pVg);
|
return getTableVgroupFromCache(pCxt->pMetaCache, pTbName, pVg);
|
||||||
}
|
}
|
||||||
SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
|
SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
|
||||||
.requestId = pBasicCtx->requestId,
|
.requestId = pBasicCtx->requestId,
|
||||||
.requestObjRefId = pBasicCtx->requestRid,
|
.requestObjRefId = pBasicCtx->requestRid,
|
||||||
.mgmtEps = pBasicCtx->mgmtEpSet};
|
.mgmtEps = pBasicCtx->mgmtEpSet};
|
||||||
|
@ -322,7 +322,7 @@ static int32_t getDBCfg(SInsertParseContext* pCxt, const char* pDbFName, SDbCfgI
|
||||||
if (pBasicCtx->async) {
|
if (pBasicCtx->async) {
|
||||||
CHECK_CODE(getDbCfgFromCache(pCxt->pMetaCache, pDbFName, pInfo));
|
CHECK_CODE(getDbCfgFromCache(pCxt->pMetaCache, pDbFName, pInfo));
|
||||||
} else {
|
} else {
|
||||||
SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
|
SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
|
||||||
.requestId = pBasicCtx->requestId,
|
.requestId = pBasicCtx->requestId,
|
||||||
.requestObjRefId = pBasicCtx->requestRid,
|
.requestObjRefId = pBasicCtx->requestRid,
|
||||||
.mgmtEps = pBasicCtx->mgmtEpSet};
|
.mgmtEps = pBasicCtx->mgmtEpSet};
|
||||||
|
@ -1315,15 +1315,6 @@ static void destroyInsertParseContext(SInsertParseContext* pCxt) {
|
||||||
destroyBlockArrayList(pCxt->pVgDataBlocks);
|
destroyBlockArrayList(pCxt->pVgDataBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t checkSchemalessDb(SInsertParseContext* pCxt, char* pDbName) {
|
|
||||||
// SDbCfgInfo pInfo = {0};
|
|
||||||
// char fullName[TSDB_TABLE_FNAME_LEN];
|
|
||||||
// snprintf(fullName, sizeof(fullName), "%d.%s", pCxt->pComCxt->acctId, pDbName);
|
|
||||||
// CHECK_CODE(getDBCfg(pCxt, fullName, &pInfo));
|
|
||||||
// return pInfo.schemaless ? TSDB_CODE_SML_INVALID_DB_CONF : TSDB_CODE_SUCCESS;
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
// tb_name
|
// tb_name
|
||||||
// [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
|
// [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
|
||||||
// [(field1_name, ...)]
|
// [(field1_name, ...)]
|
||||||
|
@ -1377,8 +1368,6 @@ static int32_t parseInsertBody(SInsertParseContext* pCxt) {
|
||||||
SName name;
|
SName name;
|
||||||
CHECK_CODE(createSName(&name, &tbnameToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg));
|
CHECK_CODE(createSName(&name, &tbnameToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg));
|
||||||
|
|
||||||
CHECK_CODE(checkSchemalessDb(pCxt, name.dbname));
|
|
||||||
|
|
||||||
tNameExtractFullName(&name, tbFName);
|
tNameExtractFullName(&name, tbFName);
|
||||||
CHECK_CODE(taosHashPut(pCxt->pTableNameHashObj, tbFName, strlen(tbFName), &name, sizeof(SName)));
|
CHECK_CODE(taosHashPut(pCxt->pTableNameHashObj, tbFName, strlen(tbFName), &name, sizeof(SName)));
|
||||||
char dbFName[TSDB_DB_FNAME_LEN];
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
|
|
@ -56,8 +56,12 @@ static EDealRes doRewriteExpr(SNode** pNode, void* pContext) {
|
||||||
pCol->node.resType = pToBeRewrittenExpr->resType;
|
pCol->node.resType = pToBeRewrittenExpr->resType;
|
||||||
strcpy(pCol->node.aliasName, pToBeRewrittenExpr->aliasName);
|
strcpy(pCol->node.aliasName, pToBeRewrittenExpr->aliasName);
|
||||||
strcpy(pCol->colName, ((SExprNode*)pExpr)->aliasName);
|
strcpy(pCol->colName, ((SExprNode*)pExpr)->aliasName);
|
||||||
if (QUERY_NODE_FUNCTION == nodeType(pExpr) && FUNCTION_TYPE_WSTARTTS == ((SFunctionNode*)pExpr)->funcType) {
|
if (QUERY_NODE_FUNCTION == nodeType(pExpr)) {
|
||||||
pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
if (FUNCTION_TYPE_WSTARTTS == ((SFunctionNode*)pExpr)->funcType) {
|
||||||
|
pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
|
||||||
|
} else if (FUNCTION_TYPE_TBNAME == ((SFunctionNode*)pExpr)->funcType) {
|
||||||
|
pCol->colType = COLUMN_TYPE_TBNAME;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
nodesDestroyNode(*pNode);
|
nodesDestroyNode(*pNode);
|
||||||
*pNode = (SNode*)pCol;
|
*pNode = (SNode*)pCol;
|
||||||
|
|
|
@ -1042,7 +1042,7 @@ static int32_t smaOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan)
|
||||||
|
|
||||||
static EDealRes partTagsOptHasColImpl(SNode* pNode, void* pContext) {
|
static EDealRes partTagsOptHasColImpl(SNode* pNode, void* pContext) {
|
||||||
if (QUERY_NODE_COLUMN == nodeType(pNode)) {
|
if (QUERY_NODE_COLUMN == nodeType(pNode)) {
|
||||||
if (COLUMN_TYPE_TAG != ((SColumnNode*)pNode)->colType) {
|
if (COLUMN_TYPE_TAG != ((SColumnNode*)pNode)->colType && COLUMN_TYPE_TBNAME != ((SColumnNode*)pNode)->colType) {
|
||||||
*(bool*)pContext = true;
|
*(bool*)pContext = true;
|
||||||
return DEAL_RES_END;
|
return DEAL_RES_END;
|
||||||
}
|
}
|
||||||
|
@ -1057,9 +1057,9 @@ static bool partTagsOptHasCol(SNodeList* pPartKeys) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool partTagsIsOptimizableNode(SLogicNode* pNode) {
|
static bool partTagsIsOptimizableNode(SLogicNode* pNode) {
|
||||||
return ((QUERY_NODE_LOGIC_PLAN_PARTITION == nodeType(pNode) /*||
|
return ((QUERY_NODE_LOGIC_PLAN_PARTITION == nodeType(pNode) ||
|
||||||
(QUERY_NODE_LOGIC_PLAN_AGG == nodeType(pNode) && NULL != ((SAggLogicNode*)pNode)->pGroupKeys &&
|
(QUERY_NODE_LOGIC_PLAN_AGG == nodeType(pNode) && NULL != ((SAggLogicNode*)pNode)->pGroupKeys &&
|
||||||
NULL != ((SAggLogicNode*)pNode)->pAggFuncs)*/) &&
|
NULL != ((SAggLogicNode*)pNode)->pAggFuncs)) &&
|
||||||
1 == LIST_LENGTH(pNode->pChildren) &&
|
1 == LIST_LENGTH(pNode->pChildren) &&
|
||||||
QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(nodesListGetNode(pNode->pChildren, 0)));
|
QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(nodesListGetNode(pNode->pChildren, 0)));
|
||||||
}
|
}
|
||||||
|
@ -1080,6 +1080,28 @@ static bool partTagsOptMayBeOptimized(SLogicNode* pNode) {
|
||||||
return !partTagsOptHasCol(partTagsGetPartKeys(pNode));
|
return !partTagsOptHasCol(partTagsGetPartKeys(pNode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static EDealRes partTagsOptRebuildTbanmeImpl(SNode** pNode, void* pContext) {
|
||||||
|
if (QUERY_NODE_COLUMN == nodeType(*pNode) && COLUMN_TYPE_TBNAME == ((SColumnNode*)*pNode)->colType) {
|
||||||
|
SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION);
|
||||||
|
if (NULL == pFunc) {
|
||||||
|
*(int32_t*)pContext = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return DEAL_RES_ERROR;
|
||||||
|
}
|
||||||
|
strcpy(pFunc->functionName, "tbname");
|
||||||
|
pFunc->funcType = FUNCTION_TYPE_TBNAME;
|
||||||
|
nodesDestroyNode(*pNode);
|
||||||
|
*pNode = (SNode*)pFunc;
|
||||||
|
return DEAL_RES_IGNORE_CHILD;
|
||||||
|
}
|
||||||
|
return DEAL_RES_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t partTagsOptRebuildTbanme(SNodeList* pPartKeys) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
nodesRewriteExprs(pPartKeys, partTagsOptRebuildTbanmeImpl, &code);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t partTagsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) {
|
static int32_t partTagsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) {
|
||||||
SLogicNode* pNode = optFindPossibleNode(pLogicSubplan->pNode, partTagsOptMayBeOptimized);
|
SLogicNode* pNode = optFindPossibleNode(pLogicSubplan->pNode, partTagsOptMayBeOptimized);
|
||||||
if (NULL == pNode) {
|
if (NULL == pNode) {
|
||||||
|
@ -1096,7 +1118,18 @@ static int32_t partTagsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub
|
||||||
nodesDestroyNode((SNode*)pNode);
|
nodesDestroyNode((SNode*)pNode);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
TSWAP(((SAggLogicNode*)pNode)->pGroupKeys, pScan->pPartTags);
|
SNode* pGroupKey = NULL;
|
||||||
|
FOREACH(pGroupKey, ((SAggLogicNode*)pNode)->pGroupKeys) {
|
||||||
|
code = nodesListMakeStrictAppend(
|
||||||
|
&pScan->pPartTags, nodesCloneNode(nodesListGetNode(((SGroupingSetNode*)pGroupKey)->pParameterList, 0)));
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DESTORY_LIST(((SAggLogicNode*)pNode)->pGroupKeys);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = partTagsOptRebuildTbanme(pScan->pPartTags);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -1184,7 +1217,7 @@ static const SOptimizeRule optimizeRuleSet[] = {
|
||||||
{.pName = "ConditionPushDown", .optimizeFunc = cpdOptimize},
|
{.pName = "ConditionPushDown", .optimizeFunc = cpdOptimize},
|
||||||
{.pName = "OrderByPrimaryKey", .optimizeFunc = opkOptimize},
|
{.pName = "OrderByPrimaryKey", .optimizeFunc = opkOptimize},
|
||||||
{.pName = "SmaIndex", .optimizeFunc = smaOptimize},
|
{.pName = "SmaIndex", .optimizeFunc = smaOptimize},
|
||||||
{.pName = "PartitionByTags", .optimizeFunc = partTagsOptimize},
|
// {.pName = "PartitionTags", .optimizeFunc = partTagsOptimize},
|
||||||
{.pName = "EliminateProject", .optimizeFunc = eliminateProjOptimize}
|
{.pName = "EliminateProject", .optimizeFunc = eliminateProjOptimize}
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
|
@ -176,7 +176,7 @@ static bool stbSplNeedSplit(bool streamQuery, SLogicNode* pNode) {
|
||||||
return !stbSplHasGatherExecFunc(((SAggLogicNode*)pNode)->pAggFuncs) && stbSplHasMultiTbScan(streamQuery, pNode);
|
return !stbSplHasGatherExecFunc(((SAggLogicNode*)pNode)->pAggFuncs) && stbSplHasMultiTbScan(streamQuery, pNode);
|
||||||
case QUERY_NODE_LOGIC_PLAN_WINDOW: {
|
case QUERY_NODE_LOGIC_PLAN_WINDOW: {
|
||||||
SWindowLogicNode* pWindow = (SWindowLogicNode*)pNode;
|
SWindowLogicNode* pWindow = (SWindowLogicNode*)pNode;
|
||||||
if (WINDOW_TYPE_STATE == pWindow->winType || (!streamQuery && WINDOW_TYPE_SESSION == pWindow->winType) ) {
|
if (WINDOW_TYPE_STATE == pWindow->winType || (!streamQuery && WINDOW_TYPE_SESSION == pWindow->winType)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return !stbSplHasGatherExecFunc(pWindow->pFuncs) && stbSplHasMultiTbScan(streamQuery, pNode);
|
return !stbSplHasGatherExecFunc(pWindow->pFuncs) && stbSplHasMultiTbScan(streamQuery, pNode);
|
||||||
|
@ -380,6 +380,7 @@ static int32_t stbSplCreateExchangeNode(SSplitContext* pCxt, SLogicNode* pParent
|
||||||
SExchangeLogicNode* pExchange = NULL;
|
SExchangeLogicNode* pExchange = NULL;
|
||||||
int32_t code = splCreateExchangeNode(pCxt, pPartChild, &pExchange);
|
int32_t code = splCreateExchangeNode(pCxt, pPartChild, &pExchange);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
pExchange->node.pParent = pParent;
|
||||||
code = nodesListMakeAppend(&pParent->pChildren, (SNode*)pExchange);
|
code = nodesListMakeAppend(&pParent->pChildren, (SNode*)pExchange);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
|
@ -484,7 +485,27 @@ static int32_t stbSplSplitSession(SSplitContext* pCxt, SStableSplitInfo* pInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t stbSplSplitWindowNode(SSplitContext* pCxt, SStableSplitInfo* pInfo) {
|
static SNodeList* stbSplGetPartKeys(SLogicNode* pNode) {
|
||||||
|
if (QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(pNode)) {
|
||||||
|
return ((SScanLogicNode*)pNode)->pPartTags;
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool stbSplIsPartTbanme(SNodeList* pPartKeys) {
|
||||||
|
if (NULL == pPartKeys || 1 != LIST_LENGTH(pPartKeys)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
SNode* pPartKey = nodesListGetNode(pPartKeys, 0);
|
||||||
|
return QUERY_NODE_FUNCTION == nodeType(pPartKey) && FUNCTION_TYPE_TBNAME == ((SFunctionNode*)pPartKey)->funcType;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool stbSplIsMultiTableWinodw(SWindowLogicNode* pWindow) {
|
||||||
|
return stbSplIsPartTbanme(stbSplGetPartKeys((SLogicNode*)nodesListGetNode(pWindow->node.pChildren, 0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t stbSplSplitWindowForMergeTable(SSplitContext* pCxt, SStableSplitInfo* pInfo) {
|
||||||
switch (((SWindowLogicNode*)pInfo->pSplitNode)->winType) {
|
switch (((SWindowLogicNode*)pInfo->pSplitNode)->winType) {
|
||||||
case WINDOW_TYPE_INTERVAL:
|
case WINDOW_TYPE_INTERVAL:
|
||||||
return stbSplSplitInterval(pCxt, pInfo);
|
return stbSplSplitInterval(pCxt, pInfo);
|
||||||
|
@ -496,6 +517,34 @@ static int32_t stbSplSplitWindowNode(SSplitContext* pCxt, SStableSplitInfo* pInf
|
||||||
return TSDB_CODE_PLAN_INTERNAL_ERROR;
|
return TSDB_CODE_PLAN_INTERNAL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t stbSplSplitWindowForMultiTable(SSplitContext* pCxt, SStableSplitInfo* pInfo) {
|
||||||
|
if (pCxt->pPlanCxt->streamQuery) {
|
||||||
|
SPLIT_FLAG_SET_MASK(pInfo->pSubplan->splitFlag, SPLIT_FLAG_STABLE_SPLIT);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
SExchangeLogicNode* pExchange = NULL;
|
||||||
|
int32_t code = splCreateExchangeNode(pCxt, pInfo->pSplitNode, &pExchange);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = replaceLogicNode(pInfo->pSubplan, pInfo->pSplitNode, (SLogicNode*)pExchange);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = nodesListMakeStrictAppend(&pInfo->pSubplan->pChildren,
|
||||||
|
(SNode*)splCreateScanSubplan(pCxt, pInfo->pSplitNode, SPLIT_FLAG_STABLE_SPLIT));
|
||||||
|
}
|
||||||
|
pInfo->pSubplan->subplanType = SUBPLAN_TYPE_MERGE;
|
||||||
|
++(pCxt->groupId);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t stbSplSplitWindowNode(SSplitContext* pCxt, SStableSplitInfo* pInfo) {
|
||||||
|
if (stbSplIsMultiTableWinodw((SWindowLogicNode*)pInfo->pSplitNode)) {
|
||||||
|
return stbSplSplitWindowForMultiTable(pCxt, pInfo);
|
||||||
|
} else {
|
||||||
|
return stbSplSplitWindowForMergeTable(pCxt, pInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t stbSplCreatePartAggNode(SAggLogicNode* pMergeAgg, SLogicNode** pOutput) {
|
static int32_t stbSplCreatePartAggNode(SAggLogicNode* pMergeAgg, SLogicNode** pOutput) {
|
||||||
SNodeList* pFunc = pMergeAgg->pAggFuncs;
|
SNodeList* pFunc = pMergeAgg->pAggFuncs;
|
||||||
pMergeAgg->pAggFuncs = NULL;
|
pMergeAgg->pAggFuncs = NULL;
|
||||||
|
|
|
@ -37,7 +37,9 @@ TEST_F(PlanOtherTest, createStream) {
|
||||||
TEST_F(PlanOtherTest, createStreamUseSTable) {
|
TEST_F(PlanOtherTest, createStreamUseSTable) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create stream if not exists s1 as select count(*) from st1 interval(10s)");
|
run("CREATE STREAM IF NOT EXISTS s1 as SELECT COUNT(*) FROM st1 INTERVAL(10s)");
|
||||||
|
|
||||||
|
run("CREATE STREAM IF NOT EXISTS s1 as SELECT COUNT(*) FROM st1 PARTITION BY TBNAME INTERVAL(10s)");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(PlanOtherTest, createSmaIndex) {
|
TEST_F(PlanOtherTest, createSmaIndex) {
|
||||||
|
|
|
@ -197,6 +197,7 @@ int32_t syncNodeSendMsgByInfo(const SNodeInfo* nodeInfo, SSyncNode* pSyncNode, S
|
||||||
cJSON* syncNode2Json(const SSyncNode* pSyncNode);
|
cJSON* syncNode2Json(const SSyncNode* pSyncNode);
|
||||||
char* syncNode2Str(const SSyncNode* pSyncNode);
|
char* syncNode2Str(const SSyncNode* pSyncNode);
|
||||||
void syncNodeEventLog(const SSyncNode* pSyncNode, char* str);
|
void syncNodeEventLog(const SSyncNode* pSyncNode, char* str);
|
||||||
|
void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str);
|
||||||
char* syncNode2SimpleStr(const SSyncNode* pSyncNode);
|
char* syncNode2SimpleStr(const SSyncNode* pSyncNode);
|
||||||
bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config);
|
bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config);
|
||||||
void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* newConfig, SyncIndex lastConfigChangeIndex);
|
void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* newConfig, SyncIndex lastConfigChangeIndex);
|
||||||
|
|
|
@ -99,19 +99,25 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
if (pMsg->term > ths->pRaftStore->currentTerm) {
|
if (pMsg->term > ths->pRaftStore->currentTerm) {
|
||||||
syncNodeUpdateTerm(ths, pMsg->term);
|
syncNodeUpdateTerm(ths, pMsg->term);
|
||||||
}
|
}
|
||||||
assert(pMsg->term <= ths->pRaftStore->currentTerm);
|
ASSERT(pMsg->term <= ths->pRaftStore->currentTerm);
|
||||||
|
|
||||||
// reset elect timer
|
// reset elect timer
|
||||||
if (pMsg->term == ths->pRaftStore->currentTerm) {
|
if (pMsg->term == ths->pRaftStore->currentTerm) {
|
||||||
ths->leaderCache = pMsg->srcId;
|
ths->leaderCache = pMsg->srcId;
|
||||||
syncNodeResetElectTimer(ths);
|
syncNodeResetElectTimer(ths);
|
||||||
}
|
}
|
||||||
assert(pMsg->dataLen >= 0);
|
ASSERT(pMsg->dataLen >= 0);
|
||||||
|
|
||||||
SyncTerm localPreLogTerm = 0;
|
SyncTerm localPreLogTerm = 0;
|
||||||
if (pMsg->prevLogIndex >= SYNC_INDEX_BEGIN && pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)) {
|
if (pMsg->prevLogIndex >= SYNC_INDEX_BEGIN && pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)) {
|
||||||
SSyncRaftEntry* pEntry = ths->pLogStore->getEntry(ths->pLogStore, pMsg->prevLogIndex);
|
SSyncRaftEntry* pEntry = ths->pLogStore->getEntry(ths->pLogStore, pMsg->prevLogIndex);
|
||||||
assert(pEntry != NULL);
|
if (pEntry == NULL) {
|
||||||
|
char logBuf[128];
|
||||||
|
snprintf(logBuf, sizeof(logBuf), "getEntry error, index:%ld, since %s", pMsg->prevLogIndex, terrstr());
|
||||||
|
syncNodeErrorLog(ths, logBuf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
localPreLogTerm = pEntry->term;
|
localPreLogTerm = pEntry->term;
|
||||||
syncEntryDestory(pEntry);
|
syncEntryDestory(pEntry);
|
||||||
}
|
}
|
||||||
|
@ -160,7 +166,7 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
// accept request
|
// accept request
|
||||||
if (pMsg->term == ths->pRaftStore->currentTerm && ths->state == TAOS_SYNC_STATE_FOLLOWER && logOK) {
|
if (pMsg->term == ths->pRaftStore->currentTerm && ths->state == TAOS_SYNC_STATE_FOLLOWER && logOK) {
|
||||||
// preIndex = -1, or has preIndex entry in local log
|
// preIndex = -1, or has preIndex entry in local log
|
||||||
assert(pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore));
|
ASSERT(pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore));
|
||||||
|
|
||||||
// has extra entries (> preIndex) in local log
|
// has extra entries (> preIndex) in local log
|
||||||
bool hasExtraEntries = pMsg->prevLogIndex < ths->pLogStore->getLastIndex(ths->pLogStore);
|
bool hasExtraEntries = pMsg->prevLogIndex < ths->pLogStore->getLastIndex(ths->pLogStore);
|
||||||
|
@ -179,13 +185,21 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
|
|
||||||
SyncIndex extraIndex = pMsg->prevLogIndex + 1;
|
SyncIndex extraIndex = pMsg->prevLogIndex + 1;
|
||||||
SSyncRaftEntry* pExtraEntry = ths->pLogStore->getEntry(ths->pLogStore, extraIndex);
|
SSyncRaftEntry* pExtraEntry = ths->pLogStore->getEntry(ths->pLogStore, extraIndex);
|
||||||
assert(pExtraEntry != NULL);
|
if (pExtraEntry == NULL) {
|
||||||
|
char logBuf[128];
|
||||||
|
snprintf(logBuf, sizeof(logBuf), "getEntry error2, index:%ld, since %s", extraIndex, terrstr());
|
||||||
|
syncNodeErrorLog(ths, logBuf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen);
|
SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen);
|
||||||
assert(pAppendEntry != NULL);
|
if (pAppendEntry == NULL) {
|
||||||
|
syncNodeErrorLog(ths, "syncEntryDeserialize pAppendEntry error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// log not match, conflict
|
// log not match, conflict
|
||||||
assert(extraIndex == pAppendEntry->index);
|
ASSERT(extraIndex == pAppendEntry->index);
|
||||||
if (pExtraEntry->term != pAppendEntry->term) {
|
if (pExtraEntry->term != pAppendEntry->term) {
|
||||||
conflict = true;
|
conflict = true;
|
||||||
}
|
}
|
||||||
|
@ -201,7 +215,12 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
for (SyncIndex index = delEnd; index >= delBegin; --index) {
|
for (SyncIndex index = delEnd; index >= delBegin; --index) {
|
||||||
if (ths->pFsm->FpRollBackCb != NULL) {
|
if (ths->pFsm->FpRollBackCb != NULL) {
|
||||||
SSyncRaftEntry* pRollBackEntry = ths->pLogStore->getEntry(ths->pLogStore, index);
|
SSyncRaftEntry* pRollBackEntry = ths->pLogStore->getEntry(ths->pLogStore, index);
|
||||||
assert(pRollBackEntry != NULL);
|
if (pRollBackEntry == NULL) {
|
||||||
|
char logBuf[128];
|
||||||
|
snprintf(logBuf, sizeof(logBuf), "getEntry error3, index:%ld, since %s", index, terrstr());
|
||||||
|
syncNodeErrorLog(ths, logBuf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// if (pRollBackEntry->msgType != TDMT_SYNC_NOOP) {
|
// if (pRollBackEntry->msgType != TDMT_SYNC_NOOP) {
|
||||||
if (syncUtilUserRollback(pRollBackEntry->msgType)) {
|
if (syncUtilUserRollback(pRollBackEntry->msgType)) {
|
||||||
|
@ -257,7 +276,10 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
|
|
||||||
} else if (!hasExtraEntries && hasAppendEntries) {
|
} else if (!hasExtraEntries && hasAppendEntries) {
|
||||||
SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen);
|
SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen);
|
||||||
assert(pAppendEntry != NULL);
|
if (pAppendEntry == NULL) {
|
||||||
|
syncNodeErrorLog(ths, "syncEntryDeserialize pAppendEntry2 error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// append new entries
|
// append new entries
|
||||||
ths->pLogStore->appendEntry(ths->pLogStore, pAppendEntry);
|
ths->pLogStore->appendEntry(ths->pLogStore, pAppendEntry);
|
||||||
|
@ -287,7 +309,8 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
// do nothing
|
// do nothing
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
assert(0);
|
syncNodeLog3("", ths);
|
||||||
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncAppendEntriesReply* pReply = syncAppendEntriesReplyBuild(ths->vgId);
|
SyncAppendEntriesReply* pReply = syncAppendEntriesReplyBuild(ths->vgId);
|
||||||
|
|
|
@ -67,7 +67,7 @@ int32_t syncNodeOnAppendEntriesReplyCb(SSyncNode* ths, SyncAppendEntriesReply* p
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(pMsg->term == ths->pRaftStore->currentTerm);
|
ASSERT(pMsg->term == ths->pRaftStore->currentTerm);
|
||||||
|
|
||||||
if (pMsg->success) {
|
if (pMsg->success) {
|
||||||
// nextIndex' = [nextIndex EXCEPT ![i][j] = m.mmatchIndex + 1]
|
// nextIndex' = [nextIndex EXCEPT ![i][j] = m.mmatchIndex + 1]
|
||||||
|
|
|
@ -75,7 +75,7 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) {
|
||||||
if (agree) {
|
if (agree) {
|
||||||
// term
|
// term
|
||||||
SSyncRaftEntry* pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, index);
|
SSyncRaftEntry* pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, index);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
// cannot commit, even if quorum agree. need check term!
|
// cannot commit, even if quorum agree. need check term!
|
||||||
if (pEntry->term == pSyncNode->pRaftStore->currentTerm) {
|
if (pEntry->term == pSyncNode->pRaftStore->currentTerm) {
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
// /\ UNCHANGED <<serverVars, candidateVars, leaderVars, logVars>>
|
// /\ UNCHANGED <<serverVars, candidateVars, leaderVars, logVars>>
|
||||||
//
|
//
|
||||||
int32_t syncNodeRequestVotePeers(SSyncNode* pSyncNode) {
|
int32_t syncNodeRequestVotePeers(SSyncNode* pSyncNode) {
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
||||||
|
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
for (int i = 0; i < pSyncNode->peersNum; ++i) {
|
for (int i = 0; i < pSyncNode->peersNum; ++i) {
|
||||||
|
@ -44,7 +44,7 @@ int32_t syncNodeRequestVotePeers(SSyncNode* pSyncNode) {
|
||||||
pMsg->lastLogTerm = pSyncNode->pLogStore->getLastTerm(pSyncNode->pLogStore);
|
pMsg->lastLogTerm = pSyncNode->pLogStore->getLastTerm(pSyncNode->pLogStore);
|
||||||
|
|
||||||
ret = syncNodeRequestVote(pSyncNode, &pSyncNode->peersId[i], pMsg);
|
ret = syncNodeRequestVote(pSyncNode, &pSyncNode->peersId[i], pMsg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
syncRequestVoteDestroy(pMsg);
|
syncRequestVoteDestroy(pMsg);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -75,7 +75,7 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
|
||||||
if (pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER) {
|
if (pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER) {
|
||||||
syncNodeFollower2Candidate(pSyncNode);
|
syncNodeFollower2Candidate(pSyncNode);
|
||||||
}
|
}
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
||||||
|
|
||||||
// start election
|
// start election
|
||||||
raftStoreNextTerm(pSyncNode->pRaftStore);
|
raftStoreNextTerm(pSyncNode->pRaftStore);
|
||||||
|
@ -86,7 +86,7 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
|
||||||
syncNodeVoteForSelf(pSyncNode);
|
syncNodeVoteForSelf(pSyncNode);
|
||||||
if (voteGrantedMajority(pSyncNode->pVotesGranted)) {
|
if (voteGrantedMajority(pSyncNode->pVotesGranted)) {
|
||||||
// only myself, to leader
|
// only myself, to leader
|
||||||
assert(!pSyncNode->pVotesGranted->toLeader);
|
ASSERT(!pSyncNode->pVotesGranted->toLeader);
|
||||||
syncNodeCandidate2Leader(pSyncNode);
|
syncNodeCandidate2Leader(pSyncNode);
|
||||||
pSyncNode->pVotesGranted->toLeader = true;
|
pSyncNode->pVotesGranted->toLeader = true;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -98,7 +98,7 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
|
||||||
ret = syncNodeRequestVotePeers(pSyncNode);
|
ret = syncNodeRequestVotePeers(pSyncNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
syncNodeResetElectTimer(pSyncNode);
|
syncNodeResetElectTimer(pSyncNode);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "syncEnv.h"
|
#include "syncEnv.h"
|
||||||
// #include <assert.h>
|
// #include <ASSERT.h>
|
||||||
|
|
||||||
SSyncEnv *gSyncEnv = NULL;
|
SSyncEnv *gSyncEnv = NULL;
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ int32_t syncEnvStart() {
|
||||||
taosSeedRand(seed);
|
taosSeedRand(seed);
|
||||||
// gSyncEnv = doSyncEnvStart(gSyncEnv);
|
// gSyncEnv = doSyncEnvStart(gSyncEnv);
|
||||||
gSyncEnv = doSyncEnvStart();
|
gSyncEnv = doSyncEnvStart();
|
||||||
assert(gSyncEnv != NULL);
|
ASSERT(gSyncEnv != NULL);
|
||||||
sTrace("sync env start ok");
|
sTrace("sync env start ok");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -86,7 +86,7 @@ static void syncEnvTick(void *param, void *tmrId) {
|
||||||
|
|
||||||
static SSyncEnv *doSyncEnvStart() {
|
static SSyncEnv *doSyncEnvStart() {
|
||||||
SSyncEnv *pSyncEnv = (SSyncEnv *)taosMemoryMalloc(sizeof(SSyncEnv));
|
SSyncEnv *pSyncEnv = (SSyncEnv *)taosMemoryMalloc(sizeof(SSyncEnv));
|
||||||
assert(pSyncEnv != NULL);
|
ASSERT(pSyncEnv != NULL);
|
||||||
memset(pSyncEnv, 0, sizeof(SSyncEnv));
|
memset(pSyncEnv, 0, sizeof(SSyncEnv));
|
||||||
|
|
||||||
pSyncEnv->envTickTimerCounter = 0;
|
pSyncEnv->envTickTimerCounter = 0;
|
||||||
|
@ -103,7 +103,7 @@ static SSyncEnv *doSyncEnvStart() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t doSyncEnvStop(SSyncEnv *pSyncEnv) {
|
static int32_t doSyncEnvStop(SSyncEnv *pSyncEnv) {
|
||||||
assert(pSyncEnv == gSyncEnv);
|
ASSERT(pSyncEnv == gSyncEnv);
|
||||||
if (pSyncEnv != NULL) {
|
if (pSyncEnv != NULL) {
|
||||||
atomic_store_8(&(pSyncEnv->isStart), 0);
|
atomic_store_8(&(pSyncEnv->isStart), 0);
|
||||||
taosTmrCleanUp(pSyncEnv->pTimerManager);
|
taosTmrCleanUp(pSyncEnv->pTimerManager);
|
||||||
|
|
|
@ -30,7 +30,7 @@ static int32_t syncIODestroy(SSyncIO *io);
|
||||||
static int32_t syncIOStartInternal(SSyncIO *io);
|
static int32_t syncIOStartInternal(SSyncIO *io);
|
||||||
static int32_t syncIOStopInternal(SSyncIO *io);
|
static int32_t syncIOStopInternal(SSyncIO *io);
|
||||||
|
|
||||||
static void * syncIOConsumerFunc(void *param);
|
static void *syncIOConsumerFunc(void *param);
|
||||||
static void syncIOProcessRequest(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
static void syncIOProcessRequest(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
||||||
static void syncIOProcessReply(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
static void syncIOProcessReply(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
||||||
static int32_t syncIOAuth(void *parent, char *meterId, char *spi, char *encrypt, char *secret, char *ckey);
|
static int32_t syncIOAuth(void *parent, char *meterId, char *spi, char *encrypt, char *secret, char *ckey);
|
||||||
|
@ -47,11 +47,11 @@ static void syncIOTickPing(void *param, void *tmrId);
|
||||||
int32_t syncIOStart(char *host, uint16_t port) {
|
int32_t syncIOStart(char *host, uint16_t port) {
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
gSyncIO = syncIOCreate(host, port);
|
gSyncIO = syncIOCreate(host, port);
|
||||||
assert(gSyncIO != NULL);
|
ASSERT(gSyncIO != NULL);
|
||||||
|
|
||||||
taosSeedRand(taosGetTimestampSec());
|
taosSeedRand(taosGetTimestampSec());
|
||||||
ret = syncIOStartInternal(gSyncIO);
|
ret = syncIOStartInternal(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
sTrace("syncIOStart ok, gSyncIO:%p", gSyncIO);
|
sTrace("syncIOStart ok, gSyncIO:%p", gSyncIO);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -59,16 +59,16 @@ int32_t syncIOStart(char *host, uint16_t port) {
|
||||||
|
|
||||||
int32_t syncIOStop() {
|
int32_t syncIOStop() {
|
||||||
int32_t ret = syncIOStopInternal(gSyncIO);
|
int32_t ret = syncIOStopInternal(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
ret = syncIODestroy(gSyncIO);
|
ret = syncIODestroy(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncIOSendMsg(const SEpSet *pEpSet, SRpcMsg *pMsg) {
|
int32_t syncIOSendMsg(const SEpSet *pEpSet, SRpcMsg *pMsg) {
|
||||||
assert(pEpSet->inUse == 0);
|
ASSERT(pEpSet->inUse == 0);
|
||||||
assert(pEpSet->numOfEps == 1);
|
ASSERT(pEpSet->numOfEps == 1);
|
||||||
|
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
{
|
{
|
||||||
|
@ -107,25 +107,25 @@ int32_t syncIOEqMsg(const SMsgCb *msgcb, SRpcMsg *pMsg) {
|
||||||
|
|
||||||
int32_t syncIOQTimerStart() {
|
int32_t syncIOQTimerStart() {
|
||||||
int32_t ret = syncIOStartQ(gSyncIO);
|
int32_t ret = syncIOStartQ(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncIOQTimerStop() {
|
int32_t syncIOQTimerStop() {
|
||||||
int32_t ret = syncIOStopQ(gSyncIO);
|
int32_t ret = syncIOStopQ(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncIOPingTimerStart() {
|
int32_t syncIOPingTimerStart() {
|
||||||
int32_t ret = syncIOStartPing(gSyncIO);
|
int32_t ret = syncIOStartPing(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncIOPingTimerStop() {
|
int32_t syncIOPingTimerStop() {
|
||||||
int32_t ret = syncIOStopPing(gSyncIO);
|
int32_t ret = syncIOStopPing(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,7 +151,7 @@ static SSyncIO *syncIOCreate(char *host, uint16_t port) {
|
||||||
static int32_t syncIODestroy(SSyncIO *io) {
|
static int32_t syncIODestroy(SSyncIO *io) {
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
int8_t start = atomic_load_8(&io->isStart);
|
int8_t start = atomic_load_8(&io->isStart);
|
||||||
assert(start == 0);
|
ASSERT(start == 0);
|
||||||
|
|
||||||
if (io->serverRpc != NULL) {
|
if (io->serverRpc != NULL) {
|
||||||
rpcClose(io->serverRpc);
|
rpcClose(io->serverRpc);
|
||||||
|
@ -242,9 +242,9 @@ static int32_t syncIOStopInternal(SSyncIO *io) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *syncIOConsumerFunc(void *param) {
|
static void *syncIOConsumerFunc(void *param) {
|
||||||
SSyncIO * io = param;
|
SSyncIO *io = param;
|
||||||
STaosQall *qall;
|
STaosQall *qall;
|
||||||
SRpcMsg * pRpcMsg, rpcMsg;
|
SRpcMsg *pRpcMsg, rpcMsg;
|
||||||
qall = taosAllocateQall();
|
qall = taosAllocateQall();
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -264,7 +264,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
if (pRpcMsg->msgType == TDMT_SYNC_PING) {
|
if (pRpcMsg->msgType == TDMT_SYNC_PING) {
|
||||||
if (io->FpOnSyncPing != NULL) {
|
if (io->FpOnSyncPing != NULL) {
|
||||||
SyncPing *pSyncMsg = syncPingFromRpcMsg2(pRpcMsg);
|
SyncPing *pSyncMsg = syncPingFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncPing(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncPing(io->pSyncNode, pSyncMsg);
|
||||||
syncPingDestroy(pSyncMsg);
|
syncPingDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -272,7 +272,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_PING_REPLY) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_PING_REPLY) {
|
||||||
if (io->FpOnSyncPingReply != NULL) {
|
if (io->FpOnSyncPingReply != NULL) {
|
||||||
SyncPingReply *pSyncMsg = syncPingReplyFromRpcMsg2(pRpcMsg);
|
SyncPingReply *pSyncMsg = syncPingReplyFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncPingReply(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncPingReply(io->pSyncNode, pSyncMsg);
|
||||||
syncPingReplyDestroy(pSyncMsg);
|
syncPingReplyDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -280,7 +280,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_CLIENT_REQUEST) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_CLIENT_REQUEST) {
|
||||||
if (io->FpOnSyncClientRequest != NULL) {
|
if (io->FpOnSyncClientRequest != NULL) {
|
||||||
SyncClientRequest *pSyncMsg = syncClientRequestFromRpcMsg2(pRpcMsg);
|
SyncClientRequest *pSyncMsg = syncClientRequestFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncClientRequest(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncClientRequest(io->pSyncNode, pSyncMsg);
|
||||||
syncClientRequestDestroy(pSyncMsg);
|
syncClientRequestDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -288,7 +288,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_REQUEST_VOTE) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_REQUEST_VOTE) {
|
||||||
if (io->FpOnSyncRequestVote != NULL) {
|
if (io->FpOnSyncRequestVote != NULL) {
|
||||||
SyncRequestVote *pSyncMsg = syncRequestVoteFromRpcMsg2(pRpcMsg);
|
SyncRequestVote *pSyncMsg = syncRequestVoteFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncRequestVote(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncRequestVote(io->pSyncNode, pSyncMsg);
|
||||||
syncRequestVoteDestroy(pSyncMsg);
|
syncRequestVoteDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -296,7 +296,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_REQUEST_VOTE_REPLY) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_REQUEST_VOTE_REPLY) {
|
||||||
if (io->FpOnSyncRequestVoteReply != NULL) {
|
if (io->FpOnSyncRequestVoteReply != NULL) {
|
||||||
SyncRequestVoteReply *pSyncMsg = syncRequestVoteReplyFromRpcMsg2(pRpcMsg);
|
SyncRequestVoteReply *pSyncMsg = syncRequestVoteReplyFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncRequestVoteReply(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncRequestVoteReply(io->pSyncNode, pSyncMsg);
|
||||||
syncRequestVoteReplyDestroy(pSyncMsg);
|
syncRequestVoteReplyDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -304,7 +304,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_APPEND_ENTRIES) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_APPEND_ENTRIES) {
|
||||||
if (io->FpOnSyncAppendEntries != NULL) {
|
if (io->FpOnSyncAppendEntries != NULL) {
|
||||||
SyncAppendEntries *pSyncMsg = syncAppendEntriesFromRpcMsg2(pRpcMsg);
|
SyncAppendEntries *pSyncMsg = syncAppendEntriesFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncAppendEntries(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncAppendEntries(io->pSyncNode, pSyncMsg);
|
||||||
syncAppendEntriesDestroy(pSyncMsg);
|
syncAppendEntriesDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -312,7 +312,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_APPEND_ENTRIES_REPLY) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_APPEND_ENTRIES_REPLY) {
|
||||||
if (io->FpOnSyncAppendEntriesReply != NULL) {
|
if (io->FpOnSyncAppendEntriesReply != NULL) {
|
||||||
SyncAppendEntriesReply *pSyncMsg = syncAppendEntriesReplyFromRpcMsg2(pRpcMsg);
|
SyncAppendEntriesReply *pSyncMsg = syncAppendEntriesReplyFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncAppendEntriesReply(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncAppendEntriesReply(io->pSyncNode, pSyncMsg);
|
||||||
syncAppendEntriesReplyDestroy(pSyncMsg);
|
syncAppendEntriesReplyDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -320,7 +320,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_TIMEOUT) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_TIMEOUT) {
|
||||||
if (io->FpOnSyncTimeout != NULL) {
|
if (io->FpOnSyncTimeout != NULL) {
|
||||||
SyncTimeout *pSyncMsg = syncTimeoutFromRpcMsg2(pRpcMsg);
|
SyncTimeout *pSyncMsg = syncTimeoutFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncTimeout(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncTimeout(io->pSyncNode, pSyncMsg);
|
||||||
syncTimeoutDestroy(pSyncMsg);
|
syncTimeoutDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -328,7 +328,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_SNAPSHOT_SEND) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_SNAPSHOT_SEND) {
|
||||||
if (io->FpOnSyncSnapshotSend != NULL) {
|
if (io->FpOnSyncSnapshotSend != NULL) {
|
||||||
SyncSnapshotSend *pSyncMsg = syncSnapshotSendFromRpcMsg2(pRpcMsg);
|
SyncSnapshotSend *pSyncMsg = syncSnapshotSendFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncSnapshotSend(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncSnapshotSend(io->pSyncNode, pSyncMsg);
|
||||||
syncSnapshotSendDestroy(pSyncMsg);
|
syncSnapshotSendDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -336,7 +336,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_SNAPSHOT_RSP) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_SNAPSHOT_RSP) {
|
||||||
if (io->FpOnSyncSnapshotRsp != NULL) {
|
if (io->FpOnSyncSnapshotRsp != NULL) {
|
||||||
SyncSnapshotRsp *pSyncMsg = syncSnapshotRspFromRpcMsg2(pRpcMsg);
|
SyncSnapshotRsp *pSyncMsg = syncSnapshotRspFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncSnapshotRsp(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncSnapshotRsp(io->pSyncNode, pSyncMsg);
|
||||||
syncSnapshotRspDestroy(pSyncMsg);
|
syncSnapshotRspDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
SSyncIndexMgr *syncIndexMgrCreate(SSyncNode *pSyncNode) {
|
SSyncIndexMgr *syncIndexMgrCreate(SSyncNode *pSyncNode) {
|
||||||
SSyncIndexMgr *pSyncIndexMgr = taosMemoryMalloc(sizeof(SSyncIndexMgr));
|
SSyncIndexMgr *pSyncIndexMgr = taosMemoryMalloc(sizeof(SSyncIndexMgr));
|
||||||
assert(pSyncIndexMgr != NULL);
|
ASSERT(pSyncIndexMgr != NULL);
|
||||||
memset(pSyncIndexMgr, 0, sizeof(SSyncIndexMgr));
|
memset(pSyncIndexMgr, 0, sizeof(SSyncIndexMgr));
|
||||||
|
|
||||||
pSyncIndexMgr->replicas = &(pSyncNode->replicasId);
|
pSyncIndexMgr->replicas = &(pSyncNode->replicasId);
|
||||||
|
@ -63,7 +63,7 @@ void syncIndexMgrSetIndex(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId,
|
||||||
}
|
}
|
||||||
|
|
||||||
// maybe config change
|
// maybe config change
|
||||||
// assert(0);
|
// ASSERT(0);
|
||||||
|
|
||||||
char host[128];
|
char host[128];
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
|
@ -169,7 +169,7 @@ void syncIndexMgrSetTerm(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId, S
|
||||||
}
|
}
|
||||||
|
|
||||||
// maybe config change
|
// maybe config change
|
||||||
// assert(0);
|
// ASSERT(0);
|
||||||
char host[128];
|
char host[128];
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
syncUtilU642Addr(pRaftId->addr, host, sizeof(host), &port);
|
syncUtilU642Addr(pRaftId->addr, host, sizeof(host), &port);
|
||||||
|
@ -183,5 +183,5 @@ SyncTerm syncIndexMgrGetTerm(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftI
|
||||||
return term;
|
return term;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(0);
|
ASSERT(0);
|
||||||
}
|
}
|
|
@ -75,7 +75,7 @@ int32_t syncInit() {
|
||||||
|
|
||||||
void syncCleanUp() {
|
void syncCleanUp() {
|
||||||
int32_t ret = syncEnvStop();
|
int32_t ret = syncEnvStop();
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
if (tsNodeRefId != -1) {
|
if (tsNodeRefId != -1) {
|
||||||
taosCloseRef(tsNodeRefId);
|
taosCloseRef(tsNodeRefId);
|
||||||
|
@ -85,7 +85,7 @@ void syncCleanUp() {
|
||||||
|
|
||||||
int64_t syncOpen(const SSyncInfo* pSyncInfo) {
|
int64_t syncOpen(const SSyncInfo* pSyncInfo) {
|
||||||
SSyncNode* pSyncNode = syncNodeOpen(pSyncInfo);
|
SSyncNode* pSyncNode = syncNodeOpen(pSyncInfo);
|
||||||
assert(pSyncNode != NULL);
|
ASSERT(pSyncNode != NULL);
|
||||||
|
|
||||||
if (gRaftDetailLog) {
|
if (gRaftDetailLog) {
|
||||||
syncNodeLog2("syncNodeOpen open success", pSyncNode);
|
syncNodeLog2("syncNodeOpen open success", pSyncNode);
|
||||||
|
@ -318,7 +318,7 @@ bool syncCanLeaderTransfer(int64_t rid) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
|
|
||||||
if (pSyncNode->replicaNum == 1) {
|
if (pSyncNode->replicaNum == 1) {
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -355,7 +355,7 @@ ESyncState syncGetMyRole(int64_t rid) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return TAOS_SYNC_STATE_ERROR;
|
return TAOS_SYNC_STATE_ERROR;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
ESyncState state = pSyncNode->state;
|
ESyncState state = pSyncNode->state;
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -367,7 +367,7 @@ bool syncIsReady(int64_t rid) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
bool b = (pSyncNode->state == TAOS_SYNC_STATE_LEADER) && pSyncNode->restoreFinish;
|
bool b = (pSyncNode->state == TAOS_SYNC_STATE_LEADER) && pSyncNode->restoreFinish;
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
return b;
|
return b;
|
||||||
|
@ -378,7 +378,7 @@ bool syncIsRestoreFinish(int64_t rid) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
bool b = pSyncNode->restoreFinish;
|
bool b = pSyncNode->restoreFinish;
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -390,7 +390,7 @@ int32_t syncGetSnapshotMeta(int64_t rid, struct SSnapshotMeta* sMeta) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
sMeta->lastConfigIndex = pSyncNode->pRaftCfg->lastConfigIndex;
|
sMeta->lastConfigIndex = pSyncNode->pRaftCfg->lastConfigIndex;
|
||||||
|
|
||||||
sTrace("vgId:%d, get snapshot meta, lastConfigIndex:%" PRId64, pSyncNode->vgId, pSyncNode->pRaftCfg->lastConfigIndex);
|
sTrace("vgId:%d, get snapshot meta, lastConfigIndex:%" PRId64, pSyncNode->vgId, pSyncNode->pRaftCfg->lastConfigIndex);
|
||||||
|
@ -404,7 +404,7 @@ int32_t syncGetSnapshotMetaByIndex(int64_t rid, SyncIndex snapshotIndex, struct
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
|
|
||||||
ASSERT(pSyncNode->pRaftCfg->configIndexCount >= 1);
|
ASSERT(pSyncNode->pRaftCfg->configIndexCount >= 1);
|
||||||
SyncIndex lastIndex = (pSyncNode->pRaftCfg->configIndexArr)[0];
|
SyncIndex lastIndex = (pSyncNode->pRaftCfg->configIndexArr)[0];
|
||||||
|
@ -448,7 +448,7 @@ SyncTerm syncGetMyTerm(int64_t rid) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return TAOS_SYNC_STATE_ERROR;
|
return TAOS_SYNC_STATE_ERROR;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
SyncTerm term = pSyncNode->pRaftStore->currentTerm;
|
SyncTerm term = pSyncNode->pRaftStore->currentTerm;
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -460,7 +460,7 @@ SyncGroupId syncGetVgId(int64_t rid) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return TAOS_SYNC_STATE_ERROR;
|
return TAOS_SYNC_STATE_ERROR;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
SyncGroupId vgId = pSyncNode->vgId;
|
SyncGroupId vgId = pSyncNode->vgId;
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -473,7 +473,7 @@ void syncGetEpSet(int64_t rid, SEpSet* pEpSet) {
|
||||||
memset(pEpSet, 0, sizeof(*pEpSet));
|
memset(pEpSet, 0, sizeof(*pEpSet));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
pEpSet->numOfEps = 0;
|
pEpSet->numOfEps = 0;
|
||||||
for (int i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
|
for (int i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
|
||||||
snprintf(pEpSet->eps[i].fqdn, sizeof(pEpSet->eps[i].fqdn), "%s", (pSyncNode->pRaftCfg->cfg.nodeInfo)[i].nodeFqdn);
|
snprintf(pEpSet->eps[i].fqdn, sizeof(pEpSet->eps[i].fqdn), "%s", (pSyncNode->pRaftCfg->cfg.nodeInfo)[i].nodeFqdn);
|
||||||
|
@ -494,7 +494,7 @@ int32_t syncGetRespRpc(int64_t rid, uint64_t index, SRpcMsg* msg) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return TAOS_SYNC_STATE_ERROR;
|
return TAOS_SYNC_STATE_ERROR;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
|
|
||||||
SRespStub stub;
|
SRespStub stub;
|
||||||
int32_t ret = syncRespMgrGet(pSyncNode->pSyncRespMgr, index, &stub);
|
int32_t ret = syncRespMgrGet(pSyncNode->pSyncRespMgr, index, &stub);
|
||||||
|
@ -511,7 +511,7 @@ int32_t syncGetAndDelRespRpc(int64_t rid, uint64_t index, SRpcHandleInfo* pInfo)
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return TAOS_SYNC_STATE_ERROR;
|
return TAOS_SYNC_STATE_ERROR;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
|
|
||||||
SRespStub stub;
|
SRespStub stub;
|
||||||
int32_t ret = syncRespMgrGetAndDel(pSyncNode->pSyncRespMgr, index, &stub);
|
int32_t ret = syncRespMgrGetAndDel(pSyncNode->pSyncRespMgr, index, &stub);
|
||||||
|
@ -530,7 +530,7 @@ void syncSetMsgCb(int64_t rid, const SMsgCb* msgcb) {
|
||||||
sTrace("syncSetQ get pSyncNode is NULL, rid:%ld", rid);
|
sTrace("syncSetQ get pSyncNode is NULL, rid:%ld", rid);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
pSyncNode->msgcb = msgcb;
|
pSyncNode->msgcb = msgcb;
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -542,7 +542,7 @@ char* sync2SimpleStr(int64_t rid) {
|
||||||
sTrace("syncSetRpc get pSyncNode is NULL, rid:%ld", rid);
|
sTrace("syncSetRpc get pSyncNode is NULL, rid:%ld", rid);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
char* s = syncNode2SimpleStr(pSyncNode);
|
char* s = syncNode2SimpleStr(pSyncNode);
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
|
||||||
|
@ -554,7 +554,7 @@ void setPingTimerMS(int64_t rid, int32_t pingTimerMS) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
pSyncNode->pingBaseLine = pingTimerMS;
|
pSyncNode->pingBaseLine = pingTimerMS;
|
||||||
pSyncNode->pingTimerMS = pingTimerMS;
|
pSyncNode->pingTimerMS = pingTimerMS;
|
||||||
|
|
||||||
|
@ -566,7 +566,7 @@ void setElectTimerMS(int64_t rid, int32_t electTimerMS) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
pSyncNode->electBaseLine = electTimerMS;
|
pSyncNode->electBaseLine = electTimerMS;
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -577,7 +577,7 @@ void setHeartbeatTimerMS(int64_t rid, int32_t hbTimerMS) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
pSyncNode->hbBaseLine = hbTimerMS;
|
pSyncNode->hbBaseLine = hbTimerMS;
|
||||||
pSyncNode->heartbeatTimerMS = hbTimerMS;
|
pSyncNode->heartbeatTimerMS = hbTimerMS;
|
||||||
|
|
||||||
|
@ -592,7 +592,7 @@ int32_t syncPropose(int64_t rid, const SRpcMsg* pMsg, bool isWeak) {
|
||||||
terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
|
terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
ret = syncNodePropose(pSyncNode, pMsg, isWeak);
|
ret = syncNodePropose(pSyncNode, pMsg, isWeak);
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -662,7 +662,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
|
||||||
SSyncInfo* pSyncInfo = (SSyncInfo*)pOldSyncInfo;
|
SSyncInfo* pSyncInfo = (SSyncInfo*)pOldSyncInfo;
|
||||||
|
|
||||||
SSyncNode* pSyncNode = (SSyncNode*)taosMemoryMalloc(sizeof(SSyncNode));
|
SSyncNode* pSyncNode = (SSyncNode*)taosMemoryMalloc(sizeof(SSyncNode));
|
||||||
assert(pSyncNode != NULL);
|
ASSERT(pSyncNode != NULL);
|
||||||
memset(pSyncNode, 0, sizeof(SSyncNode));
|
memset(pSyncNode, 0, sizeof(SSyncNode));
|
||||||
|
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
|
@ -682,12 +682,12 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
|
||||||
meta.snapshotEnable = pSyncInfo->snapshotEnable;
|
meta.snapshotEnable = pSyncInfo->snapshotEnable;
|
||||||
meta.lastConfigIndex = SYNC_INDEX_INVALID;
|
meta.lastConfigIndex = SYNC_INDEX_INVALID;
|
||||||
ret = raftCfgCreateFile((SSyncCfg*)&(pSyncInfo->syncCfg), meta, pSyncNode->configPath);
|
ret = raftCfgCreateFile((SSyncCfg*)&(pSyncInfo->syncCfg), meta, pSyncNode->configPath);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// update syncCfg by raft_config.json
|
// update syncCfg by raft_config.json
|
||||||
pSyncNode->pRaftCfg = raftCfgOpen(pSyncNode->configPath);
|
pSyncNode->pRaftCfg = raftCfgOpen(pSyncNode->configPath);
|
||||||
assert(pSyncNode->pRaftCfg != NULL);
|
ASSERT(pSyncNode->pRaftCfg != NULL);
|
||||||
pSyncInfo->syncCfg = pSyncNode->pRaftCfg->cfg;
|
pSyncInfo->syncCfg = pSyncNode->pRaftCfg->cfg;
|
||||||
|
|
||||||
if (gRaftDetailLog) {
|
if (gRaftDetailLog) {
|
||||||
|
@ -712,7 +712,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
|
||||||
|
|
||||||
// init raft config
|
// init raft config
|
||||||
pSyncNode->pRaftCfg = raftCfgOpen(pSyncNode->configPath);
|
pSyncNode->pRaftCfg = raftCfgOpen(pSyncNode->configPath);
|
||||||
assert(pSyncNode->pRaftCfg != NULL);
|
ASSERT(pSyncNode->pRaftCfg != NULL);
|
||||||
|
|
||||||
// init internal
|
// init internal
|
||||||
pSyncNode->myNodeInfo = pSyncNode->pRaftCfg->cfg.nodeInfo[pSyncNode->pRaftCfg->cfg.myIndex];
|
pSyncNode->myNodeInfo = pSyncNode->pRaftCfg->cfg.nodeInfo[pSyncNode->pRaftCfg->cfg.myIndex];
|
||||||
|
@ -771,23 +771,23 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
|
||||||
// init TLA+ server vars
|
// init TLA+ server vars
|
||||||
pSyncNode->state = TAOS_SYNC_STATE_FOLLOWER;
|
pSyncNode->state = TAOS_SYNC_STATE_FOLLOWER;
|
||||||
pSyncNode->pRaftStore = raftStoreOpen(pSyncNode->raftStorePath);
|
pSyncNode->pRaftStore = raftStoreOpen(pSyncNode->raftStorePath);
|
||||||
assert(pSyncNode->pRaftStore != NULL);
|
ASSERT(pSyncNode->pRaftStore != NULL);
|
||||||
|
|
||||||
// init TLA+ candidate vars
|
// init TLA+ candidate vars
|
||||||
pSyncNode->pVotesGranted = voteGrantedCreate(pSyncNode);
|
pSyncNode->pVotesGranted = voteGrantedCreate(pSyncNode);
|
||||||
assert(pSyncNode->pVotesGranted != NULL);
|
ASSERT(pSyncNode->pVotesGranted != NULL);
|
||||||
pSyncNode->pVotesRespond = votesRespondCreate(pSyncNode);
|
pSyncNode->pVotesRespond = votesRespondCreate(pSyncNode);
|
||||||
assert(pSyncNode->pVotesRespond != NULL);
|
ASSERT(pSyncNode->pVotesRespond != NULL);
|
||||||
|
|
||||||
// init TLA+ leader vars
|
// init TLA+ leader vars
|
||||||
pSyncNode->pNextIndex = syncIndexMgrCreate(pSyncNode);
|
pSyncNode->pNextIndex = syncIndexMgrCreate(pSyncNode);
|
||||||
assert(pSyncNode->pNextIndex != NULL);
|
ASSERT(pSyncNode->pNextIndex != NULL);
|
||||||
pSyncNode->pMatchIndex = syncIndexMgrCreate(pSyncNode);
|
pSyncNode->pMatchIndex = syncIndexMgrCreate(pSyncNode);
|
||||||
assert(pSyncNode->pMatchIndex != NULL);
|
ASSERT(pSyncNode->pMatchIndex != NULL);
|
||||||
|
|
||||||
// init TLA+ log vars
|
// init TLA+ log vars
|
||||||
pSyncNode->pLogStore = logStoreCreate(pSyncNode);
|
pSyncNode->pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pSyncNode->pLogStore != NULL);
|
ASSERT(pSyncNode->pLogStore != NULL);
|
||||||
pSyncNode->commitIndex = SYNC_INDEX_INVALID;
|
pSyncNode->commitIndex = SYNC_INDEX_INVALID;
|
||||||
|
|
||||||
// timer ms init
|
// timer ms init
|
||||||
|
@ -845,7 +845,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
|
||||||
|
|
||||||
// tools
|
// tools
|
||||||
pSyncNode->pSyncRespMgr = syncRespMgrCreate(pSyncNode, 0);
|
pSyncNode->pSyncRespMgr = syncRespMgrCreate(pSyncNode, 0);
|
||||||
assert(pSyncNode->pSyncRespMgr != NULL);
|
ASSERT(pSyncNode->pSyncRespMgr != NULL);
|
||||||
|
|
||||||
// restore state
|
// restore state
|
||||||
pSyncNode->restoreFinish = false;
|
pSyncNode->restoreFinish = false;
|
||||||
|
@ -893,7 +893,7 @@ void syncNodeStart(SSyncNode* pSyncNode) {
|
||||||
|
|
||||||
// int32_t ret = 0;
|
// int32_t ret = 0;
|
||||||
// ret = syncNodeStartPingTimer(pSyncNode);
|
// ret = syncNodeStartPingTimer(pSyncNode);
|
||||||
// assert(ret == 0);
|
// ASSERT(ret == 0);
|
||||||
|
|
||||||
if (gRaftDetailLog) {
|
if (gRaftDetailLog) {
|
||||||
syncNodeLog2("==state change become leader immediately==", pSyncNode);
|
syncNodeLog2("==state change become leader immediately==", pSyncNode);
|
||||||
|
@ -915,10 +915,10 @@ void syncNodeClose(SSyncNode* pSyncNode) {
|
||||||
syncNodeEventLog(pSyncNode, "sync close");
|
syncNodeEventLog(pSyncNode, "sync close");
|
||||||
|
|
||||||
int32_t ret;
|
int32_t ret;
|
||||||
assert(pSyncNode != NULL);
|
ASSERT(pSyncNode != NULL);
|
||||||
|
|
||||||
ret = raftStoreClose(pSyncNode->pRaftStore);
|
ret = raftStoreClose(pSyncNode->pRaftStore);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
syncRespMgrDestroy(pSyncNode->pSyncRespMgr);
|
syncRespMgrDestroy(pSyncNode->pSyncRespMgr);
|
||||||
voteGrantedDestroy(pSyncNode->pVotesGranted);
|
voteGrantedDestroy(pSyncNode->pVotesGranted);
|
||||||
|
@ -980,7 +980,7 @@ int32_t syncNodePingSelf(SSyncNode* pSyncNode) {
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, &pSyncNode->myRaftId, pSyncNode->vgId);
|
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, &pSyncNode->myRaftId, pSyncNode->vgId);
|
||||||
ret = syncNodePing(pSyncNode, &pMsg->destId, pMsg);
|
ret = syncNodePing(pSyncNode, &pMsg->destId, pMsg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
syncPingDestroy(pMsg);
|
syncPingDestroy(pMsg);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -992,7 +992,7 @@ int32_t syncNodePingPeers(SSyncNode* pSyncNode) {
|
||||||
SRaftId* destId = &(pSyncNode->peersId[i]);
|
SRaftId* destId = &(pSyncNode->peersId[i]);
|
||||||
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, destId, pSyncNode->vgId);
|
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, destId, pSyncNode->vgId);
|
||||||
ret = syncNodePing(pSyncNode, destId, pMsg);
|
ret = syncNodePing(pSyncNode, destId, pMsg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
syncPingDestroy(pMsg);
|
syncPingDestroy(pMsg);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1004,7 +1004,7 @@ int32_t syncNodePingAll(SSyncNode* pSyncNode) {
|
||||||
SRaftId* destId = &(pSyncNode->replicasId[i]);
|
SRaftId* destId = &(pSyncNode->replicasId[i]);
|
||||||
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, destId, pSyncNode->vgId);
|
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, destId, pSyncNode->vgId);
|
||||||
ret = syncNodePing(pSyncNode, destId, pMsg);
|
ret = syncNodePing(pSyncNode, destId, pMsg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
syncPingDestroy(pMsg);
|
syncPingDestroy(pMsg);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1311,32 +1311,86 @@ void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) {
|
||||||
|
|
||||||
if (userStrLen < 256) {
|
if (userStrLen < 256) {
|
||||||
char logBuf[128 + 256];
|
char logBuf[128 + 256];
|
||||||
snprintf(logBuf, sizeof(logBuf),
|
if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
|
||||||
"vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
|
snprintf(logBuf, sizeof(logBuf),
|
||||||
"replica-num:%d, "
|
"vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
|
||||||
"lconfig:%ld, changing:%d",
|
"replica-num:%d, "
|
||||||
pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
|
"lconfig:%ld, changing:%d",
|
||||||
pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
|
pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
|
||||||
pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
|
||||||
pSyncNode->changing);
|
pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
||||||
|
pSyncNode->changing);
|
||||||
|
} else {
|
||||||
|
snprintf(logBuf, sizeof(logBuf), "%s", str);
|
||||||
|
}
|
||||||
sDebug("%s", logBuf);
|
sDebug("%s", logBuf);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
int len = 128 + userStrLen;
|
int len = 128 + userStrLen;
|
||||||
char* s = (char*)taosMemoryMalloc(len);
|
char* s = (char*)taosMemoryMalloc(len);
|
||||||
snprintf(s, len,
|
if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
|
||||||
"vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
|
snprintf(s, len,
|
||||||
"replica-num:%d, "
|
"vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
|
||||||
"lconfig:%ld, changing:%d",
|
"replica-num:%d, "
|
||||||
pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
|
"lconfig:%ld, changing:%d",
|
||||||
pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
|
pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
|
||||||
pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
|
||||||
pSyncNode->changing);
|
pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
||||||
|
pSyncNode->changing);
|
||||||
|
} else {
|
||||||
|
snprintf(s, len, "%s", str);
|
||||||
|
}
|
||||||
sDebug("%s", s);
|
sDebug("%s", s);
|
||||||
taosMemoryFree(s);
|
taosMemoryFree(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str) {
|
||||||
|
int32_t userStrLen = strlen(str);
|
||||||
|
|
||||||
|
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
|
||||||
|
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
||||||
|
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
||||||
|
}
|
||||||
|
SyncIndex logLastIndex = pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore);
|
||||||
|
SyncIndex logBeginIndex = pSyncNode->pLogStore->syncLogBeginIndex(pSyncNode->pLogStore);
|
||||||
|
|
||||||
|
if (userStrLen < 256) {
|
||||||
|
char logBuf[128 + 256];
|
||||||
|
if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
|
||||||
|
snprintf(logBuf, sizeof(logBuf),
|
||||||
|
"vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
|
||||||
|
"replica-num:%d, "
|
||||||
|
"lconfig:%ld, changing:%d",
|
||||||
|
pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
|
||||||
|
pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
|
||||||
|
pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
||||||
|
pSyncNode->changing);
|
||||||
|
} else {
|
||||||
|
snprintf(logBuf, sizeof(logBuf), "%s", str);
|
||||||
|
}
|
||||||
|
sError("%s", logBuf);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
int len = 128 + userStrLen;
|
||||||
|
char* s = (char*)taosMemoryMalloc(len);
|
||||||
|
if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
|
||||||
|
snprintf(s, len,
|
||||||
|
"vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
|
||||||
|
"replica-num:%d, "
|
||||||
|
"lconfig:%ld, changing:%d",
|
||||||
|
pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
|
||||||
|
pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
|
||||||
|
pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
||||||
|
pSyncNode->changing);
|
||||||
|
} else {
|
||||||
|
snprintf(s, len, "%s", str);
|
||||||
|
}
|
||||||
|
sError("%s", s);
|
||||||
|
taosMemoryFree(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
char* syncNode2SimpleStr(const SSyncNode* pSyncNode) {
|
char* syncNode2SimpleStr(const SSyncNode* pSyncNode) {
|
||||||
int len = 256;
|
int len = 256;
|
||||||
char* s = (char*)taosMemoryMalloc(len);
|
char* s = (char*)taosMemoryMalloc(len);
|
||||||
|
@ -1702,8 +1756,8 @@ void syncNodeBecomeLeader(SSyncNode* pSyncNode, const char* debugStr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncNodeCandidate2Leader(SSyncNode* pSyncNode) {
|
void syncNodeCandidate2Leader(SSyncNode* pSyncNode) {
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
||||||
assert(voteGrantedMajority(pSyncNode->pVotesGranted));
|
ASSERT(voteGrantedMajority(pSyncNode->pVotesGranted));
|
||||||
syncNodeBecomeLeader(pSyncNode, "candidate to leader");
|
syncNodeBecomeLeader(pSyncNode, "candidate to leader");
|
||||||
|
|
||||||
syncNodeLog2("==state change syncNodeCandidate2Leader==", pSyncNode);
|
syncNodeLog2("==state change syncNodeCandidate2Leader==", pSyncNode);
|
||||||
|
@ -1715,21 +1769,21 @@ void syncNodeCandidate2Leader(SSyncNode* pSyncNode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncNodeFollower2Candidate(SSyncNode* pSyncNode) {
|
void syncNodeFollower2Candidate(SSyncNode* pSyncNode) {
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER);
|
||||||
pSyncNode->state = TAOS_SYNC_STATE_CANDIDATE;
|
pSyncNode->state = TAOS_SYNC_STATE_CANDIDATE;
|
||||||
|
|
||||||
syncNodeLog2("==state change syncNodeFollower2Candidate==", pSyncNode);
|
syncNodeLog2("==state change syncNodeFollower2Candidate==", pSyncNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncNodeLeader2Follower(SSyncNode* pSyncNode) {
|
void syncNodeLeader2Follower(SSyncNode* pSyncNode) {
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_LEADER);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_LEADER);
|
||||||
syncNodeBecomeFollower(pSyncNode, "leader to follower");
|
syncNodeBecomeFollower(pSyncNode, "leader to follower");
|
||||||
|
|
||||||
syncNodeLog2("==state change syncNodeLeader2Follower==", pSyncNode);
|
syncNodeLog2("==state change syncNodeLeader2Follower==", pSyncNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncNodeCandidate2Follower(SSyncNode* pSyncNode) {
|
void syncNodeCandidate2Follower(SSyncNode* pSyncNode) {
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
||||||
syncNodeBecomeFollower(pSyncNode, "candidate to follower");
|
syncNodeBecomeFollower(pSyncNode, "candidate to follower");
|
||||||
|
|
||||||
syncNodeLog2("==state change syncNodeCandidate2Follower==", pSyncNode);
|
syncNodeLog2("==state change syncNodeCandidate2Follower==", pSyncNode);
|
||||||
|
@ -1740,8 +1794,8 @@ void syncNodeCandidate2Follower(SSyncNode* pSyncNode) {
|
||||||
// just called by syncNodeVoteForSelf
|
// just called by syncNodeVoteForSelf
|
||||||
// need assert
|
// need assert
|
||||||
void syncNodeVoteForTerm(SSyncNode* pSyncNode, SyncTerm term, SRaftId* pRaftId) {
|
void syncNodeVoteForTerm(SSyncNode* pSyncNode, SyncTerm term, SRaftId* pRaftId) {
|
||||||
assert(term == pSyncNode->pRaftStore->currentTerm);
|
ASSERT(term == pSyncNode->pRaftStore->currentTerm);
|
||||||
assert(!raftStoreHasVoted(pSyncNode->pRaftStore));
|
ASSERT(!raftStoreHasVoted(pSyncNode->pRaftStore));
|
||||||
|
|
||||||
raftStoreVote(pSyncNode->pRaftStore, pRaftId);
|
raftStoreVote(pSyncNode->pRaftStore, pRaftId);
|
||||||
}
|
}
|
||||||
|
@ -1764,7 +1818,7 @@ void syncNodeVoteForSelf(SSyncNode* pSyncNode) {
|
||||||
// snapshot --------------
|
// snapshot --------------
|
||||||
bool syncNodeHasSnapshot(SSyncNode* pSyncNode) {
|
bool syncNodeHasSnapshot(SSyncNode* pSyncNode) {
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
|
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
|
||||||
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
||||||
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
||||||
if (snapshot.lastApplyIndex >= SYNC_INDEX_BEGIN) {
|
if (snapshot.lastApplyIndex >= SYNC_INDEX_BEGIN) {
|
||||||
|
@ -1774,6 +1828,7 @@ bool syncNodeHasSnapshot(SSyncNode* pSyncNode) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
bool syncNodeIsIndexInSnapshot(SSyncNode* pSyncNode, SyncIndex index) {
|
bool syncNodeIsIndexInSnapshot(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
ASSERT(syncNodeHasSnapshot(pSyncNode));
|
ASSERT(syncNodeHasSnapshot(pSyncNode));
|
||||||
ASSERT(pSyncNode->pFsm->FpGetSnapshotInfo != NULL);
|
ASSERT(pSyncNode->pFsm->FpGetSnapshotInfo != NULL);
|
||||||
|
@ -1784,6 +1839,7 @@ bool syncNodeIsIndexInSnapshot(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
bool b = (index <= snapshot.lastApplyIndex);
|
bool b = (index <= snapshot.lastApplyIndex);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
SyncIndex syncNodeGetLastIndex(SSyncNode* pSyncNode) {
|
SyncIndex syncNodeGetLastIndex(SSyncNode* pSyncNode) {
|
||||||
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
|
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
|
||||||
|
@ -1800,7 +1856,7 @@ SyncTerm syncNodeGetLastTerm(SSyncNode* pSyncNode) {
|
||||||
SyncTerm lastTerm = 0;
|
SyncTerm lastTerm = 0;
|
||||||
if (syncNodeHasSnapshot(pSyncNode)) {
|
if (syncNodeHasSnapshot(pSyncNode)) {
|
||||||
// has snapshot
|
// has snapshot
|
||||||
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
|
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
|
||||||
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
||||||
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
||||||
}
|
}
|
||||||
|
@ -1834,8 +1890,8 @@ SyncIndex syncNodeSyncStartIndex(SSyncNode* pSyncNode) {
|
||||||
|
|
||||||
SyncIndex syncNodeGetPreIndex(SSyncNode* pSyncNode, SyncIndex index) {
|
SyncIndex syncNodeGetPreIndex(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
ASSERT(index >= SYNC_INDEX_BEGIN);
|
ASSERT(index >= SYNC_INDEX_BEGIN);
|
||||||
SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
|
|
||||||
|
|
||||||
|
SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
|
||||||
if (index > syncStartIndex) {
|
if (index > syncStartIndex) {
|
||||||
syncNodeLog3("syncNodeGetPreIndex", pSyncNode);
|
syncNodeLog3("syncNodeGetPreIndex", pSyncNode);
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
|
@ -1847,8 +1903,47 @@ SyncIndex syncNodeGetPreIndex(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
|
|
||||||
SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
|
SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
ASSERT(index >= SYNC_INDEX_BEGIN);
|
ASSERT(index >= SYNC_INDEX_BEGIN);
|
||||||
SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
|
|
||||||
|
|
||||||
|
SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
|
||||||
|
if (index > syncStartIndex) {
|
||||||
|
syncNodeLog3("syncNodeGetPreTerm", pSyncNode);
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index == SYNC_INDEX_BEGIN) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SyncTerm preTerm = 0;
|
||||||
|
SyncIndex preIndex = index - 1;
|
||||||
|
SSyncRaftEntry* pPreEntry = NULL;
|
||||||
|
int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, preIndex, &pPreEntry);
|
||||||
|
if (code == 0) {
|
||||||
|
ASSERT(pPreEntry != NULL);
|
||||||
|
preTerm = pPreEntry->term;
|
||||||
|
taosMemoryFree(pPreEntry);
|
||||||
|
return preTerm;
|
||||||
|
} else {
|
||||||
|
if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) {
|
||||||
|
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
|
||||||
|
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
||||||
|
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
||||||
|
if (snapshot.lastApplyIndex == preIndex) {
|
||||||
|
return snapshot.lastApplyTerm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
|
ASSERT(index >= SYNC_INDEX_BEGIN);
|
||||||
|
|
||||||
|
SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
|
||||||
if (index > syncStartIndex) {
|
if (index > syncStartIndex) {
|
||||||
syncNodeLog3("syncNodeGetPreTerm", pSyncNode);
|
syncNodeLog3("syncNodeGetPreTerm", pSyncNode);
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
|
@ -1861,7 +1956,7 @@ SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
SyncTerm preTerm = 0;
|
SyncTerm preTerm = 0;
|
||||||
if (syncNodeHasSnapshot(pSyncNode)) {
|
if (syncNodeHasSnapshot(pSyncNode)) {
|
||||||
// has snapshot
|
// has snapshot
|
||||||
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
|
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
|
||||||
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
||||||
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
||||||
}
|
}
|
||||||
|
@ -1908,6 +2003,7 @@ SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
|
|
||||||
return preTerm;
|
return preTerm;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// get pre index and term of "index"
|
// get pre index and term of "index"
|
||||||
int32_t syncNodeGetPreIndexTerm(SSyncNode* pSyncNode, SyncIndex index, SyncIndex* pPreIndex, SyncTerm* pPreTerm) {
|
int32_t syncNodeGetPreIndexTerm(SSyncNode* pSyncNode, SyncIndex index, SyncIndex* pPreIndex, SyncTerm* pPreTerm) {
|
||||||
|
@ -2062,17 +2158,17 @@ static void syncNodeEqHeartbeatTimer(void* param, void* tmrId) {
|
||||||
|
|
||||||
static int32_t syncNodeEqNoop(SSyncNode* ths) {
|
static int32_t syncNodeEqNoop(SSyncNode* ths) {
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
assert(ths->state == TAOS_SYNC_STATE_LEADER);
|
ASSERT(ths->state == TAOS_SYNC_STATE_LEADER);
|
||||||
|
|
||||||
SyncIndex index = ths->pLogStore->getLastIndex(ths->pLogStore) + 1;
|
SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore);
|
||||||
SyncTerm term = ths->pRaftStore->currentTerm;
|
SyncTerm term = ths->pRaftStore->currentTerm;
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuildNoop(term, index, ths->vgId);
|
SSyncRaftEntry* pEntry = syncEntryBuildNoop(term, index, ths->vgId);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
uint32_t entryLen;
|
uint32_t entryLen;
|
||||||
char* serialized = syncEntrySerialize(pEntry, &entryLen);
|
char* serialized = syncEntrySerialize(pEntry, &entryLen);
|
||||||
SyncClientRequest* pSyncMsg = syncClientRequestBuild(entryLen);
|
SyncClientRequest* pSyncMsg = syncClientRequestBuild(entryLen);
|
||||||
assert(pSyncMsg->dataLen == entryLen);
|
ASSERT(pSyncMsg->dataLen == entryLen);
|
||||||
memcpy(pSyncMsg->data, serialized, entryLen);
|
memcpy(pSyncMsg->data, serialized, entryLen);
|
||||||
|
|
||||||
SRpcMsg rpcMsg = {0};
|
SRpcMsg rpcMsg = {0};
|
||||||
|
@ -2092,10 +2188,10 @@ static int32_t syncNodeEqNoop(SSyncNode* ths) {
|
||||||
static int32_t syncNodeAppendNoop(SSyncNode* ths) {
|
static int32_t syncNodeAppendNoop(SSyncNode* ths) {
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
|
|
||||||
SyncIndex index = ths->pLogStore->getLastIndex(ths->pLogStore) + 1;
|
SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore);
|
||||||
SyncTerm term = ths->pRaftStore->currentTerm;
|
SyncTerm term = ths->pRaftStore->currentTerm;
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuildNoop(term, index, ths->vgId);
|
SSyncRaftEntry* pEntry = syncEntryBuildNoop(term, index, ths->vgId);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
if (ths->state == TAOS_SYNC_STATE_LEADER) {
|
if (ths->state == TAOS_SYNC_STATE_LEADER) {
|
||||||
// ths->pLogStore->appendEntry(ths->pLogStore, pEntry);
|
// ths->pLogStore->appendEntry(ths->pLogStore, pEntry);
|
||||||
|
@ -2158,7 +2254,7 @@ int32_t syncNodeOnClientRequestCb(SSyncNode* ths, SyncClientRequest* pMsg) {
|
||||||
SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore);
|
SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore);
|
||||||
SyncTerm term = ths->pRaftStore->currentTerm;
|
SyncTerm term = ths->pRaftStore->currentTerm;
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuild2((SyncClientRequest*)pMsg, term, index);
|
SSyncRaftEntry* pEntry = syncEntryBuild2((SyncClientRequest*)pMsg, term, index);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
if (ths->state == TAOS_SYNC_STATE_LEADER) {
|
if (ths->state == TAOS_SYNC_STATE_LEADER) {
|
||||||
// ths->pLogStore->appendEntry(ths->pLogStore, pEntry);
|
// ths->pLogStore->appendEntry(ths->pLogStore, pEntry);
|
||||||
|
|
|
@ -186,18 +186,18 @@ void syncTimeoutDestroy(SyncTimeout* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncTimeoutSerialize(const SyncTimeout* pMsg, char* buf, uint32_t bufLen) {
|
void syncTimeoutSerialize(const SyncTimeout* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncTimeoutDeserialize(const char* buf, uint32_t len, SyncTimeout* pMsg) {
|
void syncTimeoutDeserialize(const char* buf, uint32_t len, SyncTimeout* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncTimeoutSerialize2(const SyncTimeout* pMsg, uint32_t* len) {
|
char* syncTimeoutSerialize2(const SyncTimeout* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncTimeoutSerialize(pMsg, buf, pMsg->bytes);
|
syncTimeoutSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -208,9 +208,9 @@ char* syncTimeoutSerialize2(const SyncTimeout* pMsg, uint32_t* len) {
|
||||||
SyncTimeout* syncTimeoutDeserialize2(const char* buf, uint32_t len) {
|
SyncTimeout* syncTimeoutDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncTimeout* pMsg = taosMemoryMalloc(bytes);
|
SyncTimeout* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncTimeoutDeserialize(buf, len, pMsg);
|
syncTimeoutDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,7 +228,7 @@ void syncTimeoutFromRpcMsg(const SRpcMsg* pRpcMsg, SyncTimeout* pMsg) {
|
||||||
|
|
||||||
SyncTimeout* syncTimeoutFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncTimeout* syncTimeoutFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncTimeout* pMsg = syncTimeoutDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncTimeout* pMsg = syncTimeoutDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,19 +322,19 @@ void syncPingDestroy(SyncPing* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncPingSerialize(const SyncPing* pMsg, char* buf, uint32_t bufLen) {
|
void syncPingSerialize(const SyncPing* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncPingDeserialize(const char* buf, uint32_t len, SyncPing* pMsg) {
|
void syncPingDeserialize(const char* buf, uint32_t len, SyncPing* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
assert(pMsg->bytes == sizeof(SyncPing) + pMsg->dataLen);
|
ASSERT(pMsg->bytes == sizeof(SyncPing) + pMsg->dataLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncPingSerialize2(const SyncPing* pMsg, uint32_t* len) {
|
char* syncPingSerialize2(const SyncPing* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncPingSerialize(pMsg, buf, pMsg->bytes);
|
syncPingSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -345,9 +345,9 @@ char* syncPingSerialize2(const SyncPing* pMsg, uint32_t* len) {
|
||||||
SyncPing* syncPingDeserialize2(const char* buf, uint32_t len) {
|
SyncPing* syncPingDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncPing* pMsg = taosMemoryMalloc(bytes);
|
SyncPing* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncPingDeserialize(buf, len, pMsg);
|
syncPingDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -406,7 +406,7 @@ SyncPing* syncPingDeserialize3(void* buf, int32_t bufLen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pMsg = taosMemoryMalloc(bytes);
|
pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
pMsg->bytes = bytes;
|
pMsg->bytes = bytes;
|
||||||
|
|
||||||
if (tDecodeI32(&decoder, &pMsg->vgId) < 0) {
|
if (tDecodeI32(&decoder, &pMsg->vgId) < 0) {
|
||||||
|
@ -435,7 +435,7 @@ SyncPing* syncPingDeserialize3(void* buf, int32_t bufLen) {
|
||||||
if (tDecodeBinary(&decoder, (uint8_t**)(&data), &len) < 0) {
|
if (tDecodeBinary(&decoder, (uint8_t**)(&data), &len) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
assert(len = pMsg->dataLen);
|
ASSERT(len = pMsg->dataLen);
|
||||||
memcpy(pMsg->data, data, len);
|
memcpy(pMsg->data, data, len);
|
||||||
|
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
@ -457,7 +457,7 @@ void syncPingFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPing* pMsg) {
|
||||||
|
|
||||||
SyncPing* syncPingFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncPing* syncPingFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncPing* pMsg = syncPingDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncPing* pMsg = syncPingDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -584,19 +584,19 @@ void syncPingReplyDestroy(SyncPingReply* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncPingReplySerialize(const SyncPingReply* pMsg, char* buf, uint32_t bufLen) {
|
void syncPingReplySerialize(const SyncPingReply* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncPingReplyDeserialize(const char* buf, uint32_t len, SyncPingReply* pMsg) {
|
void syncPingReplyDeserialize(const char* buf, uint32_t len, SyncPingReply* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
assert(pMsg->bytes == sizeof(SyncPing) + pMsg->dataLen);
|
ASSERT(pMsg->bytes == sizeof(SyncPing) + pMsg->dataLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncPingReplySerialize2(const SyncPingReply* pMsg, uint32_t* len) {
|
char* syncPingReplySerialize2(const SyncPingReply* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncPingReplySerialize(pMsg, buf, pMsg->bytes);
|
syncPingReplySerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -607,9 +607,9 @@ char* syncPingReplySerialize2(const SyncPingReply* pMsg, uint32_t* len) {
|
||||||
SyncPingReply* syncPingReplyDeserialize2(const char* buf, uint32_t len) {
|
SyncPingReply* syncPingReplyDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncPingReply* pMsg = taosMemoryMalloc(bytes);
|
SyncPingReply* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncPingReplyDeserialize(buf, len, pMsg);
|
syncPingReplyDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -668,7 +668,7 @@ SyncPingReply* syncPingReplyDeserialize3(void* buf, int32_t bufLen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pMsg = taosMemoryMalloc(bytes);
|
pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
pMsg->bytes = bytes;
|
pMsg->bytes = bytes;
|
||||||
|
|
||||||
if (tDecodeI32(&decoder, &pMsg->vgId) < 0) {
|
if (tDecodeI32(&decoder, &pMsg->vgId) < 0) {
|
||||||
|
@ -697,7 +697,7 @@ SyncPingReply* syncPingReplyDeserialize3(void* buf, int32_t bufLen) {
|
||||||
if (tDecodeBinary(&decoder, (uint8_t**)(&data), &len) < 0) {
|
if (tDecodeBinary(&decoder, (uint8_t**)(&data), &len) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
assert(len = pMsg->dataLen);
|
ASSERT(len = pMsg->dataLen);
|
||||||
memcpy(pMsg->data, data, len);
|
memcpy(pMsg->data, data, len);
|
||||||
|
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
@ -719,7 +719,7 @@ void syncPingReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPingReply* pMsg) {
|
||||||
|
|
||||||
SyncPingReply* syncPingReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncPingReply* syncPingReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncPingReply* pMsg = syncPingReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncPingReply* pMsg = syncPingReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -844,18 +844,18 @@ void syncClientRequestDestroy(SyncClientRequest* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncClientRequestSerialize(const SyncClientRequest* pMsg, char* buf, uint32_t bufLen) {
|
void syncClientRequestSerialize(const SyncClientRequest* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncClientRequestDeserialize(const char* buf, uint32_t len, SyncClientRequest* pMsg) {
|
void syncClientRequestDeserialize(const char* buf, uint32_t len, SyncClientRequest* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncClientRequestSerialize2(const SyncClientRequest* pMsg, uint32_t* len) {
|
char* syncClientRequestSerialize2(const SyncClientRequest* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncClientRequestSerialize(pMsg, buf, pMsg->bytes);
|
syncClientRequestSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -866,9 +866,9 @@ char* syncClientRequestSerialize2(const SyncClientRequest* pMsg, uint32_t* len)
|
||||||
SyncClientRequest* syncClientRequestDeserialize2(const char* buf, uint32_t len) {
|
SyncClientRequest* syncClientRequestDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncClientRequest* pMsg = taosMemoryMalloc(bytes);
|
SyncClientRequest* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncClientRequestDeserialize(buf, len, pMsg);
|
syncClientRequestDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -888,7 +888,7 @@ void syncClientRequestFromRpcMsg(const SRpcMsg* pRpcMsg, SyncClientRequest* pMsg
|
||||||
// step 3. RpcMsg => SyncClientRequest, from queue
|
// step 3. RpcMsg => SyncClientRequest, from queue
|
||||||
SyncClientRequest* syncClientRequestFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncClientRequest* syncClientRequestFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncClientRequest* pMsg = syncClientRequestDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncClientRequest* pMsg = syncClientRequestDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -974,18 +974,18 @@ void syncRequestVoteDestroy(SyncRequestVote* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncRequestVoteSerialize(const SyncRequestVote* pMsg, char* buf, uint32_t bufLen) {
|
void syncRequestVoteSerialize(const SyncRequestVote* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncRequestVoteDeserialize(const char* buf, uint32_t len, SyncRequestVote* pMsg) {
|
void syncRequestVoteDeserialize(const char* buf, uint32_t len, SyncRequestVote* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncRequestVoteSerialize2(const SyncRequestVote* pMsg, uint32_t* len) {
|
char* syncRequestVoteSerialize2(const SyncRequestVote* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncRequestVoteSerialize(pMsg, buf, pMsg->bytes);
|
syncRequestVoteSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -996,9 +996,9 @@ char* syncRequestVoteSerialize2(const SyncRequestVote* pMsg, uint32_t* len) {
|
||||||
SyncRequestVote* syncRequestVoteDeserialize2(const char* buf, uint32_t len) {
|
SyncRequestVote* syncRequestVoteDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncRequestVote* pMsg = taosMemoryMalloc(bytes);
|
SyncRequestVote* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncRequestVoteDeserialize(buf, len, pMsg);
|
syncRequestVoteDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1016,7 +1016,7 @@ void syncRequestVoteFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVote* pMsg) {
|
||||||
|
|
||||||
SyncRequestVote* syncRequestVoteFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncRequestVote* syncRequestVoteFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncRequestVote* pMsg = syncRequestVoteDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncRequestVote* pMsg = syncRequestVoteDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1125,18 +1125,18 @@ void syncRequestVoteReplyDestroy(SyncRequestVoteReply* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncRequestVoteReplySerialize(const SyncRequestVoteReply* pMsg, char* buf, uint32_t bufLen) {
|
void syncRequestVoteReplySerialize(const SyncRequestVoteReply* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncRequestVoteReplyDeserialize(const char* buf, uint32_t len, SyncRequestVoteReply* pMsg) {
|
void syncRequestVoteReplyDeserialize(const char* buf, uint32_t len, SyncRequestVoteReply* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncRequestVoteReplySerialize2(const SyncRequestVoteReply* pMsg, uint32_t* len) {
|
char* syncRequestVoteReplySerialize2(const SyncRequestVoteReply* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncRequestVoteReplySerialize(pMsg, buf, pMsg->bytes);
|
syncRequestVoteReplySerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -1147,9 +1147,9 @@ char* syncRequestVoteReplySerialize2(const SyncRequestVoteReply* pMsg, uint32_t*
|
||||||
SyncRequestVoteReply* syncRequestVoteReplyDeserialize2(const char* buf, uint32_t len) {
|
SyncRequestVoteReply* syncRequestVoteReplyDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncRequestVoteReply* pMsg = taosMemoryMalloc(bytes);
|
SyncRequestVoteReply* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncRequestVoteReplyDeserialize(buf, len, pMsg);
|
syncRequestVoteReplyDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1167,7 +1167,7 @@ void syncRequestVoteReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVoteReply
|
||||||
|
|
||||||
SyncRequestVoteReply* syncRequestVoteReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncRequestVoteReply* syncRequestVoteReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncRequestVoteReply* pMsg = syncRequestVoteReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncRequestVoteReply* pMsg = syncRequestVoteReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1274,19 +1274,19 @@ void syncAppendEntriesDestroy(SyncAppendEntries* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncAppendEntriesSerialize(const SyncAppendEntries* pMsg, char* buf, uint32_t bufLen) {
|
void syncAppendEntriesSerialize(const SyncAppendEntries* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncAppendEntriesDeserialize(const char* buf, uint32_t len, SyncAppendEntries* pMsg) {
|
void syncAppendEntriesDeserialize(const char* buf, uint32_t len, SyncAppendEntries* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
assert(pMsg->bytes == sizeof(SyncAppendEntries) + pMsg->dataLen);
|
ASSERT(pMsg->bytes == sizeof(SyncAppendEntries) + pMsg->dataLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncAppendEntriesSerialize2(const SyncAppendEntries* pMsg, uint32_t* len) {
|
char* syncAppendEntriesSerialize2(const SyncAppendEntries* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncAppendEntriesSerialize(pMsg, buf, pMsg->bytes);
|
syncAppendEntriesSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -1297,9 +1297,9 @@ char* syncAppendEntriesSerialize2(const SyncAppendEntries* pMsg, uint32_t* len)
|
||||||
SyncAppendEntries* syncAppendEntriesDeserialize2(const char* buf, uint32_t len) {
|
SyncAppendEntries* syncAppendEntriesDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncAppendEntries* pMsg = taosMemoryMalloc(bytes);
|
SyncAppendEntries* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncAppendEntriesDeserialize(buf, len, pMsg);
|
syncAppendEntriesDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1317,7 +1317,7 @@ void syncAppendEntriesFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntries* pMsg
|
||||||
|
|
||||||
SyncAppendEntries* syncAppendEntriesFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncAppendEntries* syncAppendEntriesFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncAppendEntries* pMsg = syncAppendEntriesDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncAppendEntries* pMsg = syncAppendEntriesDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1444,18 +1444,18 @@ void syncAppendEntriesReplyDestroy(SyncAppendEntriesReply* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncAppendEntriesReplySerialize(const SyncAppendEntriesReply* pMsg, char* buf, uint32_t bufLen) {
|
void syncAppendEntriesReplySerialize(const SyncAppendEntriesReply* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncAppendEntriesReplyDeserialize(const char* buf, uint32_t len, SyncAppendEntriesReply* pMsg) {
|
void syncAppendEntriesReplyDeserialize(const char* buf, uint32_t len, SyncAppendEntriesReply* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncAppendEntriesReplySerialize2(const SyncAppendEntriesReply* pMsg, uint32_t* len) {
|
char* syncAppendEntriesReplySerialize2(const SyncAppendEntriesReply* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncAppendEntriesReplySerialize(pMsg, buf, pMsg->bytes);
|
syncAppendEntriesReplySerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -1466,9 +1466,9 @@ char* syncAppendEntriesReplySerialize2(const SyncAppendEntriesReply* pMsg, uint3
|
||||||
SyncAppendEntriesReply* syncAppendEntriesReplyDeserialize2(const char* buf, uint32_t len) {
|
SyncAppendEntriesReply* syncAppendEntriesReplyDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncAppendEntriesReply* pMsg = taosMemoryMalloc(bytes);
|
SyncAppendEntriesReply* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncAppendEntriesReplyDeserialize(buf, len, pMsg);
|
syncAppendEntriesReplyDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1486,7 +1486,7 @@ void syncAppendEntriesReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntriesR
|
||||||
|
|
||||||
SyncAppendEntriesReply* syncAppendEntriesReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncAppendEntriesReply* syncAppendEntriesReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncAppendEntriesReply* pMsg = syncAppendEntriesReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncAppendEntriesReply* pMsg = syncAppendEntriesReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1607,18 +1607,18 @@ void syncApplyMsgDestroy(SyncApplyMsg* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncApplyMsgSerialize(const SyncApplyMsg* pMsg, char* buf, uint32_t bufLen) {
|
void syncApplyMsgSerialize(const SyncApplyMsg* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncApplyMsgDeserialize(const char* buf, uint32_t len, SyncApplyMsg* pMsg) {
|
void syncApplyMsgDeserialize(const char* buf, uint32_t len, SyncApplyMsg* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncApplyMsgSerialize2(const SyncApplyMsg* pMsg, uint32_t* len) {
|
char* syncApplyMsgSerialize2(const SyncApplyMsg* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncApplyMsgSerialize(pMsg, buf, pMsg->bytes);
|
syncApplyMsgSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -1629,9 +1629,9 @@ char* syncApplyMsgSerialize2(const SyncApplyMsg* pMsg, uint32_t* len) {
|
||||||
SyncApplyMsg* syncApplyMsgDeserialize2(const char* buf, uint32_t len) {
|
SyncApplyMsg* syncApplyMsgDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncApplyMsg* pMsg = taosMemoryMalloc(bytes);
|
SyncApplyMsg* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncApplyMsgDeserialize(buf, len, pMsg);
|
syncApplyMsgDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1752,19 +1752,19 @@ void syncSnapshotSendDestroy(SyncSnapshotSend* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncSnapshotSendSerialize(const SyncSnapshotSend* pMsg, char* buf, uint32_t bufLen) {
|
void syncSnapshotSendSerialize(const SyncSnapshotSend* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncSnapshotSendDeserialize(const char* buf, uint32_t len, SyncSnapshotSend* pMsg) {
|
void syncSnapshotSendDeserialize(const char* buf, uint32_t len, SyncSnapshotSend* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
assert(pMsg->bytes == sizeof(SyncSnapshotSend) + pMsg->dataLen);
|
ASSERT(pMsg->bytes == sizeof(SyncSnapshotSend) + pMsg->dataLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncSnapshotSendSerialize2(const SyncSnapshotSend* pMsg, uint32_t* len) {
|
char* syncSnapshotSendSerialize2(const SyncSnapshotSend* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncSnapshotSendSerialize(pMsg, buf, pMsg->bytes);
|
syncSnapshotSendSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -1775,9 +1775,9 @@ char* syncSnapshotSendSerialize2(const SyncSnapshotSend* pMsg, uint32_t* len) {
|
||||||
SyncSnapshotSend* syncSnapshotSendDeserialize2(const char* buf, uint32_t len) {
|
SyncSnapshotSend* syncSnapshotSendDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncSnapshotSend* pMsg = taosMemoryMalloc(bytes);
|
SyncSnapshotSend* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncSnapshotSendDeserialize(buf, len, pMsg);
|
syncSnapshotSendDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1795,7 +1795,7 @@ void syncSnapshotSendFromRpcMsg(const SRpcMsg* pRpcMsg, SyncSnapshotSend* pMsg)
|
||||||
|
|
||||||
SyncSnapshotSend* syncSnapshotSendFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncSnapshotSend* syncSnapshotSendFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncSnapshotSend* pMsg = syncSnapshotSendDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncSnapshotSend* pMsg = syncSnapshotSendDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1925,18 +1925,18 @@ void syncSnapshotRspDestroy(SyncSnapshotRsp* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncSnapshotRspSerialize(const SyncSnapshotRsp* pMsg, char* buf, uint32_t bufLen) {
|
void syncSnapshotRspSerialize(const SyncSnapshotRsp* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncSnapshotRspDeserialize(const char* buf, uint32_t len, SyncSnapshotRsp* pMsg) {
|
void syncSnapshotRspDeserialize(const char* buf, uint32_t len, SyncSnapshotRsp* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncSnapshotRspSerialize2(const SyncSnapshotRsp* pMsg, uint32_t* len) {
|
char* syncSnapshotRspSerialize2(const SyncSnapshotRsp* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncSnapshotRspSerialize(pMsg, buf, pMsg->bytes);
|
syncSnapshotRspSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -1947,9 +1947,9 @@ char* syncSnapshotRspSerialize2(const SyncSnapshotRsp* pMsg, uint32_t* len) {
|
||||||
SyncSnapshotRsp* syncSnapshotRspDeserialize2(const char* buf, uint32_t len) {
|
SyncSnapshotRsp* syncSnapshotRspDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncSnapshotRsp* pMsg = taosMemoryMalloc(bytes);
|
SyncSnapshotRsp* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncSnapshotRspDeserialize(buf, len, pMsg);
|
syncSnapshotRspDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1967,7 +1967,7 @@ void syncSnapshotRspFromRpcMsg(const SRpcMsg* pRpcMsg, SyncSnapshotRsp* pMsg) {
|
||||||
|
|
||||||
SyncSnapshotRsp* syncSnapshotRspFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncSnapshotRsp* syncSnapshotRspFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncSnapshotRsp* pMsg = syncSnapshotRspDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncSnapshotRsp* pMsg = syncSnapshotRspDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2085,18 +2085,18 @@ void syncLeaderTransferDestroy(SyncLeaderTransfer* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncLeaderTransferSerialize(const SyncLeaderTransfer* pMsg, char* buf, uint32_t bufLen) {
|
void syncLeaderTransferSerialize(const SyncLeaderTransfer* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncLeaderTransferDeserialize(const char* buf, uint32_t len, SyncLeaderTransfer* pMsg) {
|
void syncLeaderTransferDeserialize(const char* buf, uint32_t len, SyncLeaderTransfer* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncLeaderTransferSerialize2(const SyncLeaderTransfer* pMsg, uint32_t* len) {
|
char* syncLeaderTransferSerialize2(const SyncLeaderTransfer* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncLeaderTransferSerialize(pMsg, buf, pMsg->bytes);
|
syncLeaderTransferSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -2107,9 +2107,9 @@ char* syncLeaderTransferSerialize2(const SyncLeaderTransfer* pMsg, uint32_t* len
|
||||||
SyncLeaderTransfer* syncLeaderTransferDeserialize2(const char* buf, uint32_t len) {
|
SyncLeaderTransfer* syncLeaderTransferDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncLeaderTransfer* pMsg = taosMemoryMalloc(bytes);
|
SyncLeaderTransfer* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncLeaderTransferDeserialize(buf, len, pMsg);
|
syncLeaderTransferDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2127,7 +2127,7 @@ void syncLeaderTransferFromRpcMsg(const SRpcMsg* pRpcMsg, SyncLeaderTransfer* pM
|
||||||
|
|
||||||
SyncLeaderTransfer* syncLeaderTransferFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncLeaderTransfer* syncLeaderTransferFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncLeaderTransfer* pMsg = syncLeaderTransferDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncLeaderTransfer* pMsg = syncLeaderTransferDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2247,18 +2247,18 @@ void syncReconfigFinishDestroy(SyncReconfigFinish* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncReconfigFinishSerialize(const SyncReconfigFinish* pMsg, char* buf, uint32_t bufLen) {
|
void syncReconfigFinishSerialize(const SyncReconfigFinish* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncReconfigFinishDeserialize(const char* buf, uint32_t len, SyncReconfigFinish* pMsg) {
|
void syncReconfigFinishDeserialize(const char* buf, uint32_t len, SyncReconfigFinish* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncReconfigFinishSerialize2(const SyncReconfigFinish* pMsg, uint32_t* len) {
|
char* syncReconfigFinishSerialize2(const SyncReconfigFinish* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncReconfigFinishSerialize(pMsg, buf, pMsg->bytes);
|
syncReconfigFinishSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -2269,9 +2269,9 @@ char* syncReconfigFinishSerialize2(const SyncReconfigFinish* pMsg, uint32_t* len
|
||||||
SyncReconfigFinish* syncReconfigFinishDeserialize2(const char* buf, uint32_t len) {
|
SyncReconfigFinish* syncReconfigFinishDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncReconfigFinish* pMsg = taosMemoryMalloc(bytes);
|
SyncReconfigFinish* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncReconfigFinishDeserialize(buf, len, pMsg);
|
syncReconfigFinishDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2289,7 +2289,7 @@ void syncReconfigFinishFromRpcMsg(const SRpcMsg* pRpcMsg, SyncReconfigFinish* pM
|
||||||
|
|
||||||
SyncReconfigFinish* syncReconfigFinishFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncReconfigFinish* syncReconfigFinishFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncReconfigFinish* pMsg = syncReconfigFinishDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncReconfigFinish* pMsg = syncReconfigFinishDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,29 +24,29 @@ SRaftCfg *raftCfgOpen(const char *path) {
|
||||||
snprintf(pCfg->path, sizeof(pCfg->path), "%s", path);
|
snprintf(pCfg->path, sizeof(pCfg->path), "%s", path);
|
||||||
|
|
||||||
pCfg->pFile = taosOpenFile(pCfg->path, TD_FILE_READ | TD_FILE_WRITE);
|
pCfg->pFile = taosOpenFile(pCfg->path, TD_FILE_READ | TD_FILE_WRITE);
|
||||||
assert(pCfg->pFile != NULL);
|
ASSERT(pCfg->pFile != NULL);
|
||||||
|
|
||||||
taosLSeekFile(pCfg->pFile, 0, SEEK_SET);
|
taosLSeekFile(pCfg->pFile, 0, SEEK_SET);
|
||||||
|
|
||||||
char buf[1024] = {0};
|
char buf[1024] = {0};
|
||||||
int len = taosReadFile(pCfg->pFile, buf, sizeof(buf));
|
int len = taosReadFile(pCfg->pFile, buf, sizeof(buf));
|
||||||
assert(len > 0);
|
ASSERT(len > 0);
|
||||||
|
|
||||||
int32_t ret = raftCfgFromStr(buf, pCfg);
|
int32_t ret = raftCfgFromStr(buf, pCfg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
return pCfg;
|
return pCfg;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftCfgClose(SRaftCfg *pRaftCfg) {
|
int32_t raftCfgClose(SRaftCfg *pRaftCfg) {
|
||||||
int64_t ret = taosCloseFile(&(pRaftCfg->pFile));
|
int64_t ret = taosCloseFile(&(pRaftCfg->pFile));
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
taosMemoryFree(pRaftCfg);
|
taosMemoryFree(pRaftCfg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftCfgPersist(SRaftCfg *pRaftCfg) {
|
int32_t raftCfgPersist(SRaftCfg *pRaftCfg) {
|
||||||
assert(pRaftCfg != NULL);
|
ASSERT(pRaftCfg != NULL);
|
||||||
|
|
||||||
char *s = raftCfg2Str(pRaftCfg);
|
char *s = raftCfg2Str(pRaftCfg);
|
||||||
taosLSeekFile(pRaftCfg->pFile, 0, SEEK_SET);
|
taosLSeekFile(pRaftCfg->pFile, 0, SEEK_SET);
|
||||||
|
@ -61,10 +61,10 @@ int32_t raftCfgPersist(SRaftCfg *pRaftCfg) {
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "%s", s);
|
snprintf(buf, sizeof(buf), "%s", s);
|
||||||
int64_t ret = taosWriteFile(pRaftCfg->pFile, buf, sizeof(buf));
|
int64_t ret = taosWriteFile(pRaftCfg->pFile, buf, sizeof(buf));
|
||||||
assert(ret == sizeof(buf));
|
ASSERT(ret == sizeof(buf));
|
||||||
|
|
||||||
// int64_t ret = taosWriteFile(pRaftCfg->pFile, s, strlen(s) + 1);
|
// int64_t ret = taosWriteFile(pRaftCfg->pFile, s, strlen(s) + 1);
|
||||||
// assert(ret == strlen(s) + 1);
|
// ASSERT(ret == strlen(s) + 1);
|
||||||
|
|
||||||
taosMemoryFree(s);
|
taosMemoryFree(s);
|
||||||
taosFsyncFile(pRaftCfg->pFile);
|
taosFsyncFile(pRaftCfg->pFile);
|
||||||
|
@ -135,27 +135,27 @@ int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg) {
|
||||||
const cJSON *pJson = pRoot;
|
const cJSON *pJson = pRoot;
|
||||||
|
|
||||||
cJSON *pReplicaNum = cJSON_GetObjectItem(pJson, "replicaNum");
|
cJSON *pReplicaNum = cJSON_GetObjectItem(pJson, "replicaNum");
|
||||||
assert(cJSON_IsNumber(pReplicaNum));
|
ASSERT(cJSON_IsNumber(pReplicaNum));
|
||||||
pSyncCfg->replicaNum = cJSON_GetNumberValue(pReplicaNum);
|
pSyncCfg->replicaNum = cJSON_GetNumberValue(pReplicaNum);
|
||||||
|
|
||||||
cJSON *pMyIndex = cJSON_GetObjectItem(pJson, "myIndex");
|
cJSON *pMyIndex = cJSON_GetObjectItem(pJson, "myIndex");
|
||||||
assert(cJSON_IsNumber(pMyIndex));
|
ASSERT(cJSON_IsNumber(pMyIndex));
|
||||||
pSyncCfg->myIndex = cJSON_GetNumberValue(pMyIndex);
|
pSyncCfg->myIndex = cJSON_GetNumberValue(pMyIndex);
|
||||||
|
|
||||||
cJSON *pNodeInfoArr = cJSON_GetObjectItem(pJson, "nodeInfo");
|
cJSON *pNodeInfoArr = cJSON_GetObjectItem(pJson, "nodeInfo");
|
||||||
int arraySize = cJSON_GetArraySize(pNodeInfoArr);
|
int arraySize = cJSON_GetArraySize(pNodeInfoArr);
|
||||||
assert(arraySize == pSyncCfg->replicaNum);
|
ASSERT(arraySize == pSyncCfg->replicaNum);
|
||||||
|
|
||||||
for (int i = 0; i < arraySize; ++i) {
|
for (int i = 0; i < arraySize; ++i) {
|
||||||
cJSON *pNodeInfo = cJSON_GetArrayItem(pNodeInfoArr, i);
|
cJSON *pNodeInfo = cJSON_GetArrayItem(pNodeInfoArr, i);
|
||||||
assert(pNodeInfo != NULL);
|
ASSERT(pNodeInfo != NULL);
|
||||||
|
|
||||||
cJSON *pNodePort = cJSON_GetObjectItem(pNodeInfo, "nodePort");
|
cJSON *pNodePort = cJSON_GetObjectItem(pNodeInfo, "nodePort");
|
||||||
assert(cJSON_IsNumber(pNodePort));
|
ASSERT(cJSON_IsNumber(pNodePort));
|
||||||
((pSyncCfg->nodeInfo)[i]).nodePort = cJSON_GetNumberValue(pNodePort);
|
((pSyncCfg->nodeInfo)[i]).nodePort = cJSON_GetNumberValue(pNodePort);
|
||||||
|
|
||||||
cJSON *pNodeFqdn = cJSON_GetObjectItem(pNodeInfo, "nodeFqdn");
|
cJSON *pNodeFqdn = cJSON_GetObjectItem(pNodeInfo, "nodeFqdn");
|
||||||
assert(cJSON_IsString(pNodeFqdn));
|
ASSERT(cJSON_IsString(pNodeFqdn));
|
||||||
snprintf(((pSyncCfg->nodeInfo)[i]).nodeFqdn, sizeof(((pSyncCfg->nodeInfo)[i]).nodeFqdn), "%s",
|
snprintf(((pSyncCfg->nodeInfo)[i]).nodeFqdn, sizeof(((pSyncCfg->nodeInfo)[i]).nodeFqdn), "%s",
|
||||||
pNodeFqdn->valuestring);
|
pNodeFqdn->valuestring);
|
||||||
}
|
}
|
||||||
|
@ -165,10 +165,10 @@ int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg) {
|
||||||
|
|
||||||
int32_t syncCfgFromStr(const char *s, SSyncCfg *pSyncCfg) {
|
int32_t syncCfgFromStr(const char *s, SSyncCfg *pSyncCfg) {
|
||||||
cJSON *pRoot = cJSON_Parse(s);
|
cJSON *pRoot = cJSON_Parse(s);
|
||||||
assert(pRoot != NULL);
|
ASSERT(pRoot != NULL);
|
||||||
|
|
||||||
int32_t ret = syncCfgFromJson(pRoot, pSyncCfg);
|
int32_t ret = syncCfgFromJson(pRoot, pSyncCfg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
cJSON_Delete(pRoot);
|
cJSON_Delete(pRoot);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -207,10 +207,10 @@ char *raftCfg2Str(SRaftCfg *pRaftCfg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftCfgCreateFile(SSyncCfg *pCfg, SRaftCfgMeta meta, const char *path) {
|
int32_t raftCfgCreateFile(SSyncCfg *pCfg, SRaftCfgMeta meta, const char *path) {
|
||||||
assert(pCfg != NULL);
|
ASSERT(pCfg != NULL);
|
||||||
|
|
||||||
TdFilePtr pFile = taosOpenFile(path, TD_FILE_CREATE | TD_FILE_WRITE);
|
TdFilePtr pFile = taosOpenFile(path, TD_FILE_CREATE | TD_FILE_WRITE);
|
||||||
assert(pFile != NULL);
|
ASSERT(pFile != NULL);
|
||||||
|
|
||||||
SRaftCfg raftCfg;
|
SRaftCfg raftCfg;
|
||||||
raftCfg.cfg = *pCfg;
|
raftCfg.cfg = *pCfg;
|
||||||
|
@ -227,10 +227,10 @@ int32_t raftCfgCreateFile(SSyncCfg *pCfg, SRaftCfgMeta meta, const char *path) {
|
||||||
ASSERT(strlen(s) + 1 <= CONFIG_FILE_LEN);
|
ASSERT(strlen(s) + 1 <= CONFIG_FILE_LEN);
|
||||||
snprintf(buf, sizeof(buf), "%s", s);
|
snprintf(buf, sizeof(buf), "%s", s);
|
||||||
int64_t ret = taosWriteFile(pFile, buf, sizeof(buf));
|
int64_t ret = taosWriteFile(pFile, buf, sizeof(buf));
|
||||||
assert(ret == sizeof(buf));
|
ASSERT(ret == sizeof(buf));
|
||||||
|
|
||||||
// int64_t ret = taosWriteFile(pFile, s, strlen(s) + 1);
|
// int64_t ret = taosWriteFile(pFile, s, strlen(s) + 1);
|
||||||
// assert(ret == strlen(s) + 1);
|
// ASSERT(ret == strlen(s) + 1);
|
||||||
|
|
||||||
taosMemoryFree(s);
|
taosMemoryFree(s);
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
|
@ -255,15 +255,15 @@ int32_t raftCfgFromJson(const cJSON *pRoot, SRaftCfg *pRaftCfg) {
|
||||||
|
|
||||||
cJSON *pIndexArr = cJSON_GetObjectItem(pJson, "configIndexArr");
|
cJSON *pIndexArr = cJSON_GetObjectItem(pJson, "configIndexArr");
|
||||||
int arraySize = cJSON_GetArraySize(pIndexArr);
|
int arraySize = cJSON_GetArraySize(pIndexArr);
|
||||||
assert(arraySize == pRaftCfg->configIndexCount);
|
ASSERT(arraySize == pRaftCfg->configIndexCount);
|
||||||
|
|
||||||
memset(pRaftCfg->configIndexArr, 0, sizeof(pRaftCfg->configIndexArr));
|
memset(pRaftCfg->configIndexArr, 0, sizeof(pRaftCfg->configIndexArr));
|
||||||
for (int i = 0; i < arraySize; ++i) {
|
for (int i = 0; i < arraySize; ++i) {
|
||||||
cJSON *pIndexObj = cJSON_GetArrayItem(pIndexArr, i);
|
cJSON *pIndexObj = cJSON_GetArrayItem(pIndexArr, i);
|
||||||
assert(pIndexObj != NULL);
|
ASSERT(pIndexObj != NULL);
|
||||||
|
|
||||||
cJSON *pIndex = cJSON_GetObjectItem(pIndexObj, "index");
|
cJSON *pIndex = cJSON_GetObjectItem(pIndexObj, "index");
|
||||||
assert(cJSON_IsString(pIndex));
|
ASSERT(cJSON_IsString(pIndex));
|
||||||
(pRaftCfg->configIndexArr)[i] = atoll(pIndex->valuestring);
|
(pRaftCfg->configIndexArr)[i] = atoll(pIndex->valuestring);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,10 +276,10 @@ int32_t raftCfgFromJson(const cJSON *pRoot, SRaftCfg *pRaftCfg) {
|
||||||
|
|
||||||
int32_t raftCfgFromStr(const char *s, SRaftCfg *pRaftCfg) {
|
int32_t raftCfgFromStr(const char *s, SRaftCfg *pRaftCfg) {
|
||||||
cJSON *pRoot = cJSON_Parse(s);
|
cJSON *pRoot = cJSON_Parse(s);
|
||||||
assert(pRoot != NULL);
|
ASSERT(pRoot != NULL);
|
||||||
|
|
||||||
int32_t ret = raftCfgFromJson(pRoot, pRaftCfg);
|
int32_t ret = raftCfgFromJson(pRoot, pRaftCfg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
cJSON_Delete(pRoot);
|
cJSON_Delete(pRoot);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
SSyncRaftEntry* syncEntryBuild(uint32_t dataLen) {
|
SSyncRaftEntry* syncEntryBuild(uint32_t dataLen) {
|
||||||
uint32_t bytes = sizeof(SSyncRaftEntry) + dataLen;
|
uint32_t bytes = sizeof(SSyncRaftEntry) + dataLen;
|
||||||
SSyncRaftEntry* pEntry = taosMemoryMalloc(bytes);
|
SSyncRaftEntry* pEntry = taosMemoryMalloc(bytes);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
memset(pEntry, 0, bytes);
|
memset(pEntry, 0, bytes);
|
||||||
pEntry->bytes = bytes;
|
pEntry->bytes = bytes;
|
||||||
pEntry->dataLen = dataLen;
|
pEntry->dataLen = dataLen;
|
||||||
|
@ -29,14 +29,14 @@ SSyncRaftEntry* syncEntryBuild(uint32_t dataLen) {
|
||||||
// step 4. SyncClientRequest => SSyncRaftEntry, add term, index
|
// step 4. SyncClientRequest => SSyncRaftEntry, add term, index
|
||||||
SSyncRaftEntry* syncEntryBuild2(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
|
SSyncRaftEntry* syncEntryBuild2(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuild3(pMsg, term, index);
|
SSyncRaftEntry* pEntry = syncEntryBuild3(pMsg, term, index);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
return pEntry;
|
return pEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSyncRaftEntry* syncEntryBuild3(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
|
SSyncRaftEntry* syncEntryBuild3(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuild(pMsg->dataLen);
|
SSyncRaftEntry* pEntry = syncEntryBuild(pMsg->dataLen);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
pEntry->msgType = pMsg->msgType;
|
pEntry->msgType = pMsg->msgType;
|
||||||
pEntry->originalRpcType = pMsg->originalRpcType;
|
pEntry->originalRpcType = pMsg->originalRpcType;
|
||||||
|
@ -63,7 +63,7 @@ SSyncRaftEntry* syncEntryBuildNoop(SyncTerm term, SyncIndex index, int32_t vgId)
|
||||||
memcpy(rpcMsg.pCont, &head, sizeof(head));
|
memcpy(rpcMsg.pCont, &head, sizeof(head));
|
||||||
|
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuild(rpcMsg.contLen);
|
SSyncRaftEntry* pEntry = syncEntryBuild(rpcMsg.contLen);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
pEntry->msgType = TDMT_SYNC_CLIENT_REQUEST;
|
pEntry->msgType = TDMT_SYNC_CLIENT_REQUEST;
|
||||||
pEntry->originalRpcType = TDMT_SYNC_NOOP;
|
pEntry->originalRpcType = TDMT_SYNC_NOOP;
|
||||||
|
@ -72,7 +72,7 @@ SSyncRaftEntry* syncEntryBuildNoop(SyncTerm term, SyncIndex index, int32_t vgId)
|
||||||
pEntry->term = term;
|
pEntry->term = term;
|
||||||
pEntry->index = index;
|
pEntry->index = index;
|
||||||
|
|
||||||
assert(pEntry->dataLen == rpcMsg.contLen);
|
ASSERT(pEntry->dataLen == rpcMsg.contLen);
|
||||||
memcpy(pEntry->data, rpcMsg.pCont, rpcMsg.contLen);
|
memcpy(pEntry->data, rpcMsg.pCont, rpcMsg.contLen);
|
||||||
rpcFreeCont(rpcMsg.pCont);
|
rpcFreeCont(rpcMsg.pCont);
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ void syncEntryDestory(SSyncRaftEntry* pEntry) {
|
||||||
// step 5. SSyncRaftEntry => bin, to raft log
|
// step 5. SSyncRaftEntry => bin, to raft log
|
||||||
char* syncEntrySerialize(const SSyncRaftEntry* pEntry, uint32_t* len) {
|
char* syncEntrySerialize(const SSyncRaftEntry* pEntry, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pEntry->bytes);
|
char* buf = taosMemoryMalloc(pEntry->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
memcpy(buf, pEntry, pEntry->bytes);
|
memcpy(buf, pEntry, pEntry->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pEntry->bytes;
|
*len = pEntry->bytes;
|
||||||
|
@ -100,9 +100,9 @@ char* syncEntrySerialize(const SSyncRaftEntry* pEntry, uint32_t* len) {
|
||||||
SSyncRaftEntry* syncEntryDeserialize(const char* buf, uint32_t len) {
|
SSyncRaftEntry* syncEntryDeserialize(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SSyncRaftEntry* pEntry = taosMemoryMalloc(bytes);
|
SSyncRaftEntry* pEntry = taosMemoryMalloc(bytes);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
memcpy(pEntry, buf, len);
|
memcpy(pEntry, buf, len);
|
||||||
assert(len == pEntry->bytes);
|
ASSERT(len == pEntry->bytes);
|
||||||
return pEntry;
|
return pEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ static SyncIndex raftLogEndIndex(struct SSyncLogStore* pLogStore);
|
||||||
static SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore);
|
static SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore);
|
||||||
static bool raftLogIsEmpty(struct SSyncLogStore* pLogStore);
|
static bool raftLogIsEmpty(struct SSyncLogStore* pLogStore);
|
||||||
static int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore);
|
static int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore);
|
||||||
static bool raftLogInRange(struct SSyncLogStore* pLogStore, SyncIndex index);
|
|
||||||
static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore);
|
static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore);
|
||||||
static SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore);
|
static SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore);
|
||||||
static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry);
|
static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry);
|
||||||
|
@ -58,8 +58,6 @@ static int32_t raftLogSetBeginIndex(struct SSyncLogStore* pLogStore, SyncIndex b
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftLogResetBeginIndex(struct SSyncLogStore* pLogStore) { return 0; }
|
|
||||||
|
|
||||||
static SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore) {
|
static SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
|
@ -81,6 +79,7 @@ static int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore) {
|
||||||
return count > 0 ? count : 0;
|
return count > 0 ? count : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static bool raftLogInRange(struct SSyncLogStore* pLogStore, SyncIndex index) {
|
static bool raftLogInRange(struct SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
SyncIndex beginIndex = raftLogBeginIndex(pLogStore);
|
SyncIndex beginIndex = raftLogBeginIndex(pLogStore);
|
||||||
SyncIndex endIndex = raftLogEndIndex(pLogStore);
|
SyncIndex endIndex = raftLogEndIndex(pLogStore);
|
||||||
|
@ -90,6 +89,7 @@ static bool raftLogInRange(struct SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore) {
|
static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore) {
|
||||||
SyncIndex lastIndex;
|
SyncIndex lastIndex;
|
||||||
|
@ -143,7 +143,10 @@ static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntr
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
|
|
||||||
SyncIndex writeIndex = raftLogWriteIndex(pLogStore);
|
SyncIndex writeIndex = raftLogWriteIndex(pLogStore);
|
||||||
ASSERT(pEntry->index == writeIndex);
|
if (pEntry->index != writeIndex) {
|
||||||
|
sError("raftLogAppendEntry error, pEntry->index:%ld update to writeIndex:%ld", pEntry->index, writeIndex);
|
||||||
|
pEntry->index = writeIndex;
|
||||||
|
}
|
||||||
|
|
||||||
int code = 0;
|
int code = 0;
|
||||||
SSyncLogMeta syncMeta;
|
SSyncLogMeta syncMeta;
|
||||||
|
@ -171,6 +174,7 @@ static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntr
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncRaftEntry** ppEntry) {
|
static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncRaftEntry** ppEntry) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
|
@ -215,6 +219,49 @@ static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index,
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncRaftEntry** ppEntry) {
|
||||||
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
|
SWal* pWal = pData->pWal;
|
||||||
|
int32_t code;
|
||||||
|
|
||||||
|
*ppEntry = NULL;
|
||||||
|
|
||||||
|
SWalReadHandle* pWalHandle = walOpenReadHandle(pWal);
|
||||||
|
if (pWalHandle == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = walReadWithHandle(pWalHandle, index);
|
||||||
|
if (code != 0) {
|
||||||
|
int32_t err = terrno;
|
||||||
|
const char* errStr = tstrerror(err);
|
||||||
|
int32_t linuxErr = errno;
|
||||||
|
const char* linuxErrMsg = strerror(errno);
|
||||||
|
sError("raftLogGetEntry error, err:%d %X, msg:%s, linuxErr:%d, linuxErrMsg:%s", err, err, errStr, linuxErr,
|
||||||
|
linuxErrMsg);
|
||||||
|
|
||||||
|
walCloseReadHandle(pWalHandle);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ppEntry = syncEntryBuild(pWalHandle->pHead->head.bodyLen);
|
||||||
|
ASSERT(*ppEntry != NULL);
|
||||||
|
(*ppEntry)->msgType = TDMT_SYNC_CLIENT_REQUEST;
|
||||||
|
(*ppEntry)->originalRpcType = pWalHandle->pHead->head.msgType;
|
||||||
|
(*ppEntry)->seqNum = pWalHandle->pHead->head.syncMeta.seqNum;
|
||||||
|
(*ppEntry)->isWeak = pWalHandle->pHead->head.syncMeta.isWeek;
|
||||||
|
(*ppEntry)->term = pWalHandle->pHead->head.syncMeta.term;
|
||||||
|
(*ppEntry)->index = index;
|
||||||
|
ASSERT((*ppEntry)->dataLen == pWalHandle->pHead->head.bodyLen);
|
||||||
|
memcpy((*ppEntry)->data, pWalHandle->pHead->head.body, pWalHandle->pHead->head.bodyLen);
|
||||||
|
|
||||||
|
// need to hold, do not new every time!!
|
||||||
|
walCloseReadHandle(pWalHandle);
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIndex) {
|
static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIndex) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
|
@ -245,10 +292,10 @@ static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** pp
|
||||||
//-------------------------------
|
//-------------------------------
|
||||||
SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
|
SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
|
||||||
SSyncLogStore* pLogStore = taosMemoryMalloc(sizeof(SSyncLogStore));
|
SSyncLogStore* pLogStore = taosMemoryMalloc(sizeof(SSyncLogStore));
|
||||||
assert(pLogStore != NULL);
|
ASSERT(pLogStore != NULL);
|
||||||
|
|
||||||
pLogStore->data = taosMemoryMalloc(sizeof(SSyncLogStoreData));
|
pLogStore->data = taosMemoryMalloc(sizeof(SSyncLogStoreData));
|
||||||
assert(pLogStore->data != NULL);
|
ASSERT(pLogStore->data != NULL);
|
||||||
|
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
pData->pSyncNode = pSyncNode;
|
pData->pSyncNode = pSyncNode;
|
||||||
|
@ -277,7 +324,6 @@ SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
|
||||||
pLogStore->syncLogEndIndex = raftLogEndIndex;
|
pLogStore->syncLogEndIndex = raftLogEndIndex;
|
||||||
pLogStore->syncLogIsEmpty = raftLogIsEmpty;
|
pLogStore->syncLogIsEmpty = raftLogIsEmpty;
|
||||||
pLogStore->syncLogEntryCount = raftLogEntryCount;
|
pLogStore->syncLogEntryCount = raftLogEntryCount;
|
||||||
pLogStore->syncLogInRange = raftLogInRange;
|
|
||||||
pLogStore->syncLogLastIndex = raftLogLastIndex;
|
pLogStore->syncLogLastIndex = raftLogLastIndex;
|
||||||
pLogStore->syncLogLastTerm = raftLogLastTerm;
|
pLogStore->syncLogLastTerm = raftLogLastTerm;
|
||||||
pLogStore->syncLogAppendEntry = raftLogAppendEntry;
|
pLogStore->syncLogAppendEntry = raftLogAppendEntry;
|
||||||
|
@ -285,6 +331,8 @@ SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
|
||||||
pLogStore->syncLogTruncate = raftLogTruncate;
|
pLogStore->syncLogTruncate = raftLogTruncate;
|
||||||
pLogStore->syncLogWriteIndex = raftLogWriteIndex;
|
pLogStore->syncLogWriteIndex = raftLogWriteIndex;
|
||||||
|
|
||||||
|
// pLogStore->syncLogInRange = raftLogInRange;
|
||||||
|
|
||||||
return pLogStore;
|
return pLogStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -301,7 +349,7 @@ int32_t logStoreAppendEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) {
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
|
|
||||||
SyncIndex lastIndex = logStoreLastIndex(pLogStore);
|
SyncIndex lastIndex = logStoreLastIndex(pLogStore);
|
||||||
assert(pEntry->index == lastIndex + 1);
|
ASSERT(pEntry->index == lastIndex + 1);
|
||||||
|
|
||||||
int code = 0;
|
int code = 0;
|
||||||
SSyncLogMeta syncMeta;
|
SSyncLogMeta syncMeta;
|
||||||
|
@ -347,10 +395,10 @@ SSyncRaftEntry* logStoreGetEntry(SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
linuxErrMsg);
|
linuxErrMsg);
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
// assert(walReadWithHandle(pWalHandle, index) == 0);
|
// ASSERT(walReadWithHandle(pWalHandle, index) == 0);
|
||||||
|
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuild(pWalHandle->pHead->head.bodyLen);
|
SSyncRaftEntry* pEntry = syncEntryBuild(pWalHandle->pHead->head.bodyLen);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
pEntry->msgType = TDMT_SYNC_CLIENT_REQUEST;
|
pEntry->msgType = TDMT_SYNC_CLIENT_REQUEST;
|
||||||
pEntry->originalRpcType = pWalHandle->pHead->head.msgType;
|
pEntry->originalRpcType = pWalHandle->pHead->head.msgType;
|
||||||
|
@ -358,7 +406,7 @@ SSyncRaftEntry* logStoreGetEntry(SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
pEntry->isWeak = pWalHandle->pHead->head.syncMeta.isWeek;
|
pEntry->isWeak = pWalHandle->pHead->head.syncMeta.isWeek;
|
||||||
pEntry->term = pWalHandle->pHead->head.syncMeta.term;
|
pEntry->term = pWalHandle->pHead->head.syncMeta.term;
|
||||||
pEntry->index = index;
|
pEntry->index = index;
|
||||||
assert(pEntry->dataLen == pWalHandle->pHead->head.bodyLen);
|
ASSERT(pEntry->dataLen == pWalHandle->pHead->head.bodyLen);
|
||||||
memcpy(pEntry->data, pWalHandle->pHead->head.body, pWalHandle->pHead->head.bodyLen);
|
memcpy(pEntry->data, pWalHandle->pHead->head.body, pWalHandle->pHead->head.bodyLen);
|
||||||
|
|
||||||
// need to hold, do not new every time!!
|
// need to hold, do not new every time!!
|
||||||
|
@ -373,7 +421,7 @@ SSyncRaftEntry* logStoreGetEntry(SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
int32_t logStoreTruncate(SSyncLogStore* pLogStore, SyncIndex fromIndex) {
|
int32_t logStoreTruncate(SSyncLogStore* pLogStore, SyncIndex fromIndex) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
// assert(walRollback(pWal, fromIndex) == 0);
|
// ASSERT(walRollback(pWal, fromIndex) == 0);
|
||||||
int32_t code = walRollback(pWal, fromIndex);
|
int32_t code = walRollback(pWal, fromIndex);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
int32_t err = terrno;
|
int32_t err = terrno;
|
||||||
|
@ -407,7 +455,7 @@ SyncTerm logStoreLastTerm(SSyncLogStore* pLogStore) {
|
||||||
int32_t logStoreUpdateCommitIndex(SSyncLogStore* pLogStore, SyncIndex index) {
|
int32_t logStoreUpdateCommitIndex(SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
// assert(walCommit(pWal, index) == 0);
|
// ASSERT(walCommit(pWal, index) == 0);
|
||||||
int32_t code = walCommit(pWal, index);
|
int32_t code = walCommit(pWal, index);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
int32_t err = terrno;
|
int32_t err = terrno;
|
||||||
|
|
|
@ -39,40 +39,40 @@ SRaftStore *raftStoreOpen(const char *path) {
|
||||||
|
|
||||||
if (!raftStoreFileExist(pRaftStore->path)) {
|
if (!raftStoreFileExist(pRaftStore->path)) {
|
||||||
ret = raftStoreInit(pRaftStore);
|
ret = raftStoreInit(pRaftStore);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
pRaftStore->pFile = taosOpenFile(path, TD_FILE_READ | TD_FILE_WRITE);
|
pRaftStore->pFile = taosOpenFile(path, TD_FILE_READ | TD_FILE_WRITE);
|
||||||
assert(pRaftStore->pFile != NULL);
|
ASSERT(pRaftStore->pFile != NULL);
|
||||||
|
|
||||||
int len = taosReadFile(pRaftStore->pFile, storeBuf, RAFT_STORE_BLOCK_SIZE);
|
int len = taosReadFile(pRaftStore->pFile, storeBuf, RAFT_STORE_BLOCK_SIZE);
|
||||||
assert(len == RAFT_STORE_BLOCK_SIZE);
|
ASSERT(len == RAFT_STORE_BLOCK_SIZE);
|
||||||
|
|
||||||
ret = raftStoreDeserialize(pRaftStore, storeBuf, len);
|
ret = raftStoreDeserialize(pRaftStore, storeBuf, len);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
return pRaftStore;
|
return pRaftStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t raftStoreInit(SRaftStore *pRaftStore) {
|
static int32_t raftStoreInit(SRaftStore *pRaftStore) {
|
||||||
assert(pRaftStore != NULL);
|
ASSERT(pRaftStore != NULL);
|
||||||
|
|
||||||
pRaftStore->pFile = taosOpenFile(pRaftStore->path, TD_FILE_CREATE | TD_FILE_WRITE);
|
pRaftStore->pFile = taosOpenFile(pRaftStore->path, TD_FILE_CREATE | TD_FILE_WRITE);
|
||||||
assert(pRaftStore->pFile != NULL);
|
ASSERT(pRaftStore->pFile != NULL);
|
||||||
|
|
||||||
pRaftStore->currentTerm = 0;
|
pRaftStore->currentTerm = 0;
|
||||||
pRaftStore->voteFor.addr = 0;
|
pRaftStore->voteFor.addr = 0;
|
||||||
pRaftStore->voteFor.vgId = 0;
|
pRaftStore->voteFor.vgId = 0;
|
||||||
|
|
||||||
int32_t ret = raftStorePersist(pRaftStore);
|
int32_t ret = raftStorePersist(pRaftStore);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
taosCloseFile(&pRaftStore->pFile);
|
taosCloseFile(&pRaftStore->pFile);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftStoreClose(SRaftStore *pRaftStore) {
|
int32_t raftStoreClose(SRaftStore *pRaftStore) {
|
||||||
assert(pRaftStore != NULL);
|
ASSERT(pRaftStore != NULL);
|
||||||
|
|
||||||
taosCloseFile(&pRaftStore->pFile);
|
taosCloseFile(&pRaftStore->pFile);
|
||||||
taosMemoryFree(pRaftStore);
|
taosMemoryFree(pRaftStore);
|
||||||
|
@ -81,17 +81,17 @@ int32_t raftStoreClose(SRaftStore *pRaftStore) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftStorePersist(SRaftStore *pRaftStore) {
|
int32_t raftStorePersist(SRaftStore *pRaftStore) {
|
||||||
assert(pRaftStore != NULL);
|
ASSERT(pRaftStore != NULL);
|
||||||
|
|
||||||
int32_t ret;
|
int32_t ret;
|
||||||
char storeBuf[RAFT_STORE_BLOCK_SIZE] = {0};
|
char storeBuf[RAFT_STORE_BLOCK_SIZE] = {0};
|
||||||
ret = raftStoreSerialize(pRaftStore, storeBuf, sizeof(storeBuf));
|
ret = raftStoreSerialize(pRaftStore, storeBuf, sizeof(storeBuf));
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
taosLSeekFile(pRaftStore->pFile, 0, SEEK_SET);
|
taosLSeekFile(pRaftStore->pFile, 0, SEEK_SET);
|
||||||
|
|
||||||
ret = taosWriteFile(pRaftStore->pFile, storeBuf, sizeof(storeBuf));
|
ret = taosWriteFile(pRaftStore->pFile, storeBuf, sizeof(storeBuf));
|
||||||
assert(ret == RAFT_STORE_BLOCK_SIZE);
|
ASSERT(ret == RAFT_STORE_BLOCK_SIZE);
|
||||||
|
|
||||||
taosFsyncFile(pRaftStore->pFile);
|
taosFsyncFile(pRaftStore->pFile);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -103,7 +103,7 @@ static bool raftStoreFileExist(char *path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftStoreSerialize(SRaftStore *pRaftStore, char *buf, size_t len) {
|
int32_t raftStoreSerialize(SRaftStore *pRaftStore, char *buf, size_t len) {
|
||||||
assert(pRaftStore != NULL);
|
ASSERT(pRaftStore != NULL);
|
||||||
|
|
||||||
cJSON *pRoot = cJSON_CreateObject();
|
cJSON *pRoot = cJSON_CreateObject();
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ int32_t raftStoreSerialize(SRaftStore *pRaftStore, char *buf, size_t len) {
|
||||||
|
|
||||||
char *serialized = cJSON_Print(pRoot);
|
char *serialized = cJSON_Print(pRoot);
|
||||||
int len2 = strlen(serialized);
|
int len2 = strlen(serialized);
|
||||||
assert(len2 < len);
|
ASSERT(len2 < len);
|
||||||
memset(buf, 0, len);
|
memset(buf, 0, len);
|
||||||
snprintf(buf, len, "%s", serialized);
|
snprintf(buf, len, "%s", serialized);
|
||||||
taosMemoryFree(serialized);
|
taosMemoryFree(serialized);
|
||||||
|
@ -135,17 +135,17 @@ int32_t raftStoreSerialize(SRaftStore *pRaftStore, char *buf, size_t len) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftStoreDeserialize(SRaftStore *pRaftStore, char *buf, size_t len) {
|
int32_t raftStoreDeserialize(SRaftStore *pRaftStore, char *buf, size_t len) {
|
||||||
assert(pRaftStore != NULL);
|
ASSERT(pRaftStore != NULL);
|
||||||
|
|
||||||
assert(len > 0 && len <= RAFT_STORE_BLOCK_SIZE);
|
ASSERT(len > 0 && len <= RAFT_STORE_BLOCK_SIZE);
|
||||||
cJSON *pRoot = cJSON_Parse(buf);
|
cJSON *pRoot = cJSON_Parse(buf);
|
||||||
|
|
||||||
cJSON *pCurrentTerm = cJSON_GetObjectItem(pRoot, "current_term");
|
cJSON *pCurrentTerm = cJSON_GetObjectItem(pRoot, "current_term");
|
||||||
assert(cJSON_IsString(pCurrentTerm));
|
ASSERT(cJSON_IsString(pCurrentTerm));
|
||||||
sscanf(pCurrentTerm->valuestring, "%lu", &(pRaftStore->currentTerm));
|
sscanf(pCurrentTerm->valuestring, "%lu", &(pRaftStore->currentTerm));
|
||||||
|
|
||||||
cJSON *pVoteForAddr = cJSON_GetObjectItem(pRoot, "vote_for_addr");
|
cJSON *pVoteForAddr = cJSON_GetObjectItem(pRoot, "vote_for_addr");
|
||||||
assert(cJSON_IsString(pVoteForAddr));
|
ASSERT(cJSON_IsString(pVoteForAddr));
|
||||||
sscanf(pVoteForAddr->valuestring, "%lu", &(pRaftStore->voteFor.addr));
|
sscanf(pVoteForAddr->valuestring, "%lu", &(pRaftStore->voteFor.addr));
|
||||||
|
|
||||||
cJSON *pVoteForVgid = cJSON_GetObjectItem(pRoot, "vote_for_vgid");
|
cJSON *pVoteForVgid = cJSON_GetObjectItem(pRoot, "vote_for_vgid");
|
||||||
|
@ -161,7 +161,7 @@ bool raftStoreHasVoted(SRaftStore *pRaftStore) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void raftStoreVote(SRaftStore *pRaftStore, SRaftId *pRaftId) {
|
void raftStoreVote(SRaftStore *pRaftStore, SRaftId *pRaftId) {
|
||||||
assert(!syncUtilEmptyId(pRaftId));
|
ASSERT(!syncUtilEmptyId(pRaftId));
|
||||||
pRaftStore->voteFor = *pRaftId;
|
pRaftStore->voteFor = *pRaftId;
|
||||||
raftStorePersist(pRaftStore);
|
raftStorePersist(pRaftStore);
|
||||||
}
|
}
|
||||||
|
@ -216,7 +216,7 @@ cJSON *raftStore2Json(SRaftStore *pRaftStore) {
|
||||||
|
|
||||||
char *raftStore2Str(SRaftStore *pRaftStore) {
|
char *raftStore2Str(SRaftStore *pRaftStore) {
|
||||||
cJSON *pJson = raftStore2Json(pRaftStore);
|
cJSON *pJson = raftStore2Json(pRaftStore);
|
||||||
char * serialized = cJSON_Print(pJson);
|
char *serialized = cJSON_Print(pJson);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
return serialized;
|
return serialized;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
// /\ UNCHANGED <<serverVars, candidateVars, leaderVars, logVars>>
|
// /\ UNCHANGED <<serverVars, candidateVars, leaderVars, logVars>>
|
||||||
//
|
//
|
||||||
int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
|
int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_LEADER);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_LEADER);
|
||||||
|
|
||||||
syncIndexMgrLog2("==syncNodeAppendEntriesPeers== pNextIndex", pSyncNode->pNextIndex);
|
syncIndexMgrLog2("==syncNodeAppendEntriesPeers== pNextIndex", pSyncNode->pNextIndex);
|
||||||
syncIndexMgrLog2("==syncNodeAppendEntriesPeers== pMatchIndex", pSyncNode->pMatchIndex);
|
syncIndexMgrLog2("==syncNodeAppendEntriesPeers== pMatchIndex", pSyncNode->pMatchIndex);
|
||||||
|
@ -68,7 +68,7 @@ int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
|
||||||
SyncTerm preLogTerm = 0;
|
SyncTerm preLogTerm = 0;
|
||||||
if (preLogIndex >= SYNC_INDEX_BEGIN) {
|
if (preLogIndex >= SYNC_INDEX_BEGIN) {
|
||||||
SSyncRaftEntry* pPreEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, preLogIndex);
|
SSyncRaftEntry* pPreEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, preLogIndex);
|
||||||
assert(pPreEntry != NULL);
|
ASSERT(pPreEntry != NULL);
|
||||||
|
|
||||||
preLogTerm = pPreEntry->term;
|
preLogTerm = pPreEntry->term;
|
||||||
syncEntryDestory(pPreEntry);
|
syncEntryDestory(pPreEntry);
|
||||||
|
@ -81,12 +81,12 @@ int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
|
||||||
SSyncRaftEntry* pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, nextIndex);
|
SSyncRaftEntry* pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, nextIndex);
|
||||||
if (pEntry != NULL) {
|
if (pEntry != NULL) {
|
||||||
pMsg = syncAppendEntriesBuild(pEntry->bytes, pSyncNode->vgId);
|
pMsg = syncAppendEntriesBuild(pEntry->bytes, pSyncNode->vgId);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
|
|
||||||
// add pEntry into msg
|
// add pEntry into msg
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
char* serialized = syncEntrySerialize(pEntry, &len);
|
char* serialized = syncEntrySerialize(pEntry, &len);
|
||||||
assert(len == pEntry->bytes);
|
ASSERT(len == pEntry->bytes);
|
||||||
memcpy(pMsg->data, serialized, len);
|
memcpy(pMsg->data, serialized, len);
|
||||||
|
|
||||||
taosMemoryFree(serialized);
|
taosMemoryFree(serialized);
|
||||||
|
@ -95,10 +95,10 @@ int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
|
||||||
} else {
|
} else {
|
||||||
// maybe overflow, send empty record
|
// maybe overflow, send empty record
|
||||||
pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
|
pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
pMsg->srcId = pSyncNode->myRaftId;
|
pMsg->srcId = pSyncNode->myRaftId;
|
||||||
pMsg->destId = *pDestId;
|
pMsg->destId = *pDestId;
|
||||||
pMsg->term = pSyncNode->pRaftStore->currentTerm;
|
pMsg->term = pSyncNode->pRaftStore->currentTerm;
|
||||||
|
@ -148,25 +148,32 @@ int32_t syncNodeAppendEntriesPeersSnapshot(SSyncNode* pSyncNode) {
|
||||||
|
|
||||||
SSyncRaftEntry* pEntry;
|
SSyncRaftEntry* pEntry;
|
||||||
int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, nextIndex, &pEntry);
|
int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, nextIndex, &pEntry);
|
||||||
ASSERT(code == 0);
|
|
||||||
|
|
||||||
if (pEntry != NULL) {
|
if (code == 0) {
|
||||||
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
pMsg = syncAppendEntriesBuild(pEntry->bytes, pSyncNode->vgId);
|
pMsg = syncAppendEntriesBuild(pEntry->bytes, pSyncNode->vgId);
|
||||||
ASSERT(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
|
|
||||||
// add pEntry into msg
|
// add pEntry into msg
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
char* serialized = syncEntrySerialize(pEntry, &len);
|
char* serialized = syncEntrySerialize(pEntry, &len);
|
||||||
assert(len == pEntry->bytes);
|
ASSERT(len == pEntry->bytes);
|
||||||
memcpy(pMsg->data, serialized, len);
|
memcpy(pMsg->data, serialized, len);
|
||||||
|
|
||||||
taosMemoryFree(serialized);
|
taosMemoryFree(serialized);
|
||||||
syncEntryDestory(pEntry);
|
syncEntryDestory(pEntry);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// no entry in log
|
if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) {
|
||||||
pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
|
// no entry in log
|
||||||
ASSERT(pMsg != NULL);
|
pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
|
||||||
|
ASSERT(pMsg != NULL);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
syncNodeLog3("", pSyncNode);
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepare msg
|
// prepare msg
|
||||||
|
|
|
@ -52,7 +52,7 @@ int32_t syncNodeOnRequestVoteCb(SSyncNode* ths, SyncRequestVote* pMsg) {
|
||||||
if (pMsg->term > ths->pRaftStore->currentTerm) {
|
if (pMsg->term > ths->pRaftStore->currentTerm) {
|
||||||
syncNodeUpdateTerm(ths, pMsg->term);
|
syncNodeUpdateTerm(ths, pMsg->term);
|
||||||
}
|
}
|
||||||
assert(pMsg->term <= ths->pRaftStore->currentTerm);
|
ASSERT(pMsg->term <= ths->pRaftStore->currentTerm);
|
||||||
|
|
||||||
bool logOK = (pMsg->lastLogTerm > ths->pLogStore->getLastTerm(ths->pLogStore)) ||
|
bool logOK = (pMsg->lastLogTerm > ths->pLogStore->getLastTerm(ths->pLogStore)) ||
|
||||||
((pMsg->lastLogTerm == ths->pLogStore->getLastTerm(ths->pLogStore)) &&
|
((pMsg->lastLogTerm == ths->pLogStore->getLastTerm(ths->pLogStore)) &&
|
||||||
|
|
|
@ -50,7 +50,7 @@ int32_t syncNodeOnRequestVoteReplyCb(SSyncNode* ths, SyncRequestVoteReply* pMsg)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// assert(!(pMsg->term > ths->pRaftStore->currentTerm));
|
// ASSERT(!(pMsg->term > ths->pRaftStore->currentTerm));
|
||||||
// no need this code, because if I receive reply.term, then I must have sent for that term.
|
// no need this code, because if I receive reply.term, then I must have sent for that term.
|
||||||
// if (pMsg->term > ths->pRaftStore->currentTerm) {
|
// if (pMsg->term > ths->pRaftStore->currentTerm) {
|
||||||
// syncNodeUpdateTerm(ths, pMsg->term);
|
// syncNodeUpdateTerm(ths, pMsg->term);
|
||||||
|
@ -65,7 +65,7 @@ int32_t syncNodeOnRequestVoteReplyCb(SSyncNode* ths, SyncRequestVoteReply* pMsg)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(pMsg->term == ths->pRaftStore->currentTerm);
|
ASSERT(pMsg->term == ths->pRaftStore->currentTerm);
|
||||||
|
|
||||||
// This tallies votes even when the current state is not Candidate,
|
// This tallies votes even when the current state is not Candidate,
|
||||||
// but they won't be looked at, so it doesn't matter.
|
// but they won't be looked at, so it doesn't matter.
|
||||||
|
@ -115,7 +115,7 @@ int32_t syncNodeOnRequestVoteReplySnapshotCb(SSyncNode* ths, SyncRequestVoteRepl
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// assert(!(pMsg->term > ths->pRaftStore->currentTerm));
|
// ASSERT(!(pMsg->term > ths->pRaftStore->currentTerm));
|
||||||
// no need this code, because if I receive reply.term, then I must have sent for that term.
|
// no need this code, because if I receive reply.term, then I must have sent for that term.
|
||||||
// if (pMsg->term > ths->pRaftStore->currentTerm) {
|
// if (pMsg->term > ths->pRaftStore->currentTerm) {
|
||||||
// syncNodeUpdateTerm(ths, pMsg->term);
|
// syncNodeUpdateTerm(ths, pMsg->term);
|
||||||
|
|
|
@ -22,7 +22,7 @@ SSyncRespMgr *syncRespMgrCreate(void *data, int64_t ttl) {
|
||||||
|
|
||||||
pObj->pRespHash =
|
pObj->pRespHash =
|
||||||
taosHashInit(sizeof(uint64_t), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
taosHashInit(sizeof(uint64_t), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
||||||
assert(pObj->pRespHash != NULL);
|
ASSERT(pObj->pRespHash != NULL);
|
||||||
pObj->ttl = ttl;
|
pObj->ttl = ttl;
|
||||||
pObj->data = data;
|
pObj->data = data;
|
||||||
pObj->seqNum = 0;
|
pObj->seqNum = 0;
|
||||||
|
|
|
@ -73,41 +73,49 @@ void snapshotSenderStart(SSyncSnapshotSender *pSender, SSnapshot snapshot, void
|
||||||
pSender->seq = SYNC_SNAPSHOT_SEQ_BEGIN;
|
pSender->seq = SYNC_SNAPSHOT_SEQ_BEGIN;
|
||||||
pSender->ack = SYNC_SNAPSHOT_SEQ_INVALID;
|
pSender->ack = SYNC_SNAPSHOT_SEQ_INVALID;
|
||||||
|
|
||||||
// open snapshot reader
|
// init snapshot and reader
|
||||||
ASSERT(pSender->pReader == NULL);
|
ASSERT(pSender->pReader == NULL);
|
||||||
pSender->pReader = pReader;
|
pSender->pReader = pReader;
|
||||||
pSender->snapshot = snapshot;
|
pSender->snapshot = snapshot;
|
||||||
|
|
||||||
/*
|
|
||||||
// open snapshot reader
|
|
||||||
ASSERT(pSender->pReader == NULL);
|
|
||||||
int32_t ret = pSender->pSyncNode->pFsm->FpSnapshotStartRead(pSender->pSyncNode->pFsm, &(pSender->pReader));
|
|
||||||
ASSERT(ret == 0);
|
|
||||||
|
|
||||||
// get current snapshot info
|
|
||||||
pSender->pSyncNode->pFsm->FpGetSnapshotInfo(pSender->pSyncNode->pFsm, &(pSender->snapshot));
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (pSender->pCurrentBlock != NULL) {
|
if (pSender->pCurrentBlock != NULL) {
|
||||||
taosMemoryFree(pSender->pCurrentBlock);
|
taosMemoryFree(pSender->pCurrentBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
pSender->blockLen = 0;
|
pSender->blockLen = 0;
|
||||||
|
|
||||||
if (pSender->snapshot.lastConfigIndex != SYNC_INDEX_INVALID) {
|
if (pSender->snapshot.lastConfigIndex != SYNC_INDEX_INVALID) {
|
||||||
SSyncRaftEntry *pEntry =
|
int32_t code = 0;
|
||||||
pSender->pSyncNode->pLogStore->getEntry(pSender->pSyncNode->pLogStore, pSender->snapshot.lastConfigIndex);
|
SSyncRaftEntry *pEntry = NULL;
|
||||||
ASSERT(pEntry != NULL);
|
code = pSender->pSyncNode->pLogStore->syncLogGetEntry(pSender->pSyncNode->pLogStore,
|
||||||
|
pSender->snapshot.lastConfigIndex, &pEntry);
|
||||||
|
|
||||||
SRpcMsg rpcMsg;
|
bool getLastConfig = false;
|
||||||
syncEntry2OriginalRpc(pEntry, &rpcMsg);
|
if (code == 0) {
|
||||||
SSyncCfg lastConfig;
|
ASSERT(pEntry != NULL);
|
||||||
int32_t ret = syncCfgFromStr(rpcMsg.pCont, &lastConfig);
|
|
||||||
ASSERT(ret == 0);
|
|
||||||
pSender->lastConfig = lastConfig;
|
|
||||||
|
|
||||||
rpcFreeCont(rpcMsg.pCont);
|
SRpcMsg rpcMsg;
|
||||||
syncEntryDestory(pEntry);
|
syncEntry2OriginalRpc(pEntry, &rpcMsg);
|
||||||
|
|
||||||
|
SSyncCfg lastConfig;
|
||||||
|
int32_t ret = syncCfgFromStr(rpcMsg.pCont, &lastConfig);
|
||||||
|
ASSERT(ret == 0);
|
||||||
|
pSender->lastConfig = lastConfig;
|
||||||
|
getLastConfig = true;
|
||||||
|
|
||||||
|
rpcFreeCont(rpcMsg.pCont);
|
||||||
|
syncEntryDestory(pEntry);
|
||||||
|
} else {
|
||||||
|
if (pSender->snapshot.lastConfigIndex == pSender->pSyncNode->pRaftCfg->lastConfigIndex) {
|
||||||
|
sTrace("vgId:%d sync sender get cfg from local", pSender->pSyncNode->vgId);
|
||||||
|
pSender->lastConfig = pSender->pSyncNode->pRaftCfg->cfg;
|
||||||
|
getLastConfig = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!getLastConfig) {
|
||||||
|
syncNodeLog3("", pSender->pSyncNode);
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
memset(&(pSender->lastConfig), 0, sizeof(SSyncCfg));
|
memset(&(pSender->lastConfig), 0, sizeof(SSyncCfg));
|
||||||
|
|
|
@ -86,7 +86,7 @@ void syncUtilraftId2EpSet(const SRaftId* raftId, SEpSet* pEpSet) {
|
||||||
|
|
||||||
void syncUtilnodeInfo2raftId(const SNodeInfo* pNodeInfo, SyncGroupId vgId, SRaftId* raftId) {
|
void syncUtilnodeInfo2raftId(const SNodeInfo* pNodeInfo, SyncGroupId vgId, SRaftId* raftId) {
|
||||||
uint32_t ipv4 = taosGetIpv4FromFqdn(pNodeInfo->nodeFqdn);
|
uint32_t ipv4 = taosGetIpv4FromFqdn(pNodeInfo->nodeFqdn);
|
||||||
assert(ipv4 != 0xFFFFFFFF);
|
ASSERT(ipv4 != 0xFFFFFFFF);
|
||||||
char ipbuf[128] = {0};
|
char ipbuf[128] = {0};
|
||||||
tinet_ntoa(ipbuf, ipv4);
|
tinet_ntoa(ipbuf, ipv4);
|
||||||
raftId->addr = syncUtilAddr2U64(ipbuf, pNodeInfo->nodePort);
|
raftId->addr = syncUtilAddr2U64(ipbuf, pNodeInfo->nodePort);
|
||||||
|
@ -124,7 +124,7 @@ void syncUtilbufCopyDeep(const SSyncBuffer* src, SSyncBuffer* dest) {
|
||||||
int32_t syncUtilRand(int32_t max) { return taosRand() % max; }
|
int32_t syncUtilRand(int32_t max) { return taosRand() % max; }
|
||||||
|
|
||||||
int32_t syncUtilElectRandomMS(int32_t min, int32_t max) {
|
int32_t syncUtilElectRandomMS(int32_t min, int32_t max) {
|
||||||
assert(min > 0 && max > 0 && max >= min);
|
ASSERT(min > 0 && max > 0 && max >= min);
|
||||||
return min + syncUtilRand(max - min);
|
return min + syncUtilRand(max - min);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,7 +201,7 @@ bool syncUtilCanPrint(char c) {
|
||||||
|
|
||||||
char* syncUtilprintBin(char* ptr, uint32_t len) {
|
char* syncUtilprintBin(char* ptr, uint32_t len) {
|
||||||
char* s = taosMemoryMalloc(len + 1);
|
char* s = taosMemoryMalloc(len + 1);
|
||||||
assert(s != NULL);
|
ASSERT(s != NULL);
|
||||||
memset(s, 0, len + 1);
|
memset(s, 0, len + 1);
|
||||||
memcpy(s, ptr, len);
|
memcpy(s, ptr, len);
|
||||||
|
|
||||||
|
@ -216,7 +216,7 @@ char* syncUtilprintBin(char* ptr, uint32_t len) {
|
||||||
char* syncUtilprintBin2(char* ptr, uint32_t len) {
|
char* syncUtilprintBin2(char* ptr, uint32_t len) {
|
||||||
uint32_t len2 = len * 4 + 1;
|
uint32_t len2 = len * 4 + 1;
|
||||||
char* s = taosMemoryMalloc(len2);
|
char* s = taosMemoryMalloc(len2);
|
||||||
assert(s != NULL);
|
ASSERT(s != NULL);
|
||||||
memset(s, 0, len2);
|
memset(s, 0, len2);
|
||||||
|
|
||||||
char* p = s;
|
char* p = s;
|
||||||
|
|
|
@ -24,7 +24,7 @@ static void voteGrantedClearVotes(SVotesGranted *pVotesGranted) {
|
||||||
|
|
||||||
SVotesGranted *voteGrantedCreate(SSyncNode *pSyncNode) {
|
SVotesGranted *voteGrantedCreate(SSyncNode *pSyncNode) {
|
||||||
SVotesGranted *pVotesGranted = taosMemoryMalloc(sizeof(SVotesGranted));
|
SVotesGranted *pVotesGranted = taosMemoryMalloc(sizeof(SVotesGranted));
|
||||||
assert(pVotesGranted != NULL);
|
ASSERT(pVotesGranted != NULL);
|
||||||
memset(pVotesGranted, 0, sizeof(SVotesGranted));
|
memset(pVotesGranted, 0, sizeof(SVotesGranted));
|
||||||
|
|
||||||
pVotesGranted->replicas = &(pSyncNode->replicasId);
|
pVotesGranted->replicas = &(pSyncNode->replicasId);
|
||||||
|
@ -62,9 +62,9 @@ bool voteGrantedMajority(SVotesGranted *pVotesGranted) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void voteGrantedVote(SVotesGranted *pVotesGranted, SyncRequestVoteReply *pMsg) {
|
void voteGrantedVote(SVotesGranted *pVotesGranted, SyncRequestVoteReply *pMsg) {
|
||||||
assert(pMsg->voteGranted == true);
|
ASSERT(pMsg->voteGranted == true);
|
||||||
assert(pMsg->term == pVotesGranted->term);
|
ASSERT(pMsg->term == pVotesGranted->term);
|
||||||
assert(syncUtilSameId(&pVotesGranted->pSyncNode->myRaftId, &pMsg->destId));
|
ASSERT(syncUtilSameId(&pVotesGranted->pSyncNode->myRaftId, &pMsg->destId));
|
||||||
|
|
||||||
int j = -1;
|
int j = -1;
|
||||||
for (int i = 0; i < pVotesGranted->replicaNum; ++i) {
|
for (int i = 0; i < pVotesGranted->replicaNum; ++i) {
|
||||||
|
@ -73,14 +73,14 @@ void voteGrantedVote(SVotesGranted *pVotesGranted, SyncRequestVoteReply *pMsg) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(j != -1);
|
ASSERT(j != -1);
|
||||||
assert(j >= 0 && j < pVotesGranted->replicaNum);
|
ASSERT(j >= 0 && j < pVotesGranted->replicaNum);
|
||||||
|
|
||||||
if (pVotesGranted->isGranted[j] != true) {
|
if (pVotesGranted->isGranted[j] != true) {
|
||||||
++(pVotesGranted->votes);
|
++(pVotesGranted->votes);
|
||||||
pVotesGranted->isGranted[j] = true;
|
pVotesGranted->isGranted[j] = true;
|
||||||
}
|
}
|
||||||
assert(pVotesGranted->votes <= pVotesGranted->replicaNum);
|
ASSERT(pVotesGranted->votes <= pVotesGranted->replicaNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
void voteGrantedReset(SVotesGranted *pVotesGranted, SyncTerm term) {
|
void voteGrantedReset(SVotesGranted *pVotesGranted, SyncTerm term) {
|
||||||
|
@ -127,7 +127,7 @@ cJSON *voteGranted2Json(SVotesGranted *pVotesGranted) {
|
||||||
|
|
||||||
char *voteGranted2Str(SVotesGranted *pVotesGranted) {
|
char *voteGranted2Str(SVotesGranted *pVotesGranted) {
|
||||||
cJSON *pJson = voteGranted2Json(pVotesGranted);
|
cJSON *pJson = voteGranted2Json(pVotesGranted);
|
||||||
char * serialized = cJSON_Print(pJson);
|
char *serialized = cJSON_Print(pJson);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
return serialized;
|
return serialized;
|
||||||
}
|
}
|
||||||
|
@ -162,7 +162,7 @@ void voteGrantedLog2(char *s, SVotesGranted *pObj) {
|
||||||
// SVotesRespond -----------------------------
|
// SVotesRespond -----------------------------
|
||||||
SVotesRespond *votesRespondCreate(SSyncNode *pSyncNode) {
|
SVotesRespond *votesRespondCreate(SSyncNode *pSyncNode) {
|
||||||
SVotesRespond *pVotesRespond = taosMemoryMalloc(sizeof(SVotesRespond));
|
SVotesRespond *pVotesRespond = taosMemoryMalloc(sizeof(SVotesRespond));
|
||||||
assert(pVotesRespond != NULL);
|
ASSERT(pVotesRespond != NULL);
|
||||||
memset(pVotesRespond, 0, sizeof(SVotesRespond));
|
memset(pVotesRespond, 0, sizeof(SVotesRespond));
|
||||||
|
|
||||||
pVotesRespond->replicas = &(pSyncNode->replicasId);
|
pVotesRespond->replicas = &(pSyncNode->replicasId);
|
||||||
|
@ -198,15 +198,15 @@ bool votesResponded(SVotesRespond *pVotesRespond, const SRaftId *pRaftId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void votesRespondAdd(SVotesRespond *pVotesRespond, const SyncRequestVoteReply *pMsg) {
|
void votesRespondAdd(SVotesRespond *pVotesRespond, const SyncRequestVoteReply *pMsg) {
|
||||||
assert(pVotesRespond->term == pMsg->term);
|
ASSERT(pVotesRespond->term == pMsg->term);
|
||||||
for (int i = 0; i < pVotesRespond->replicaNum; ++i) {
|
for (int i = 0; i < pVotesRespond->replicaNum; ++i) {
|
||||||
if (syncUtilSameId(&((*(pVotesRespond->replicas))[i]), &pMsg->srcId)) {
|
if (syncUtilSameId(&((*(pVotesRespond->replicas))[i]), &pMsg->srcId)) {
|
||||||
// assert(pVotesRespond->isRespond[i] == false);
|
// ASSERT(pVotesRespond->isRespond[i] == false);
|
||||||
pVotesRespond->isRespond[i] = true;
|
pVotesRespond->isRespond[i] = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void votesRespondReset(SVotesRespond *pVotesRespond, SyncTerm term) {
|
void votesRespondReset(SVotesRespond *pVotesRespond, SyncTerm term) {
|
||||||
|
@ -256,7 +256,7 @@ cJSON *votesRespond2Json(SVotesRespond *pVotesRespond) {
|
||||||
|
|
||||||
char *votesRespond2Str(SVotesRespond *pVotesRespond) {
|
char *votesRespond2Str(SVotesRespond *pVotesRespond) {
|
||||||
cJSON *pJson = votesRespond2Json(pVotesRespond);
|
cJSON *pJson = votesRespond2Json(pVotesRespond);
|
||||||
char * serialized = cJSON_Print(pJson);
|
char *serialized = cJSON_Print(pJson);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
return serialized;
|
return serialized;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ add_executable(syncWriteTest "")
|
||||||
add_executable(syncReplicateTest "")
|
add_executable(syncReplicateTest "")
|
||||||
add_executable(syncRefTest "")
|
add_executable(syncRefTest "")
|
||||||
add_executable(syncLogStoreCheck "")
|
add_executable(syncLogStoreCheck "")
|
||||||
|
add_executable(syncLogStoreCheck2 "")
|
||||||
add_executable(syncRaftCfgTest "")
|
add_executable(syncRaftCfgTest "")
|
||||||
add_executable(syncRespMgrTest "")
|
add_executable(syncRespMgrTest "")
|
||||||
add_executable(syncSnapshotTest "")
|
add_executable(syncSnapshotTest "")
|
||||||
|
@ -196,6 +197,10 @@ target_sources(syncLogStoreCheck
|
||||||
PRIVATE
|
PRIVATE
|
||||||
"syncLogStoreCheck.cpp"
|
"syncLogStoreCheck.cpp"
|
||||||
)
|
)
|
||||||
|
target_sources(syncLogStoreCheck2
|
||||||
|
PRIVATE
|
||||||
|
"syncLogStoreCheck2.cpp"
|
||||||
|
)
|
||||||
target_sources(syncRaftCfgTest
|
target_sources(syncRaftCfgTest
|
||||||
PRIVATE
|
PRIVATE
|
||||||
"syncRaftCfgTest.cpp"
|
"syncRaftCfgTest.cpp"
|
||||||
|
@ -442,6 +447,11 @@ target_include_directories(syncLogStoreCheck
|
||||||
"${TD_SOURCE_DIR}/include/libs/sync"
|
"${TD_SOURCE_DIR}/include/libs/sync"
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||||
)
|
)
|
||||||
|
target_include_directories(syncLogStoreCheck2
|
||||||
|
PUBLIC
|
||||||
|
"${TD_SOURCE_DIR}/include/libs/sync"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||||
|
)
|
||||||
target_include_directories(syncRaftCfgTest
|
target_include_directories(syncRaftCfgTest
|
||||||
PUBLIC
|
PUBLIC
|
||||||
"${TD_SOURCE_DIR}/include/libs/sync"
|
"${TD_SOURCE_DIR}/include/libs/sync"
|
||||||
|
@ -668,6 +678,10 @@ target_link_libraries(syncLogStoreCheck
|
||||||
sync
|
sync
|
||||||
gtest_main
|
gtest_main
|
||||||
)
|
)
|
||||||
|
target_link_libraries(syncLogStoreCheck2
|
||||||
|
sync
|
||||||
|
gtest_main
|
||||||
|
)
|
||||||
target_link_libraries(syncRaftCfgTest
|
target_link_libraries(syncRaftCfgTest
|
||||||
sync
|
sync
|
||||||
gtest_main
|
gtest_main
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "syncEnv.h"
|
||||||
|
#include "syncIO.h"
|
||||||
|
#include "syncInt.h"
|
||||||
|
#include "syncRaftLog.h"
|
||||||
|
#include "syncRaftStore.h"
|
||||||
|
#include "syncUtil.h"
|
||||||
|
#include "wal.h"
|
||||||
|
|
||||||
|
void logTest() {
|
||||||
|
sTrace("--- sync log test: trace");
|
||||||
|
sDebug("--- sync log test: debug");
|
||||||
|
sInfo("--- sync log test: info");
|
||||||
|
sWarn("--- sync log test: warn");
|
||||||
|
sError("--- sync log test: error");
|
||||||
|
sFatal("--- sync log test: fatal");
|
||||||
|
}
|
||||||
|
|
||||||
|
void init() {
|
||||||
|
int code = walInit();
|
||||||
|
assert(code == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanup() { walCleanUp(); }
|
||||||
|
|
||||||
|
SWal* createWal(char* path, int32_t vgId) {
|
||||||
|
SWalCfg walCfg;
|
||||||
|
memset(&walCfg, 0, sizeof(SWalCfg));
|
||||||
|
walCfg.vgId = vgId;
|
||||||
|
walCfg.fsyncPeriod = 1000;
|
||||||
|
walCfg.retentionPeriod = 1000;
|
||||||
|
walCfg.rollPeriod = 1000;
|
||||||
|
walCfg.retentionSize = 1000;
|
||||||
|
walCfg.segSize = 1000;
|
||||||
|
walCfg.level = TAOS_WAL_FSYNC;
|
||||||
|
SWal* pWal = walOpen(path, &walCfg);
|
||||||
|
assert(pWal != NULL);
|
||||||
|
return pWal;
|
||||||
|
}
|
||||||
|
|
||||||
|
SSyncNode* createSyncNode(SWal* pWal) {
|
||||||
|
SSyncNode* pSyncNode = (SSyncNode*)taosMemoryMalloc(sizeof(SSyncNode));
|
||||||
|
memset(pSyncNode, 0, sizeof(SSyncNode));
|
||||||
|
pSyncNode->pWal = pWal;
|
||||||
|
return pSyncNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void usage(char* exe) { printf("usage: %s path vgId \n", exe); }
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
if (argc != 3) {
|
||||||
|
usage(argv[0]);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
char* path = argv[1];
|
||||||
|
int32_t vgId = atoi(argv[2]);
|
||||||
|
|
||||||
|
init();
|
||||||
|
SWal* pWal = createWal(path, vgId);
|
||||||
|
assert(pWal != NULL);
|
||||||
|
SSyncNode* pSyncNode = createSyncNode(pWal);
|
||||||
|
assert(pSyncNode != NULL);
|
||||||
|
|
||||||
|
SSyncLogStore* pLog = logStoreCreate(pSyncNode);
|
||||||
|
assert(pLog != NULL);
|
||||||
|
|
||||||
|
logStorePrint2((char*)"==syncLogStoreCheck==", pLog);
|
||||||
|
|
||||||
|
walClose(pWal);
|
||||||
|
logStoreDestory(pLog);
|
||||||
|
taosMemoryFree(pSyncNode);
|
||||||
|
|
||||||
|
cleanup();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -69,6 +69,7 @@ void test1() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest1 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest1 ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -88,6 +89,7 @@ void test1() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest1 restart ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest1 restart ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -110,6 +112,7 @@ void test2() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
||||||
logStoreLog2((char*)"\n\n\ntest2 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest2 ----- ", pLogStore);
|
||||||
|
|
||||||
|
@ -130,6 +133,7 @@ void test2() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest2 restart ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest2 restart ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -152,6 +156,7 @@ void test3() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest3 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest3 ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -198,6 +203,7 @@ void test3() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest3 restart ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest3 restart ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -220,6 +226,7 @@ void test4() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest4 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest4 ----- ", pLogStore);
|
||||||
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
||||||
|
|
||||||
|
@ -257,6 +264,7 @@ void test4() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest4 restart ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest4 restart ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -279,6 +287,7 @@ void test5() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest5 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest5 ----- ", pLogStore);
|
||||||
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
||||||
|
|
||||||
|
@ -329,6 +338,7 @@ void test5() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest5 restart ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest5 restart ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -351,6 +361,7 @@ void test6() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest6 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest6 ----- ", pLogStore);
|
||||||
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
||||||
|
|
||||||
|
@ -401,6 +412,7 @@ void test6() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest6 restart ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest6 restart ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
|
|
@ -24,16 +24,16 @@ extern "C" {
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
#include "ttrace.h"
|
#include "ttrace.h"
|
||||||
|
|
||||||
#define tFatal(...) do {if (rpcDebugFlag & DEBUG_FATAL){ taosPrintLog("RPC FATAL ", DEBUG_FATAL, rpcDebugFlag, __VA_ARGS__); }} while (0)
|
#define tFatal(...) { if (rpcDebugFlag & DEBUG_FATAL) { taosPrintLog("RPC FATAL ", DEBUG_FATAL, rpcDebugFlag, __VA_ARGS__); }}
|
||||||
#define tError(...)do { if (rpcDebugFlag & DEBUG_ERROR){ taosPrintLog("RPC ERROR ", DEBUG_ERROR, rpcDebugFlag, __VA_ARGS__); } } while(0)
|
#define tError(...) { if (rpcDebugFlag & DEBUG_ERROR ){ taosPrintLog("RPC ERROR ", DEBUG_ERROR, rpcDebugFlag, __VA_ARGS__); }}
|
||||||
#define tWarn(...) do { if (rpcDebugFlag & DEBUG_WARN) { taosPrintLog("RPC WARN ", DEBUG_WARN, rpcDebugFlag, __VA_ARGS__); }} while(0)
|
#define tWarn(...) { if (rpcDebugFlag & DEBUG_WARN) { taosPrintLog("RPC WARN ", DEBUG_WARN, rpcDebugFlag, __VA_ARGS__); }}
|
||||||
#define tInfo(...) do { if (rpcDebugFlag & DEBUG_INFO) { taosPrintLog("RPC ", DEBUG_INFO, rpcDebugFlag, __VA_ARGS__); }} while(0)
|
#define tInfo(...) { if (rpcDebugFlag & DEBUG_INFO) { taosPrintLog("RPC ", DEBUG_INFO, rpcDebugFlag, __VA_ARGS__); }}
|
||||||
#define tDebug(...) do {if (rpcDebugFlag & DEBUG_DEBUG){ taosPrintLog("RPC ", DEBUG_DEBUG, rpcDebugFlag, __VA_ARGS__); }} while(0)
|
#define tDebug(...) { if (rpcDebugFlag & DEBUG_DEBUG) { taosPrintLog("RPC ", DEBUG_DEBUG, rpcDebugFlag, __VA_ARGS__); }}
|
||||||
#define tTrace(...) do {if (rpcDebugFlag & DEBUG_TRACE){ taosPrintLog("RPC ", DEBUG_TRACE, rpcDebugFlag, __VA_ARGS__); }} while(0)
|
#define tTrace(...) { if (rpcDebugFlag & DEBUG_TRACE) { taosPrintLog("RPC ", DEBUG_TRACE, rpcDebugFlag, __VA_ARGS__); }}
|
||||||
#define tDump(x, y) do {if (rpcDebugFlag & DEBUG_DUMP) { taosDumpData((unsigned char *)x, y); } } while(0)
|
#define tDump(x, y) { if (rpcDebugFlag & DEBUG_DUMP) { taosDumpData((unsigned char *)x, y); } }
|
||||||
|
|
||||||
//#define tTR(param, ...) do { char buf[40] = {0};TRACE_TO_STR(trace, buf);tTrace("TRID: %s "param, buf, __VA_ARGS__);} while(0)
|
//#define tTR(param, ...) do { char buf[40] = {0};TRACE_TO_STR(trace, buf);tTrace("TRID: %s "param, buf, __VA_ARGS__);} while(0)
|
||||||
#define tGTrace(param, ...) do { char buf[40] = {0}; TRACE_TO_STR(trace, buf); tTrace(param ", GTID: %s", __VA_ARGS__, buf);} while(0)
|
#define tGTrace(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); tTrace(param ", gtid:%s", __VA_ARGS__, buf);}
|
||||||
|
|
||||||
// clang-format on
|
// clang-format on
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -259,6 +259,12 @@ int32_t walReadWithHandle_s(SWalReadHandle *pRead, int64_t ver, SWalReadHead **p
|
||||||
|
|
||||||
int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver) {
|
int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver) {
|
||||||
int64_t code;
|
int64_t code;
|
||||||
|
|
||||||
|
if (pRead->pWal->vers.firstVer == -1) {
|
||||||
|
terrno = TSDB_CODE_WAL_LOG_NOT_EXIST;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: check wal life
|
// TODO: check wal life
|
||||||
if (pRead->curVersion != ver) {
|
if (pRead->curVersion != ver) {
|
||||||
if (walReadSeekVer(pRead, ver) < 0) {
|
if (walReadSeekVer(pRead, ver) < 0) {
|
||||||
|
|
|
@ -31,12 +31,12 @@
|
||||||
#define GET_HASH_NODE_DATA(_n) ((char *)(_n) + sizeof(SHashNode))
|
#define GET_HASH_NODE_DATA(_n) ((char *)(_n) + sizeof(SHashNode))
|
||||||
#define GET_HASH_PNODE(_n) ((SHashNode *)((char *)(_n) - sizeof(SHashNode)))
|
#define GET_HASH_PNODE(_n) ((SHashNode *)((char *)(_n) - sizeof(SHashNode)))
|
||||||
|
|
||||||
#define FREE_HASH_NODE(_fp, _n) \
|
#define FREE_HASH_NODE(_fp, _n) \
|
||||||
do { \
|
do { \
|
||||||
if (_fp != NULL) { \
|
if (_fp != NULL) { \
|
||||||
(_fp)(_n); \
|
(_fp)(GET_HASH_NODE_DATA(_n)); \
|
||||||
} \
|
} \
|
||||||
taosMemoryFreeClear(_n); \
|
taosMemoryFreeClear(_n); \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
struct SHashNode {
|
struct SHashNode {
|
||||||
|
@ -56,7 +56,7 @@ typedef struct SHashEntry {
|
||||||
} SHashEntry;
|
} SHashEntry;
|
||||||
|
|
||||||
struct SHashObj {
|
struct SHashObj {
|
||||||
SHashEntry ** hashList;
|
SHashEntry **hashList;
|
||||||
size_t capacity; // number of slots
|
size_t capacity; // number of slots
|
||||||
int64_t size; // number of elements in hash table
|
int64_t size; // number of elements in hash table
|
||||||
_hash_fn_t hashFp; // hash function
|
_hash_fn_t hashFp; // hash function
|
||||||
|
@ -65,7 +65,7 @@ struct SHashObj {
|
||||||
SRWLatch lock; // read-write spin lock
|
SRWLatch lock; // read-write spin lock
|
||||||
SHashLockTypeE type; // lock type
|
SHashLockTypeE type; // lock type
|
||||||
bool enableUpdate; // enable update
|
bool enableUpdate; // enable update
|
||||||
SArray * pMemBlock; // memory block allocated for SHashEntry
|
SArray *pMemBlock; // memory block allocated for SHashEntry
|
||||||
_hash_before_fn_t callbackFp; // function invoked before return the value to caller
|
_hash_before_fn_t callbackFp; // function invoked before return the value to caller
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -633,7 +633,7 @@ void taosHashTableResize(SHashObj *pHashObj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t st = taosGetTimestampUs();
|
int64_t st = taosGetTimestampUs();
|
||||||
void * pNewEntryList = taosMemoryRealloc(pHashObj->hashList, sizeof(void *) * newCapacity);
|
void *pNewEntryList = taosMemoryRealloc(pHashObj->hashList, sizeof(void *) * newCapacity);
|
||||||
if (pNewEntryList == NULL) {
|
if (pNewEntryList == NULL) {
|
||||||
// uDebug("cache resize failed due to out of memory, capacity remain:%zu", pHashObj->capacity);
|
// uDebug("cache resize failed due to out of memory, capacity remain:%zu", pHashObj->capacity);
|
||||||
return;
|
return;
|
||||||
|
@ -642,7 +642,7 @@ void taosHashTableResize(SHashObj *pHashObj) {
|
||||||
pHashObj->hashList = pNewEntryList;
|
pHashObj->hashList = pNewEntryList;
|
||||||
|
|
||||||
size_t inc = newCapacity - pHashObj->capacity;
|
size_t inc = newCapacity - pHashObj->capacity;
|
||||||
void * p = taosMemoryCalloc(inc, sizeof(SHashEntry));
|
void *p = taosMemoryCalloc(inc, sizeof(SHashEntry));
|
||||||
|
|
||||||
for (int32_t i = 0; i < inc; ++i) {
|
for (int32_t i = 0; i < inc; ++i) {
|
||||||
pHashObj->hashList[i + pHashObj->capacity] = (void *)((char *)p + i * sizeof(SHashEntry));
|
pHashObj->hashList[i + pHashObj->capacity] = (void *)((char *)p + i * sizeof(SHashEntry));
|
||||||
|
@ -653,9 +653,9 @@ void taosHashTableResize(SHashObj *pHashObj) {
|
||||||
pHashObj->capacity = newCapacity;
|
pHashObj->capacity = newCapacity;
|
||||||
for (int32_t idx = 0; idx < pHashObj->capacity; ++idx) {
|
for (int32_t idx = 0; idx < pHashObj->capacity; ++idx) {
|
||||||
SHashEntry *pe = pHashObj->hashList[idx];
|
SHashEntry *pe = pHashObj->hashList[idx];
|
||||||
SHashNode * pNode;
|
SHashNode *pNode;
|
||||||
SHashNode * pNext;
|
SHashNode *pNext;
|
||||||
SHashNode * pPrev = NULL;
|
SHashNode *pPrev = NULL;
|
||||||
|
|
||||||
if (pe->num == 0) {
|
if (pe->num == 0) {
|
||||||
assert(pe->next == NULL);
|
assert(pe->next == NULL);
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
###################################################################
|
||||||
|
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This file is proprietary and confidential to TAOS Technologies.
|
||||||
|
# No part of this file may be reproduced, stored, transmitted,
|
||||||
|
# disclosed or used in any form or by any means other than as
|
||||||
|
# expressly provided by the written permission from Jianhui Tao
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from util.sql import tdSql
|
||||||
|
|
||||||
|
class TDSetSql:
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdSql.init(conn.cursor(), logSql)
|
||||||
|
self.stbname = 'stb'
|
||||||
|
|
||||||
|
def set_create_normaltable_sql(self, ntbname='ntb',
|
||||||
|
column_dict={'ts':'timestamp','col1':'tinyint','col2':'smallint','col3':'int','col4':'bigint','col5': 'unsigned int','col6': 'unsigned tinyint','col7': 'unsigned smallint',
|
||||||
|
'col8': 'unsigned int','col9': 'unsigned bigint','col10': 'float','col11': 'double','col12': 'bool','col13': 'binary(20)','col14': 'nchar(20)'}):
|
||||||
|
column_sql = ''
|
||||||
|
for k, v in column_dict.items():
|
||||||
|
column_sql += f"{k} {v},"
|
||||||
|
create_ntb_sql = f'create table {ntbname} ({column_sql[:-1]})'
|
||||||
|
return create_ntb_sql
|
||||||
|
|
||||||
|
def set_create_stable_sql(self,stbname='stb',
|
||||||
|
column_dict={'ts':'timestamp','col1':'tinyint','col2':'smallint','col3':'int','col4':'bigint','col5': 'unsigned int','col6': 'unsigned tinyint','col7': 'unsigned smallint',
|
||||||
|
'col8': 'unsigned int','col9': 'unsigned bigint','col10': 'float','col11': 'double','col12': 'bool','col13': 'binary(20)','col14': 'nchar(20)'},
|
||||||
|
tag_dict={'ts_tag':'timestamp','t1':'tinyint','t2':'smallint','t3':'int','t4':'bigint','t5': 'unsigned int','t6': 'unsigned tinyint','t7': 'unsigned smallint',
|
||||||
|
't8': 'unsigned int','t9': 'unsigned bigint','t10': 'float','t11': 'double','t12': 'bool','t13': 'binary(20)','t14': 'nchar(20)'}):
|
||||||
|
column_sql = ''
|
||||||
|
tag_sql = ''
|
||||||
|
for k,v in column_dict.items():
|
||||||
|
column_sql += f"{k} {v},"
|
||||||
|
for k,v in tag_dict.items():
|
||||||
|
tag_sql += f"{k} {v},"
|
||||||
|
create_stb_sql = f'create table {stbname} ({column_sql[:-1]}) tags({tag_sql[:-1]})'
|
||||||
|
return create_stb_sql
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,103 +11,159 @@
|
||||||
|
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
import random
|
|
||||||
import string
|
import string
|
||||||
from util.common import *
|
from util.common import *
|
||||||
from util.log import *
|
from util.log import *
|
||||||
from util.cases import *
|
from util.cases import *
|
||||||
from util.sql import *
|
from util.sql import *
|
||||||
|
from util.sqlset import *
|
||||||
|
|
||||||
class TDTestCase:
|
class TDTestCase:
|
||||||
def init(self, conn, logSql):
|
def init(self, conn, logSql):
|
||||||
tdLog.debug("start to execute %s" % __file__)
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
tdSql.init(conn.cursor())
|
tdSql.init(conn.cursor())
|
||||||
|
self.setsql = TDSetSql()
|
||||||
|
self.ntbname = 'ntb'
|
||||||
self.rowNum = 10
|
self.rowNum = 10
|
||||||
self.tbnum = 20
|
self.tbnum = 20
|
||||||
self.ts = 1537146000000
|
self.ts = 1537146000000
|
||||||
self.binary_str = 'taosdata'
|
self.binary_str = 'taosdata'
|
||||||
self.nchar_str = '涛思数据'
|
self.nchar_str = '涛思数据'
|
||||||
def top_check_base(self):
|
self.column_dict = {
|
||||||
tdSql.prepare()
|
'ts' : 'timestamp',
|
||||||
tdSql.execute('''create table stb(ts timestamp, col1 tinyint, col2 smallint, col3 int, col4 bigint, col5 tinyint unsigned, col6 smallint unsigned,
|
'col1': 'tinyint',
|
||||||
col7 int unsigned, col8 bigint unsigned, col9 float, col10 double, col11 bool, col12 binary(20), col13 nchar(20)) tags(loc nchar(20))''')
|
'col2': 'smallint',
|
||||||
tdSql.execute("create table stb_1 using stb tags('beijing')")
|
'col3': 'int',
|
||||||
for i in range(self.rowNum):
|
'col4': 'bigint',
|
||||||
tdSql.execute(f"insert into stb_1 values(%d, %d, %d, %d, %d, %d, %d, %d, %d, %f, %f, %d, '{self.binary_str}%d', '{self.nchar_str}%d')"
|
'col5': 'tinyint unsigned',
|
||||||
% (self.ts + i, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1))
|
'col6': 'smallint unsigned',
|
||||||
column_list = ['col1','col2','col3','col4','col5','col6','col7','col8']
|
'col7': 'int unsigned',
|
||||||
error_column_list = ['col11','col12','col13']
|
'col8': 'bigint unsigned',
|
||||||
error_param_list = [0,101]
|
'col9': 'float',
|
||||||
for i in column_list:
|
'col10': 'double',
|
||||||
tdSql.query(f'select top({i},2) from stb_1')
|
'col11': 'bool',
|
||||||
tdSql.checkRows(2)
|
'col12': 'binary(20)',
|
||||||
tdSql.checkEqual(tdSql.queryResult,[(9,),(10,)])
|
'col13': 'nchar(20)'
|
||||||
for j in error_param_list:
|
}
|
||||||
tdSql.error(f'select top({i},{j}) from stb_1')
|
|
||||||
for i in error_column_list:
|
self.param_list = [1,100]
|
||||||
tdSql.error(f'select top({i},10) from stb_1')
|
|
||||||
tdSql.query("select ts,top(col1, 2),ts from stb_1 group by tbname")
|
def insert_data(self,column_dict,tbname,row_num):
|
||||||
tdSql.checkRows(2)
|
sql = ''
|
||||||
tdSql.query('select top(col2,1) from stb_1 interval(1y) order by col2')
|
for k, v in column_dict.items():
|
||||||
tdSql.checkData(0,0,10)
|
if v.lower() == 'timestamp' or v.lower() == 'tinyint' or v.lower() == 'smallint' or v.lower() == 'int' or v.lower() == 'bigint' or \
|
||||||
tdSql.error("select * from stb_1 where top(col2,1)=1")
|
v.lower() == 'tinyint unsigned' or v.lower() == 'smallint unsigned' or v.lower() == 'int unsigned' or v.lower() == 'bigint unsigned' or v.lower() == 'bool':
|
||||||
tdSql.execute('drop database db')
|
sql += '%d,'
|
||||||
def top_check_stb_distribute(self):
|
elif v.lower() == 'float' or v.lower() == 'double':
|
||||||
# prepare data for vgroup 4
|
sql += '%f,'
|
||||||
|
elif 'binary' in v.lower():
|
||||||
|
sql += f'"{self.binary_str}%d",'
|
||||||
|
elif 'nchar' in v.lower():
|
||||||
|
sql += f'"{self.nchar_str}%d",'
|
||||||
|
insert_sql = f'insert into {tbname} values({sql[:-1]})'
|
||||||
|
for i in range(row_num):
|
||||||
|
insert_list = []
|
||||||
|
for k, v in column_dict.items():
|
||||||
|
if v.lower() in[ 'tinyint' , 'smallint' , 'int', 'bigint' , 'tinyint unsigned' , 'smallint unsigned' , 'int unsigned' , 'bigint unsigned'] or\
|
||||||
|
'binary' in v.lower() or 'nchar' in v.lower():
|
||||||
|
insert_list.append(1 + i)
|
||||||
|
elif v.lower() == 'float' or v.lower() == 'double':
|
||||||
|
insert_list.append(0.1 + i)
|
||||||
|
elif v.lower() == 'bool':
|
||||||
|
insert_list.append(i % 2)
|
||||||
|
elif v.lower() == 'timestamp':
|
||||||
|
insert_list.append(self.ts + i)
|
||||||
|
tdSql.execute(insert_sql%(tuple(insert_list)))
|
||||||
|
pass
|
||||||
|
def top_check_data(self,tbname,tb_type):
|
||||||
|
new_column_dict = {}
|
||||||
|
for param in self.param_list:
|
||||||
|
for k,v in self.column_dict.items():
|
||||||
|
if v.lower() in ['tinyint','smallint','int','bigint','tinyint unsigned','smallint unsigned','int unsigned','bigint unsigned']:
|
||||||
|
tdSql.query(f'select top({k},{param}) from {tbname}')
|
||||||
|
if param >= self.rowNum:
|
||||||
|
if tb_type in ['normal_table','child_table']:
|
||||||
|
tdSql.checkRows(self.rowNum)
|
||||||
|
values_list = []
|
||||||
|
for i in range(self.rowNum):
|
||||||
|
tp = (self.rowNum-i,)
|
||||||
|
values_list.insert(0,tp)
|
||||||
|
tdSql.checkEqual(tdSql.queryResult,values_list)
|
||||||
|
elif tb_type == 'stable':
|
||||||
|
tdSql.checkRows(param)
|
||||||
|
elif param < self.rowNum:
|
||||||
|
if tb_type in ['normal_table','child_table']:
|
||||||
|
tdSql.checkRows(param)
|
||||||
|
values_list = []
|
||||||
|
for i in range(param):
|
||||||
|
tp = (self.rowNum-i,)
|
||||||
|
values_list.insert(0,tp)
|
||||||
|
tdSql.checkEqual(tdSql.queryResult,values_list)
|
||||||
|
elif tb_type == 'stable':
|
||||||
|
tdSql.checkRows(param)
|
||||||
|
for i in [self.param_list[0]-1,self.param_list[-1]+1]:
|
||||||
|
tdSql.error(f'select top({k},{i}) from {tbname}')
|
||||||
|
new_column_dict.update({k:v})
|
||||||
|
elif v.lower() == 'bool' or 'binary' in v.lower() or 'nchar' in v.lower():
|
||||||
|
tdSql.error(f'select top({k},{param}) from {tbname}')
|
||||||
|
tdSql.error(f'select * from {tbname} where top({k},{param})=1')
|
||||||
|
for key in new_column_dict.keys():
|
||||||
|
for k in self.column_dict.keys():
|
||||||
|
if key == k :
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
tdSql.query(f'select top({key},2),{k} from {tbname} group by tbname')
|
||||||
|
if tb_type == 'normal_table' or tb_type == 'child_table':
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
else:
|
||||||
|
tdSql.checkRows(2*self.tbnum)
|
||||||
|
def top_check_stb(self):
|
||||||
dbname = tdCom.getLongName(10, "letters")
|
dbname = tdCom.getLongName(10, "letters")
|
||||||
stbname = tdCom.getLongName(5, "letters")
|
stbname = tdCom.getLongName(5, "letters")
|
||||||
|
tag_dict = {
|
||||||
|
't0':'int'
|
||||||
|
}
|
||||||
|
tag_values = [
|
||||||
|
f'1'
|
||||||
|
]
|
||||||
tdSql.execute(f"create database if not exists {dbname} vgroups 2")
|
tdSql.execute(f"create database if not exists {dbname} vgroups 2")
|
||||||
tdSql.execute(f'use {dbname}')
|
tdSql.execute(f'use {dbname}')
|
||||||
# build 20 child tables,every table insert 10 rows
|
tdSql.execute(self.setsql.set_create_stable_sql(stbname,self.column_dict,tag_dict))
|
||||||
tdSql.execute(f'''create table {stbname}(ts timestamp, col1 tinyint, col2 smallint, col3 int, col4 bigint, col5 tinyint unsigned, col6 smallint unsigned,
|
|
||||||
col7 int unsigned, col8 bigint unsigned, col9 float, col10 double, col11 bool, col12 binary(20), col13 nchar(20)) tags(loc nchar(20))''')
|
|
||||||
for i in range(self.tbnum):
|
for i in range(self.tbnum):
|
||||||
tdSql.execute(f"create table {stbname}_{i} using {stbname} tags('beijing')")
|
tdSql.execute(f"create table {stbname}_{i} using {stbname} tags({tag_values[0]})")
|
||||||
tdSql.execute(f"insert into {stbname}_{i}(ts) values(%d)" % (self.ts - 1-i))
|
tdSql.execute(self.insert_data(self.column_dict,f'{stbname}_{i}',self.rowNum))
|
||||||
column_list = ['col1','col2','col3','col4','col5','col6','col7','col8']
|
|
||||||
for i in [f'{stbname}', f'{dbname}.{stbname}']:
|
|
||||||
for j in column_list:
|
|
||||||
tdSql.query(f"select top({j},1) from {i}")
|
|
||||||
tdSql.checkRows(0)
|
|
||||||
tdSql.query('show tables')
|
tdSql.query('show tables')
|
||||||
vgroup_list = []
|
vgroup_list = []
|
||||||
for i in range(len(tdSql.queryResult)):
|
for i in range(len(tdSql.queryResult)):
|
||||||
vgroup_list.append(tdSql.queryResult[i][6])
|
vgroup_list.append(tdSql.queryResult[i][6])
|
||||||
vgroup_list_set = set(vgroup_list)
|
|
||||||
|
|
||||||
|
vgroup_list_set = set(vgroup_list)
|
||||||
for i in vgroup_list_set:
|
for i in vgroup_list_set:
|
||||||
vgroups_num = vgroup_list.count(i)
|
vgroups_num = vgroup_list.count(i)
|
||||||
if vgroups_num >=2:
|
if vgroups_num >= 2:
|
||||||
tdLog.info(f'This scene with {vgroups_num} vgroups is ok!')
|
tdLog.info(f'This scene with {vgroups_num} vgroups is ok!')
|
||||||
continue
|
|
||||||
else:
|
|
||||||
tdLog.exit(f'This scene does not meet the requirements with {vgroups_num} vgroup!\n')
|
|
||||||
for i in range(self.rowNum):
|
|
||||||
for j in range(self.tbnum):
|
|
||||||
tdSql.execute(f"insert into {stbname}_{j} values(%d, %d, %d, %d, %d, %d, %d, %d, %d, %f, %f, %d, '{self.binary_str}%d', '{self.nchar_str}%d')"
|
|
||||||
% (self.ts + i, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1))
|
|
||||||
|
|
||||||
error_column_list = ['col11','col12','col13']
|
|
||||||
error_param_list = [0,101]
|
|
||||||
for i in column_list:
|
|
||||||
tdSql.query(f'select top({i},2) from {stbname}')
|
|
||||||
tdSql.checkRows(2)
|
|
||||||
tdSql.checkEqual(tdSql.queryResult,[(10,),(10,)])
|
|
||||||
for j in error_param_list:
|
|
||||||
tdSql.error(f'select top({i},{j}) from {stbname}')
|
|
||||||
for i in error_column_list:
|
|
||||||
tdSql.error(f'select top({i},10) from {stbname}')
|
|
||||||
|
|
||||||
tdSql.query(f"select ts,top(col1, 2),ts from {stbname} group by tbname")
|
else:
|
||||||
tdSql.checkRows(2*self.tbnum)
|
tdLog.exit(
|
||||||
tdSql.query(f'select top(col2,1) from {stbname} interval(1y) order by col2')
|
'This scene does not meet the requirements with {vgroups_num} vgroup!\n')
|
||||||
tdSql.checkData(0,0,10)
|
for i in range(self.tbnum):
|
||||||
tdSql.error(f"select * from {stbname} where top(col2,1)=1")
|
self.top_check_data(f'{stbname}_{i}','child_table')
|
||||||
|
self.top_check_data(stbname,'stable')
|
||||||
|
tdSql.execute(f'drop database {dbname}')
|
||||||
|
|
||||||
|
def top_check_ntb(self):
|
||||||
|
tdSql.prepare()
|
||||||
|
tdSql.execute(self.setsql.set_create_normaltable_sql(self.ntbname,self.column_dict))
|
||||||
|
self.insert_data(self.column_dict,self.ntbname,self.rowNum)
|
||||||
|
self.top_check_data(self.ntbname,'normal_table')
|
||||||
|
tdSql.execute('drop database db')
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.top_check_base()
|
self.top_check_ntb()
|
||||||
self.top_check_stb_distribute()
|
self.top_check_stb()
|
||||||
|
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
tdLog.success("%s successfully executed" % __file__)
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
|
@ -0,0 +1,150 @@
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
import numpy as np
|
||||||
|
import random ,os ,sys
|
||||||
|
import platform
|
||||||
|
import math
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 ,
|
||||||
|
"jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143,
|
||||||
|
"wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143,
|
||||||
|
"maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 }
|
||||||
|
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor())
|
||||||
|
self.vnode_disbutes = None
|
||||||
|
self.ts = 1537146000000
|
||||||
|
self.tb_nums = 20
|
||||||
|
self.row_nums = 100
|
||||||
|
self.time_step = 1000
|
||||||
|
|
||||||
|
def prepare_datas_of_distribute(self):
|
||||||
|
|
||||||
|
# prepate datas for 20 tables distributed at different vgroups
|
||||||
|
tdSql.execute("create database if not exists testdb keep 3650 duration 1000 vgroups 5")
|
||||||
|
tdSql.execute(" use testdb ")
|
||||||
|
tdSql.execute(
|
||||||
|
'''create table stb1
|
||||||
|
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||||
|
tags (t0 timestamp, t1 int, t2 bigint, t3 smallint, t4 tinyint, t5 float, t6 double, t7 bool, t8 binary(16),t9 nchar(32))
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
for i in range(self.tb_nums):
|
||||||
|
tdSql.execute(f'create table ct{i+1} using stb1 tags ( now(), {1*i}, {11111*i}, {111*i}, {11*i}, {1.11*i}, {11.11*i}, {i%2}, "binary{i}", "nchar{i}" )')
|
||||||
|
ts = self.ts
|
||||||
|
for j in range(self.row_nums):
|
||||||
|
ts+=j*self.time_step
|
||||||
|
tdSql.execute(
|
||||||
|
f"insert into ct{i+1} values({ts}, 1, 11111, 111, 1, 1.11, 11.11, 2, 'binary{j}', 'nchar{j}', now()+{1*j}a )"
|
||||||
|
)
|
||||||
|
|
||||||
|
tdSql.execute("insert into ct1 values (now()-810d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
||||||
|
tdSql.execute("insert into ct1 values (now()-400d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
||||||
|
tdSql.execute("insert into ct1 values (now()+90d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
||||||
|
|
||||||
|
tdLog.info(" prepare data for distributed_aggregate done! ")
|
||||||
|
|
||||||
|
def twa_support_types(self):
|
||||||
|
tdSql.query("desc stb1 ")
|
||||||
|
schema_list = tdSql.queryResult
|
||||||
|
for col_type in schema_list:
|
||||||
|
if col_type[1] in ["TINYINT" ,"SMALLINT","BIGINT" ,"INT","FLOAT","DOUBLE"]:
|
||||||
|
tdSql.query(f" select twa({col_type[0]}) from stb1 partition by tbname ")
|
||||||
|
else:
|
||||||
|
tdSql.error(f" select twa({col_type[0]}) from stb1 partition by tbname ")
|
||||||
|
|
||||||
|
|
||||||
|
def check_distribute_datas(self):
|
||||||
|
# get vgroup_ids of all
|
||||||
|
tdSql.query("show vgroups ")
|
||||||
|
vgroups = tdSql.queryResult
|
||||||
|
|
||||||
|
vnode_tables={}
|
||||||
|
|
||||||
|
for vgroup_id in vgroups:
|
||||||
|
vnode_tables[vgroup_id[0]]=[]
|
||||||
|
|
||||||
|
# check sub_table of per vnode ,make sure sub_table has been distributed
|
||||||
|
tdSql.query("show tables like 'ct%'")
|
||||||
|
table_names = tdSql.queryResult
|
||||||
|
tablenames = []
|
||||||
|
for table_name in table_names:
|
||||||
|
vnode_tables[table_name[6]].append(table_name[0])
|
||||||
|
self.vnode_disbutes = vnode_tables
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
for k ,v in vnode_tables.items():
|
||||||
|
if len(v)>=2:
|
||||||
|
count+=1
|
||||||
|
if count < 2:
|
||||||
|
tdLog.exit(" the datas of all not satisfy sub_table has been distributed ")
|
||||||
|
|
||||||
|
def distribute_twa_query(self):
|
||||||
|
# basic filter
|
||||||
|
tdSql.query(" select twa(c1) from ct1 ")
|
||||||
|
tdSql.checkData(0,0,1.000000000)
|
||||||
|
|
||||||
|
tdSql.query(" select twa(c1) from stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(self.tb_nums)
|
||||||
|
tdSql.checkData(0,0,1.000000000)
|
||||||
|
|
||||||
|
tdSql.query(" select twa(c2) from stb1 group by tbname ")
|
||||||
|
tdSql.checkRows(self.tb_nums)
|
||||||
|
tdSql.checkData(0,0,11111.000000000)
|
||||||
|
|
||||||
|
tdSql.query("select twa(c1+c2) from stb1 partition by tbname ")
|
||||||
|
tdSql.checkData(0,0,11112.000000000)
|
||||||
|
|
||||||
|
tdSql.query("select twa(c1) from stb1 partition by t1")
|
||||||
|
tdSql.checkRows(self.tb_nums)
|
||||||
|
tdSql.checkData(0,0,1.000000000)
|
||||||
|
|
||||||
|
# union all
|
||||||
|
tdSql.query(" select twa(c1) from stb1 partition by tbname union all select twa(c1) from stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(40)
|
||||||
|
tdSql.checkData(0,0,1.000000000)
|
||||||
|
|
||||||
|
# join
|
||||||
|
|
||||||
|
tdSql.execute(" create database if not exists db ")
|
||||||
|
tdSql.execute(" use db ")
|
||||||
|
tdSql.execute(" create stable st (ts timestamp , c1 int ,c2 float) tags(t1 int) ")
|
||||||
|
tdSql.execute(" create table tb1 using st tags(1) ")
|
||||||
|
tdSql.execute(" create table tb2 using st tags(2) ")
|
||||||
|
|
||||||
|
|
||||||
|
for i in range(10):
|
||||||
|
ts = i*10 + self.ts
|
||||||
|
tdSql.execute(f" insert into tb1 values({ts},{i},{i}.0)")
|
||||||
|
tdSql.execute(f" insert into tb2 values({ts},{i},{i}.0)")
|
||||||
|
|
||||||
|
tdSql.query(" select twa(tb1.c1), twa(tb2.c2) from tb1, tb2 where tb1.ts=tb2.ts ")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.checkData(0,0,4.500000000)
|
||||||
|
tdSql.checkData(0,1,4.500000000)
|
||||||
|
|
||||||
|
# group by
|
||||||
|
tdSql.execute(" use testdb ")
|
||||||
|
|
||||||
|
# mixup with other functions
|
||||||
|
tdSql.query(" select twa(c1),twa(c2),max(c1),elapsed(ts) from stb1 ")
|
||||||
|
tdSql.checkData(0,0,1.000000000)
|
||||||
|
tdSql.checkData(0,1,11111.000000000)
|
||||||
|
tdSql.checkData(0,2,1)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self.prepare_datas_of_distribute()
|
||||||
|
self.check_distribute_datas()
|
||||||
|
self.twa_support_types()
|
||||||
|
self.distribute_twa_query()
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -108,6 +108,7 @@ python3 ./test.py -f 2-query/distribute_agg_spread.py
|
||||||
python3 ./test.py -f 2-query/distribute_agg_apercentile.py
|
python3 ./test.py -f 2-query/distribute_agg_apercentile.py
|
||||||
python3 ./test.py -f 2-query/distribute_agg_avg.py
|
python3 ./test.py -f 2-query/distribute_agg_avg.py
|
||||||
python3 ./test.py -f 2-query/distribute_agg_stddev.py
|
python3 ./test.py -f 2-query/distribute_agg_stddev.py
|
||||||
|
python3 ./test.py -f 2-query/twa.py
|
||||||
|
|
||||||
python3 ./test.py -f 6-cluster/5dnode1mnode.py
|
python3 ./test.py -f 6-cluster/5dnode1mnode.py
|
||||||
python3 ./test.py -f 6-cluster/5dnode2mnode.py
|
python3 ./test.py -f 6-cluster/5dnode2mnode.py
|
||||||
|
|
Loading…
Reference in New Issue