From 5878c9a31a899676c26358be1f2f3f3109e1b169 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Mon, 31 Oct 2022 12:59:42 +0800 Subject: [PATCH 001/105] fix: impl ring log buffer --- include/libs/sync/sync.h | 6 +- include/libs/wal/wal.h | 2 +- include/util/tdef.h | 1 + source/dnode/mnode/impl/src/mndSync.c | 5 +- source/dnode/vnode/src/inc/vnd.h | 2 +- source/dnode/vnode/src/tsdb/tsdbUtil.c | 4 +- source/dnode/vnode/src/vnd/vnodeSync.c | 8 +- source/libs/sync/inc/syncInt.h | 48 +- source/libs/sync/inc/syncRaftEntry.h | 2 +- source/libs/sync/inc/syncReplication.h | 4 +- source/libs/sync/src/syncAppendEntries.c | 579 +++++++++++++++++- source/libs/sync/src/syncAppendEntriesReply.c | 123 +++- source/libs/sync/src/syncCommit.c | 115 +++- source/libs/sync/src/syncMain.c | 365 ++++++++++- source/libs/sync/src/syncRaftEntry.c | 8 +- source/libs/sync/src/syncRaftLog.c | 17 +- source/libs/sync/src/syncReplication.c | 21 +- source/libs/sync/src/syncSnapshot.c | 2 +- source/libs/tdb/src/db/tdbBtree.c | 3 +- source/libs/wal/src/walWrite.c | 9 +- 20 files changed, 1230 insertions(+), 94 deletions(-) diff --git a/include/libs/sync/sync.h b/include/libs/sync/sync.h index ff14e637d0..7ed8414906 100644 --- a/include/libs/sync/sync.h +++ b/include/libs/sync/sync.h @@ -45,7 +45,7 @@ extern bool gRaftDetailLog; #define SYNC_MAX_BATCH_SIZE 1 #define SYNC_INDEX_BEGIN 0 #define SYNC_INDEX_INVALID -1 -#define SYNC_TERM_INVALID 0xFFFFFFFFFFFFFFFF +#define SYNC_TERM_INVALID -1 // 0xFFFFFFFFFFFFFFFF typedef enum { SYNC_STRATEGY_NO_SNAPSHOT = 0, @@ -56,7 +56,7 @@ typedef enum { typedef uint64_t SyncNodeId; typedef int32_t SyncGroupId; typedef int64_t SyncIndex; -typedef uint64_t SyncTerm; +typedef int64_t SyncTerm; typedef struct SSyncNode SSyncNode; typedef struct SSyncBuffer SSyncBuffer; @@ -201,7 +201,7 @@ typedef struct SSyncInfo { int32_t syncInit(); void syncCleanUp(); int64_t syncOpen(SSyncInfo* pSyncInfo); -void syncStart(int64_t rid); +int32_t syncStart(int64_t rid); void syncStop(int64_t rid); int32_t syncSetStandby(int64_t rid); ESyncState syncGetMyRole(int64_t rid); diff --git a/include/libs/wal/wal.h b/include/libs/wal/wal.h index adf244e32a..e908ae6d88 100644 --- a/include/libs/wal/wal.h +++ b/include/libs/wal/wal.h @@ -170,7 +170,7 @@ int32_t walWriteWithSyncInfo(SWal *, int64_t index, tmsg_t msgType, SWalSyncInfo // Assign version automatically and return to caller, // -1 will be returned for failed writes -int64_t walAppendLog(SWal *, tmsg_t msgType, SWalSyncInfo syncMeta, const void *body, int32_t bodyLen); +int64_t walAppendLog(SWal *, int64_t index, tmsg_t msgType, SWalSyncInfo syncMeta, const void *body, int32_t bodyLen); void walFsync(SWal *, bool force); diff --git a/include/util/tdef.h b/include/util/tdef.h index 936fbdf0d5..0b7f9b28fa 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -281,6 +281,7 @@ typedef enum ELogicConditionType { #define TSDB_DNODE_ROLE_VNODE 2 #define TSDB_MAX_REPLICA 5 +#define TSDB_SYNC_LOG_BUFFER_SIZE 500 #define TSDB_TBNAME_COLUMN_INDEX (-1) #define TSDB_MULTI_TABLEMETA_MAX_NUM 100000 // maximum batch size allowed to load table meta diff --git a/source/dnode/mnode/impl/src/mndSync.c b/source/dnode/mnode/impl/src/mndSync.c index cd6fe380e1..74f9d8bbdb 100644 --- a/source/dnode/mnode/impl/src/mndSync.c +++ b/source/dnode/mnode/impl/src/mndSync.c @@ -309,8 +309,11 @@ int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw, int32_t transId) { void mndSyncStart(SMnode *pMnode) { SSyncMgmt *pMgmt = &pMnode->syncMgmt; + if (syncStart(pMgmt->sync) < 0) { + mError("vgId:1, failed to start sync subsystem"); + return; + } syncSetMsgCb(pMgmt->sync, &pMnode->msgCb); - syncStart(pMgmt->sync); mInfo("vgId:1, sync started, id:%" PRId64, pMgmt->sync); } diff --git a/source/dnode/vnode/src/inc/vnd.h b/source/dnode/vnode/src/inc/vnd.h index 988ecc5dd3..fe23087c25 100644 --- a/source/dnode/vnode/src/inc/vnd.h +++ b/source/dnode/vnode/src/inc/vnd.h @@ -97,7 +97,7 @@ bool vnodeShouldRollback(SVnode* pVnode); // vnodeSync.c int32_t vnodeSyncOpen(SVnode* pVnode, char* path); -void vnodeSyncStart(SVnode* pVnode); +int32_t vnodeSyncStart(SVnode* pVnode); void vnodeSyncClose(SVnode* pVnode); void vnodeRedirectRpcMsg(SVnode* pVnode, SRpcMsg* pMsg); bool vnodeIsLeader(SVnode* pVnode); diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index 4e02a28cdf..a2f3ca2911 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -714,7 +714,8 @@ int32_t tRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema) { taosArraySet(pMerger->pArray, iCol, pColVal); } } else { - ASSERT(0); + // ASSERT(0); + tsdbError("dup key accounted: key version:%" PRId64 ", merger version:%" PRId64, key.version, pMerger->version); } } @@ -888,7 +889,6 @@ int32_t tsdbBuildDeleteSkyline(SArray *aDelData, int32_t sidx, int32_t eidx, SAr code = TSDB_CODE_OUT_OF_MEMORY; goto _clear; } - midx = (sidx + eidx) / 2; code = tsdbBuildDeleteSkyline(aDelData, sidx, midx, aSkyline1); diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index 1863203f4a..c3ccbddc53 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -665,9 +665,13 @@ int32_t vnodeSyncOpen(SVnode *pVnode, char *path) { return 0; } -void vnodeSyncStart(SVnode *pVnode) { +int32_t vnodeSyncStart(SVnode *pVnode) { + if (syncStart(pVnode->sync) < 0) { + vError("vgId:%d, failed to start sync subsystem since %s", pVnode->config.vgId, terrstr()); + return -1; + } syncSetMsgCb(pVnode->sync, &pVnode->msgCb); - syncStart(pVnode->sync); + return 0; } void vnodeSyncClose(SVnode *pVnode) { syncStop(pVnode->sync); } diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index a158430a0f..bd97187ce7 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -88,6 +88,44 @@ typedef struct SPeerState { int64_t lastSendTime; } SPeerState; +typedef struct SSyncLogBufEntry { + SSyncRaftEntry* pItem; + SyncIndex prevLogIndex; + SyncTerm prevLogTerm; +} SSyncLogBufEntry; + +typedef struct SSyncLogBuffer { + SSyncLogBufEntry entries[TSDB_SYNC_LOG_BUFFER_SIZE]; + int64_t startIndex; + int64_t commitIndex; + int64_t matchIndex; + int64_t endIndex; + int64_t size; + TdThreadMutex mutex; +} SSyncLogBuffer; + +SSyncLogBuffer* syncLogBufferCreate(); +void syncLogBufferDestroy(SSyncLogBuffer* pBuf); +int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode); + +// access +int64_t syncLogBufferGetEndIndex(SSyncLogBuffer* pBuf); +int32_t syncLogBufferAppend(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry); +int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevTerm); +int64_t syncLogBufferLoad(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex toIndex); +int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode); +int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t commitIndex); + +int64_t syncNodeUpdateCommitIndex(SSyncNode* ths, SyncIndex commtIndex); +SyncAppendEntries* syncLogToAppendEntries(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index); + +// private +int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf); +int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SyncIndex toIndex); +int32_t syncLogBufferReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index); +void syncIndexMgrSetIndex(SSyncIndexMgr* pSyncIndexMgr, const SRaftId* pRaftId, SyncIndex index); +bool syncNodeAgreedUpon(SSyncNode* pNode, SyncIndex index); + typedef struct SSyncNode { // init by SSyncInfo SyncGroupId vgId; @@ -97,6 +135,7 @@ typedef struct SSyncNode { char configPath[TSDB_FILENAME_LEN * 2]; // sync io + SSyncLogBuffer* pLogBuf; SWal* pWal; const SMsgCb* msgcb; int32_t (*FpSendMsg)(const SEpSet* pEpSet, SRpcMsg* pMsg); @@ -186,7 +225,7 @@ typedef struct SSyncNode { SSyncRespMgr* pSyncRespMgr; // restore state - bool restoreFinish; + _Atomic bool restoreFinish; // SSnapshot* pSnapshot; SSyncSnapshotSender* senders[TSDB_MAX_REPLICA]; SSyncSnapshotReceiver* pNewNodeReceiver; @@ -208,10 +247,11 @@ typedef struct SSyncNode { // open/close -------------- SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo); -void syncNodeStart(SSyncNode* pSyncNode); -void syncNodeStartStandBy(SSyncNode* pSyncNode); +int32_t syncNodeStart(SSyncNode* pSyncNode); +int32_t syncNodeStartStandBy(SSyncNode* pSyncNode); void syncNodeClose(SSyncNode* pSyncNode); int32_t syncNodePropose(SSyncNode* pSyncNode, SRpcMsg* pMsg, bool isWeak); +int32_t syncNodeRestore(SSyncNode* pSyncNode); // option bool syncNodeSnapshotEnable(SSyncNode* pSyncNode); @@ -298,7 +338,7 @@ int32_t syncGetSnapshotMeta(int64_t rid, struct SSnapshotMeta* sMeta); int32_t syncGetSnapshotMetaByIndex(int64_t rid, SyncIndex snapshotIndex, struct SSnapshotMeta* sMeta); void syncStartNormal(int64_t rid); -void syncStartStandBy(int64_t rid); +int32_t syncStartStandBy(int64_t rid); bool syncNodeCanChange(SSyncNode* pSyncNode); bool syncNodeCheckNewConfig(SSyncNode* pSyncNode, const SSyncCfg* pNewCfg); diff --git a/source/libs/sync/inc/syncRaftEntry.h b/source/libs/sync/inc/syncRaftEntry.h index bab1dcc661..75ecd2d2a1 100644 --- a/source/libs/sync/inc/syncRaftEntry.h +++ b/source/libs/sync/inc/syncRaftEntry.h @@ -47,7 +47,7 @@ SSyncRaftEntry* syncEntryBuild2(SyncClientRequest* pMsg, SyncTerm term, SyncInde SSyncRaftEntry* syncEntryBuild3(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index); SSyncRaftEntry* syncEntryBuild4(SRpcMsg* pOriginalMsg, SyncTerm term, SyncIndex index); SSyncRaftEntry* syncEntryBuildNoop(SyncTerm term, SyncIndex index, int32_t vgId); -void syncEntryDestory(SSyncRaftEntry* pEntry); +void syncEntryDestroy(SSyncRaftEntry* pEntry); char* syncEntrySerialize(const SSyncRaftEntry* pEntry, uint32_t* len); // step 5 SSyncRaftEntry* syncEntryDeserialize(const char* buf, uint32_t len); // step 6 cJSON* syncEntry2Json(const SSyncRaftEntry* pEntry); diff --git a/source/libs/sync/inc/syncReplication.h b/source/libs/sync/inc/syncReplication.h index 4f15a45cec..1d34a41456 100644 --- a/source/libs/sync/inc/syncReplication.h +++ b/source/libs/sync/inc/syncReplication.h @@ -57,8 +57,8 @@ int32_t syncNodeSendHeartbeat(SSyncNode* pSyncNode, const SRaftId* pDestId, cons int32_t syncNodeReplicate(SSyncNode* pSyncNode); int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId); -int32_t syncNodeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* pDestId, const SyncAppendEntries* pMsg); -int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* pDestId, const SyncAppendEntries* pMsg); +int32_t syncNodeSendAppendEntries(SSyncNode* pSyncNode, SRaftId* pDestId, SyncAppendEntries* pMsg); +int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pSyncNode, SRaftId* pDestId, SyncAppendEntries* pMsg); #ifdef __cplusplus } diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c index 170a57a7a9..9560ea269b 100644 --- a/source/libs/sync/src/syncAppendEntries.c +++ b/source/libs/sync/src/syncAppendEntries.c @@ -118,7 +118,7 @@ static int32_t syncNodeMakeLogSame(SSyncNode* ths, SyncAppendEntries* pMsg) { rpcFreeCont(rpcMsg.pCont); } - syncEntryDestory(pRollBackEntry); + syncEntryDestroy(pRollBackEntry); } } @@ -161,7 +161,7 @@ static int32_t syncNodeDoMakeLogSame(SSyncNode* ths, SyncIndex FromIndex) { rpcFreeCont(rpcMsg.pCont); } - syncEntryDestory(pRollBackEntry); + syncEntryDestroy(pRollBackEntry); } } @@ -308,7 +308,551 @@ int32_t syncNodeFollowerCommit(SSyncNode* ths, SyncIndex newCommitIndex) { return 0; } +SSyncRaftEntry* syncEntryBuildDummy(SyncTerm term, SyncIndex index, int32_t vgId) { + return syncEntryBuildNoop(term, index, vgId); +} + +int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { + taosThreadMutexLock(&pBuf->mutex); + ASSERT(pNode->pLogStore != NULL && "log store not created"); + ASSERT(pNode->pFsm != NULL && "pFsm not registered"); + ASSERT(pNode->pFsm->FpGetSnapshotInfo != NULL && "FpGetSnapshotInfo not registered"); + + SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); + SSnapshot snapshot; + if (pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot) < 0) { + sError("vgId:%d, failed to get snapshot info since %s", pNode->vgId, terrstr()); + goto _err; + } + + SyncIndex commitIndex = snapshot.lastApplyIndex; + SyncTerm commitTerm = snapshot.lastApplyTerm; + SyncIndex toIndex = TMAX(lastVer, commitIndex); + + // update match index + pBuf->commitIndex = commitIndex; + pBuf->matchIndex = toIndex; + pBuf->endIndex = toIndex + 1; + + // load log entries in reverse order + SSyncLogStore* pLogStore = pNode->pLogStore; + SyncIndex index = toIndex; + SSyncRaftEntry* pEntry = NULL; + bool takeDummy = false; + + while (true) { + if (index <= pBuf->commitIndex) { + takeDummy = true; + break; + } + + if (pLogStore->syncLogGetEntry(pLogStore, index, &pEntry) < 0) { + sError("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); + ASSERT(0); + break; + } + + bool taken = false; + if (toIndex <= index + pBuf->size - 1) { + SSyncLogBufEntry tmp = {.pItem = pEntry, .prevLogIndex = -1, .prevLogTerm = -1}; + pBuf->entries[index % pBuf->size] = tmp; + taken = true; + } + + if (index < toIndex) { + pBuf->entries[(index + 1) % pBuf->size].prevLogIndex = pEntry->index; + pBuf->entries[(index + 1) % pBuf->size].prevLogTerm = pEntry->term; + } + + if (!taken) { + syncEntryDestroy(pEntry); + pEntry = NULL; + break; + } + + index--; + } + + // put a dummy record at commitIndex if present in log buffer + if (takeDummy) { + ASSERT(index == pBuf->commitIndex); + + SSyncRaftEntry* pDummy = syncEntryBuildDummy(commitTerm, commitIndex, pNode->vgId); + if (pDummy == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } + SSyncLogBufEntry tmp = {.pItem = pDummy, .prevLogIndex = commitIndex - 1, .prevLogTerm = commitTerm}; + pBuf->entries[(commitIndex + pBuf->size) % pBuf->size] = tmp; + + if (index < toIndex) { + pBuf->entries[(index + 1) % pBuf->size].prevLogIndex = commitIndex; + pBuf->entries[(index + 1) % pBuf->size].prevLogTerm = commitTerm; + } + } + + // update startIndex + pBuf->startIndex = index; + + // validate + syncLogBufferValidate(pBuf); + taosThreadMutexUnlock(&pBuf->mutex); + return 0; + +_err: + taosThreadMutexUnlock(&pBuf->mutex); + return -1; +} + +int64_t syncLogBufferLoadOld(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex toIndex) { + taosThreadMutexLock(&pBuf->mutex); + syncLogBufferValidate(pBuf); + + SSyncLogStore* pLogStore = pNode->pLogStore; + ASSERT(pBuf->startIndex <= pBuf->matchIndex); + ASSERT(pBuf->matchIndex + 1 == pBuf->endIndex); + SyncIndex index = pBuf->endIndex; + SSyncRaftEntry* pMatch = pBuf->entries[(index - 1 + pBuf->size) % pBuf->size].pItem; + ASSERT(pMatch != NULL); + + while (index - pBuf->startIndex < pBuf->size && index <= toIndex) { + SSyncRaftEntry* pEntry = NULL; + if (pLogStore->syncLogGetEntry(pLogStore, index, &pEntry) < 0) { + sError("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); + ASSERT(0); + break; + } + ASSERT(pMatch->index + 1 == pEntry->index); + SSyncLogBufEntry tmp = {.pItem = pEntry, .prevLogIndex = pMatch->index, .prevLogTerm = pMatch->term}; + pBuf->entries[pBuf->endIndex % pBuf->size] = tmp; + + sInfo("vgId:%d, loaded log entry into log buffer. index: %" PRId64 ", term: %" PRId64, pNode->vgId, pEntry->index, + pEntry->term); + + pBuf->matchIndex = index; + pBuf->endIndex = index + 1; + pMatch = pEntry; + index++; + } + + syncLogBufferValidate(pBuf); + taosThreadMutexUnlock(&pBuf->mutex); + return index; +} + +int32_t syncLogBufferInitOld(SSyncLogBuffer* pBuf, SSyncNode* pNode) { + taosThreadMutexLock(&pBuf->mutex); + ASSERT(pNode->pLogStore != NULL && "log store not created"); + ASSERT(pNode->pFsm != NULL && "pFsm not registered"); + ASSERT(pNode->pFsm->FpGetSnapshotInfo != NULL && "FpGetSnapshotInfo not registered"); + + SSnapshot snapshot; + if (pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot) < 0) { + sError("vgId:%d, failed to get snapshot info since %s", pNode->vgId, terrstr()); + goto _err; + } + SyncIndex commitIndex = snapshot.lastApplyIndex; + SyncTerm commitTerm = snapshot.lastApplyTerm; + + // init log buffer indexes + pBuf->startIndex = commitIndex; + pBuf->matchIndex = commitIndex; + pBuf->commitIndex = commitIndex; + pBuf->endIndex = commitIndex + 1; + + // put a dummy record at initial commitIndex + SSyncRaftEntry* pDummy = syncEntryBuildDummy(commitTerm, commitIndex, pNode->vgId); + if (pDummy == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } + SSyncLogBufEntry tmp = {.pItem = pDummy, .prevLogIndex = commitIndex - 1, .prevLogTerm = commitTerm}; + pBuf->entries[(commitIndex + pBuf->size) % pBuf->size] = tmp; + + taosThreadMutexUnlock(&pBuf->mutex); + return 0; + +_err: + taosThreadMutexUnlock(&pBuf->mutex); + return -1; +} + +int32_t syncLogBufferRollbackMatchIndex(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex toIndex) { + if (toIndex <= pBuf->commitIndex) { + sError("vgId:%d, cannot rollback across commit index:%" PRId64 ", to index:%" PRId64 "", pNode->vgId, + pBuf->commitIndex, toIndex); + return -1; + } + + pBuf->matchIndex = TMIN(pBuf->matchIndex, toIndex - 1); + + // update my match index + syncIndexMgrSetIndex(pNode->pMatchIndex, &pNode->myRaftId, pBuf->matchIndex); + return 0; +} + +int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevTerm) { + taosThreadMutexLock(&pBuf->mutex); + syncLogBufferValidate(pBuf); + + int32_t ret = 0; + SyncIndex index = pEntry->index; + SyncIndex prevIndex = pEntry->index - 1; + if (index <= pBuf->commitIndex || index - pBuf->startIndex > pBuf->size) { + sInfo("vgId:%d, cannot accept index:%" PRId64 " into log buffer. start index: %" PRId64 ", commit index: %" PRId64 + ", end index:%" PRId64 ")", + pNode->vgId, index, pBuf->startIndex, pBuf->commitIndex, pBuf->endIndex); + ret = (index <= pBuf->commitIndex) ? 0 : -1; + goto _out; + } + + // check current in buffer + SSyncRaftEntry* pExist = pBuf->entries[index % pBuf->size].pItem; + if (pExist != NULL) { + ASSERT(pEntry->index == pExist->index); + + if (pEntry->term > pExist->term) { + (void)syncLogBufferRollback(pBuf, index); + } else { + sInfo("vgId:%d, %s raft entry received. index:%" PRId64 ", term: %" PRId64 "", pNode->vgId, + ((pEntry->term < pExist->term) ? "stale" : "duplicate"), pEntry->index, pEntry->term); + SyncTerm existPrevTerm = pBuf->entries[index % pBuf->size].prevLogTerm; + ASSERT(pEntry->term < pExist->term || (pEntry->term == pExist->term && prevTerm == existPrevTerm)); + ret = (pEntry->term < pExist->term) ? 0 : -1; + goto _out; + } + } + + // update + SSyncLogBufEntry tmp = {.pItem = pEntry, .prevLogIndex = prevIndex, .prevLogTerm = prevTerm}; + pEntry = NULL; + pBuf->entries[index % pBuf->size] = tmp; + + // update end index + pBuf->endIndex = TMAX(index + 1, pBuf->endIndex); + +_out: + syncEntryDestroy(pEntry); + syncLogBufferValidate(pBuf); + taosThreadMutexUnlock(&pBuf->mutex); + return ret; +} + +SSyncRaftEntry* syncLogAppendEntriesToRaftEntry(const SyncAppendEntries* pMsg) { + SSyncRaftEntry* pEntry = taosMemoryMalloc(pMsg->dataLen); + if (pEntry == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } + (void)memcpy(pEntry, pMsg->data, pMsg->dataLen); + ASSERT(pEntry->bytes == pMsg->dataLen); + return pEntry; +} + +int32_t syncLogStorePersist(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) { + SyncIndex lastVer = pLogStore->syncLogLastIndex(pLogStore); + if (lastVer >= pEntry->index && pLogStore->syncLogTruncate(pLogStore, pEntry->index) < 0) { + sError("failed to truncate log store since %s. from index:%" PRId64 "", terrstr(), pEntry->index); + return -1; + } + lastVer = pLogStore->syncLogLastIndex(pLogStore); + ASSERT(pEntry->index == lastVer + 1); + + if (pLogStore->syncLogAppendEntry(pLogStore, pEntry) < 0) { + sError("failed to append raft log entry since %s. index:%" PRId64 ", term:%" PRId64 "", terrstr(), pEntry->index, + pEntry->term); + return -1; + } + return 0; +} + +int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode) { + taosThreadMutexLock(&pBuf->mutex); + syncLogBufferValidate(pBuf); + + SSyncLogStore* pLogStore = pNode->pLogStore; + int64_t matchIndex = pBuf->matchIndex; + + while (pBuf->matchIndex + 1 < pBuf->endIndex) { + int64_t index = pBuf->matchIndex + 1; + ASSERT(index >= 0); + + // try to proceed + SSyncLogBufEntry* pBufEntry = &pBuf->entries[index % pBuf->size]; + SyncIndex prevLogIndex = pBufEntry->prevLogIndex; + SyncTerm prevLogTerm = pBufEntry->prevLogTerm; + SSyncRaftEntry* pEntry = pBufEntry->pItem; + if (pEntry == NULL) { + sDebug("vgId:%d, cannot proceed match index in log buffer. no raft entry at next pos of matchIndex:%" PRId64, + pNode->vgId, pBuf->matchIndex); + goto _out; + } + + ASSERT(index == pEntry->index); + + // match + SSyncRaftEntry* pMatch = pBuf->entries[(pBuf->matchIndex + pBuf->size) % pBuf->size].pItem; + ASSERT(pMatch != NULL); + ASSERT(pMatch->index == pBuf->matchIndex); + ASSERT(pMatch->index + 1 == pEntry->index); + ASSERT(prevLogIndex == pMatch->index); + + if (pMatch->term != prevLogTerm) { + sError( + "vgId:%d, mismatching raft log entries encountered. " + "{ index:%" PRId64 ", term:%" PRId64 + " } " + "{ index:%" PRId64 ", term:%" PRId64 ", prevLogIndex:%" PRId64 ", prevLogTerm:%" PRId64 " } ", + pNode->vgId, pMatch->index, pMatch->term, pEntry->index, pEntry->term, prevLogIndex, prevLogTerm); + goto _out; + } + + // replicate on demand + if (pNode->state == TAOS_SYNC_STATE_LEADER && pNode->replicaNum > 1) { + (void)syncLogBufferReplicate(pBuf, pNode, index); + } + + // persist + if (syncLogStorePersist(pLogStore, pEntry) < 0) { + sError("vgId:%d, failed to persist raft log entry from log buffer since %s. index:%" PRId64, pNode->vgId, + terrstr(), pEntry->index); + goto _out; + } + + // increment + pBuf->matchIndex = index; + matchIndex = pBuf->matchIndex; + + // update my match index + syncIndexMgrSetIndex(pNode->pMatchIndex, &pNode->myRaftId, pBuf->matchIndex); + } // end of while + +_out: + syncLogBufferValidate(pBuf); + taosThreadMutexUnlock(&pBuf->mutex); + return matchIndex; +} + +int32_t syncLogFsmExecute(SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncRaftEntry* pEntry) { + ASSERT(pFsm->FpCommitCb != NULL && "No commit cb registered for the FSM"); + + SRpcMsg rpcMsg; + syncEntry2OriginalRpc(pEntry, &rpcMsg); + + SFsmCbMeta cbMeta = {0}; + cbMeta.index = pEntry->index; + cbMeta.lastConfigIndex = -1; + cbMeta.isWeak = pEntry->isWeak; + cbMeta.code = 0; + cbMeta.state = role; + cbMeta.seqNum = pEntry->seqNum; + cbMeta.term = pEntry->term; + cbMeta.currentTerm = term; + cbMeta.flag = -1; + + pFsm->FpCommitCb(pFsm, &rpcMsg, cbMeta); + return 0; +} + +int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf) { + ASSERT(pBuf->startIndex <= pBuf->matchIndex); + ASSERT(pBuf->commitIndex <= pBuf->matchIndex); + ASSERT(pBuf->matchIndex < pBuf->endIndex); + ASSERT(pBuf->endIndex - pBuf->startIndex <= pBuf->size); + for (SyncIndex index = pBuf->commitIndex; index <= pBuf->matchIndex; index++) { + SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; + ASSERT(pEntry != NULL); + } + return 0; +} + +int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t commitIndex) { + taosThreadMutexLock(&pBuf->mutex); + syncLogBufferValidate(pBuf); + + SSyncLogStore* pLogStore = pNode->pLogStore; + SSyncFSM* pFsm = pNode->pFsm; + ESyncState role = pNode->state; + SyncTerm term = pNode->pRaftStore->currentTerm; + SyncGroupId vgId = pNode->vgId; + int32_t ret = 0; + int64_t upperIndex = TMIN(commitIndex, pBuf->matchIndex); + SSyncRaftEntry* pEntry = NULL; + bool inBuf = false; + + if (commitIndex <= pBuf->commitIndex) { + sDebug("vgId:%d, stale commit update. current:%" PRId64 ", notified:%" PRId64 "", vgId, pBuf->commitIndex, + commitIndex); + ret = 0; + goto _out; + } + + sDebug("vgId:%d, log buffer info. role: %d, term: %" PRId64 ". start index:%" PRId64 ", commit index:%" PRId64 + ", match index: %" PRId64 ", end index:%" PRId64 "", + pNode->vgId, role, term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + + // execute in fsm + for (int64_t index = pBuf->commitIndex + 1; index <= upperIndex; index++) { + // get a log entry + if (index >= pBuf->startIndex) { + inBuf = true; + pEntry = pBuf->entries[index % pBuf->size].pItem; + } else { + inBuf = false; + if (pLogStore->syncLogGetEntry(pLogStore, index, &pEntry) < 0) { + sError("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); + ret = -1; + goto _out; + } + } + + ASSERT(pEntry != NULL); + + // execute it + if (!syncUtilUserCommit(pEntry->originalRpcType)) { + sInfo("vgId:%d, non-user msg in raft log entry. index: %" PRId64 ", term:%" PRId64 "", vgId, pEntry->index, + pEntry->term); + pBuf->commitIndex = index; + if (!inBuf) { + syncEntryDestroy(pEntry); + pEntry = NULL; + } + continue; + } + + if (syncLogFsmExecute(pFsm, role, term, pEntry) != 0) { + sError("vgId:%d, failed to execute raft entry in FSM. log index:%" PRId64 ", term:%" PRId64 "", vgId, + pEntry->index, pEntry->term); + ret = -1; + goto _out; + } + pBuf->commitIndex = index; + + sInfo("vgId:%d, committed index: %" PRId64 ", term: %" PRId64 ", role: %d, current term: %" PRId64 "", pNode->vgId, + pEntry->index, pEntry->term, role, term); + + if (!inBuf) { + syncEntryDestroy(pEntry); + pEntry = NULL; + } + } + + // recycle + // TODO: with a grace period of one third of free space before commitIndex in ring buffer + SyncIndex until = pBuf->commitIndex; + for (SyncIndex index = pBuf->startIndex; index < until; index++) { + SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; + ASSERT(pEntry != NULL); + syncEntryDestroy(pEntry); + memset(&pBuf->entries[(index + pBuf->size) % pBuf->size], 0, sizeof(pBuf->entries[0])); + pBuf->startIndex = index + 1; + } + +_out: + // mark as restored if needed + if (!pNode->restoreFinish && pBuf->commitIndex >= pNode->commitIndex) { + pNode->pFsm->FpRestoreFinishCb(pNode->pFsm); + pNode->restoreFinish = true; + sInfo("vgId:%d, restore finished. commit index:%" PRId64 ", match index:%" PRId64 ", last index:%" PRId64 "", + pNode->vgId, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex - 1); + } + + if (!inBuf) { + syncEntryDestroy(pEntry); + pEntry = NULL; + } + syncLogBufferValidate(pBuf); + taosThreadMutexUnlock(&pBuf->mutex); + return ret; +} + int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) { + SyncAppendEntriesReply* pReply = NULL; + // if already drop replica, do not process + if (!syncNodeInRaftGroup(ths, &(pMsg->srcId))) { + syncLogRecvAppendEntries(ths, pMsg, "not in my config"); + goto _IGNORE; + } + + // prepare response msg + pReply = syncAppendEntriesReplyBuild(ths->vgId); + pReply->srcId = ths->myRaftId; + pReply->destId = pMsg->srcId; + pReply->term = ths->pRaftStore->currentTerm; + pReply->success = false; + pReply->matchIndex = SYNC_INDEX_INVALID; + pReply->lastSendIndex = pMsg->prevLogIndex + 1; + pReply->privateTerm = ths->pNewNodeReceiver->privateTerm; + pReply->startTime = ths->startTime; + + if (pMsg->term < ths->pRaftStore->currentTerm) { + goto _SEND_RESPONSE; + } + + if (pMsg->term > ths->pRaftStore->currentTerm) { + pReply->term = pMsg->term; + } + + syncNodeStepDown(ths, pMsg->term); + syncNodeResetElectTimer(ths); + + // update commit index + (void)syncNodeUpdateCommitIndex(ths, pMsg->commitIndex); + + if (pMsg->dataLen < (int32_t)sizeof(SSyncRaftEntry)) { + sError("vgId:%d, incomplete append entries received. prev index:%" PRId64 ", term:%" PRId64 ", datalen:%d", + ths->vgId, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->dataLen); + goto _IGNORE; + } + + SSyncRaftEntry* pEntry = syncLogAppendEntriesToRaftEntry(pMsg); + + if (pEntry == NULL) { + sError("vgId:%d, failed to get raft entry from append entries since %s", ths->vgId, terrstr()); + goto _IGNORE; + } + + if (pMsg->prevLogIndex + 1 != pEntry->index) { + sError("vgId:%d, invalid previous log index in msg. index:%" PRId64 ", term:%" PRId64 ", prevLogIndex:%" PRId64 + ", prevLogTerm:%" PRId64, + ths->vgId, pEntry->index, pEntry->term, pMsg->prevLogIndex, pMsg->prevLogTerm); + goto _IGNORE; + } + + sInfo("vgId:%d, recv append entries msg. index:%" PRId64 ", term:%" PRId64 ", preLogIndex:%" PRId64 + ", prevLogTerm:%" PRId64 " commitIndex:%" PRId64 "", + pMsg->vgId, pMsg->prevLogIndex + 1, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->commitIndex); + + // accept + if (syncLogBufferAccept(ths->pLogBuf, ths, pEntry, pMsg->prevLogTerm) < 0) { + sWarn("vgId:%d, failed to accept raft entry into log buffer. index:%" PRId64 ", term:%" PRId64, ths->vgId, + pEntry->index, pEntry->term); + goto _SEND_RESPONSE; + } + pReply->success = true; + +_SEND_RESPONSE: + // update match index + pReply->matchIndex = syncLogBufferProceed(ths->pLogBuf, ths); + + // ack, i.e. send response + SRpcMsg rpcMsg; + syncAppendEntriesReply2RpcMsg(pReply, &rpcMsg); + (void)syncNodeSendMsgById(&pReply->destId, ths, &rpcMsg); + + // commit index, i.e. leader notice me + if (syncLogBufferCommit(ths->pLogBuf, ths, pMsg->commitIndex) < 0) { + sError("vgId:%d, failed to commit raft fsm log since %s.", ths->vgId, terrstr()); + goto _out; + } + +_out: +_IGNORE: + syncAppendEntriesReplyDestroy(pReply); + return 0; +} + +int32_t syncNodeOnAppendEntriesOld(SSyncNode* ths, SyncAppendEntries* pMsg) { // if already drop replica, do not process if (!syncNodeInRaftGroup(ths, &(pMsg->srcId))) { syncLogRecvAppendEntries(ths, pMsg, "not in my config"); @@ -386,6 +930,8 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) { goto _IGNORE; } + ASSERT(pAppendEntry->index == appendIndex); + // append code = ths->pLogStore->syncLogAppendEntry(ths->pLogStore, pAppendEntry); if (code != 0) { @@ -431,34 +977,11 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) { } } -#if 0 - if (code != 0 && terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) { - code = ths->pLogStore->syncLogTruncate(ths->pLogStore, appendIndex); - ASSERT(code == 0); - - code = ths->pLogStore->syncLogAppendEntry(ths->pLogStore, pAppendEntry); - ASSERT(code == 0); - - } else { - ASSERT(code == 0); - - if (pLocalEntry->term == pAppendEntry->term) { - // do nothing - } else { - code = ths->pLogStore->syncLogTruncate(ths->pLogStore, appendIndex); - ASSERT(code == 0); - - code = ths->pLogStore->syncLogAppendEntry(ths->pLogStore, pAppendEntry); - ASSERT(code == 0); - } - } -#endif - // update match index pReply->matchIndex = pAppendEntry->index; - syncEntryDestory(pLocalEntry); - syncEntryDestory(pAppendEntry); + syncEntryDestroy(pLocalEntry); + syncEntryDestroy(pAppendEntry); } else { // no append entries, do nothing @@ -489,4 +1012,4 @@ _SEND_RESPONSE: syncAppendEntriesReplyDestroy(pReply); return 0; -} \ No newline at end of file +} diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index 5e6c9f1534..e37c40455c 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -84,6 +84,70 @@ static void syncNodeStartSnapshotOnce(SSyncNode* ths, SyncIndex beginIndex, Sync } } +int64_t syncNodeUpdateCommitIndex(SSyncNode* ths, SyncIndex commitIndex) { + ths->commitIndex = TMAX(commitIndex, ths->commitIndex); + SyncIndex lastVer = ths->pLogStore->syncLogLastIndex(ths->pLogStore); + commitIndex = TMIN(ths->commitIndex, lastVer); + ths->pLogStore->syncLogUpdateCommitIndex(ths->pLogStore, commitIndex); + return commitIndex; +} + +int64_t syncNodeCheckCommitIndex(SSyncNode* ths, SyncIndex indexLikely) { + if (indexLikely > ths->commitIndex && syncNodeAgreedUpon(ths, indexLikely)) { + SyncIndex commitIndex = indexLikely; + syncNodeUpdateCommitIndex(ths, commitIndex); + sInfo("vgId:%d, agreed upon. role:%d, term:%" PRId64 ", index: %" PRId64 "", ths->vgId, ths->state, + ths->pRaftStore->currentTerm, commitIndex); + } + return ths->commitIndex; +} + +int32_t syncLogBufferCatchingUpReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex fromIndex, SRaftId destId) { + taosThreadMutexLock(&pBuf->mutex); + SyncAppendEntries* pMsgOut = NULL; + SyncIndex index = fromIndex; + + if (pNode->state != TAOS_SYNC_STATE_LEADER || pNode->replicaNum <= 1) { + goto _out; + } + + if (index < pBuf->startIndex) { + sError("vgId:%d, (not implemented yet) replication fromIndex: %" PRId64 + " that is less than pBuf->startIndex: %" PRId64 ". destId: 0x%016" PRId64 "", + pNode->vgId, fromIndex, pBuf->startIndex, destId.addr); + goto _out; + } + + if (index > pBuf->matchIndex) { + goto _out; + } + + do { + pMsgOut = syncLogToAppendEntries(pBuf, pNode, index); + if (pMsgOut == NULL) { + sError("vgId:%d, failed to assembly append entries msg since %s. index: %" PRId64 "", pNode->vgId, terrstr(), + index); + goto _out; + } + + if (syncNodeSendAppendEntries(pNode, &destId, pMsgOut) < 0) { + sWarn("vgId:%d, failed to send append entries msg since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", + pNode->vgId, terrstr(), index, destId.addr); + goto _out; + } + + index += 1; + syncAppendEntriesDestroy(pMsgOut); + pMsgOut = NULL; + } while (false && index <= pBuf->commitIndex); + +_out: + syncAppendEntriesDestroy(pMsgOut); + pMsgOut = NULL; + taosThreadMutexUnlock(&pBuf->mutex); + return 0; +} + int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, SyncAppendEntriesReply* pMsg) { int32_t ret = 0; @@ -99,6 +163,63 @@ int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, SyncAppendEntriesReply* pMs return 0; } + if (ths->state == TAOS_SYNC_STATE_LEADER) { + if (pMsg->term > ths->pRaftStore->currentTerm) { + syncLogRecvAppendEntriesReply(ths, pMsg, "error term"); + syncNodeStepDown(ths, pMsg->term); + return -1; + } + + ASSERT(pMsg->term == ths->pRaftStore->currentTerm); + + sInfo("vgId:%d received append entries reply. srcId:0x%016" PRIx64 ", term:%" PRId64 ", matchIndex:%" PRId64 "", + pMsg->vgId, pMsg->srcId.addr, pMsg->term, pMsg->matchIndex); + + if (pMsg->success) { + SyncIndex oldMatchIndex = syncIndexMgrGetIndex(ths->pMatchIndex, &(pMsg->srcId)); + if (pMsg->matchIndex > oldMatchIndex) { + syncIndexMgrSetIndex(ths->pMatchIndex, &(pMsg->srcId), pMsg->matchIndex); + } + + // commit if needed + SyncIndex indexLikely = TMIN(pMsg->matchIndex, ths->pLogBuf->matchIndex); + SyncIndex commitIndex = syncNodeCheckCommitIndex(ths, indexLikely); + (void)syncLogBufferCommit(ths->pLogBuf, ths, commitIndex); + } else { + SyncIndex nextIndex = syncIndexMgrGetIndex(ths->pNextIndex, &(pMsg->srcId)); + if (nextIndex > SYNC_INDEX_BEGIN) { + --nextIndex; + } + syncIndexMgrSetIndex(ths->pNextIndex, &(pMsg->srcId), nextIndex); + } + + // send next append entries + SPeerState* pState = syncNodeGetPeerState(ths, &(pMsg->srcId)); + ASSERT(pState != NULL); + + if (pMsg->lastSendIndex == pState->lastSendIndex) { + syncNodeReplicateOne(ths, &(pMsg->srcId)); + } + } + + return 0; +} + +int32_t syncNodeOnAppendEntriesReplyOld(SSyncNode* ths, SyncAppendEntriesReply* pMsg) { + int32_t ret = 0; + + // if already drop replica, do not process + if (!syncNodeInRaftGroup(ths, &(pMsg->srcId))) { + syncLogRecvAppendEntriesReply(ths, pMsg, "not in my config"); + return 0; + } + + // drop stale response + if (pMsg->term < ths->pRaftStore->currentTerm) { + syncLogRecvAppendEntriesReply(ths, pMsg, "drop stale response"); + return 0; + } + if (ths->state == TAOS_SYNC_STATE_LEADER) { if (pMsg->term > ths->pRaftStore->currentTerm) { syncLogRecvAppendEntriesReply(ths, pMsg, "error term"); @@ -135,4 +256,4 @@ int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, SyncAppendEntriesReply* pMs syncLogRecvAppendEntriesReply(ths, pMsg, "process"); return 0; -} \ No newline at end of file +} diff --git a/source/libs/sync/src/syncCommit.c b/source/libs/sync/src/syncCommit.c index 811a7b8e99..a96fa31f83 100644 --- a/source/libs/sync/src/syncCommit.c +++ b/source/libs/sync/src/syncCommit.c @@ -44,12 +44,100 @@ // IN commitIndex' = [commitIndex EXCEPT ![i] = newCommitIndex] // /\ UNCHANGED <> // + void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) { if (pSyncNode->state != TAOS_SYNC_STATE_LEADER) { syncNodeErrorLog(pSyncNode, "not leader, can not advance commit index"); return; } + // update commit index + SyncIndex newCommitIndex = pSyncNode->commitIndex; + for (SyncIndex index = syncNodeGetLastIndex(pSyncNode); index > pSyncNode->commitIndex; --index) { + bool agree = syncAgree(pSyncNode, index); + + if (agree) { + // term + SSyncRaftEntry* pEntry = NULL; + SLRUCache* pCache = pSyncNode->pLogStore->pCache; + LRUHandle* h = taosLRUCacheLookup(pCache, &index, sizeof(index)); + if (h) { + pEntry = (SSyncRaftEntry*)taosLRUCacheValue(pCache, h); + } else { + int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, index, &pEntry); + if (code != 0) { + char logBuf[128]; + snprintf(logBuf, sizeof(logBuf), "advance commit index error, read wal index:%" PRId64, index); + syncNodeErrorLog(pSyncNode, logBuf); + return; + } + } + // cannot commit, even if quorum agree. need check term! + if (pEntry->term <= pSyncNode->pRaftStore->currentTerm) { + // update commit index + newCommitIndex = index; + + if (h) { + taosLRUCacheRelease(pCache, h, false); + } else { + syncEntryDestroy(pEntry); + } + + break; + } else { + do { + char logBuf[128]; + snprintf(logBuf, sizeof(logBuf), "can not commit due to term not equal, index:%" PRId64 ", term:%" PRIu64, + pEntry->index, pEntry->term); + syncNodeEventLog(pSyncNode, logBuf); + } while (0); + } + + if (h) { + taosLRUCacheRelease(pCache, h, false); + } else { + syncEntryDestroy(pEntry); + } + } + } + + // advance commit index as large as possible + SyncIndex walCommitVer = logStoreWalCommitVer(pSyncNode->pLogStore); + if (walCommitVer > newCommitIndex) { + newCommitIndex = walCommitVer; + } + + // maybe execute fsm + if (newCommitIndex > pSyncNode->commitIndex) { + SyncIndex beginIndex = pSyncNode->commitIndex + 1; + SyncIndex endIndex = newCommitIndex; + + // update commit index + pSyncNode->commitIndex = newCommitIndex; + + // call back Wal + pSyncNode->pLogStore->syncLogUpdateCommitIndex(pSyncNode->pLogStore, pSyncNode->commitIndex); + + // execute fsm + if (pSyncNode->pFsm != NULL) { + int32_t code = syncNodeDoCommit(pSyncNode, beginIndex, endIndex, pSyncNode->state); + if (code != 0) { + char logBuf[128]; + snprintf(logBuf, sizeof(logBuf), "advance commit index error, do commit begin:%" PRId64 ", end:%" PRId64, + beginIndex, endIndex); + syncNodeErrorLog(pSyncNode, logBuf); + return; + } + } + } +} + +void syncMaybeAdvanceCommitIndexOld(SSyncNode* pSyncNode) { + if (pSyncNode->state != TAOS_SYNC_STATE_LEADER) { + syncNodeErrorLog(pSyncNode, "not leader, can not advance commit index"); + return; + } + // advance commit index to sanpshot first SSnapshot snapshot; pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot); @@ -93,7 +181,7 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) { if (h) { taosLRUCacheRelease(pCache, h, false); } else { - syncEntryDestory(pEntry); + syncEntryDestroy(pEntry); } break; @@ -109,7 +197,7 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) { if (h) { taosLRUCacheRelease(pCache, h, false); } else { - syncEntryDestory(pEntry); + syncEntryDestroy(pEntry); } } } @@ -245,13 +333,28 @@ bool syncAgree(SSyncNode* pSyncNode, SyncIndex index) { } */ -bool syncAgree(SSyncNode* pSyncNode, SyncIndex index) { +bool syncNodeAgreedUpon(SSyncNode* pNode, SyncIndex index) { + int count = 0; + SSyncIndexMgr* pMatches = pNode->pMatchIndex; + ASSERT(pNode->replicaNum == pMatches->replicaNum); + + for (int i = 0; i < pNode->replicaNum; i++) { + SyncIndex matchIndex = pMatches->index[i]; + if (matchIndex >= index) { + count++; + } + } + + return count >= pNode->quorum; +} + +bool syncAgree(SSyncNode* pNode, SyncIndex index) { int agreeCount = 0; - for (int i = 0; i < pSyncNode->replicaNum; ++i) { - if (syncAgreeIndex(pSyncNode, &(pSyncNode->replicasId[i]), index)) { + for (int i = 0; i < pNode->replicaNum; ++i) { + if (syncAgreeIndex(pNode, &(pNode->replicasId[i]), index)) { ++agreeCount; } - if (agreeCount >= pSyncNode->quorum) { + if (agreeCount >= pNode->quorum) { return true; } } diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 00c4ea76aa..c3267bafdc 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -105,19 +105,32 @@ int64_t syncOpen(SSyncInfo* pSyncInfo) { return pSyncNode->rid; } -void syncStart(int64_t rid) { +int32_t syncStart(int64_t rid) { SSyncNode* pSyncNode = (SSyncNode*)taosAcquireRef(tsNodeRefId, rid); if (pSyncNode == NULL) { - return; + sError("failed to acquire rid: %" PRId64 " of tsNodeReftId for pSyncNode", rid); + return -1; + } + + if (syncNodeRestore(pSyncNode) < 0) { + sError("vgId:%d, failed to restore raft log buffer since %s", pSyncNode->vgId, terrstr()); + return -1; } if (pSyncNode->pRaftCfg->isStandBy) { - syncNodeStartStandBy(pSyncNode); + if (syncNodeStartStandBy(pSyncNode) < 0) { + sError("vgId:%d, failed to start raft node as standby since %s", pSyncNode->vgId, terrstr()); + return -1; + } } else { - syncNodeStart(pSyncNode); + if (syncNodeStart(pSyncNode) < 0) { + sError("vgId:%d, failed to start sync node since %s", pSyncNode->vgId, terrstr()); + return -1; + } } taosReleaseRef(tsNodeRefId, pSyncNode->rid); + return 0; } void syncStartNormal(int64_t rid) { @@ -130,14 +143,15 @@ void syncStartNormal(int64_t rid) { taosReleaseRef(tsNodeRefId, pSyncNode->rid); } -void syncStartStandBy(int64_t rid) { +int32_t syncStartStandBy(int64_t rid) { SSyncNode* pSyncNode = (SSyncNode*)taosAcquireRef(tsNodeRefId, rid); if (pSyncNode == NULL) { - return; + return -1; } syncNodeStartStandBy(pSyncNode); taosReleaseRef(tsNodeRefId, pSyncNode->rid); + return 0; } void syncStop(int64_t rid) { @@ -661,7 +675,7 @@ int32_t syncGetSnapshotByIndex(int64_t rid, SyncIndex index, SSnapshot* pSnapsho int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, index, &pEntry); if (code != 0) { if (pEntry != NULL) { - syncEntryDestory(pEntry); + syncEntryDestroy(pEntry); } taosReleaseRef(tsNodeRefId, pSyncNode->rid); return -1; @@ -673,7 +687,7 @@ int32_t syncGetSnapshotByIndex(int64_t rid, SyncIndex index, SSnapshot* pSnapsho pSnapshot->lastApplyTerm = pEntry->term; pSnapshot->lastConfigIndex = syncNodeGetSnapshotConfigIndex(pSyncNode, index); - syncEntryDestory(pEntry); + syncEntryDestroy(pEntry); taosReleaseRef(tsNodeRefId, pSyncNode->rid); return 0; } @@ -1089,6 +1103,38 @@ int32_t syncHbTimerStop(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer) { return ret; } +SSyncLogBuffer* syncLogBufferCreate() { + SSyncLogBuffer* pBuf = taosMemoryCalloc(1, sizeof(SSyncLogBuffer)); + if (pBuf == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } + + pBuf->size = sizeof(pBuf->entries) / sizeof(pBuf->entries[0]); + + ASSERT(pBuf->size == TSDB_SYNC_LOG_BUFFER_SIZE); + + if (taosThreadMutexInit(&pBuf->mutex, NULL) < 0) { + sError("failed to init log buffer mutex due to %s", strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + return pBuf; + +_err: + taosMemoryFree(pBuf); + return NULL; +} + +void syncLogBufferDestroy(SSyncLogBuffer* pBuf) { + if (pBuf == NULL) { + return; + } + (void)taosThreadMutexDestroy(&pBuf->mutex); + (void)taosMemoryFree(pBuf); + return; +} + // open/close -------------- SSyncNode* syncNodeOpen(SSyncInfo* pOldSyncInfo) { SSyncInfo* pSyncInfo = (SSyncInfo*)pOldSyncInfo; @@ -1150,6 +1196,13 @@ SSyncNode* syncNodeOpen(SSyncInfo* pOldSyncInfo) { pSyncNode->FpEqMsg = pSyncInfo->FpEqMsg; pSyncNode->FpEqCtrlMsg = pSyncInfo->FpEqCtrlMsg; + // create raft log ring buffer + pSyncNode->pLogBuf = syncLogBufferCreate(); + if (pSyncNode->pLogBuf == NULL) { + sError("failed to init log buffer since %s. vgId:%d", terrstr(), pSyncNode->vgId); + goto _error; + } + // init raft config pSyncNode->pRaftCfg = raftCfgOpen(pSyncNode->configPath); if (pSyncNode->pRaftCfg == NULL) { @@ -1362,6 +1415,12 @@ SSyncNode* syncNodeOpen(SSyncInfo* pOldSyncInfo) { // snapshotting atomic_store_64(&pSyncNode->snapshottingIndex, SYNC_INDEX_INVALID); + // init log buffer + if (syncLogBufferInit(pSyncNode->pLogBuf, pSyncNode) < 0) { + sError("vgId:%d, failed to init raft log buffer since %s", pSyncNode->vgId, terrstr()); + ASSERT(false); + } + syncNodeEventLog(pSyncNode, "sync open"); return pSyncNode; @@ -1387,7 +1446,48 @@ void syncNodeMaybeUpdateCommitBySnapshot(SSyncNode* pSyncNode) { } } -void syncNodeStart(SSyncNode* pSyncNode) { +int32_t syncNodeRestore(SSyncNode* pSyncNode) { + ASSERT(pSyncNode->pLogStore != NULL && "log store not created"); + ASSERT(pSyncNode->pLogBuf != NULL && "ring log buffer not created"); + + SyncIndex lastVer = pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore); + SyncIndex commitIndex = pSyncNode->pLogStore->syncLogCommitIndex(pSyncNode->pLogStore); + SyncIndex endIndex = pSyncNode->pLogBuf->endIndex; + + commitIndex = TMAX(pSyncNode->commitIndex, commitIndex); + + if (syncLogBufferCommit(pSyncNode->pLogBuf, pSyncNode, commitIndex) < 0) { + return -1; + } + + if (endIndex <= lastVer) { + sError("vgId:%d, failed to load log entries into log buffers. commit index:%" PRId64 ", lastVer: %" PRId64 "", + pSyncNode->vgId, commitIndex, lastVer); + return -1; + } + + return 0; +} + +int32_t syncNodeStart(SSyncNode* pSyncNode) { + // start raft + if (pSyncNode->replicaNum == 1) { + raftStoreNextTerm(pSyncNode->pRaftStore); + syncNodeBecomeLeader(pSyncNode, "one replica start"); + + // Raft 3.6.2 Committing entries from previous terms + syncNodeAppendNoop(pSyncNode); + } else { + syncNodeBecomeFollower(pSyncNode, "first start"); + } + + int32_t ret = 0; + ret = syncNodeStartPingTimer(pSyncNode); + ASSERT(ret == 0); + return ret; +} + +void syncNodeStartOld(SSyncNode* pSyncNode) { // start raft if (pSyncNode->replicaNum == 1) { raftStoreNextTerm(pSyncNode->pRaftStore); @@ -1406,7 +1506,7 @@ void syncNodeStart(SSyncNode* pSyncNode) { ASSERT(ret == 0); } -void syncNodeStartStandBy(SSyncNode* pSyncNode) { +int32_t syncNodeStartStandBy(SSyncNode* pSyncNode) { // state change pSyncNode->state = TAOS_SYNC_STATE_FOLLOWER; syncNodeStopHeartbeatTimer(pSyncNode); @@ -1419,6 +1519,7 @@ void syncNodeStartStandBy(SSyncNode* pSyncNode) { ret = 0; ret = syncNodeStartPingTimer(pSyncNode); ASSERT(ret == 0); + return ret; } void syncNodeClose(SSyncNode* pSyncNode) { @@ -1443,6 +1544,8 @@ void syncNodeClose(SSyncNode* pSyncNode) { pSyncNode->pMatchIndex = NULL; logStoreDestory(pSyncNode->pLogStore); pSyncNode->pLogStore = NULL; + syncLogBufferDestroy(pSyncNode->pLogBuf); + pSyncNode->pLogBuf = NULL; raftCfgClose(pSyncNode->pRaftCfg); pSyncNode->pRaftCfg = NULL; @@ -2341,6 +2444,43 @@ void syncNodeStepDown(SSyncNode* pSyncNode, SyncTerm newTerm) { void syncNodeLeaderChangeRsp(SSyncNode* pSyncNode) { syncRespCleanRsp(pSyncNode->pSyncRespMgr); } +int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SyncIndex toIndex) { + ASSERT(pBuf->commitIndex < toIndex && toIndex <= pBuf->endIndex); + + SyncIndex index = pBuf->endIndex - 1; + while (index >= toIndex) { + SSyncRaftEntry* pEntry = pBuf->entries[index % pBuf->size].pItem; + if (pEntry != NULL) { + syncEntryDestroy(pEntry); + pEntry = NULL; + memset(&pBuf->entries[index % pBuf->size], 0, sizeof(pBuf->entries[0])); + } + index--; + } + pBuf->endIndex = toIndex; + pBuf->matchIndex = TMIN(pBuf->matchIndex, index); + ASSERT(index + 1 == toIndex); + return 0; +} + +int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode) { + taosThreadMutexLock(&pBuf->mutex); + SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); + ASSERT(lastVer == pBuf->matchIndex); + SyncIndex index = pBuf->endIndex - 1; + + (void)syncLogBufferRollback(pBuf, pBuf->matchIndex + 1); + + sInfo("vgId:%d, reset log buffer. start index: %" PRId64 ", commit index: %" PRId64 ", match Index: %" PRId64 + ", end index: %" PRId64 "", + pNode->vgId, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + + pBuf->endIndex = pBuf->matchIndex + 1; + + taosThreadMutexUnlock(&pBuf->mutex); + return 0; +} + void syncNodeBecomeFollower(SSyncNode* pSyncNode, const char* debugStr) { // maybe clear leader cache if (pSyncNode->state == TAOS_SYNC_STATE_LEADER) { @@ -2365,6 +2505,9 @@ void syncNodeBecomeFollower(SSyncNode* pSyncNode, const char* debugStr) { // min match index pSyncNode->minMatchIndex = SYNC_INDEX_INVALID; + // reset log buffer + syncLogBufferReset(pSyncNode->pLogBuf, pSyncNode); + // trace log do { int32_t debugStrLen = strlen(debugStr); @@ -2403,7 +2546,8 @@ void syncNodeBecomeLeader(SSyncNode* pSyncNode, const char* debugStr) { pSyncNode->leaderTime = taosGetTimestampMs(); // reset restoreFinish - pSyncNode->restoreFinish = false; + // TODO: disable it temporarily + // pSyncNode->restoreFinish = false; // state change pSyncNode->state = TAOS_SYNC_STATE_LEADER; @@ -2467,6 +2611,9 @@ void syncNodeBecomeLeader(SSyncNode* pSyncNode, const char* debugStr) { // min match index pSyncNode->minMatchIndex = SYNC_INDEX_INVALID; + // reset log buffer + syncLogBufferReset(pSyncNode->pLogBuf, pSyncNode); + // trace log do { int32_t debugStrLen = strlen(debugStr); @@ -2490,6 +2637,17 @@ void syncNodeCandidate2Leader(SSyncNode* pSyncNode) { syncNodeLog2("==state change syncNodeCandidate2Leader==", pSyncNode); + // Raft 3.6.2 Committing entries from previous terms + syncNodeAppendNoop(pSyncNode); +} + +void syncNodeCandidate2LeaderOld(SSyncNode* pSyncNode) { + ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE); + ASSERT(voteGrantedMajority(pSyncNode->pVotesGranted)); + syncNodeBecomeLeader(pSyncNode, "candidate to leader"); + + syncNodeLog2("==state change syncNodeCandidate2Leader==", pSyncNode); + // Raft 3.6.2 Committing entries from previous terms syncNodeAppendNoop(pSyncNode); syncMaybeAdvanceCommitIndex(pSyncNode); @@ -2941,7 +3099,46 @@ static int32_t syncCacheEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry, return code; } +int32_t syncNodeAppend(SSyncNode* ths, SSyncRaftEntry* pEntry) { + // append to log buffer + if (syncLogBufferAppend(ths->pLogBuf, ths, pEntry) < 0) { + sError("vgId:%d, failed to enqueue log buffer. index:%" PRId64 "", ths->vgId, pEntry->index); + return -1; + } + + // proceed match index, with replicating on needed + SyncIndex matchIndex = syncLogBufferProceed(ths->pLogBuf, ths); + + // multi replica + if (ths->replicaNum > 1) { + return 0; + } + + // single replica + (void)syncNodeUpdateCommitIndex(ths, matchIndex); + + if (syncLogBufferCommit(ths->pLogBuf, ths, ths->commitIndex) < 0) { + sError("vgId:%d, failed to commit until commitIndex:%" PRId64 "", ths->vgId, ths->commitIndex); + return -1; + } + + return 0; +} + static int32_t syncNodeAppendNoop(SSyncNode* ths) { + SyncIndex index = syncLogBufferGetEndIndex(ths->pLogBuf); + SyncTerm term = ths->pRaftStore->currentTerm; + + SSyncRaftEntry* pEntry = syncEntryBuildNoop(term, index, ths->vgId); + if (pEntry == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } + + return syncNodeAppend(ths, pEntry); +} + +static int32_t syncNodeAppendNoopOld(SSyncNode* ths) { int32_t ret = 0; SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore); @@ -2963,7 +3160,7 @@ static int32_t syncNodeAppendNoop(SSyncNode* ths) { if (h) { taosLRUCacheRelease(ths->pLogStore->pCache, h, false); } else { - syncEntryDestory(pEntry); + syncEntryDestroy(pEntry); } return ret; @@ -3055,6 +3252,114 @@ int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, SyncHeartbeatReply* pMsg) { return 0; } +int64_t syncLogBufferGetEndIndex(SSyncLogBuffer* pBuf) { + taosThreadMutexLock(&pBuf->mutex); + int64_t index = pBuf->endIndex; + taosThreadMutexUnlock(&pBuf->mutex); + return index; +} + +int32_t syncLogBufferAppend(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry) { + taosThreadMutexLock(&pBuf->mutex); + syncLogBufferValidate(pBuf); + SyncIndex index = pEntry->index; + + if (index - pBuf->startIndex > pBuf->size) { + sError("vgId:%d, failed to append due to log buffer full. index:%" PRId64 "", pNode->vgId, index); + goto _out; + } + + ASSERT(index == pBuf->endIndex); + + SSyncRaftEntry* pExist = pBuf->entries[index % pBuf->size].pItem; + ASSERT(pExist == NULL); + + // initial log buffer with at least one item, e.g. commitIndex + SSyncRaftEntry* pMatch = pBuf->entries[(index - 1 + pBuf->size) % pBuf->size].pItem; + ASSERT(pMatch != NULL && "no matched raft log entry"); + ASSERT(pMatch->index + 1 == index); + + SSyncLogBufEntry tmp = {.pItem = pEntry, .prevLogIndex = pMatch->index, .prevLogTerm = pMatch->term}; + pBuf->entries[index % pBuf->size] = tmp; + pBuf->endIndex = index + 1; + + syncLogBufferValidate(pBuf); + taosThreadMutexUnlock(&pBuf->mutex); + return 0; + +_out: + syncLogBufferValidate(pBuf); + syncEntryDestroy(pEntry); + taosThreadMutexUnlock(&pBuf->mutex); + return -1; +} + +SyncTerm syncLogBufferGetTerm(SSyncLogBuffer* pBuf, SyncIndex index) { + ASSERT(pBuf->startIndex <= index && index < pBuf->endIndex); + SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; + ASSERT(pEntry != NULL); + return pEntry->term; +} + +SyncAppendEntries* syncLogToAppendEntries(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index) { + SyncAppendEntries* pMsg = NULL; + + if (index < pBuf->startIndex || index >= pBuf->endIndex) { + sError("vgId:%d, log entry (%" PRId64 ") out of range of log buffer [%" PRId64 ", %" PRId64 ").", pNode->vgId, + index, pBuf->startIndex, pBuf->endIndex); + return pMsg; + } + + SSyncRaftEntry* pEntry = pBuf->entries[index % pBuf->size].pItem; + if (pEntry == NULL) { + sError("vgId:%d, log entry (%" PRId64 ") not exist in log buffer [%" PRId64 ", %" PRId64 ").", pNode->vgId, index, + pBuf->startIndex, pBuf->endIndex); + return pMsg; + } + + uint32_t datalen = pEntry->bytes; + pMsg = syncAppendEntriesBuild(datalen, pNode->vgId); + if (pMsg == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } + + (void)memcpy(pMsg->data, pEntry, datalen); + + pMsg->prevLogIndex = index - 1; + pMsg->prevLogTerm = syncLogBufferGetTerm(pBuf, pMsg->prevLogIndex); + pMsg->vgId = pNode->vgId; + pMsg->srcId = pNode->myRaftId; + pMsg->term = pNode->pRaftStore->currentTerm; + pMsg->commitIndex = pNode->commitIndex; + pMsg->privateTerm = 0; + return pMsg; +} + +void syncLogReplicateAppendEntries(SSyncNode* pNode, SyncAppendEntries* pMsg) { + for (int i = 0; i < pNode->replicaNum; i++) { + SRaftId* pDestId = &pNode->peersId[i]; + if (!syncUtilSameId(pDestId, &pNode->myRaftId)) { + (void)syncNodeSendAppendEntries(pNode, pDestId, pMsg); + } + } +} + +int32_t syncLogBufferReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index) { + SyncAppendEntries* pMsgOut = syncLogToAppendEntries(pNode->pLogBuf, pNode, index); + if (pMsgOut == NULL) { + sError("vgId:%d, failed to get append entries for index:%" PRId64 "", pNode->vgId, index); + goto _err; + } + + // replicate pMsgOut + (void)syncLogReplicateAppendEntries(pNode, pMsgOut); + +_err: + syncAppendEntriesDestroy(pMsgOut); + return 0; +} + // TLA+ Spec // ClientRequest(i, v) == // /\ state[i] = Leader @@ -3069,6 +3374,31 @@ int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, SyncHeartbeatReply* pMsg) { int32_t syncNodeOnClientRequest(SSyncNode* ths, SyncClientRequest* pMsg, SyncIndex* pRetIndex) { syncNodeEventLog(ths, "on client request"); + int32_t code = 0; + + SyncIndex index = syncLogBufferGetEndIndex(ths->pLogBuf); + SyncTerm term = ths->pRaftStore->currentTerm; + SSyncRaftEntry* pEntry = NULL; + pEntry = syncEntryBuild2((SyncClientRequest*)pMsg, term, index); + if (pEntry == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } + + if (ths->state == TAOS_SYNC_STATE_LEADER) { + if (pRetIndex) { + (*pRetIndex) = index; + } + + return syncNodeAppend(ths, pEntry); + } + + return 0; +} + +int32_t syncNodeOnClientRequestOld(SSyncNode* ths, SyncClientRequest* pMsg, SyncIndex* pRetIndex) { + syncNodeEventLog(ths, "on client request"); + int32_t ret = 0; int32_t code = 0; @@ -3085,11 +3415,11 @@ int32_t syncNodeOnClientRequest(SSyncNode* ths, SyncClientRequest* pMsg, SyncInd code = ths->pLogStore->syncLogAppendEntry(ths->pLogStore, pEntry); if (code != 0) { // del resp mgr, call FpCommitCb - ASSERT(0); + sError("vgId:%d, failed to append log entry since %s", ths->vgId, terrstr()); return -1; } - // if mulit replica, start replicate right now + // if multi replica, start replicate right now if (ths->replicaNum > 1) { syncNodeReplicate(ths); } @@ -3111,7 +3441,7 @@ int32_t syncNodeOnClientRequest(SSyncNode* ths, SyncClientRequest* pMsg, SyncInd if (h) { taosLRUCacheRelease(ths->pLogStore->pCache, h, false); } else { - syncEntryDestory(pEntry); + syncEntryDestroy(pEntry); } return ret; @@ -3305,6 +3635,7 @@ static int32_t syncNodeProposeConfigChangeFinish(SSyncNode* ths, SyncReconfigFin } bool syncNodeIsOptimizedOneReplica(SSyncNode* ths, SRpcMsg* pMsg) { + return false; return (ths->replicaNum == 1 && syncUtilUserCommit(pMsg->msgType) && ths->vgId != 1); } @@ -3432,7 +3763,7 @@ int32_t syncNodeDoCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endInde if (h) { taosLRUCacheRelease(pCache, h, false); } else { - syncEntryDestory(pEntry); + syncEntryDestroy(pEntry); } } } @@ -3703,4 +4034,4 @@ void syncLogRecvHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* p snprintf(logBuf, sizeof(logBuf), "recv sync-heartbeat-reply from %s:%d {term:%" PRIu64 ", pterm:%" PRIu64 "}, %s", host, port, pMsg->term, pMsg->privateTerm, s); syncNodeEventLog(pSyncNode, logBuf); -} \ No newline at end of file +} diff --git a/source/libs/sync/src/syncRaftEntry.c b/source/libs/sync/src/syncRaftEntry.c index 940aaca055..38b8574afa 100644 --- a/source/libs/sync/src/syncRaftEntry.c +++ b/source/libs/sync/src/syncRaftEntry.c @@ -96,7 +96,7 @@ SSyncRaftEntry* syncEntryBuildNoop(SyncTerm term, SyncIndex index, int32_t vgId) return pEntry; } -void syncEntryDestory(SSyncRaftEntry* pEntry) { +void syncEntryDestroy(SSyncRaftEntry* pEntry) { if (pEntry != NULL) { taosMemoryFree(pEntry); } @@ -454,7 +454,7 @@ static int cmpFn(const void* p1, const void* p2) { return memcmp(p1, p2, sizeof( static void freeRaftEntry(void* param) { SSyncRaftEntry* pEntry = (SSyncRaftEntry*)param; - syncEntryDestory(pEntry); + syncEntryDestroy(pEntry); } SRaftEntryCache* raftEntryCacheCreate(SSyncNode* pSyncNode, int32_t maxCount) { @@ -588,7 +588,7 @@ int32_t raftEntryCacheClear(struct SRaftEntryCache* pCache, int32_t count) { SSkipListNode* pNode = tSkipListIterGet(pIter); ASSERT(pNode != NULL); SSyncRaftEntry* pEntry = (SSyncRaftEntry*)SL_GET_NODE_DATA(pNode); - syncEntryDestory(pEntry); + syncEntryDestroy(pEntry); ++returnCnt; } tSkipListDestroyIter(pIter); @@ -617,7 +617,7 @@ int32_t raftEntryCacheClear(struct SRaftEntryCache* pCache, int32_t count) { ++returnCnt; SSyncRaftEntry* pEntry = (SSyncRaftEntry*)SL_GET_NODE_DATA(pNode); - // syncEntryDestory(pEntry); + // syncEntryDestroy(pEntry); taosRemoveRef(pCache->refMgr, pEntry->rid); } tSkipListDestroyIter(pIter); diff --git a/source/libs/sync/src/syncRaftLog.c b/source/libs/sync/src/syncRaftLog.c index 23d076cfbc..3db970ba00 100644 --- a/source/libs/sync/src/syncRaftLog.c +++ b/source/libs/sync/src/syncRaftLog.c @@ -152,7 +152,6 @@ static int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore) { } static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore) { - SyncIndex lastIndex; SSyncLogStoreData* pData = pLogStore->data; SWal* pWal = pData->pWal; SyncIndex lastVer = walGetLastVer(pWal); @@ -207,7 +206,7 @@ static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntr syncMeta.isWeek = pEntry->isWeak; syncMeta.seqNum = pEntry->seqNum; syncMeta.term = pEntry->term; - index = walAppendLog(pWal, pEntry->originalRpcType, syncMeta, pEntry->data, pEntry->dataLen); + index = walAppendLog(pWal, pEntry->index, pEntry->originalRpcType, syncMeta, pEntry->data, pEntry->dataLen); if (index < 0) { int32_t err = terrno; const char* errStr = tstrerror(err); @@ -218,11 +217,10 @@ static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntr snprintf(logBuf, sizeof(logBuf), "wal write error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", pEntry->index, err, err, errStr, sysErr, sysErrStr); syncNodeErrorLog(pData->pSyncNode, logBuf); - - ASSERT(0); return -1; } - pEntry->index = index; + + ASSERT(pEntry->index == index); do { char eventLog[128]; @@ -326,8 +324,7 @@ static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIn const char* sysErrStr = strerror(errno); sError("vgId:%d, wal truncate error, from-index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", pData->pSyncNode->vgId, fromIndex, err, err, errStr, sysErr, sysErrStr); - - ASSERT(0); + return -1; } // event log @@ -365,7 +362,6 @@ static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** pp int32_t raftLogUpdateCommitIndex(SSyncLogStore* pLogStore, SyncIndex index) { SSyncLogStoreData* pData = pLogStore->data; SWal* pWal = pData->pWal; - // ASSERT(walCommit(pWal, index) == 0); int32_t code = walCommit(pWal, index); if (code != 0) { int32_t err = terrno; @@ -374,8 +370,7 @@ int32_t raftLogUpdateCommitIndex(SSyncLogStore* pLogStore, SyncIndex index) { const char* sysErrStr = strerror(errno); sError("vgId:%d, wal update commit index error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", pData->pSyncNode->vgId, index, err, err, errStr, sysErr, sysErrStr); - - ASSERT(0); + return -1; } return 0; } @@ -427,7 +422,7 @@ cJSON* logStore2Json(SSyncLogStore* pLogStore) { raftLogGetEntry(pLogStore, i, &pEntry); cJSON_AddItemToArray(pEntries, syncEntry2Json(pEntry)); - syncEntryDestory(pEntry); + syncEntryDestroy(pEntry); } } } diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c index e040310e15..181b9f2b74 100644 --- a/source/libs/sync/src/syncReplication.c +++ b/source/libs/sync/src/syncReplication.c @@ -55,7 +55,11 @@ int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId) { // maybe start snapshot SyncIndex logStartIndex = pSyncNode->pLogStore->syncLogBeginIndex(pSyncNode->pLogStore); SyncIndex logEndIndex = pSyncNode->pLogStore->syncLogEndIndex(pSyncNode->pLogStore); - if (nextIndex < logStartIndex || nextIndex - 1 > logEndIndex) { + if (nextIndex > logEndIndex) { + return 0; + } + + if (nextIndex < logStartIndex) { char logBuf[128]; snprintf(logBuf, sizeof(logBuf), "start snapshot for next-index:%" PRId64 ", start:%" PRId64 ", end:%" PRId64, nextIndex, logStartIndex, logEndIndex); @@ -90,7 +94,7 @@ int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId) { memcpy(pMsg->data, serialized, len); taosMemoryFree(serialized); - syncEntryDestory(pEntry); + syncEntryDestroy(pEntry); } else { if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) { @@ -154,8 +158,10 @@ int32_t syncNodeReplicate(SSyncNode* pSyncNode) { return 0; } -int32_t syncNodeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftId, const SyncAppendEntries* pMsg) { +int32_t syncNodeSendAppendEntries(SSyncNode* pSyncNode, SRaftId* destRaftId, SyncAppendEntries* pMsg) { int32_t ret = 0; + pMsg->destId = *destRaftId; + syncLogSendAppendEntries(pSyncNode, pMsg, ""); SRpcMsg rpcMsg; @@ -163,7 +169,10 @@ int32_t syncNodeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftI syncNodeSendMsgById(destRaftId, pSyncNode, &rpcMsg); SPeerState* pState = syncNodeGetPeerState(pSyncNode, destRaftId); - ASSERT(pState != NULL); + if (pState == NULL) { + sError("vgId:%d, failed to get peer state for addr:0x%016" PRIx64 "", pSyncNode->vgId, destRaftId->addr); + return -1; + } if (pMsg->dataLen > 0) { pState->lastSendIndex = pMsg->prevLogIndex + 1; @@ -173,7 +182,7 @@ int32_t syncNodeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftI return ret; } -int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftId, const SyncAppendEntries* pMsg) { +int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pSyncNode, SRaftId* destRaftId, SyncAppendEntries* pMsg) { int32_t ret = 0; if (syncNodeNeedSendAppendEntries(pSyncNode, destRaftId, pMsg)) { ret = syncNodeSendAppendEntries(pSyncNode, destRaftId, pMsg); @@ -231,4 +240,4 @@ int32_t syncNodeHeartbeatPeers(SSyncNode* pSyncNode) { } return 0; -} \ No newline at end of file +} diff --git a/source/libs/sync/src/syncSnapshot.c b/source/libs/sync/src/syncSnapshot.c index a7bafa9f28..43c9ec2980 100644 --- a/source/libs/sync/src/syncSnapshot.c +++ b/source/libs/sync/src/syncSnapshot.c @@ -139,7 +139,7 @@ int32_t snapshotSenderStart(SSyncSnapshotSender *pSender, SSnapshotParam snapsho getLastConfig = true; rpcFreeCont(rpcMsg.pCont); - syncEntryDestory(pEntry); + syncEntryDestroy(pEntry); } else { if (pSender->snapshot.lastConfigIndex == pSender->pSyncNode->pRaftCfg->lastConfigIndex) { sTrace("vgId:%d, sync sender get cfg from local", pSender->pSyncNode->vgId); diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index 3f36a058e5..6dda38653d 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -194,7 +194,8 @@ int tdbBtreeInsert(SBTree *pBt, const void *pKey, int kLen, const void *pVal, in btc.idx++; } else if (c == 0) { // dup key not allowed - ASSERT(0); + tdbError("unable to insert dup key. pKey: %p, kLen: %d, btc: %p, pTxn: %p", pKey, kLen, &btc, pTxn); + // ASSERT(0); return -1; } } diff --git a/source/libs/wal/src/walWrite.c b/source/libs/wal/src/walWrite.c index 527ffa0056..7ddebc5424 100644 --- a/source/libs/wal/src/walWrite.c +++ b/source/libs/wal/src/walWrite.c @@ -519,10 +519,15 @@ END: return -1; } -int64_t walAppendLog(SWal *pWal, tmsg_t msgType, SWalSyncInfo syncMeta, const void *body, int32_t bodyLen) { +int64_t walAppendLog(SWal *pWal, int64_t index, tmsg_t msgType, SWalSyncInfo syncMeta, const void *body, + int32_t bodyLen) { taosThreadMutexLock(&pWal->mutex); - int64_t index = pWal->vers.lastVer + 1; + if (index != pWal->vers.lastVer + 1) { + terrno = TSDB_CODE_WAL_INVALID_VER; + taosThreadMutexUnlock(&pWal->mutex); + return -1; + } if (walCheckAndRoll(pWal) < 0) { taosThreadMutexUnlock(&pWal->mutex); From def4058eb113a2bf601aed2f12adabdc2b953e93 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Fri, 11 Nov 2022 22:55:21 +0800 Subject: [PATCH 002/105] feat: impl pipelining negotiation --- include/libs/sync/sync.h | 2 + include/os/osTime.h | 7 + include/util/tdef.h | 2 +- source/libs/sync/inc/syncInt.h | 67 +++- source/libs/sync/src/syncAppendEntries.c | 118 +++--- source/libs/sync/src/syncAppendEntriesReply.c | 123 +++--- source/libs/sync/src/syncIndexMgr.c | 9 + source/libs/sync/src/syncMain.c | 368 ++++++++++++++++-- source/libs/sync/src/syncReplication.c | 27 +- source/libs/transport/src/tmsgcb.c | 3 + 10 files changed, 593 insertions(+), 133 deletions(-) diff --git a/include/libs/sync/sync.h b/include/libs/sync/sync.h index 7ed8414906..a477cea93c 100644 --- a/include/libs/sync/sync.h +++ b/include/libs/sync/sync.h @@ -40,6 +40,8 @@ extern bool gRaftDetailLog; #define SYNC_MNODE_LOG_RETENTION 10000 #define SYNC_VNODE_LOG_RETENTION 500 +#define SYNC_MAX_RETRY_BACKOFF 5 +#define SYNC_LOG_REPL_RETRY_WAIT_MS 50 #define SYNC_APPEND_ENTRIES_TIMEOUT_MS 10000 #define SYNC_MAX_BATCH_SIZE 1 diff --git a/include/os/osTime.h b/include/os/osTime.h index 48f046d4d0..88eabd206d 100644 --- a/include/os/osTime.h +++ b/include/os/osTime.h @@ -82,6 +82,13 @@ static FORCE_INLINE int64_t taosGetTimestampNs() { return (int64_t)systemTime.tv_sec * 1000000000LL + (int64_t)systemTime.tv_nsec; } +//@return timestamp of monotonic clock in millisecond +static FORCE_INLINE int64_t taosGetMonoTimestampMs() { + struct timespec systemTime = {0}; + taosClockGetTime(CLOCK_MONOTONIC, &systemTime); + return (int64_t)systemTime.tv_sec * 1000LL + (int64_t)systemTime.tv_nsec / 1000000; +} + char *taosStrpTime(const char *buf, const char *fmt, struct tm *tm); struct tm *taosLocalTime(const time_t *timep, struct tm *result); struct tm *taosLocalTimeNolock(struct tm *result, const time_t *timep, int dst); diff --git a/include/util/tdef.h b/include/util/tdef.h index 0b7f9b28fa..c5776e8d87 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -281,7 +281,7 @@ typedef enum ELogicConditionType { #define TSDB_DNODE_ROLE_VNODE 2 #define TSDB_MAX_REPLICA 5 -#define TSDB_SYNC_LOG_BUFFER_SIZE 500 +#define TSDB_SYNC_LOG_BUFFER_SIZE 512 #define TSDB_TBNAME_COLUMN_INDEX (-1) #define TSDB_MULTI_TABLEMETA_MAX_NUM 100000 // maximum batch size allowed to load table meta diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index bd97187ce7..58b32ed025 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -88,6 +88,60 @@ typedef struct SPeerState { int64_t lastSendTime; } SPeerState; +typedef struct SSyncReplInfo { + bool barrier; + bool acked; + int64_t timeMs; + int64_t term; +} SSyncReplInfo; + +typedef struct SSyncLogReplMgr { + SSyncReplInfo states[TSDB_SYNC_LOG_BUFFER_SIZE]; + int64_t startIndex; + int64_t matchIndex; + int64_t endIndex; + int64_t size; + bool restored; + int64_t peerStartTime; + int32_t retryBackoff; + int32_t peerId; +} SSyncLogReplMgr; + +SSyncLogReplMgr* syncLogReplMgrCreate(); +void syncLogReplMgrDestroy(SSyncLogReplMgr* pMgr); + +// access +static FORCE_INLINE int64_t syncLogGetRetryBackoffTimeMs(SSyncLogReplMgr* pMgr) { + return (1 << pMgr->retryBackoff) * SYNC_LOG_REPL_RETRY_WAIT_MS; +} + +static FORCE_INLINE int32_t syncLogGetNextRetryBackoff(SSyncLogReplMgr* pMgr) { + return TMIN(pMgr->retryBackoff + 1, SYNC_MAX_RETRY_BACKOFF); +} + +static FORCE_INLINE int32_t syncLogReplMgrUpdateTerm(SSyncLogReplMgr* pMgr, SyncIndex index, SyncTerm term) { + if (index < pMgr->startIndex || index >= pMgr->endIndex) { + return -1; + } + pMgr->states[(index + pMgr->size) % pMgr->size].term = term; + return 0; +} + +SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index); +int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SRaftId* pDestId, + bool* pBarrier); +int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); +int32_t syncLogBufferReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); +int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); +int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); +int32_t syncLogResetLogReplMgr(SSyncLogReplMgr* pMgr); +int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); +int32_t syncLogReplMgrProcessReplyInNormalMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); +int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode); + +// others +bool syncLogReplMgrValidate(SSyncLogReplMgr* pMgr); + typedef struct SSyncLogBufEntry { SSyncRaftEntry* pItem; SyncIndex prevLogIndex; @@ -115,14 +169,15 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt int64_t syncLogBufferLoad(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex toIndex); int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode); int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t commitIndex); +SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index, bool* pInBuf); int64_t syncNodeUpdateCommitIndex(SSyncNode* ths, SyncIndex commtIndex); -SyncAppendEntries* syncLogToAppendEntries(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index); +SyncAppendEntries* syncLogToAppendEntries(SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm); // private int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf); int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SyncIndex toIndex); -int32_t syncLogBufferReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index); +int32_t syncLogBufferReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm); void syncIndexMgrSetIndex(SSyncIndexMgr* pSyncIndexMgr, const SRaftId* pRaftId, SyncIndex index); bool syncNodeAgreedUpon(SSyncNode* pNode, SyncIndex index); @@ -225,11 +280,14 @@ typedef struct SSyncNode { SSyncRespMgr* pSyncRespMgr; // restore state - _Atomic bool restoreFinish; + bool restoreFinish; // SSnapshot* pSnapshot; SSyncSnapshotSender* senders[TSDB_MAX_REPLICA]; SSyncSnapshotReceiver* pNewNodeReceiver; + // log replication mgr + SSyncLogReplMgr* logReplMgrs[TSDB_MAX_REPLICA]; + SPeerState peerStates[TSDB_MAX_REPLICA]; // is config changing @@ -309,6 +367,9 @@ void syncNodeCandidate2Follower(SSyncNode* pSyncNode); void syncNodeVoteForTerm(SSyncNode* pSyncNode, SyncTerm term, SRaftId* pRaftId); void syncNodeVoteForSelf(SSyncNode* pSyncNode); +// log replication +SSyncLogReplMgr* syncNodeGetLogReplMgr(SSyncNode* pNode, SRaftId* pDestId); + // snapshot -------------- bool syncNodeHasSnapshot(SSyncNode* pSyncNode); void syncNodeMaybeUpdateCommitBySnapshot(SSyncNode* pSyncNode); diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c index 9560ea269b..285981012e 100644 --- a/source/libs/sync/src/syncAppendEntries.c +++ b/source/libs/sync/src/syncAppendEntries.c @@ -18,6 +18,7 @@ #include "syncRaftCfg.h" #include "syncRaftLog.h" #include "syncRaftStore.h" +#include "syncReplication.h" #include "syncSnapshot.h" #include "syncUtil.h" #include "syncVoteMgr.h" @@ -318,16 +319,17 @@ int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { ASSERT(pNode->pFsm != NULL && "pFsm not registered"); ASSERT(pNode->pFsm->FpGetSnapshotInfo != NULL && "FpGetSnapshotInfo not registered"); - SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); SSnapshot snapshot; if (pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot) < 0) { sError("vgId:%d, failed to get snapshot info since %s", pNode->vgId, terrstr()); goto _err; } + SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); SyncIndex commitIndex = snapshot.lastApplyIndex; SyncTerm commitTerm = snapshot.lastApplyTerm; SyncIndex toIndex = TMAX(lastVer, commitIndex); + ASSERT(lastVer >= commitIndex); // update match index pBuf->commitIndex = commitIndex; @@ -392,7 +394,7 @@ int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { } // update startIndex - pBuf->startIndex = index; + pBuf->startIndex = takeDummy ? index : index + 1; // validate syncLogBufferValidate(pBuf); @@ -491,18 +493,44 @@ int32_t syncLogBufferRollbackMatchIndex(SSyncLogBuffer* pBuf, SSyncNode* pNode, return 0; } +FORCE_INLINE SyncTerm syncLogBufferGetLastMatchTerm(SSyncLogBuffer* pBuf) { + SyncIndex index = pBuf->matchIndex; + SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; + ASSERT(pEntry != NULL); + return pEntry->term; +} + int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevTerm) { taosThreadMutexLock(&pBuf->mutex); syncLogBufferValidate(pBuf); - - int32_t ret = 0; + int32_t ret = -1; SyncIndex index = pEntry->index; SyncIndex prevIndex = pEntry->index - 1; - if (index <= pBuf->commitIndex || index - pBuf->startIndex > pBuf->size) { - sInfo("vgId:%d, cannot accept index:%" PRId64 " into log buffer. start index: %" PRId64 ", commit index: %" PRId64 - ", end index:%" PRId64 ")", - pNode->vgId, index, pBuf->startIndex, pBuf->commitIndex, pBuf->endIndex); - ret = (index <= pBuf->commitIndex) ? 0 : -1; + SyncTerm lastMatchTerm = syncLogBufferGetLastMatchTerm(pBuf); + + if (index <= pBuf->commitIndex) { + sInfo("vgId:%d, raft entry already committed. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, + pBuf->endIndex); + ret = 0; + goto _out; + } + + if (index - pBuf->startIndex >= pBuf->size) { + sInfo("vgId:%d, raft entry out of buffer capacity. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, + pBuf->endIndex); + goto _out; + } + + if (index > pBuf->matchIndex && lastMatchTerm != prevTerm) { + sInfo("vgId:%d, not ready to accept raft entry (i.e. across barrier). index: %" PRId64 ", term: %" PRId64 + ": prevterm: %" PRId64 " /= lastmatch: %" PRId64 ". log buffer: [%" PRId64 " %" PRId64 " %" PRId64 + ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, prevTerm, lastMatchTerm, pBuf->startIndex, pBuf->commitIndex, + pBuf->matchIndex, pBuf->endIndex); goto _out; } @@ -511,14 +539,16 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt if (pExist != NULL) { ASSERT(pEntry->index == pExist->index); - if (pEntry->term > pExist->term) { + if (pEntry->term != pExist->term) { (void)syncLogBufferRollback(pBuf, index); } else { - sInfo("vgId:%d, %s raft entry received. index:%" PRId64 ", term: %" PRId64 "", pNode->vgId, - ((pEntry->term < pExist->term) ? "stale" : "duplicate"), pEntry->index, pEntry->term); + sInfo("vgId:%d, duplicate raft entry received. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, + pBuf->endIndex); SyncTerm existPrevTerm = pBuf->entries[index % pBuf->size].prevLogTerm; - ASSERT(pEntry->term < pExist->term || (pEntry->term == pExist->term && prevTerm == existPrevTerm)); - ret = (pEntry->term < pExist->term) ? 0 : -1; + ASSERT(pEntry->term == pExist->term && prevTerm == existPrevTerm); + ret = 0; goto _out; } } @@ -531,6 +561,9 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt // update end index pBuf->endIndex = TMAX(index + 1, pBuf->endIndex); + // success + ret = 0; + _out: syncEntryDestroy(pEntry); syncLogBufferValidate(pBuf); @@ -550,6 +583,7 @@ SSyncRaftEntry* syncLogAppendEntriesToRaftEntry(const SyncAppendEntries* pMsg) { } int32_t syncLogStorePersist(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) { + ASSERT(pEntry->index >= 0); SyncIndex lastVer = pLogStore->syncLogLastIndex(pLogStore); if (lastVer >= pEntry->index && pLogStore->syncLogTruncate(pLogStore, pEntry->index) < 0) { sError("failed to truncate log store since %s. from index:%" PRId64 "", terrstr(), pEntry->index); @@ -563,6 +597,9 @@ int32_t syncLogStorePersist(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) { pEntry->term); return -1; } + + lastVer = pLogStore->syncLogLastIndex(pLogStore); + ASSERT(pEntry->index == lastVer); return 0; } @@ -607,10 +644,14 @@ int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode) { goto _out; } + // increase match index + pBuf->matchIndex = index; + + sInfo("vgId:%d, log buffer proceed. start index: %" PRId64 ", match index: %" PRId64 ", end index: %" PRId64, + pNode->vgId, pBuf->startIndex, pBuf->matchIndex, pBuf->endIndex); + // replicate on demand - if (pNode->state == TAOS_SYNC_STATE_LEADER && pNode->replicaNum > 1) { - (void)syncLogBufferReplicate(pBuf, pNode, index); - } + (void)syncNodeReplicate(pNode); // persist if (syncLogStorePersist(pLogStore, pEntry) < 0) { @@ -618,16 +659,15 @@ int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode) { terrstr(), pEntry->index); goto _out; } - - // increment - pBuf->matchIndex = index; - matchIndex = pBuf->matchIndex; + ASSERT(pEntry->index == pBuf->matchIndex); // update my match index + matchIndex = pBuf->matchIndex; syncIndexMgrSetIndex(pNode->pMatchIndex, &pNode->myRaftId, pBuf->matchIndex); } // end of while _out: + pBuf->matchIndex = matchIndex; syncLogBufferValidate(pBuf); taosThreadMutexUnlock(&pBuf->mutex); return matchIndex; @@ -659,7 +699,7 @@ int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf) { ASSERT(pBuf->commitIndex <= pBuf->matchIndex); ASSERT(pBuf->matchIndex < pBuf->endIndex); ASSERT(pBuf->endIndex - pBuf->startIndex <= pBuf->size); - for (SyncIndex index = pBuf->commitIndex; index <= pBuf->matchIndex; index++) { + for (SyncIndex index = pBuf->startIndex; index <= pBuf->matchIndex; index++) { SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; ASSERT(pEntry != NULL); } @@ -694,20 +734,11 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm // execute in fsm for (int64_t index = pBuf->commitIndex + 1; index <= upperIndex; index++) { // get a log entry - if (index >= pBuf->startIndex) { - inBuf = true; - pEntry = pBuf->entries[index % pBuf->size].pItem; - } else { - inBuf = false; - if (pLogStore->syncLogGetEntry(pLogStore, index, &pEntry) < 0) { - sError("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); - ret = -1; - goto _out; - } + pEntry = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf); + if (pEntry == NULL) { + goto _out; } - ASSERT(pEntry != NULL); - // execute it if (!syncUtilUserCommit(pEntry->originalRpcType)) { sInfo("vgId:%d, non-user msg in raft log entry. index: %" PRId64 ", term:%" PRId64 "", vgId, pEntry->index, @@ -738,8 +769,8 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm } // recycle - // TODO: with a grace period of one third of free space before commitIndex in ring buffer - SyncIndex until = pBuf->commitIndex; + SyncIndex used = pBuf->endIndex - pBuf->startIndex; + SyncIndex until = pBuf->commitIndex - (pBuf->size - used) / 2; for (SyncIndex index = pBuf->startIndex; index < until; index++) { SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; ASSERT(pEntry != NULL); @@ -796,9 +827,6 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) { syncNodeStepDown(ths, pMsg->term); syncNodeResetElectTimer(ths); - // update commit index - (void)syncNodeUpdateCommitIndex(ths, pMsg->commitIndex); - if (pMsg->dataLen < (int32_t)sizeof(SSyncRaftEntry)) { sError("vgId:%d, incomplete append entries received. prev index:%" PRId64 ", term:%" PRId64 ", datalen:%d", ths->vgId, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->dataLen); @@ -825,15 +853,17 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) { // accept if (syncLogBufferAccept(ths->pLogBuf, ths, pEntry, pMsg->prevLogTerm) < 0) { - sWarn("vgId:%d, failed to accept raft entry into log buffer. index:%" PRId64 ", term:%" PRId64, ths->vgId, - pEntry->index, pEntry->term); goto _SEND_RESPONSE; } - pReply->success = true; _SEND_RESPONSE: - // update match index pReply->matchIndex = syncLogBufferProceed(ths->pLogBuf, ths); + bool matched = (pReply->matchIndex >= pReply->lastSendIndex); + pReply->success = matched; + if (matched) { + // update commit index only after matching + (void)syncNodeUpdateCommitIndex(ths, pMsg->commitIndex); + } // ack, i.e. send response SRpcMsg rpcMsg; @@ -841,7 +871,7 @@ _SEND_RESPONSE: (void)syncNodeSendMsgById(&pReply->destId, ths, &rpcMsg); // commit index, i.e. leader notice me - if (syncLogBufferCommit(ths->pLogBuf, ths, pMsg->commitIndex) < 0) { + if (syncLogBufferCommit(ths->pLogBuf, ths, ths->commitIndex) < 0) { sError("vgId:%d, failed to commit raft fsm log since %s.", ths->vgId, terrstr()); goto _out; } diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index e37c40455c..86d8ec11b9 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -85,11 +85,11 @@ static void syncNodeStartSnapshotOnce(SSyncNode* ths, SyncIndex beginIndex, Sync } int64_t syncNodeUpdateCommitIndex(SSyncNode* ths, SyncIndex commitIndex) { - ths->commitIndex = TMAX(commitIndex, ths->commitIndex); SyncIndex lastVer = ths->pLogStore->syncLogLastIndex(ths->pLogStore); - commitIndex = TMIN(ths->commitIndex, lastVer); - ths->pLogStore->syncLogUpdateCommitIndex(ths->pLogStore, commitIndex); - return commitIndex; + commitIndex = TMAX(commitIndex, ths->commitIndex); + ths->commitIndex = TMIN(commitIndex, lastVer); + ths->pLogStore->syncLogUpdateCommitIndex(ths->pLogStore, ths->commitIndex); + return ths->commitIndex; } int64_t syncNodeCheckCommitIndex(SSyncNode* ths, SyncIndex indexLikely) { @@ -102,50 +102,77 @@ int64_t syncNodeCheckCommitIndex(SSyncNode* ths, SyncIndex indexLikely) { return ths->commitIndex; } -int32_t syncLogBufferCatchingUpReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex fromIndex, SRaftId destId) { - taosThreadMutexLock(&pBuf->mutex); +SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index, bool* pInBuf) { + SSyncRaftEntry* pEntry = NULL; + if (index >= pBuf->endIndex) { + return NULL; + } + if (index > pBuf->startIndex) { // startIndex might be dummy + *pInBuf = true; + pEntry = pBuf->entries[index % pBuf->size].pItem; + } else { + *pInBuf = false; + if (pNode->pLogStore->syncLogGetEntry(pNode->pLogStore, index, &pEntry) < 0) { + sError("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); + } + } + return pEntry; +} + +bool syncLogReplMgrValidate(SSyncLogReplMgr* pMgr) { + ASSERT(pMgr->startIndex <= pMgr->endIndex); + for (SyncIndex index = pMgr->startIndex; index < pMgr->endIndex; index++) { + ASSERT(pMgr->states[(index + pMgr->size) % pMgr->size].barrier == false || index + 1 == pMgr->endIndex); + } + return true; +} + +static FORCE_INLINE bool syncLogIsReplicationBarrier(SSyncRaftEntry* pEntry) { + return pEntry->originalRpcType == TDMT_SYNC_NOOP; +} + +int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SRaftId* pDestId, + bool* pBarrier) { + SSyncRaftEntry* pEntry = NULL; SyncAppendEntries* pMsgOut = NULL; - SyncIndex index = fromIndex; + bool inBuf = false; + int32_t ret = -1; + SyncTerm prevLogTerm = -1; + SSyncLogBuffer* pBuf = pNode->pLogBuf; - if (pNode->state != TAOS_SYNC_STATE_LEADER || pNode->replicaNum <= 1) { + sInfo("vgId:%d, replicate one msg index: %" PRId64 " to dest: 0x%016" PRIx64, pNode->vgId, index, pDestId->addr); + + pEntry = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf); + if (pEntry == NULL) { + sError("vgId:%d, failed to get raft entry for index: %" PRId64 "", pNode->vgId, index); + goto _out; + } + *pBarrier = syncLogIsReplicationBarrier(pEntry); + + prevLogTerm = syncLogReplMgrGetPrevLogTerm(pMgr, pNode, index); + if (prevLogTerm < 0 && terrno != TSDB_CODE_SUCCESS) { + sError("vgId:%d, failed to get prev log term since %s. index: %" PRId64 "", pNode->vgId, terrstr(), index); + goto _out; + } + (void)syncLogReplMgrUpdateTerm(pMgr, pEntry->index, pEntry->term); + + pMsgOut = syncLogToAppendEntries(pNode, pEntry, prevLogTerm); + if (pMsgOut == NULL) { + sError("vgId:%d, failed to get append entries for index:%" PRId64 "", pNode->vgId, index); goto _out; } - if (index < pBuf->startIndex) { - sError("vgId:%d, (not implemented yet) replication fromIndex: %" PRId64 - " that is less than pBuf->startIndex: %" PRId64 ". destId: 0x%016" PRId64 "", - pNode->vgId, fromIndex, pBuf->startIndex, destId.addr); - goto _out; - } - - if (index > pBuf->matchIndex) { - goto _out; - } - - do { - pMsgOut = syncLogToAppendEntries(pBuf, pNode, index); - if (pMsgOut == NULL) { - sError("vgId:%d, failed to assembly append entries msg since %s. index: %" PRId64 "", pNode->vgId, terrstr(), - index); - goto _out; - } - - if (syncNodeSendAppendEntries(pNode, &destId, pMsgOut) < 0) { - sWarn("vgId:%d, failed to send append entries msg since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", - pNode->vgId, terrstr(), index, destId.addr); - goto _out; - } - - index += 1; - syncAppendEntriesDestroy(pMsgOut); - pMsgOut = NULL; - } while (false && index <= pBuf->commitIndex); + (void)syncNodeSendAppendEntries(pNode, pDestId, pMsgOut); + ret = 0; _out: syncAppendEntriesDestroy(pMsgOut); pMsgOut = NULL; - taosThreadMutexUnlock(&pBuf->mutex); - return 0; + if (!inBuf) { + syncEntryDestroy(pEntry); + pEntry = NULL; + } + return ret; } int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, SyncAppendEntriesReply* pMsg) { @@ -185,23 +212,15 @@ int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, SyncAppendEntriesReply* pMs SyncIndex indexLikely = TMIN(pMsg->matchIndex, ths->pLogBuf->matchIndex); SyncIndex commitIndex = syncNodeCheckCommitIndex(ths, indexLikely); (void)syncLogBufferCommit(ths->pLogBuf, ths, commitIndex); - } else { - SyncIndex nextIndex = syncIndexMgrGetIndex(ths->pNextIndex, &(pMsg->srcId)); - if (nextIndex > SYNC_INDEX_BEGIN) { - --nextIndex; - } - syncIndexMgrSetIndex(ths->pNextIndex, &(pMsg->srcId), nextIndex); } - // send next append entries - SPeerState* pState = syncNodeGetPeerState(ths, &(pMsg->srcId)); - ASSERT(pState != NULL); - - if (pMsg->lastSendIndex == pState->lastSendIndex) { - syncNodeReplicateOne(ths, &(pMsg->srcId)); + // replicate log + SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(ths, &pMsg->srcId); + ASSERT(pMgr != NULL); + if (pMgr != NULL) { + (void)syncLogReplMgrProcessReply(pMgr, ths, pMsg); } } - return 0; } diff --git a/source/libs/sync/src/syncIndexMgr.c b/source/libs/sync/src/syncIndexMgr.c index 8e78aeedc3..09137c31c7 100644 --- a/source/libs/sync/src/syncIndexMgr.c +++ b/source/libs/sync/src/syncIndexMgr.c @@ -82,6 +82,15 @@ void syncIndexMgrSetIndex(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId, index); } +SSyncLogReplMgr *syncNodeGetLogReplMgr(SSyncNode *pNode, SRaftId *pDestId) { + for (int i = 0; i < pNode->replicaNum; i++) { + if (syncUtilSameId(&(pNode->replicasId[i]), pDestId)) { + return pNode->logReplMgrs[i]; + } + } + return NULL; +} + SyncIndex syncIndexMgrGetIndex(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId) { if (pSyncIndexMgr == NULL) { return SYNC_INDEX_INVALID; diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index c3267bafdc..f9f6760e8c 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -1103,6 +1103,252 @@ int32_t syncHbTimerStop(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer) { return ret; } +int32_t syncLogResetLogReplMgr(SSyncLogReplMgr* pMgr) { + ASSERT(pMgr->startIndex >= 0); + for (SyncIndex index = pMgr->startIndex; index < pMgr->endIndex; index++) { + memset(&pMgr->states[index % pMgr->size], 0, sizeof(pMgr->states[0])); + } + pMgr->startIndex = 0; + pMgr->matchIndex = 0; + pMgr->endIndex = 0; + pMgr->restored = false; + pMgr->retryBackoff = 0; + return 0; +} + +int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { + if (pMgr->endIndex <= pMgr->startIndex) { + return 0; + } + + int32_t ret = -1; + bool retried = false; + int64_t retryWaitMs = syncLogGetRetryBackoffTimeMs(pMgr); + + for (SyncIndex index = pMgr->startIndex; index < pMgr->endIndex; index++) { + int64_t pos = index % pMgr->size; + ASSERT(!pMgr->states[pos].barrier || (index == pMgr->startIndex || index + 1 == pMgr->endIndex)); + if (pMgr->states[pos].acked) { + continue; + } + int64_t nowMs = taosGetMonoTimestampMs(); + if (nowMs < pMgr->states[pos].timeMs + retryWaitMs) { + break; + } + + SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; + bool barrier = false; + if (syncLogBufferReplicateOneTo(pMgr, pNode, index, pDestId, &barrier) < 0) { + sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, + terrstr(), index, pDestId->addr); + goto _out; + } + ASSERT(barrier == pMgr->states[pos].barrier); + pMgr->states[pos].timeMs = nowMs; + pMgr->states[pos].acked = false; + retried = true; + } + + ret = 0; +_out: + if (retried) { + pMgr->retryBackoff = syncLogGetNextRetryBackoff(pMgr); + } + return ret; +} + +int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, + SyncAppendEntriesReply* pMsg) { + SRaftId destId = pMsg->srcId; + ASSERT(pMgr->restored == false); + + if (pMgr->endIndex == 0) { + ASSERT(pMgr->startIndex == 0); + ASSERT(pMgr->matchIndex == 0); + if (pMsg->matchIndex < 0) { + pMgr->restored = true; + return 0; + } + } else { + if (pMsg->lastSendIndex < pMgr->startIndex || pMsg->lastSendIndex >= pMgr->endIndex) { + syncLogReplMgrRetryOnNeed(pMgr, pNode); + return 0; + } + + pMgr->states[pMsg->lastSendIndex % pMgr->size].acked = true; + + if (pMsg->matchIndex == pMsg->lastSendIndex) { + pMgr->restored = true; + return 0; + } + + (void)syncLogResetLogReplMgr(pMgr); + } + + SyncIndex index = TMIN(pMsg->matchIndex, pNode->pLogBuf->matchIndex); + bool barrier = false; + ASSERT(index >= 0); + // send match index + if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &destId, &barrier) < 0) { + sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, + terrstr(), index, destId.addr); + return -1; + } + + int64_t nowMs = taosGetMonoTimestampMs(); + pMgr->states[index % pMgr->size].barrier = barrier; + pMgr->states[index % pMgr->size].timeMs = nowMs; + pMgr->states[index % pMgr->size].acked = false; + + pMgr->matchIndex = index; + pMgr->startIndex = index; + pMgr->endIndex = index + 1; + return 0; +} + +int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) { + SSyncLogBuffer* pBuf = pNode->pLogBuf; + taosThreadMutexLock(&pBuf->mutex); + if (pMsg->startTime != pMgr->peerStartTime) { + syncLogResetLogReplMgr(pMgr); + pMgr->peerStartTime = pMsg->startTime; + } + + if (pMgr->restored) { + (void)syncLogReplMgrProcessReplyInNormalMode(pMgr, pNode, pMsg); + } else { + (void)syncLogReplMgrProcessReplyInRecoveryMode(pMgr, pNode, pMsg); + } + taosThreadMutexUnlock(&pBuf->mutex); + return 0; +} + +int32_t syncLogBufferReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { + SSyncLogBuffer* pBuf = pNode->pLogBuf; + if (pMgr->restored) { + (void)syncLogReplMgrReplicateAttemptedOnce(pMgr, pNode); + } else { + (void)syncLogReplMgrReplicateProbeOnce(pMgr, pNode); + } + return 0; +} + +int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { + ASSERT(!pMgr->restored); + SyncIndex index = pNode->pLogBuf->matchIndex; + SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; + bool barrier = false; + if (syncLogBufferReplicateOneTo(pMgr, pNode, index, pDestId, &barrier) < 0) { + sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, + terrstr(), index, pDestId->addr); + return -1; + } + + SSyncLogBuffer* pBuf = pNode->pLogBuf; + sInfo("vgId:%d, attempted to probe the %d'th peer. pMgr(restored:%d): [%" PRId64 " %" PRId64 ", %" PRId64 + "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, + pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + return 0; +} + +int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { + ASSERT(pMgr->restored); + SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; + int32_t batchSize = TMAX(1, pMgr->size / 10); + int32_t count = 0; + + for (SyncIndex index = pMgr->endIndex; index <= pNode->pLogBuf->matchIndex; index++) { + if (batchSize < count++ || pMgr->startIndex + pMgr->size <= index) { + break; + } + if (pMgr->startIndex + 1 < index && pMgr->states[(index - 1) % pMgr->size].barrier) { + break; + } + int64_t pos = index % pMgr->size; + SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; + bool barrier = false; + if (syncLogBufferReplicateOneTo(pMgr, pNode, index, pDestId, &barrier) < 0) { + sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, + terrstr(), index, pDestId->addr); + return -1; + } + pMgr->states[pos].barrier = barrier; + pMgr->states[pos].timeMs = taosGetMonoTimestampMs(); + pMgr->states[pos].acked = false; + + pMgr->endIndex = index + 1; + if (barrier) { + break; + } + } + + SSyncLogBuffer* pBuf = pNode->pLogBuf; + sInfo("vgId:%d, attempted to replicate %d msgs to the %d'th peer. pMgr(restored:%d): [%" PRId64 " %" PRId64 + ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, count, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + syncLogReplMgrRetryOnNeed(pMgr, pNode); + return 0; +} + +int32_t syncLogReplMgrProcessReplyInNormalMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) { + ASSERT(pMgr->restored == true); + if (pMgr->startIndex <= pMsg->lastSendIndex && pMsg->lastSendIndex < pMgr->endIndex) { + pMgr->states[pMsg->lastSendIndex % pMgr->size].acked = true; + pMgr->matchIndex = TMAX(pMgr->matchIndex, pMsg->matchIndex); + for (SyncIndex index = pMgr->startIndex; index < pMgr->matchIndex; index++) { + memset(&pMgr->states[index % pMgr->size], 0, sizeof(pMgr->states[0])); + } + pMgr->startIndex = pMgr->matchIndex; + } + + return syncLogReplMgrReplicateAttemptedOnce(pMgr, pNode); +} + +SSyncLogReplMgr* syncLogReplMgrCreate() { + SSyncLogReplMgr* pMgr = taosMemoryCalloc(1, sizeof(SSyncLogReplMgr)); + if (pMgr == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } + + pMgr->size = sizeof(pMgr->states) / sizeof(pMgr->states[0]); + + ASSERT(pMgr->size == TSDB_SYNC_LOG_BUFFER_SIZE); + + return pMgr; + +_err: + taosMemoryFree(pMgr); + return NULL; +} + +void syncLogReplMgrDestroy(SSyncLogReplMgr* pMgr) { + if (pMgr == NULL) { + return; + } + (void)taosMemoryFree(pMgr); + return; +} + +int32_t syncNodeLogReplMgrInit(SSyncNode* pNode) { + for (int i = 0; i < TSDB_MAX_REPLICA; i++) { + ASSERT(pNode->logReplMgrs[i] == NULL); + pNode->logReplMgrs[i] = syncLogReplMgrCreate(); + pNode->logReplMgrs[i]->peerId = i; + ASSERT(pNode->logReplMgrs[i] != NULL && "Out of memory."); + } + return 0; +} + +void syncNodeLogReplMgrDestroy(SSyncNode* pNode) { + for (int i = 0; i < TSDB_MAX_REPLICA; i++) { + syncLogReplMgrDestroy(pNode->logReplMgrs[i]); + pNode->logReplMgrs[i] = NULL; + } +} + SSyncLogBuffer* syncLogBufferCreate() { SSyncLogBuffer* pBuf = taosMemoryCalloc(1, sizeof(SSyncLogBuffer)); if (pBuf == NULL) { @@ -1397,9 +1643,13 @@ SSyncNode* syncNodeOpen(SSyncInfo* pOldSyncInfo) { // is config changing pSyncNode->changing = false; + // replication mgr + syncNodeLogReplMgrInit(pSyncNode); + // peer state syncNodePeerStateInit(pSyncNode); + // // min match index pSyncNode->minMatchIndex = SYNC_INDEX_INVALID; @@ -1532,6 +1782,7 @@ void syncNodeClose(SSyncNode* pSyncNode) { ret = raftStoreClose(pSyncNode->pRaftStore); ASSERT(ret == 0); + syncNodeLogReplMgrDestroy(pSyncNode); syncRespMgrDestroy(pSyncNode->pSyncRespMgr); pSyncNode->pSyncRespMgr = NULL; voteGrantedDestroy(pSyncNode->pVotesGranted); @@ -2477,6 +2728,11 @@ int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode) { pBuf->endIndex = pBuf->matchIndex + 1; + // reset repl mgr + for (int i = 0; i < pNode->replicaNum; i++) { + SSyncLogReplMgr* pMgr = pNode->logReplMgrs[i]; + syncLogResetLogReplMgr(pMgr); + } taosThreadMutexUnlock(&pBuf->mutex); return 0; } @@ -2637,8 +2893,12 @@ void syncNodeCandidate2Leader(SSyncNode* pSyncNode) { syncNodeLog2("==state change syncNodeCandidate2Leader==", pSyncNode); - // Raft 3.6.2 Committing entries from previous terms - syncNodeAppendNoop(pSyncNode); + int32_t ret = syncNodeAppendNoop(pSyncNode); + ASSERT(ret == 0); + SyncIndex lastIndex = pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore); + ASSERT(lastIndex >= 0); + sInfo("vgId:%d, become leader. term: %" PRId64 ", commit index: %" PRId64 ", last index: %" PRId64 "", + pSyncNode->vgId, pSyncNode->pRaftStore->currentTerm, pSyncNode->commitIndex, lastIndex); } void syncNodeCandidate2LeaderOld(SSyncNode* pSyncNode) { @@ -2671,22 +2931,33 @@ int32_t syncNodePeerStateInit(SSyncNode* pSyncNode) { void syncNodeFollower2Candidate(SSyncNode* pSyncNode) { ASSERT(pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER); pSyncNode->state = TAOS_SYNC_STATE_CANDIDATE; + SyncIndex lastIndex = pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore); + sInfo("vgId:%d, become candidate from follower. term: %" PRId64 ", commit index: %" PRId64 ", last index: %" PRId64, + pSyncNode->vgId, pSyncNode->pRaftStore->currentTerm, pSyncNode->commitIndex, lastIndex); - syncNodeEventLog(pSyncNode, "follower to candidate"); + // syncNodeEventLog(pSyncNode, "follower to candidate"); } void syncNodeLeader2Follower(SSyncNode* pSyncNode) { ASSERT(pSyncNode->state == TAOS_SYNC_STATE_LEADER); syncNodeBecomeFollower(pSyncNode, "leader to follower"); - syncNodeEventLog(pSyncNode, "leader to follower"); + SyncIndex lastIndex = pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore); + sInfo("vgId:%d, become follower from leader. term: %" PRId64 ", commit index: %" PRId64 ", last index: %" PRId64, + pSyncNode->vgId, pSyncNode->pRaftStore->currentTerm, pSyncNode->commitIndex, lastIndex); + + // syncNodeEventLog(pSyncNode, "leader to follower"); } void syncNodeCandidate2Follower(SSyncNode* pSyncNode) { ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE); syncNodeBecomeFollower(pSyncNode, "candidate to follower"); - syncNodeEventLog(pSyncNode, "candidate to follower"); + SyncIndex lastIndex = pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore); + sInfo("vgId:%d, become follower from candidate. term: %" PRId64 ", commit index: %" PRId64 ", last index: %" PRId64, + pSyncNode->vgId, pSyncNode->pRaftStore->currentTerm, pSyncNode->commitIndex, lastIndex); + + // syncNodeEventLog(pSyncNode, "candidate to follower"); } // raft vote -------------- @@ -3109,6 +3380,11 @@ int32_t syncNodeAppend(SSyncNode* ths, SSyncRaftEntry* pEntry) { // proceed match index, with replicating on needed SyncIndex matchIndex = syncLogBufferProceed(ths->pLogBuf, ths); + sInfo("vgId:%d, append raft log index: %" PRId64 ", term: %" PRId64 " log buffer: [%" PRId64 " %" PRId64 " %" PRId64 + ", %" PRId64 ")", + ths->vgId, pEntry->index, pEntry->term, ths->pLogBuf->startIndex, ths->pLogBuf->commitIndex, + ths->pLogBuf->matchIndex, ths->pLogBuf->endIndex); + // multi replica if (ths->replicaNum > 1) { return 0; @@ -3135,7 +3411,8 @@ static int32_t syncNodeAppendNoop(SSyncNode* ths) { return -1; } - return syncNodeAppend(ths, pEntry); + int32_t ret = syncNodeAppend(ths, pEntry); + return 0; } static int32_t syncNodeAppendNoopOld(SSyncNode* ths) { @@ -3264,7 +3541,7 @@ int32_t syncLogBufferAppend(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt syncLogBufferValidate(pBuf); SyncIndex index = pEntry->index; - if (index - pBuf->startIndex > pBuf->size) { + if (index - pBuf->startIndex >= pBuf->size) { sError("vgId:%d, failed to append due to log buffer full. index:%" PRId64 "", pNode->vgId, index); goto _out; } @@ -3294,30 +3571,57 @@ _out: return -1; } -SyncTerm syncLogBufferGetTerm(SSyncLogBuffer* pBuf, SyncIndex index) { - ASSERT(pBuf->startIndex <= index && index < pBuf->endIndex); - SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; - ASSERT(pEntry != NULL); - return pEntry->term; +SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index) { + SSyncLogBuffer* pBuf = pNode->pLogBuf; + SSyncRaftEntry* pEntry = NULL; + SyncIndex prevIndex = index - 1; + SyncTerm prevLogTerm = -1; + terrno = TSDB_CODE_SUCCESS; + + if (prevIndex == -1) return 0; + + if (index - 1 > pBuf->matchIndex) { + terrno = TSDB_CODE_WAL_LOG_NOT_EXIST; + return -1; + } + + ASSERT(index - 1 == prevIndex); + + if (index - 1 >= pBuf->startIndex) { + pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; + ASSERT(pEntry != NULL && "no log entry found"); + prevLogTerm = pBuf->entries[(index + pBuf->size) % pBuf->size].prevLogTerm; + return prevLogTerm; + } + + if (pMgr->startIndex <= prevIndex && prevIndex < pMgr->endIndex) { + int64_t timeMs = pMgr->states[(prevIndex + pMgr->size) % pMgr->size].timeMs; + ASSERT(timeMs != 0 && "no log entry found"); + prevLogTerm = pMgr->states[(prevIndex + pMgr->size) % pMgr->size].term; + return prevLogTerm; + } + + SSnapshot snapshot; + if (pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot) == 0 && prevIndex == snapshot.lastApplyIndex) { + return snapshot.lastApplyTerm; + } + + if (pNode->pLogStore->syncLogGetEntry(pNode->pLogStore, prevIndex, &pEntry) == 0) { + prevLogTerm = pEntry->term; + syncEntryDestroy(pEntry); + pEntry = NULL; + return prevLogTerm; + } + + sError("vgId:%d, failed to get log term since %s. index: %" PRId64 "", pNode->vgId, terrstr(), prevIndex); + terrno = TSDB_CODE_WAL_LOG_NOT_EXIST; + return -1; } -SyncAppendEntries* syncLogToAppendEntries(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index) { +SyncAppendEntries* syncLogToAppendEntries(SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm) { SyncAppendEntries* pMsg = NULL; - - if (index < pBuf->startIndex || index >= pBuf->endIndex) { - sError("vgId:%d, log entry (%" PRId64 ") out of range of log buffer [%" PRId64 ", %" PRId64 ").", pNode->vgId, - index, pBuf->startIndex, pBuf->endIndex); - return pMsg; - } - - SSyncRaftEntry* pEntry = pBuf->entries[index % pBuf->size].pItem; - if (pEntry == NULL) { - sError("vgId:%d, log entry (%" PRId64 ") not exist in log buffer [%" PRId64 ", %" PRId64 ").", pNode->vgId, index, - pBuf->startIndex, pBuf->endIndex); - return pMsg; - } - uint32_t datalen = pEntry->bytes; + pMsg = syncAppendEntriesBuild(datalen, pNode->vgId); if (pMsg == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; @@ -3326,8 +3630,8 @@ SyncAppendEntries* syncLogToAppendEntries(SSyncLogBuffer* pBuf, SSyncNode* pNode (void)memcpy(pMsg->data, pEntry, datalen); - pMsg->prevLogIndex = index - 1; - pMsg->prevLogTerm = syncLogBufferGetTerm(pBuf, pMsg->prevLogIndex); + pMsg->prevLogIndex = pEntry->index - 1; + pMsg->prevLogTerm = prevLogTerm; pMsg->vgId = pNode->vgId; pMsg->srcId = pNode->myRaftId; pMsg->term = pNode->pRaftStore->currentTerm; @@ -3345,10 +3649,10 @@ void syncLogReplicateAppendEntries(SSyncNode* pNode, SyncAppendEntries* pMsg) { } } -int32_t syncLogBufferReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index) { - SyncAppendEntries* pMsgOut = syncLogToAppendEntries(pNode->pLogBuf, pNode, index); +int32_t syncLogBufferReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm) { + SyncAppendEntries* pMsgOut = syncLogToAppendEntries(pNode, pEntry, prevLogTerm); if (pMsgOut == NULL) { - sError("vgId:%d, failed to get append entries for index:%" PRId64 "", pNode->vgId, index); + sError("vgId:%d, failed to get append entries for index:%" PRId64 "", pNode->vgId, pEntry->index); goto _err; } diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c index 181b9f2b74..3dcd2d8cdf 100644 --- a/source/libs/sync/src/syncReplication.c +++ b/source/libs/sync/src/syncReplication.c @@ -136,7 +136,21 @@ int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId) { return 0; } -int32_t syncNodeReplicate(SSyncNode* pSyncNode) { +int32_t syncNodeReplicate(SSyncNode* pNode) { + if (pNode->state != TAOS_SYNC_STATE_LEADER || pNode->replicaNum == 1) { + return -1; + } + for (int32_t i = 0; i < pNode->replicaNum; i++) { + if (syncUtilSameId(&pNode->replicasId[i], &pNode->myRaftId)) { + continue; + } + SSyncLogReplMgr* pMgr = pNode->logReplMgrs[i]; + (void)syncLogBufferReplicateOnce(pMgr, pNode); + } + return 0; +} + +int32_t syncNodeReplicateOld(SSyncNode* pSyncNode) { if (pSyncNode->state != TAOS_SYNC_STATE_LEADER) { return -1; } @@ -159,6 +173,17 @@ int32_t syncNodeReplicate(SSyncNode* pSyncNode) { } int32_t syncNodeSendAppendEntries(SSyncNode* pSyncNode, SRaftId* destRaftId, SyncAppendEntries* pMsg) { + sInfo("vgId:%d, send append entries msg index: %" PRId64 " to dest: 0x%016" PRId64, pSyncNode->vgId, + pMsg->prevLogIndex + 1, destRaftId->addr); + int32_t ret = 0; + pMsg->destId = *destRaftId; + SRpcMsg rpcMsg; + syncAppendEntries2RpcMsg(pMsg, &rpcMsg); + syncNodeSendMsgById(destRaftId, pSyncNode, &rpcMsg); + return 0; +} + +int32_t syncNodeSendAppendEntriesOld(SSyncNode* pSyncNode, SRaftId* destRaftId, SyncAppendEntries* pMsg) { int32_t ret = 0; pMsg->destId = *destRaftId; diff --git a/source/libs/transport/src/tmsgcb.c b/source/libs/transport/src/tmsgcb.c index 1cd1903851..2007bc474f 100644 --- a/source/libs/transport/src/tmsgcb.c +++ b/source/libs/transport/src/tmsgcb.c @@ -23,6 +23,9 @@ static SMsgCb defaultMsgCb; void tmsgSetDefault(const SMsgCb* msgcb) { defaultMsgCb = *msgcb; } int32_t tmsgPutToQueue(const SMsgCb* msgcb, EQueueType qtype, SRpcMsg* pMsg) { + if (msgcb == NULL) { + return -1; + } int32_t code = (*msgcb->putToQueueFp)(msgcb->mgmt, qtype, pMsg); if (code != 0) { rpcFreeCont(pMsg->pCont); From c0c1cd82113cbc2694d2d1d839ca4f1c89f6db99 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Tue, 15 Nov 2022 10:24:11 +0800 Subject: [PATCH 003/105] enh: reset sync log repl mgr if restarting of the peer detected in HeartbeatReply --- source/libs/sync/inc/syncInt.h | 6 +- source/libs/sync/src/syncAppendEntries.c | 146 ++++-------------- source/libs/sync/src/syncAppendEntriesReply.c | 12 +- source/libs/sync/src/syncCommit.c | 87 ----------- source/libs/sync/src/syncElection.c | 2 +- source/libs/sync/src/syncMain.c | 60 ++++--- source/libs/sync/src/syncReplication.c | 4 +- source/libs/sync/src/syncTimeout.c | 2 +- 8 files changed, 83 insertions(+), 236 deletions(-) diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index 58b32ed025..ae1c4d9e50 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -166,21 +166,21 @@ int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode); int64_t syncLogBufferGetEndIndex(SSyncLogBuffer* pBuf); int32_t syncLogBufferAppend(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry); int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevTerm); -int64_t syncLogBufferLoad(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex toIndex); int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode); int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t commitIndex); -SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index, bool* pInBuf); int64_t syncNodeUpdateCommitIndex(SSyncNode* ths, SyncIndex commtIndex); SyncAppendEntries* syncLogToAppendEntries(SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm); // private +SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index, bool* pInBuf); int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf); int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SyncIndex toIndex); int32_t syncLogBufferReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm); -void syncIndexMgrSetIndex(SSyncIndexMgr* pSyncIndexMgr, const SRaftId* pRaftId, SyncIndex index); bool syncNodeAgreedUpon(SSyncNode* pNode, SyncIndex index); +void syncIndexMgrSetIndex(SSyncIndexMgr* pSyncIndexMgr, const SRaftId* pRaftId, SyncIndex index); + typedef struct SSyncNode { // init by SSyncInfo SyncGroupId vgId; diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c index 285981012e..1111547a9a 100644 --- a/source/libs/sync/src/syncAppendEntries.c +++ b/source/libs/sync/src/syncAppendEntries.c @@ -324,11 +324,11 @@ int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { sError("vgId:%d, failed to get snapshot info since %s", pNode->vgId, terrstr()); goto _err; } - - SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); SyncIndex commitIndex = snapshot.lastApplyIndex; SyncTerm commitTerm = snapshot.lastApplyTerm; - SyncIndex toIndex = TMAX(lastVer, commitIndex); + + SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); + SyncIndex toIndex = lastVer; ASSERT(lastVer >= commitIndex); // update match index @@ -406,93 +406,6 @@ _err: return -1; } -int64_t syncLogBufferLoadOld(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex toIndex) { - taosThreadMutexLock(&pBuf->mutex); - syncLogBufferValidate(pBuf); - - SSyncLogStore* pLogStore = pNode->pLogStore; - ASSERT(pBuf->startIndex <= pBuf->matchIndex); - ASSERT(pBuf->matchIndex + 1 == pBuf->endIndex); - SyncIndex index = pBuf->endIndex; - SSyncRaftEntry* pMatch = pBuf->entries[(index - 1 + pBuf->size) % pBuf->size].pItem; - ASSERT(pMatch != NULL); - - while (index - pBuf->startIndex < pBuf->size && index <= toIndex) { - SSyncRaftEntry* pEntry = NULL; - if (pLogStore->syncLogGetEntry(pLogStore, index, &pEntry) < 0) { - sError("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); - ASSERT(0); - break; - } - ASSERT(pMatch->index + 1 == pEntry->index); - SSyncLogBufEntry tmp = {.pItem = pEntry, .prevLogIndex = pMatch->index, .prevLogTerm = pMatch->term}; - pBuf->entries[pBuf->endIndex % pBuf->size] = tmp; - - sInfo("vgId:%d, loaded log entry into log buffer. index: %" PRId64 ", term: %" PRId64, pNode->vgId, pEntry->index, - pEntry->term); - - pBuf->matchIndex = index; - pBuf->endIndex = index + 1; - pMatch = pEntry; - index++; - } - - syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); - return index; -} - -int32_t syncLogBufferInitOld(SSyncLogBuffer* pBuf, SSyncNode* pNode) { - taosThreadMutexLock(&pBuf->mutex); - ASSERT(pNode->pLogStore != NULL && "log store not created"); - ASSERT(pNode->pFsm != NULL && "pFsm not registered"); - ASSERT(pNode->pFsm->FpGetSnapshotInfo != NULL && "FpGetSnapshotInfo not registered"); - - SSnapshot snapshot; - if (pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot) < 0) { - sError("vgId:%d, failed to get snapshot info since %s", pNode->vgId, terrstr()); - goto _err; - } - SyncIndex commitIndex = snapshot.lastApplyIndex; - SyncTerm commitTerm = snapshot.lastApplyTerm; - - // init log buffer indexes - pBuf->startIndex = commitIndex; - pBuf->matchIndex = commitIndex; - pBuf->commitIndex = commitIndex; - pBuf->endIndex = commitIndex + 1; - - // put a dummy record at initial commitIndex - SSyncRaftEntry* pDummy = syncEntryBuildDummy(commitTerm, commitIndex, pNode->vgId); - if (pDummy == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } - SSyncLogBufEntry tmp = {.pItem = pDummy, .prevLogIndex = commitIndex - 1, .prevLogTerm = commitTerm}; - pBuf->entries[(commitIndex + pBuf->size) % pBuf->size] = tmp; - - taosThreadMutexUnlock(&pBuf->mutex); - return 0; - -_err: - taosThreadMutexUnlock(&pBuf->mutex); - return -1; -} - -int32_t syncLogBufferRollbackMatchIndex(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex toIndex) { - if (toIndex <= pBuf->commitIndex) { - sError("vgId:%d, cannot rollback across commit index:%" PRId64 ", to index:%" PRId64 "", pNode->vgId, - pBuf->commitIndex, toIndex); - return -1; - } - - pBuf->matchIndex = TMIN(pBuf->matchIndex, toIndex - 1); - - // update my match index - syncIndexMgrSetIndex(pNode->pMatchIndex, &pNode->myRaftId, pBuf->matchIndex); - return 0; -} - FORCE_INLINE SyncTerm syncLogBufferGetLastMatchTerm(SSyncLogBuffer* pBuf) { SyncIndex index = pBuf->matchIndex; SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; @@ -509,26 +422,25 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt SyncTerm lastMatchTerm = syncLogBufferGetLastMatchTerm(pBuf); if (index <= pBuf->commitIndex) { - sInfo("vgId:%d, raft entry already committed. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 - " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, - pBuf->endIndex); + sDebug("vgId:%d, raft entry already committed. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, + pBuf->endIndex); ret = 0; goto _out; } if (index - pBuf->startIndex >= pBuf->size) { - sInfo("vgId:%d, raft entry out of buffer capacity. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 - " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, - pBuf->endIndex); + sDebug("vgId:%d, raft entry out of buffer capacity. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, + pBuf->endIndex); goto _out; } if (index > pBuf->matchIndex && lastMatchTerm != prevTerm) { - sInfo("vgId:%d, not ready to accept raft entry (i.e. across barrier). index: %" PRId64 ", term: %" PRId64 - ": prevterm: %" PRId64 " /= lastmatch: %" PRId64 ". log buffer: [%" PRId64 " %" PRId64 " %" PRId64 - ", %" PRId64 ")", + sInfo("vgId:%d, not ready to accept raft entry. index: %" PRId64 ", term: %" PRId64 ": prevterm: %" PRId64 + " != lastmatch: %" PRId64 ". log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pEntry->index, pEntry->term, prevTerm, lastMatchTerm, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); goto _out; @@ -542,10 +454,10 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt if (pEntry->term != pExist->term) { (void)syncLogBufferRollback(pBuf, index); } else { - sInfo("vgId:%d, duplicate raft entry received. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 - " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, - pBuf->endIndex); + sDebug("vgId:%d, duplicate raft entry received. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, + pBuf->endIndex); SyncTerm existPrevTerm = pBuf->entries[index % pBuf->size].prevLogTerm; ASSERT(pEntry->term == pExist->term && prevTerm == existPrevTerm); ret = 0; @@ -647,8 +559,8 @@ int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode) { // increase match index pBuf->matchIndex = index; - sInfo("vgId:%d, log buffer proceed. start index: %" PRId64 ", match index: %" PRId64 ", end index: %" PRId64, - pNode->vgId, pBuf->startIndex, pBuf->matchIndex, pBuf->endIndex); + sDebug("vgId:%d, log buffer proceed. start index: %" PRId64 ", match index: %" PRId64 ", end index: %" PRId64, + pNode->vgId, pBuf->startIndex, pBuf->matchIndex, pBuf->endIndex); // replicate on demand (void)syncNodeReplicate(pNode); @@ -759,8 +671,8 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm } pBuf->commitIndex = index; - sInfo("vgId:%d, committed index: %" PRId64 ", term: %" PRId64 ", role: %d, current term: %" PRId64 "", pNode->vgId, - pEntry->index, pEntry->term, role, term); + sDebug("vgId:%d, committed index: %" PRId64 ", term: %" PRId64 ", role: %d, current term: %" PRId64 "", pNode->vgId, + pEntry->index, pEntry->term, role, term); if (!inBuf) { syncEntryDestroy(pEntry); @@ -784,8 +696,8 @@ _out: if (!pNode->restoreFinish && pBuf->commitIndex >= pNode->commitIndex) { pNode->pFsm->FpRestoreFinishCb(pNode->pFsm); pNode->restoreFinish = true; - sInfo("vgId:%d, restore finished. commit index:%" PRId64 ", match index:%" PRId64 ", last index:%" PRId64 "", - pNode->vgId, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex - 1); + sInfo("vgId:%d, restore finished. pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); } if (!inBuf) { @@ -799,6 +711,7 @@ _out: int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) { SyncAppendEntriesReply* pReply = NULL; + bool accepted = false; // if already drop replica, do not process if (!syncNodeInRaftGroup(ths, &(pMsg->srcId))) { syncLogRecvAppendEntries(ths, pMsg, "not in my config"); @@ -847,20 +760,21 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) { goto _IGNORE; } - sInfo("vgId:%d, recv append entries msg. index:%" PRId64 ", term:%" PRId64 ", preLogIndex:%" PRId64 - ", prevLogTerm:%" PRId64 " commitIndex:%" PRId64 "", - pMsg->vgId, pMsg->prevLogIndex + 1, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->commitIndex); + sDebug("vgId:%d, recv append entries msg. index:%" PRId64 ", term:%" PRId64 ", preLogIndex:%" PRId64 + ", prevLogTerm:%" PRId64 " commitIndex:%" PRId64 "", + pMsg->vgId, pMsg->prevLogIndex + 1, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->commitIndex); // accept if (syncLogBufferAccept(ths->pLogBuf, ths, pEntry, pMsg->prevLogTerm) < 0) { goto _SEND_RESPONSE; } + accepted = true; _SEND_RESPONSE: pReply->matchIndex = syncLogBufferProceed(ths->pLogBuf, ths); bool matched = (pReply->matchIndex >= pReply->lastSendIndex); - pReply->success = matched; - if (matched) { + if (accepted && matched) { + pReply->success = true; // update commit index only after matching (void)syncNodeUpdateCommitIndex(ths, pMsg->commitIndex); } diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index 86d8ec11b9..ef20153fa7 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -96,8 +96,8 @@ int64_t syncNodeCheckCommitIndex(SSyncNode* ths, SyncIndex indexLikely) { if (indexLikely > ths->commitIndex && syncNodeAgreedUpon(ths, indexLikely)) { SyncIndex commitIndex = indexLikely; syncNodeUpdateCommitIndex(ths, commitIndex); - sInfo("vgId:%d, agreed upon. role:%d, term:%" PRId64 ", index: %" PRId64 "", ths->vgId, ths->state, - ths->pRaftStore->currentTerm, commitIndex); + sDebug("vgId:%d, agreed upon. role:%d, term:%" PRId64 ", index: %" PRId64 "", ths->vgId, ths->state, + ths->pRaftStore->currentTerm, commitIndex); } return ths->commitIndex; } @@ -140,7 +140,7 @@ int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn SyncTerm prevLogTerm = -1; SSyncLogBuffer* pBuf = pNode->pLogBuf; - sInfo("vgId:%d, replicate one msg index: %" PRId64 " to dest: 0x%016" PRIx64, pNode->vgId, index, pDestId->addr); + sDebug("vgId:%d, replicate one msg index: %" PRId64 " to dest: 0x%016" PRIx64, pNode->vgId, index, pDestId->addr); pEntry = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf); if (pEntry == NULL) { @@ -199,8 +199,8 @@ int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, SyncAppendEntriesReply* pMs ASSERT(pMsg->term == ths->pRaftStore->currentTerm); - sInfo("vgId:%d received append entries reply. srcId:0x%016" PRIx64 ", term:%" PRId64 ", matchIndex:%" PRId64 "", - pMsg->vgId, pMsg->srcId.addr, pMsg->term, pMsg->matchIndex); + sDebug("vgId:%d received append entries reply. srcId:0x%016" PRIx64 ", term:%" PRId64 ", matchIndex:%" PRId64 "", + pMsg->vgId, pMsg->srcId.addr, pMsg->term, pMsg->matchIndex); if (pMsg->success) { SyncIndex oldMatchIndex = syncIndexMgrGetIndex(ths->pMatchIndex, &(pMsg->srcId)); @@ -216,7 +216,7 @@ int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, SyncAppendEntriesReply* pMs // replicate log SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(ths, &pMsg->srcId); - ASSERT(pMgr != NULL); + // ASSERT(pMgr != NULL); if (pMgr != NULL) { (void)syncLogReplMgrProcessReply(pMgr, ths, pMsg); } diff --git a/source/libs/sync/src/syncCommit.c b/source/libs/sync/src/syncCommit.c index a96fa31f83..6ba1867635 100644 --- a/source/libs/sync/src/syncCommit.c +++ b/source/libs/sync/src/syncCommit.c @@ -51,93 +51,6 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) { return; } - // update commit index - SyncIndex newCommitIndex = pSyncNode->commitIndex; - for (SyncIndex index = syncNodeGetLastIndex(pSyncNode); index > pSyncNode->commitIndex; --index) { - bool agree = syncAgree(pSyncNode, index); - - if (agree) { - // term - SSyncRaftEntry* pEntry = NULL; - SLRUCache* pCache = pSyncNode->pLogStore->pCache; - LRUHandle* h = taosLRUCacheLookup(pCache, &index, sizeof(index)); - if (h) { - pEntry = (SSyncRaftEntry*)taosLRUCacheValue(pCache, h); - } else { - int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, index, &pEntry); - if (code != 0) { - char logBuf[128]; - snprintf(logBuf, sizeof(logBuf), "advance commit index error, read wal index:%" PRId64, index); - syncNodeErrorLog(pSyncNode, logBuf); - return; - } - } - // cannot commit, even if quorum agree. need check term! - if (pEntry->term <= pSyncNode->pRaftStore->currentTerm) { - // update commit index - newCommitIndex = index; - - if (h) { - taosLRUCacheRelease(pCache, h, false); - } else { - syncEntryDestroy(pEntry); - } - - break; - } else { - do { - char logBuf[128]; - snprintf(logBuf, sizeof(logBuf), "can not commit due to term not equal, index:%" PRId64 ", term:%" PRIu64, - pEntry->index, pEntry->term); - syncNodeEventLog(pSyncNode, logBuf); - } while (0); - } - - if (h) { - taosLRUCacheRelease(pCache, h, false); - } else { - syncEntryDestroy(pEntry); - } - } - } - - // advance commit index as large as possible - SyncIndex walCommitVer = logStoreWalCommitVer(pSyncNode->pLogStore); - if (walCommitVer > newCommitIndex) { - newCommitIndex = walCommitVer; - } - - // maybe execute fsm - if (newCommitIndex > pSyncNode->commitIndex) { - SyncIndex beginIndex = pSyncNode->commitIndex + 1; - SyncIndex endIndex = newCommitIndex; - - // update commit index - pSyncNode->commitIndex = newCommitIndex; - - // call back Wal - pSyncNode->pLogStore->syncLogUpdateCommitIndex(pSyncNode->pLogStore, pSyncNode->commitIndex); - - // execute fsm - if (pSyncNode->pFsm != NULL) { - int32_t code = syncNodeDoCommit(pSyncNode, beginIndex, endIndex, pSyncNode->state); - if (code != 0) { - char logBuf[128]; - snprintf(logBuf, sizeof(logBuf), "advance commit index error, do commit begin:%" PRId64 ", end:%" PRId64, - beginIndex, endIndex); - syncNodeErrorLog(pSyncNode, logBuf); - return; - } - } - } -} - -void syncMaybeAdvanceCommitIndexOld(SSyncNode* pSyncNode) { - if (pSyncNode->state != TAOS_SYNC_STATE_LEADER) { - syncNodeErrorLog(pSyncNode, "not leader, can not advance commit index"); - return; - } - // advance commit index to sanpshot first SSnapshot snapshot; pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot); diff --git a/source/libs/sync/src/syncElection.c b/source/libs/sync/src/syncElection.c index b428f4d2f2..a287727a39 100644 --- a/source/libs/sync/src/syncElection.c +++ b/source/libs/sync/src/syncElection.c @@ -111,4 +111,4 @@ int32_t syncNodeSendRequestVote(SSyncNode* pSyncNode, const SRaftId* destRaftId, syncRequestVote2RpcMsg(pMsg, &rpcMsg); syncNodeSendMsgById(destRaftId, pSyncNode, &rpcMsg); return ret; -} \ No newline at end of file +} diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index f9f6760e8c..aaed6a10d0 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -1116,6 +1116,8 @@ int32_t syncLogResetLogReplMgr(SSyncLogReplMgr* pMgr) { return 0; } +_Atomic int64_t tsRetryCnt = 0; + int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { if (pMgr->endIndex <= pMgr->startIndex) { return 0; @@ -1147,6 +1149,7 @@ int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { pMgr->states[pos].timeMs = nowMs; pMgr->states[pos].acked = false; retried = true; + tsRetryCnt++; } ret = 0; @@ -1185,10 +1188,10 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod (void)syncLogResetLogReplMgr(pMgr); } + // send match index SyncIndex index = TMIN(pMsg->matchIndex, pNode->pLogBuf->matchIndex); bool barrier = false; ASSERT(index >= 0); - // send match index if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &destId, &barrier) < 0) { sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, terrstr(), index, destId.addr); @@ -1206,6 +1209,17 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod return 0; } +int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg) { + SSyncLogBuffer* pBuf = pNode->pLogBuf; + taosThreadMutexLock(&pBuf->mutex); + if (pMsg->startTime != pMgr->peerStartTime) { + syncLogResetLogReplMgr(pMgr); + pMgr->peerStartTime = pMsg->startTime; + } + taosThreadMutexUnlock(&pBuf->mutex); + return 0; +} + int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) { SSyncLogBuffer* pBuf = pNode->pLogBuf; taosThreadMutexLock(&pBuf->mutex); @@ -1245,17 +1259,19 @@ int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode } SSyncLogBuffer* pBuf = pNode->pLogBuf; - sInfo("vgId:%d, attempted to probe the %d'th peer. pMgr(restored:%d): [%" PRId64 " %" PRId64 ", %" PRId64 + sInfo("vgId:%d, attempted to probe the %d'th peer. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } +_Atomic int64_t tsSendCnt = 0; + int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { ASSERT(pMgr->restored); SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; - int32_t batchSize = TMAX(1, pMgr->size / 10); + int32_t batchSize = TMAX(1, pMgr->size / 20); int32_t count = 0; for (SyncIndex index = pMgr->endIndex; index <= pNode->pLogBuf->matchIndex; index++) { @@ -1278,16 +1294,17 @@ int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* p pMgr->states[pos].acked = false; pMgr->endIndex = index + 1; + tsSendCnt++; if (barrier) { break; } } SSyncLogBuffer* pBuf = pNode->pLogBuf; - sInfo("vgId:%d, attempted to replicate %d msgs to the %d'th peer. pMgr(restored:%d): [%" PRId64 " %" PRId64 - ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, count, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, - pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + sDebug("vgId:%d, attempted to replicate %d msgs to the %d'th peer. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 + "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, count, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); syncLogReplMgrRetryOnNeed(pMgr, pNode); return 0; } @@ -1704,18 +1721,13 @@ int32_t syncNodeRestore(SSyncNode* pSyncNode) { SyncIndex commitIndex = pSyncNode->pLogStore->syncLogCommitIndex(pSyncNode->pLogStore); SyncIndex endIndex = pSyncNode->pLogBuf->endIndex; + ASSERT(endIndex == lastVer + 1); commitIndex = TMAX(pSyncNode->commitIndex, commitIndex); if (syncLogBufferCommit(pSyncNode->pLogBuf, pSyncNode, commitIndex) < 0) { return -1; } - if (endIndex <= lastVer) { - sError("vgId:%d, failed to load log entries into log buffers. commit index:%" PRId64 ", lastVer: %" PRId64 "", - pSyncNode->vgId, commitIndex, lastVer); - return -1; - } - return 0; } @@ -2722,9 +2734,8 @@ int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode) { (void)syncLogBufferRollback(pBuf, pBuf->matchIndex + 1); - sInfo("vgId:%d, reset log buffer. start index: %" PRId64 ", commit index: %" PRId64 ", match Index: %" PRId64 - ", end index: %" PRId64 "", - pNode->vgId, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + sInfo("vgId:%d, reset log buffer. pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); pBuf->endIndex = pBuf->matchIndex + 1; @@ -3380,10 +3391,10 @@ int32_t syncNodeAppend(SSyncNode* ths, SSyncRaftEntry* pEntry) { // proceed match index, with replicating on needed SyncIndex matchIndex = syncLogBufferProceed(ths->pLogBuf, ths); - sInfo("vgId:%d, append raft log index: %" PRId64 ", term: %" PRId64 " log buffer: [%" PRId64 " %" PRId64 " %" PRId64 - ", %" PRId64 ")", - ths->vgId, pEntry->index, pEntry->term, ths->pLogBuf->startIndex, ths->pLogBuf->commitIndex, - ths->pLogBuf->matchIndex, ths->pLogBuf->endIndex); + sDebug("vgId:%d, append raft entry. index: %" PRId64 ", term: %" PRId64 " pBuf: [%" PRId64 " %" PRId64 " %" PRId64 + ", %" PRId64 ")", + ths->vgId, pEntry->index, pEntry->term, ths->pLogBuf->startIndex, ths->pLogBuf->commitIndex, + ths->pLogBuf->matchIndex, ths->pLogBuf->endIndex); // multi replica if (ths->replicaNum > 1) { @@ -3521,6 +3532,15 @@ int32_t syncNodeOnHeartbeat(SSyncNode* ths, SyncHeartbeat* pMsg) { } int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, SyncHeartbeatReply* pMsg) { + SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(ths, &pMsg->srcId); + if (pMgr == NULL) { + sError("vgId:%d, failed to get log repl mgr for the peer at addr 0x016%" PRIx64 "", ths->vgId, pMsg->srcId.addr); + return -1; + } + return syncLogReplMgrProcessHeartbeatReply(pMgr, ths, pMsg); +} + +int32_t syncNodeOnHeartbeatReplyOld(SSyncNode* ths, SyncHeartbeatReply* pMsg) { syncLogRecvHeartbeatReply(ths, pMsg, ""); // update last reply time, make decision whether the other node is alive or not diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c index 3dcd2d8cdf..1c4b997875 100644 --- a/source/libs/sync/src/syncReplication.c +++ b/source/libs/sync/src/syncReplication.c @@ -173,8 +173,8 @@ int32_t syncNodeReplicateOld(SSyncNode* pSyncNode) { } int32_t syncNodeSendAppendEntries(SSyncNode* pSyncNode, SRaftId* destRaftId, SyncAppendEntries* pMsg) { - sInfo("vgId:%d, send append entries msg index: %" PRId64 " to dest: 0x%016" PRId64, pSyncNode->vgId, - pMsg->prevLogIndex + 1, destRaftId->addr); + sTrace("vgId:%d, send append entries msg index: %" PRId64 " to dest: 0x%016" PRId64, pSyncNode->vgId, + pMsg->prevLogIndex + 1, destRaftId->addr); int32_t ret = 0; pMsg->destId = *destRaftId; SRpcMsg rpcMsg; diff --git a/source/libs/sync/src/syncTimeout.c b/source/libs/sync/src/syncTimeout.c index 17c8c14136..3fe7f08816 100644 --- a/source/libs/sync/src/syncTimeout.c +++ b/source/libs/sync/src/syncTimeout.c @@ -135,4 +135,4 @@ int32_t syncNodeOnTimer(SSyncNode* ths, SyncTimeout* pMsg) { } return ret; -} \ No newline at end of file +} From cf14200dfe2fbfcbd6424a9e5739fdf1fa823c40 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Tue, 15 Nov 2022 10:26:32 +0800 Subject: [PATCH 004/105] enh: get timestamp thru clock_gettime(CLOCK_MONOTONIC,) for taosGetMonotonicMs() --- source/os/src/osTimer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/os/src/osTimer.c b/source/os/src/osTimer.c index d1c233ea9c..d2b8f3134a 100644 --- a/source/os/src/osTimer.c +++ b/source/os/src/osTimer.c @@ -216,7 +216,7 @@ int64_t taosGetMonotonicMs() { #if 0 return getMonotonicUs() / 1000; #else - return taosGetTimestampMs(); + return taosGetMonoTimestampMs(); #endif } From bf634a840d05f65d7d2001601668939e876c4e55 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Tue, 15 Nov 2022 17:13:31 +0800 Subject: [PATCH 005/105] enh: check lastVer and commit version during syncNodeOpen --- source/libs/sync/inc/syncInt.h | 9 ++- source/libs/sync/src/syncAppendEntries.c | 13 +++- source/libs/sync/src/syncAppendEntriesReply.c | 11 ++-- source/libs/sync/src/syncMain.c | 62 +++++++++++-------- 4 files changed, 56 insertions(+), 39 deletions(-) diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index ae1c4d9e50..7f6061cf00 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -120,16 +120,15 @@ static FORCE_INLINE int32_t syncLogGetNextRetryBackoff(SSyncLogReplMgr* pMgr) { } static FORCE_INLINE int32_t syncLogReplMgrUpdateTerm(SSyncLogReplMgr* pMgr, SyncIndex index, SyncTerm term) { - if (index < pMgr->startIndex || index >= pMgr->endIndex) { - return -1; - } + if (pMgr->endIndex == 0) return -1; + ASSERT(pMgr->startIndex <= index && index < pMgr->endIndex); pMgr->states[(index + pMgr->size) % pMgr->size].term = term; return 0; } SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index); -int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SRaftId* pDestId, - bool* pBarrier); +int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm, + SRaftId* pDestId, bool* pBarrier); int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); int32_t syncLogBufferReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c index 1111547a9a..f94e7c041a 100644 --- a/source/libs/sync/src/syncAppendEntries.c +++ b/source/libs/sync/src/syncAppendEntries.c @@ -328,9 +328,16 @@ int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { SyncTerm commitTerm = snapshot.lastApplyTerm; SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); - SyncIndex toIndex = lastVer; - ASSERT(lastVer >= commitIndex); + if (lastVer < commitIndex) { + sError("vgId:%d, lastVer of WAL log less than tsdb commit version. lastVer: %" PRId64 + ", tsdb commit version: %" PRId64 "", + pNode->vgId, lastVer, commitIndex); + // TODO: terrno = TSDB_CODE_WAL_LOG_INCOMPLETE; + goto _err; + } + ASSERT(lastVer >= commitIndex); + SyncIndex toIndex = lastVer; // update match index pBuf->commitIndex = commitIndex; pBuf->matchIndex = toIndex; @@ -547,7 +554,7 @@ int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode) { ASSERT(prevLogIndex == pMatch->index); if (pMatch->term != prevLogTerm) { - sError( + sInfo( "vgId:%d, mismatching raft log entries encountered. " "{ index:%" PRId64 ", term:%" PRId64 " } " diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index ef20153fa7..eddd0d51c9 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -131,8 +131,8 @@ static FORCE_INLINE bool syncLogIsReplicationBarrier(SSyncRaftEntry* pEntry) { return pEntry->originalRpcType == TDMT_SYNC_NOOP; } -int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SRaftId* pDestId, - bool* pBarrier) { +int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm, + SRaftId* pDestId, bool* pBarrier) { SSyncRaftEntry* pEntry = NULL; SyncAppendEntries* pMsgOut = NULL; bool inBuf = false; @@ -140,8 +140,6 @@ int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn SyncTerm prevLogTerm = -1; SSyncLogBuffer* pBuf = pNode->pLogBuf; - sDebug("vgId:%d, replicate one msg index: %" PRId64 " to dest: 0x%016" PRIx64, pNode->vgId, index, pDestId->addr); - pEntry = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf); if (pEntry == NULL) { sError("vgId:%d, failed to get raft entry for index: %" PRId64 "", pNode->vgId, index); @@ -154,7 +152,7 @@ int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn sError("vgId:%d, failed to get prev log term since %s. index: %" PRId64 "", pNode->vgId, terrstr(), index); goto _out; } - (void)syncLogReplMgrUpdateTerm(pMgr, pEntry->index, pEntry->term); + if (pTerm) *pTerm = pEntry->term; pMsgOut = syncLogToAppendEntries(pNode, pEntry, prevLogTerm); if (pMsgOut == NULL) { @@ -165,6 +163,9 @@ int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn (void)syncNodeSendAppendEntries(pNode, pDestId, pMsgOut); ret = 0; + sInfo("vgId:%d, replicate one msg index: %" PRId64 " term: %" PRId64 " prevterm: %" PRId64 " to dest: 0x%016" PRIx64, + pNode->vgId, pEntry->index, pEntry->term, prevLogTerm, pDestId->addr); + _out: syncAppendEntriesDestroy(pMsgOut); pMsgOut = NULL; diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index aaed6a10d0..ccaf5b92a3 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -1140,13 +1140,15 @@ int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; bool barrier = false; - if (syncLogBufferReplicateOneTo(pMgr, pNode, index, pDestId, &barrier) < 0) { + SyncTerm term = -1; + if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, terrstr(), index, pDestId->addr); goto _out; } ASSERT(barrier == pMgr->states[pos].barrier); pMgr->states[pos].timeMs = nowMs; + pMgr->states[pos].term = term; pMgr->states[pos].acked = false; retried = true; tsRetryCnt++; @@ -1162,6 +1164,7 @@ _out: int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) { + SSyncLogBuffer* pBuf = pNode->pLogBuf; SRaftId destId = pMsg->srcId; ASSERT(pMgr->restored == false); @@ -1170,6 +1173,10 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod ASSERT(pMgr->matchIndex == 0); if (pMsg->matchIndex < 0) { pMgr->restored = true; + sInfo("vgId:%d, sync log repl mgr of the %d'th peer restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 + "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } } else { @@ -1182,6 +1189,10 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod if (pMsg->matchIndex == pMsg->lastSendIndex) { pMgr->restored = true; + sInfo("vgId:%d, sync log repl mgr of the %d'th peer restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 + "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } @@ -1191,8 +1202,9 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod // send match index SyncIndex index = TMIN(pMsg->matchIndex, pNode->pLogBuf->matchIndex); bool barrier = false; + SyncTerm term = -1; ASSERT(index >= 0); - if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &destId, &barrier) < 0) { + if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, &destId, &barrier) < 0) { sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, terrstr(), index, destId.addr); return -1; @@ -1201,6 +1213,7 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod int64_t nowMs = taosGetMonoTimestampMs(); pMgr->states[index % pMgr->size].barrier = barrier; pMgr->states[index % pMgr->size].timeMs = nowMs; + pMgr->states[index % pMgr->size].term = term; pMgr->states[index % pMgr->size].acked = false; pMgr->matchIndex = index; @@ -1212,7 +1225,9 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg) { SSyncLogBuffer* pBuf = pNode->pLogBuf; taosThreadMutexLock(&pBuf->mutex); - if (pMsg->startTime != pMgr->peerStartTime) { + if (pMsg->startTime != 0 && pMsg->startTime != pMgr->peerStartTime) { + sInfo("vgId:%d, reset sync log repl mgr in heartbeat. start time:%" PRId64 ", old start time:%" PRId64 "", + pNode->vgId, pMsg->startTime, pMgr->peerStartTime); syncLogResetLogReplMgr(pMgr); pMgr->peerStartTime = pMsg->startTime; } @@ -1224,6 +1239,9 @@ int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Sync SSyncLogBuffer* pBuf = pNode->pLogBuf; taosThreadMutexLock(&pBuf->mutex); if (pMsg->startTime != pMgr->peerStartTime) { + sInfo("vgId:%d, reset sync log repl mgr in append entries reply. start time:%" PRId64 ", old start time:%" PRId64 + "", + pNode->vgId, pMsg->startTime, pMgr->peerStartTime); syncLogResetLogReplMgr(pMgr); pMgr->peerStartTime = pMsg->startTime; } @@ -1252,17 +1270,19 @@ int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode SyncIndex index = pNode->pLogBuf->matchIndex; SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; bool barrier = false; - if (syncLogBufferReplicateOneTo(pMgr, pNode, index, pDestId, &barrier) < 0) { + SyncTerm term = -1; + if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, terrstr(), index, pDestId->addr); return -1; } SSyncLogBuffer* pBuf = pNode->pLogBuf; - sInfo("vgId:%d, attempted to probe the %d'th peer. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 - "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, - pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + sInfo("vgId:%d, attempted to probe the %d'th peer with msg of index:%" PRId64 " term: %" PRId64 + ". pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 + ")", + pNode->vgId, pMgr->peerId, index, term, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } @@ -1273,6 +1293,7 @@ int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* p SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; int32_t batchSize = TMAX(1, pMgr->size / 20); int32_t count = 0; + int64_t nowMs = taosGetMonoTimestampMs(); for (SyncIndex index = pMgr->endIndex; index <= pNode->pLogBuf->matchIndex; index++) { if (batchSize < count++ || pMgr->startIndex + pMgr->size <= index) { @@ -1284,13 +1305,15 @@ int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* p int64_t pos = index % pMgr->size; SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; bool barrier = false; - if (syncLogBufferReplicateOneTo(pMgr, pNode, index, pDestId, &barrier) < 0) { + SyncTerm term = -1; + if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, terrstr(), index, pDestId->addr); return -1; } pMgr->states[pos].barrier = barrier; - pMgr->states[pos].timeMs = taosGetMonoTimestampMs(); + pMgr->states[pos].timeMs = nowMs; + pMgr->states[pos].term = term; pMgr->states[pos].acked = false; pMgr->endIndex = index + 1; @@ -1685,7 +1708,7 @@ SSyncNode* syncNodeOpen(SSyncInfo* pOldSyncInfo) { // init log buffer if (syncLogBufferInit(pSyncNode->pLogBuf, pSyncNode) < 0) { sError("vgId:%d, failed to init raft log buffer since %s", pSyncNode->vgId, terrstr()); - ASSERT(false); + goto _error; } syncNodeEventLog(pSyncNode, "sync open"); @@ -3497,6 +3520,7 @@ int32_t syncNodeOnHeartbeat(SSyncNode* ths, SyncHeartbeat* pMsg) { pMsgReply->srcId = ths->myRaftId; pMsgReply->term = ths->pRaftStore->currentTerm; pMsgReply->privateTerm = 8864; // magic number + pMsgReply->startTime = ths->startTime; SRpcMsg rpcMsg; syncHeartbeatReply2RpcMsg(pMsgReply, &rpcMsg); @@ -3618,6 +3642,7 @@ SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, S int64_t timeMs = pMgr->states[(prevIndex + pMgr->size) % pMgr->size].timeMs; ASSERT(timeMs != 0 && "no log entry found"); prevLogTerm = pMgr->states[(prevIndex + pMgr->size) % pMgr->size].term; + ASSERT(prevIndex == 0 || prevLogTerm != 0); return prevLogTerm; } @@ -3669,21 +3694,6 @@ void syncLogReplicateAppendEntries(SSyncNode* pNode, SyncAppendEntries* pMsg) { } } -int32_t syncLogBufferReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm) { - SyncAppendEntries* pMsgOut = syncLogToAppendEntries(pNode, pEntry, prevLogTerm); - if (pMsgOut == NULL) { - sError("vgId:%d, failed to get append entries for index:%" PRId64 "", pNode->vgId, pEntry->index); - goto _err; - } - - // replicate pMsgOut - (void)syncLogReplicateAppendEntries(pNode, pMsgOut); - -_err: - syncAppendEntriesDestroy(pMsgOut); - return 0; -} - // TLA+ Spec // ClientRequest(i, v) == // /\ state[i] = Leader From 9e8404f60aca4daba5bec1669c60380c097ee08f Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Tue, 25 Oct 2022 18:03:22 +0800 Subject: [PATCH 006/105] refactor(sync): adjust timer --- source/libs/sync/inc/syncInt.h | 1 - source/libs/sync/src/syncMain.c | 84 ++++++++++-------------------- source/libs/sync/src/syncTimeout.c | 4 +- 3 files changed, 29 insertions(+), 60 deletions(-) diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index 7f6061cf00..5b5f198436 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -248,7 +248,6 @@ typedef struct SSyncNode { tmr_h pElectTimer; int32_t electTimerMS; uint64_t electTimerLogicClock; - uint64_t electTimerLogicClockUser; TAOS_TMR_CALLBACK FpElectTimerCB; // Timer Fp uint64_t electTimerCounter; diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index ccaf5b92a3..1e60b4950a 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -1631,7 +1631,6 @@ SSyncNode* syncNodeOpen(SSyncInfo* pOldSyncInfo) { pSyncNode->pElectTimer = NULL; pSyncNode->electTimerMS = syncUtilElectRandomMS(pSyncNode->electBaseLine, 2 * pSyncNode->electBaseLine); atomic_store_64(&pSyncNode->electTimerLogicClock, 0); - atomic_store_64(&pSyncNode->electTimerLogicClockUser, 0); pSyncNode->FpElectTimerCB = syncNodeEqElectTimer; pSyncNode->electTimerCounter = 0; @@ -1937,15 +1936,6 @@ int32_t syncNodeStartElectTimer(SSyncNode* pSyncNode, int32_t ms) { pSyncNode->electTimerMS = ms; taosTmrReset(pSyncNode->FpElectTimerCB, pSyncNode->electTimerMS, pSyncNode, gSyncEnv->pTimerManager, &pSyncNode->pElectTimer); - atomic_store_64(&pSyncNode->electTimerLogicClock, pSyncNode->electTimerLogicClockUser); - - /* - do { - char logBuf[128]; - snprintf(logBuf, sizeof(logBuf), "elect timer reset, ms:%d", ms); - syncNodeEventLog(pSyncNode, logBuf); - } while (0); - */ } else { sError("vgId:%d, start elect timer error, sync env is stop", pSyncNode->vgId); @@ -1955,11 +1945,10 @@ int32_t syncNodeStartElectTimer(SSyncNode* pSyncNode, int32_t ms) { int32_t syncNodeStopElectTimer(SSyncNode* pSyncNode) { int32_t ret = 0; - atomic_add_fetch_64(&pSyncNode->electTimerLogicClockUser, 1); + atomic_add_fetch_64(&pSyncNode->electTimerLogicClock, 1); taosTmrStop(pSyncNode->pElectTimer); pSyncNode->pElectTimer = NULL; - // sTrace("vgId:%d, sync %s stop elect timer", pSyncNode->vgId, syncUtilState2String(pSyncNode->state)); return ret; } @@ -2185,8 +2174,6 @@ cJSON* syncNode2Json(const SSyncNode* pSyncNode) { cJSON_AddNumberToObject(pRoot, "electTimerMS", pSyncNode->electTimerMS); snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->electTimerLogicClock); cJSON_AddStringToObject(pRoot, "electTimerLogicClock", u64buf); - snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->electTimerLogicClockUser); - cJSON_AddStringToObject(pRoot, "electTimerLogicClockUser", u64buf); snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->FpElectTimerCB); cJSON_AddStringToObject(pRoot, "FpElectTimerCB", u64buf); snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->electTimerCounter); @@ -2288,7 +2275,7 @@ inline void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) { snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy, pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex, pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode), - pSyncNode->electTimerLogicClockUser, pSyncNode->heartbeatTimerLogicClockUser, peerStateStr, printStr); + pSyncNode->electTimerLogicClock, pSyncNode->heartbeatTimerLogicClockUser, peerStateStr, printStr); } else { snprintf(logBuf, sizeof(logBuf), "%s", str); } @@ -2312,7 +2299,7 @@ inline void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) { snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy, pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex, pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode), - pSyncNode->electTimerLogicClockUser, pSyncNode->heartbeatTimerLogicClockUser, peerStateStr, printStr); + pSyncNode->electTimerLogicClock, pSyncNode->heartbeatTimerLogicClockUser, peerStateStr, printStr); } else { snprintf(s, len, "%s", str); } @@ -2362,7 +2349,7 @@ inline void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str) { snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy, pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex, pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode), - pSyncNode->electTimerLogicClockUser, pSyncNode->heartbeatTimerLogicClockUser, printStr); + pSyncNode->electTimerLogicClock, pSyncNode->heartbeatTimerLogicClockUser, printStr); } else { snprintf(logBuf, sizeof(logBuf), "%s", str); } @@ -2384,7 +2371,7 @@ inline void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str) { snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy, pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex, pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode), - pSyncNode->electTimerLogicClockUser, pSyncNode->heartbeatTimerLogicClockUser, printStr); + pSyncNode->electTimerLogicClock, pSyncNode->heartbeatTimerLogicClockUser, printStr); } else { snprintf(s, len, "%s", str); } @@ -3226,36 +3213,31 @@ static void syncNodeEqPingTimer(void* param, void* tmrId) { static void syncNodeEqElectTimer(void* param, void* tmrId) { SSyncNode* pSyncNode = (SSyncNode*)param; - if (atomic_load_64(&pSyncNode->electTimerLogicClockUser) <= atomic_load_64(&pSyncNode->electTimerLogicClock)) { - SyncTimeout* pSyncMsg = syncTimeoutBuild2(SYNC_TIMEOUT_ELECTION, atomic_load_64(&pSyncNode->electTimerLogicClock), - pSyncNode->electTimerMS, pSyncNode->vgId, pSyncNode); - SRpcMsg rpcMsg; - syncTimeout2RpcMsg(pSyncMsg, &rpcMsg); - syncRpcMsgLog2((char*)"==syncNodeEqElectTimer==", &rpcMsg); - if (pSyncNode->FpEqMsg != NULL) { - int32_t code = pSyncNode->FpEqMsg(pSyncNode->msgcb, &rpcMsg); - if (code != 0) { - sError("vgId:%d, sync enqueue elect msg error, code:%d", pSyncNode->vgId, code); - rpcFreeCont(rpcMsg.pCont); - syncTimeoutDestroy(pSyncMsg); - return; - } - } else { - sTrace("syncNodeEqElectTimer FpEqMsg is NULL"); - } - syncTimeoutDestroy(pSyncMsg); - // reset timer ms - if (syncEnvIsStart() && pSyncNode->electBaseLine > 0) { - pSyncNode->electTimerMS = syncUtilElectRandomMS(pSyncNode->electBaseLine, 2 * pSyncNode->electBaseLine); - taosTmrReset(syncNodeEqElectTimer, pSyncNode->electTimerMS, pSyncNode, gSyncEnv->pTimerManager, - &pSyncNode->pElectTimer); - } else { - sError("sync env is stop, syncNodeEqElectTimer"); + SyncTimeout* pSyncMsg = syncTimeoutBuild2(SYNC_TIMEOUT_ELECTION, atomic_load_64(&pSyncNode->electTimerLogicClock), + pSyncNode->electTimerMS, pSyncNode->vgId, pSyncNode); + SRpcMsg rpcMsg; + syncTimeout2RpcMsg(pSyncMsg, &rpcMsg); + if (pSyncNode->FpEqMsg != NULL) { + int32_t code = pSyncNode->FpEqMsg(pSyncNode->msgcb, &rpcMsg); + if (code != 0) { + sError("vgId:%d, sync enqueue elect msg error, code:%d", pSyncNode->vgId, code); + rpcFreeCont(rpcMsg.pCont); + syncTimeoutDestroy(pSyncMsg); + return; } } else { - sTrace("==syncNodeEqElectTimer== electTimerLogicClock:%" PRIu64 ", electTimerLogicClockUser:%" PRIu64, - pSyncNode->electTimerLogicClock, pSyncNode->electTimerLogicClockUser); + sTrace("syncNodeEqElectTimer FpEqMsg is NULL"); + } + syncTimeoutDestroy(pSyncMsg); + + // reset timer ms + if (syncEnvIsStart() && pSyncNode->electBaseLine > 0) { + pSyncNode->electTimerMS = syncUtilElectRandomMS(pSyncNode->electBaseLine, 2 * pSyncNode->electBaseLine); + taosTmrReset(syncNodeEqElectTimer, pSyncNode->electTimerMS, pSyncNode, gSyncEnv->pTimerManager, + &pSyncNode->pElectTimer); + } else { + sError("sync env is stop, syncNodeEqElectTimer"); } } @@ -3480,16 +3462,6 @@ static int32_t syncNodeAppendNoopOld(SSyncNode* ths) { // on message ---- int32_t syncNodeOnPingCb(SSyncNode* ths, SyncPing* pMsg) { // log state - char logBuf[1024] = {0}; - snprintf(logBuf, sizeof(logBuf), - "==syncNodeOnPingCb== vgId:%d, state: %d, %s, term:%" PRIu64 " electTimerLogicClock:%" PRIu64 - ", " - "electTimerLogicClockUser:%" PRIu64 ", electTimerMS:%d", - ths->vgId, ths->state, syncUtilState2String(ths->state), ths->pRaftStore->currentTerm, - ths->electTimerLogicClock, ths->electTimerLogicClockUser, ths->electTimerMS); - - int32_t ret = 0; - syncPingLog2(logBuf, pMsg); SyncPingReply* pMsgReply = syncPingReplyBuild3(&ths->myRaftId, &pMsg->srcId, ths->vgId); SRpcMsg rpcMsg; syncPingReply2RpcMsg(pMsgReply, &rpcMsg); @@ -3503,7 +3475,7 @@ int32_t syncNodeOnPingCb(SSyncNode* ths, SyncPing* pMsg) { syncNodeSendMsgById(&pMsgReply->destId, ths, &rpcMsg); - return ret; + return 0; } int32_t syncNodeOnPingReplyCb(SSyncNode* ths, SyncPingReply* pMsg) { diff --git a/source/libs/sync/src/syncTimeout.c b/source/libs/sync/src/syncTimeout.c index 3fe7f08816..fa7660dccf 100644 --- a/source/libs/sync/src/syncTimeout.c +++ b/source/libs/sync/src/syncTimeout.c @@ -113,10 +113,8 @@ int32_t syncNodeOnTimer(SSyncNode* ths, SyncTimeout* pMsg) { } } else if (pMsg->timeoutType == SYNC_TIMEOUT_ELECTION) { - if (atomic_load_64(&ths->electTimerLogicClockUser) <= pMsg->logicClock) { + if (atomic_load_64(&ths->electTimerLogicClock) <= pMsg->logicClock) { ++(ths->electTimerCounter); - sTrace("vgId:%d, sync timer, type:election count:%" PRIu64 ", lc-user:%" PRIu64, ths->vgId, - ths->electTimerCounter, ths->electTimerLogicClockUser); syncNodeElect(ths); } From ab2f4e974c720b8ece920713a22d6f5bff682014 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Wed, 16 Nov 2022 12:02:46 +0800 Subject: [PATCH 007/105] fix: protect against nullptr of pMsg in cliHandleExeptImpl --- source/libs/transport/src/transCli.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 126b0b638e..04269a3e05 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -451,7 +451,7 @@ void cliHandleExceptImpl(SCliConn* pConn, int32_t code) { if (pCtx == NULL || pCtx->pSem == NULL) { if (transMsg.info.ahandle == NULL) { - if (REQUEST_NO_RESP(&pMsg->msg) || pMsg->type == Release) destroyCmsg(pMsg); + if (pMsg == NULL || REQUEST_NO_RESP(&pMsg->msg) || pMsg->type == Release) destroyCmsg(pMsg); once = true; continue; } From 3e13cd82808653f02248dda4e5f3ce86d9388ef5 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Wed, 16 Nov 2022 14:26:18 +0800 Subject: [PATCH 008/105] fix: check if timer triggered ahead of time in syncNodeElect --- include/libs/sync/syncTools.h | 2 + include/util/tdef.h | 2 +- source/libs/sync/inc/syncInt.h | 1 + source/libs/sync/src/syncAppendEntriesReply.c | 6 +-- source/libs/sync/src/syncElection.c | 13 +++++- source/libs/sync/src/syncMain.c | 41 +++++++++++++++---- source/libs/sync/src/syncReplication.c | 7 ++++ 7 files changed, 58 insertions(+), 14 deletions(-) diff --git a/include/libs/sync/syncTools.h b/include/libs/sync/syncTools.h index d5c015bfb2..d009ea0b4f 100644 --- a/include/libs/sync/syncTools.h +++ b/include/libs/sync/syncTools.h @@ -696,6 +696,8 @@ int32_t syncNodeOnSnapshotReply(SSyncNode* ths, SyncSnapshotRsp* pMsg); int32_t syncNodeOnHeartbeat(SSyncNode* ths, SyncHeartbeat* pMsg); int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, SyncHeartbeatReply* pMsg); +void syncNodePegLastMsgRecvTime(SSyncNode* ths); + // ----------------------------------------- typedef int32_t (*FpOnPingCb)(SSyncNode* ths, SyncPing* pMsg); typedef int32_t (*FpOnPingReplyCb)(SSyncNode* ths, SyncPingReply* pMsg); diff --git a/include/util/tdef.h b/include/util/tdef.h index c5776e8d87..742b6b1da9 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -281,7 +281,7 @@ typedef enum ELogicConditionType { #define TSDB_DNODE_ROLE_VNODE 2 #define TSDB_MAX_REPLICA 5 -#define TSDB_SYNC_LOG_BUFFER_SIZE 512 +#define TSDB_SYNC_LOG_BUFFER_SIZE 1024 #define TSDB_TBNAME_COLUMN_INDEX (-1) #define TSDB_MULTI_TABLEMETA_MAX_NUM 100000 // maximum batch size allowed to load table meta diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index 5b5f198436..b341587bbe 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -298,6 +298,7 @@ typedef struct SSyncNode { int64_t startTime; int64_t leaderTime; int64_t lastReplicateTime; + int64_t lastMsgRecvTime; } SSyncNode; diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index eddd0d51c9..cbff83acf8 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -148,7 +148,7 @@ int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn *pBarrier = syncLogIsReplicationBarrier(pEntry); prevLogTerm = syncLogReplMgrGetPrevLogTerm(pMgr, pNode, index); - if (prevLogTerm < 0 && terrno != TSDB_CODE_SUCCESS) { + if (prevLogTerm < 0) { sError("vgId:%d, failed to get prev log term since %s. index: %" PRId64 "", pNode->vgId, terrstr(), index); goto _out; } @@ -163,8 +163,8 @@ int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn (void)syncNodeSendAppendEntries(pNode, pDestId, pMsgOut); ret = 0; - sInfo("vgId:%d, replicate one msg index: %" PRId64 " term: %" PRId64 " prevterm: %" PRId64 " to dest: 0x%016" PRIx64, - pNode->vgId, pEntry->index, pEntry->term, prevLogTerm, pDestId->addr); + sDebug("vgId:%d, replicate one msg index: %" PRId64 " term: %" PRId64 " prevterm: %" PRId64 " to dest: 0x%016" PRIx64, + pNode->vgId, pEntry->index, pEntry->term, prevLogTerm, pDestId->addr); _out: syncAppendEntriesDestroy(pMsgOut); diff --git a/source/libs/sync/src/syncElection.c b/source/libs/sync/src/syncElection.c index a287727a39..8d904ff934 100644 --- a/source/libs/sync/src/syncElection.c +++ b/source/libs/sync/src/syncElection.c @@ -34,6 +34,13 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) { syncNodeEventLog(pSyncNode, "begin election"); + int64_t nowMs = taosGetMonoTimestampMs(); + if (nowMs < pSyncNode->lastMsgRecvTime + pSyncNode->electTimerMS) { + sError("vgId:%d, election timer triggered ahead of time for %" PRId64 "ms", pSyncNode->vgId, + pSyncNode->lastMsgRecvTime + pSyncNode->electTimerMS - nowMs); + return -1; + } + int32_t ret = 0; if (pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER) { syncNodeFollower2Candidate(pSyncNode); @@ -105,7 +112,11 @@ int32_t syncNodeRequestVotePeers(SSyncNode* pSyncNode) { int32_t syncNodeSendRequestVote(SSyncNode* pSyncNode, const SRaftId* destRaftId, const SyncRequestVote* pMsg) { int32_t ret = 0; - syncLogSendRequestVote(pSyncNode, pMsg, ""); + // syncLogSendRequestVote(pSyncNode, pMsg, ""); + char host[64]; + uint16_t port; + syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port); + sInfo("vgId:%d, send request vote of term: %" PRId64 " to %s:%d", pSyncNode->vgId, pMsg->term, host, port); SRpcMsg rpcMsg; syncRequestVote2RpcMsg(pMsg, &rpcMsg); diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 1e60b4950a..7811d3ca59 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -1167,15 +1167,18 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod SSyncLogBuffer* pBuf = pNode->pLogBuf; SRaftId destId = pMsg->srcId; ASSERT(pMgr->restored == false); + char host[64]; + uint16_t port; + syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); if (pMgr->endIndex == 0) { ASSERT(pMgr->startIndex == 0); ASSERT(pMgr->matchIndex == 0); if (pMsg->matchIndex < 0) { pMgr->restored = true; - sInfo("vgId:%d, sync log repl mgr of the %d'th peer restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 + sInfo("vgId:%d, sync log repl mgr of peer %s:%d restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pNode->vgId, host, port, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } @@ -1189,9 +1192,9 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod if (pMsg->matchIndex == pMsg->lastSendIndex) { pMgr->restored = true; - sInfo("vgId:%d, sync log repl mgr of the %d'th peer restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 + sInfo("vgId:%d, sync log repl mgr of peer %s:%d restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pNode->vgId, host, port, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } @@ -1278,11 +1281,11 @@ int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode } SSyncLogBuffer* pBuf = pNode->pLogBuf; - sInfo("vgId:%d, attempted to probe the %d'th peer with msg of index:%" PRId64 " term: %" PRId64 - ". pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 - ")", - pNode->vgId, pMgr->peerId, index, term, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, - pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + sDebug("vgId:%d, attempted to probe the %d'th peer with msg of index:%" PRId64 " term: %" PRId64 + ". pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 + ")", + pNode->vgId, pMgr->peerId, index, term, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } @@ -1963,6 +1966,8 @@ int32_t syncNodeResetElectTimer(SSyncNode* pSyncNode) { int32_t ret = 0; int32_t electMS; + syncNodePegLastMsgRecvTime(pSyncNode); + if (pSyncNode->pRaftCfg->isStandBy) { electMS = TIMER_MAX_MS; } else { @@ -3231,6 +3236,7 @@ static void syncNodeEqElectTimer(void* param, void* tmrId) { } syncTimeoutDestroy(pSyncMsg); +#if 0 // reset timer ms if (syncEnvIsStart() && pSyncNode->electBaseLine > 0) { pSyncNode->electTimerMS = syncUtilElectRandomMS(pSyncNode->electBaseLine, 2 * pSyncNode->electBaseLine); @@ -3239,6 +3245,7 @@ static void syncNodeEqElectTimer(void* param, void* tmrId) { } else { sError("sync env is stop, syncNodeEqElectTimer"); } +#endif } static void syncNodeEqHeartbeatTimer(void* param, void* tmrId) { @@ -3246,6 +3253,10 @@ static void syncNodeEqHeartbeatTimer(void* param, void* tmrId) { syncNodeEventLog(pSyncNode, "eq hb timer"); +#if 0 + sInfo("vgId:%d, heartbeat timer tick.", pSyncNode->vgId); +#endif + if (pSyncNode->replicaNum > 1) { if (atomic_load_64(&pSyncNode->heartbeatTimerLogicClockUser) <= atomic_load_64(&pSyncNode->heartbeatTimerLogicClock)) { @@ -3484,6 +3495,11 @@ int32_t syncNodeOnPingReplyCb(SSyncNode* ths, SyncPingReply* pMsg) { return ret; } +void syncNodePegLastMsgRecvTime(SSyncNode* ths) { + int64_t nowMs = taosGetMonoTimestampMs(); + ths->lastMsgRecvTime = nowMs; +} + int32_t syncNodeOnHeartbeat(SSyncNode* ths, SyncHeartbeat* pMsg) { syncLogRecvHeartbeat(ths, pMsg, ""); @@ -3497,6 +3513,13 @@ int32_t syncNodeOnHeartbeat(SSyncNode* ths, SyncHeartbeat* pMsg) { SRpcMsg rpcMsg; syncHeartbeatReply2RpcMsg(pMsgReply, &rpcMsg); +#if 0 + char host[64]; + uint16_t port; + syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); + sInfo("vgId:%d, recv heartbeat msg from %s:%d", ths->vgId, host, port); +#endif + #if 1 if (pMsg->term >= ths->pRaftStore->currentTerm && ths->state != TAOS_SYNC_STATE_FOLLOWER) { syncNodeStepDown(ths, pMsg->term); diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c index 1c4b997875..0c6290180f 100644 --- a/source/libs/sync/src/syncReplication.c +++ b/source/libs/sync/src/syncReplication.c @@ -239,6 +239,13 @@ int32_t syncNodeSendHeartbeat(SSyncNode* pSyncNode, const SRaftId* destRaftId, c int32_t ret = 0; syncLogSendHeartbeat(pSyncNode, pMsg, ""); +#if 0 + char host[64]; + uint16_t port; + syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port); + sInfo("vgId:%d, send heartbeat msg to %s:%d", pSyncNode->vgId, host, port); +#endif + SRpcMsg rpcMsg; syncHeartbeat2RpcMsg(pMsg, &rpcMsg); syncNodeSendMsgById(&(pMsg->destId), pSyncNode, &rpcMsg); From 60626327222dac0a956be8715ee55dbbccb22dc5 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Wed, 16 Nov 2022 19:53:22 +0800 Subject: [PATCH 009/105] enh: turn commit-cb logging msg to debug level in vnodeSyncCommitMsg --- source/dnode/vnode/src/vnd/vnodeSync.c | 8 ++++---- source/libs/sync/src/syncAppendEntries.c | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index c3ccbddc53..e66bed22cd 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -418,10 +418,10 @@ static void vnodeSyncCommitMsg(SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta c rpcMsg.info.conn.applyIndex = cbMeta.index; rpcMsg.info.conn.applyTerm = cbMeta.term; - vInfo("vgId:%d, commit-cb is excuted, fsm:%p, index:%" PRId64 ", term:%" PRIu64 ", msg-index:%" PRId64 - ", weak:%d, code:%d, state:%d %s, type:%s", - syncGetVgId(pVnode->sync), pFsm, cbMeta.index, cbMeta.term, rpcMsg.info.conn.applyIndex, cbMeta.isWeak, - cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), TMSG_INFO(pMsg->msgType)); + vDebug("vgId:%d, commit-cb is excuted, fsm:%p, index:%" PRId64 ", term:%" PRIu64 ", msg-index:%" PRId64 + ", weak:%d, code:%d, state:%d %s, type:%s", + syncGetVgId(pVnode->sync), pFsm, cbMeta.index, cbMeta.term, rpcMsg.info.conn.applyIndex, cbMeta.isWeak, + cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), TMSG_INFO(pMsg->msgType)); tmsgPutToQueue(&pVnode->msgCb, APPLY_QUEUE, &rpcMsg); } else { diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c index f94e7c041a..2552867a99 100644 --- a/source/libs/sync/src/syncAppendEntries.c +++ b/source/libs/sync/src/syncAppendEntries.c @@ -618,10 +618,12 @@ int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf) { ASSERT(pBuf->commitIndex <= pBuf->matchIndex); ASSERT(pBuf->matchIndex < pBuf->endIndex); ASSERT(pBuf->endIndex - pBuf->startIndex <= pBuf->size); +#if 0 for (SyncIndex index = pBuf->startIndex; index <= pBuf->matchIndex; index++) { SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; ASSERT(pEntry != NULL); } +#endif return 0; } From da469149db61b1725c9d2adb657497f3b935f057 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Thu, 17 Nov 2022 20:27:23 +0800 Subject: [PATCH 010/105] enh: debug to info --- source/dnode/vnode/src/vnd/vnodeSync.c | 12 ++--- source/libs/sync/src/syncAppendEntries.c | 26 +++++----- source/libs/sync/src/syncAppendEntriesReply.c | 12 ++--- source/libs/sync/src/syncMain.c | 48 +++++++------------ 4 files changed, 41 insertions(+), 57 deletions(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index 7ab19c5c6e..feecbc6d3b 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -307,10 +307,10 @@ static void vnodeSyncApplyMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const S rpcMsg.info.conn.applyTerm = pMeta->term; const STraceId *trace = &pMsg->info.traceId; - vGTrace("vgId:%d, commit-cb is excuted, fsm:%p, index:%" PRId64 ", term:%" PRIu64 ", msg-index:%" PRId64 - ", weak:%d, code:%d, state:%d %s, type:%s", - pVnode->config.vgId, pFsm, pMeta->index, pMeta->term, rpcMsg.info.conn.applyIndex, pMeta->isWeak, - pMeta->code, pMeta->state, syncStr(pMeta->state), TMSG_INFO(pMsg->msgType)); + vGInfo("vgId:%d, commit-cb is excuted, fsm:%p, index:%" PRId64 ", term:%" PRIu64 ", msg-index:%" PRId64 + ", weak:%d, code:%d, state:%d %s, type:%s", + pVnode->config.vgId, pFsm, pMeta->index, pMeta->term, rpcMsg.info.conn.applyIndex, pMeta->isWeak, + pMeta->code, pMeta->state, syncStr(pMeta->state), TMSG_INFO(pMsg->msgType)); tmsgPutToQueue(&pVnode->msgCb, APPLY_QUEUE, &rpcMsg); } else { @@ -558,12 +558,12 @@ bool vnodeIsLeader(SVnode *pVnode) { } else { terrno = TSDB_CODE_APP_NOT_READY; } - vDebug("vgId:%d, vnode not ready, state:%s, restore:%d", pVnode->config.vgId, syncStr(state.state), state.restored); + vInfo("vgId:%d, vnode not ready, state:%s, restore:%d", pVnode->config.vgId, syncStr(state.state), state.restored); return false; } if (!pVnode->restored) { - vDebug("vgId:%d, vnode not restored", pVnode->config.vgId); + vInfo("vgId:%d, vnode not restored", pVnode->config.vgId); terrno = TSDB_CODE_APP_NOT_READY; return false; } diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c index 0d892cdd1d..8197119b87 100644 --- a/source/libs/sync/src/syncAppendEntries.c +++ b/source/libs/sync/src/syncAppendEntries.c @@ -245,19 +245,19 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt SyncTerm lastMatchTerm = syncLogBufferGetLastMatchTerm(pBuf); if (index <= pBuf->commitIndex) { - sDebug("vgId:%d, raft entry already committed. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 - " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, - pBuf->endIndex); + sInfo("vgId:%d, raft entry already committed. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, + pBuf->endIndex); ret = 0; goto _out; } if (index - pBuf->startIndex >= pBuf->size) { - sDebug("vgId:%d, raft entry out of buffer capacity. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 - " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, - pBuf->endIndex); + sInfo("vgId:%d, raft entry out of buffer capacity. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, + pBuf->endIndex); goto _out; } @@ -382,8 +382,8 @@ int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode) { // increase match index pBuf->matchIndex = index; - sDebug("vgId:%d, log buffer proceed. start index: %" PRId64 ", match index: %" PRId64 ", end index: %" PRId64, - pNode->vgId, pBuf->startIndex, pBuf->matchIndex, pBuf->endIndex); + sInfo("vgId:%d, log buffer proceed. start index: %" PRId64 ", match index: %" PRId64 ", end index: %" PRId64, + pNode->vgId, pBuf->startIndex, pBuf->matchIndex, pBuf->endIndex); // replicate on demand (void)syncNodeReplicate(pNode); @@ -586,9 +586,9 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, const SRpcMsg* pRpcMsg) { goto _IGNORE; } - sDebug("vgId:%d, recv append entries msg. index:%" PRId64 ", term:%" PRId64 ", preLogIndex:%" PRId64 - ", prevLogTerm:%" PRId64 " commitIndex:%" PRId64 "", - pMsg->vgId, pMsg->prevLogIndex + 1, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->commitIndex); + sInfo("vgId:%d, recv append entries msg. index:%" PRId64 ", term:%" PRId64 ", preLogIndex:%" PRId64 + ", prevLogTerm:%" PRId64 " commitIndex:%" PRId64 "", + pMsg->vgId, pMsg->prevLogIndex + 1, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->commitIndex); // accept if (syncLogBufferAccept(ths->pLogBuf, ths, pEntry, pMsg->prevLogTerm) < 0) { diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index 3a7513f276..3295f03016 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -50,8 +50,8 @@ int64_t syncNodeCheckCommitIndex(SSyncNode* ths, SyncIndex indexLikely) { if (indexLikely > ths->commitIndex && syncNodeAgreedUpon(ths, indexLikely)) { SyncIndex commitIndex = indexLikely; syncNodeUpdateCommitIndex(ths, commitIndex); - sDebug("vgId:%d, agreed upon. role:%d, term:%" PRId64 ", index: %" PRId64 "", ths->vgId, ths->state, - ths->pRaftStore->currentTerm, commitIndex); + sInfo("vgId:%d, agreed upon. role:%d, term:%" PRId64 ", index: %" PRId64 "", ths->vgId, ths->state, + ths->pRaftStore->currentTerm, commitIndex); } return ths->commitIndex; } @@ -113,8 +113,8 @@ int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn (void)syncNodeSendAppendEntries(pNode, pDestId, &msgOut); ret = 0; - sDebug("vgId:%d, replicate one msg index: %" PRId64 " term: %" PRId64 " prevterm: %" PRId64 " to dest: 0x%016" PRIx64, - pNode->vgId, pEntry->index, pEntry->term, prevLogTerm, pDestId->addr); + sInfo("vgId:%d, replicate one msg index: %" PRId64 " term: %" PRId64 " prevterm: %" PRId64 " to dest: 0x%016" PRIx64, + pNode->vgId, pEntry->index, pEntry->term, prevLogTerm, pDestId->addr); if (!inBuf) { syncEntryDestroy(pEntry); @@ -157,8 +157,8 @@ int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) { ASSERT(pMsg->term == ths->pRaftStore->currentTerm); - sDebug("vgId:%d received append entries reply. srcId:0x%016" PRIx64 ", term:%" PRId64 ", matchIndex:%" PRId64 "", - pMsg->vgId, pMsg->srcId.addr, pMsg->term, pMsg->matchIndex); + sInfo("vgId:%d received append entries reply. srcId:0x%016" PRIx64 ", term:%" PRId64 ", matchIndex:%" PRId64 "", + pMsg->vgId, pMsg->srcId.addr, pMsg->term, pMsg->matchIndex); if (pMsg->success) { SyncIndex oldMatchIndex = syncIndexMgrGetIndex(ths->pMatchIndex, &(pMsg->srcId)); diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index a54fbd294b..7e19b9aa5c 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -93,13 +93,13 @@ int32_t syncStart(int64_t rid) { goto _err; } - if (syncNodeStart(pSyncNode) < 0) { - sError("vgId:%d, failed to start sync node since %s", pSyncNode->vgId, terrstr()); - goto _err; - } + if (syncNodeStart(pSyncNode) < 0) { + sError("vgId:%d, failed to start sync node since %s", pSyncNode->vgId, terrstr()); + goto _err; + } - syncNodeRelease(pSyncNode); - return 0; + syncNodeRelease(pSyncNode); + return 0; _err: syncNodeRelease(pSyncNode); @@ -524,13 +524,8 @@ int32_t syncGetSnapshotByIndex(int64_t rid, SyncIndex index, SSnapshot* pSnapsho pSnapshot->lastApplyTerm = pEntry->term; pSnapshot->lastConfigIndex = syncNodeGetSnapshotConfigIndex(pSyncNode, index); -<<<<<<< HEAD - syncEntryDestroy(pEntry); - taosReleaseRef(tsNodeRefId, pSyncNode->rid); -======= syncEntryDestroy(pEntry); syncNodeRelease(pSyncNode); ->>>>>>> 3.0 return 0; } @@ -771,7 +766,7 @@ _out: int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) { SSyncLogBuffer* pBuf = pNode->pLogBuf; - SRaftId destId = pMsg->srcId; + SRaftId destId = pMsg->srcId; ASSERT(pMgr->restored == false); char host[64]; uint16_t port; @@ -2508,10 +2503,10 @@ int32_t syncNodeAppend(SSyncNode* ths, SSyncRaftEntry* pEntry) { // proceed match index, with replicating on needed SyncIndex matchIndex = syncLogBufferProceed(ths->pLogBuf, ths); - sDebug("vgId:%d, append raft entry. index: %" PRId64 ", term: %" PRId64 " pBuf: [%" PRId64 " %" PRId64 " %" PRId64 - ", %" PRId64 ")", - ths->vgId, pEntry->index, pEntry->term, ths->pLogBuf->startIndex, ths->pLogBuf->commitIndex, - ths->pLogBuf->matchIndex, ths->pLogBuf->endIndex); + sInfo("vgId:%d, append raft entry. index: %" PRId64 ", term: %" PRId64 " pBuf: [%" PRId64 " %" PRId64 " %" PRId64 + ", %" PRId64 ")", + ths->vgId, pEntry->index, pEntry->term, ths->pLogBuf->startIndex, ths->pLogBuf->commitIndex, + ths->pLogBuf->matchIndex, ths->pLogBuf->endIndex); // multi replica if (ths->replicaNum > 1) { @@ -2646,7 +2641,7 @@ int32_t syncNodeOnHeartbeat(SSyncNode* ths, const SRpcMsg* pRpcMsg) { int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) { SyncHeartbeatReply* pMsg = pRpcMsg->pCont; - SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(ths, &pMsg->srcId); + SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(ths, &pMsg->srcId); if (pMgr == NULL) { sError("vgId:%d, failed to get log repl mgr for the peer at addr 0x016%" PRIx64 "", ths->vgId, pMsg->srcId.addr); return -1; @@ -2797,17 +2792,6 @@ int32_t syncLogToAppendEntries(SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTer return 0; } -#if 0 -void syncLogReplicateAppendEntries(SSyncNode* pNode, SyncAppendEntries* pMsg) { - for (int i = 0; i < pNode->replicaNum; i++) { - SRaftId* pDestId = &pNode->peersId[i]; - if (!syncUtilSameId(pDestId, &pNode->myRaftId)) { - (void)syncNodeSendAppendEntries(pNode, pDestId, pMsg); - } - } -} -#endif - // TLA+ Spec // ClientRequest(i, v) == // /\ state[i] = Leader @@ -2824,9 +2808,9 @@ int32_t syncNodeOnClientRequest(SSyncNode* ths, SRpcMsg* pMsg, SyncIndex* pRetIn int32_t code = 0; - SyncIndex index = syncLogBufferGetEndIndex(ths->pLogBuf); - SyncTerm term = ths->pRaftStore->currentTerm; - SSyncRaftEntry* pEntry = NULL; + SyncIndex index = syncLogBufferGetEndIndex(ths->pLogBuf); + SyncTerm term = ths->pRaftStore->currentTerm; + SSyncRaftEntry* pEntry = NULL; if (pMsg->msgType == TDMT_SYNC_CLIENT_REQUEST) { pEntry = syncEntryBuildFromClientRequest(pMsg->pCont, term, index); } else { @@ -2841,7 +2825,7 @@ int32_t syncNodeOnClientRequest(SSyncNode* ths, SRpcMsg* pMsg, SyncIndex* pRetIn return syncNodeAppend(ths, pEntry); } - return 0; + return -1; } int32_t syncNodeOnClientRequestOld(SSyncNode* ths, SRpcMsg* pMsg, SyncIndex* pRetIndex) { From 4526ff28769554b8c0c7aa002244052e46717226 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Thu, 17 Nov 2022 23:37:02 +0800 Subject: [PATCH 011/105] enh: add syncLogBuffer.h and syncLogBuffer.c --- source/libs/sync/inc/syncInt.h | 98 +- source/libs/sync/inc/syncLogBuffer.h | 129 +++ source/libs/sync/src/syncAppendEntries.c | 394 +------- source/libs/sync/src/syncAppendEntriesReply.c | 77 +- source/libs/sync/src/syncLogBuffer.c | 944 ++++++++++++++++++ source/libs/sync/src/syncMain.c | 455 +-------- source/libs/sync/src/syncReplication.c | 3 + source/os/src/osTimer.c | 2 +- 8 files changed, 1083 insertions(+), 1019 deletions(-) create mode 100644 source/libs/sync/inc/syncLogBuffer.h create mode 100644 source/libs/sync/src/syncLogBuffer.c diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index 2199b9b65a..f204f7f4fe 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -50,6 +50,8 @@ typedef struct SyncPreSnapshotReply SyncPreSnapshotReply; typedef struct SyncHeartbeatReply SyncHeartbeatReply; typedef struct SyncHeartbeat SyncHeartbeat; typedef struct SyncPreSnapshot SyncPreSnapshot; +typedef struct SSyncLogBuffer SSyncLogBuffer; +typedef struct SSyncLogReplMgr SSyncLogReplMgr; typedef struct SRaftId { SyncNodeId addr; @@ -85,102 +87,6 @@ typedef struct SPeerState { int64_t lastSendTime; } SPeerState; -typedef struct SSyncReplInfo { - bool barrier; - bool acked; - int64_t timeMs; - int64_t term; -} SSyncReplInfo; - -typedef struct SSyncLogReplMgr { - SSyncReplInfo states[TSDB_SYNC_LOG_BUFFER_SIZE]; - int64_t startIndex; - int64_t matchIndex; - int64_t endIndex; - int64_t size; - bool restored; - int64_t peerStartTime; - int32_t retryBackoff; - int32_t peerId; -} SSyncLogReplMgr; - -SSyncLogReplMgr* syncLogReplMgrCreate(); -void syncLogReplMgrDestroy(SSyncLogReplMgr* pMgr); - -// access -static FORCE_INLINE int64_t syncLogGetRetryBackoffTimeMs(SSyncLogReplMgr* pMgr) { - return (1 << pMgr->retryBackoff) * SYNC_LOG_REPL_RETRY_WAIT_MS; -} - -static FORCE_INLINE int32_t syncLogGetNextRetryBackoff(SSyncLogReplMgr* pMgr) { - return TMIN(pMgr->retryBackoff + 1, SYNC_MAX_RETRY_BACKOFF); -} - -static FORCE_INLINE int32_t syncLogReplMgrUpdateTerm(SSyncLogReplMgr* pMgr, SyncIndex index, SyncTerm term) { - if (pMgr->endIndex == 0) return -1; - ASSERT(pMgr->startIndex <= index && index < pMgr->endIndex); - pMgr->states[(index + pMgr->size) % pMgr->size].term = term; - return 0; -} - -SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index); -int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm, - SRaftId* pDestId, bool* pBarrier); -int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); -int32_t syncLogBufferReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); -int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); -int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); -int32_t syncLogResetLogReplMgr(SSyncLogReplMgr* pMgr); -int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); -int32_t syncLogReplMgrProcessReplyInNormalMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); -int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode); - -int32_t syncNodeSendAppendEntries(SSyncNode* pNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg); -int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg); -void syncLogDestroyAppendEntries(SRpcMsg* pRpcMsg); - -// others -bool syncLogReplMgrValidate(SSyncLogReplMgr* pMgr); - -typedef struct SSyncLogBufEntry { - SSyncRaftEntry* pItem; - SyncIndex prevLogIndex; - SyncTerm prevLogTerm; -} SSyncLogBufEntry; - -typedef struct SSyncLogBuffer { - SSyncLogBufEntry entries[TSDB_SYNC_LOG_BUFFER_SIZE]; - int64_t startIndex; - int64_t commitIndex; - int64_t matchIndex; - int64_t endIndex; - int64_t size; - TdThreadMutex mutex; -} SSyncLogBuffer; - -SSyncLogBuffer* syncLogBufferCreate(); -void syncLogBufferDestroy(SSyncLogBuffer* pBuf); -int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode); - -// access -int64_t syncLogBufferGetEndIndex(SSyncLogBuffer* pBuf); -int32_t syncLogBufferAppend(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry); -int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevTerm); -int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode); -int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t commitIndex); - -int64_t syncNodeUpdateCommitIndex(SSyncNode* ths, SyncIndex commtIndex); -int32_t syncLogToAppendEntries(SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm, SRpcMsg* pRpcMsg); - -// private -SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index, bool* pInBuf); -int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf); -int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SyncIndex toIndex); -int32_t syncLogBufferReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm); -bool syncNodeAgreedUpon(SSyncNode* pNode, SyncIndex index); - -void syncIndexMgrSetIndex(SSyncIndexMgr* pSyncIndexMgr, const SRaftId* pRaftId, SyncIndex index); - typedef struct SSyncNode { // init by SSyncInfo SyncGroupId vgId; diff --git a/source/libs/sync/inc/syncLogBuffer.h b/source/libs/sync/inc/syncLogBuffer.h new file mode 100644 index 0000000000..4c209549b4 --- /dev/null +++ b/source/libs/sync/inc/syncLogBuffer.h @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef _TD_LIBS_SYNC_LOG_BUFFER_H +#define _TD_LIBS_SYNC_LOG_BUFFER_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "syncInt.h" + +typedef struct SSyncReplInfo { + bool barrier; + bool acked; + int64_t timeMs; + int64_t term; +} SSyncReplInfo; + +typedef struct SSyncLogReplMgr { + SSyncReplInfo states[TSDB_SYNC_LOG_BUFFER_SIZE]; + int64_t startIndex; + int64_t matchIndex; + int64_t endIndex; + int64_t size; + bool restored; + int64_t peerStartTime; + int32_t retryBackoff; + int32_t peerId; +} SSyncLogReplMgr; + +SSyncLogReplMgr* syncLogReplMgrCreate(); +void syncLogReplMgrDestroy(SSyncLogReplMgr* pMgr); +int32_t syncNodeLogReplMgrInit(SSyncNode* pNode); +void syncNodeLogReplMgrDestroy(SSyncNode* pNode); + +// access +static FORCE_INLINE int64_t syncLogGetRetryBackoffTimeMs(SSyncLogReplMgr* pMgr) { + return (1 << pMgr->retryBackoff) * SYNC_LOG_REPL_RETRY_WAIT_MS; +} + +static FORCE_INLINE int32_t syncLogGetNextRetryBackoff(SSyncLogReplMgr* pMgr) { + return TMIN(pMgr->retryBackoff + 1, SYNC_MAX_RETRY_BACKOFF); +} + +static FORCE_INLINE int32_t syncLogReplMgrUpdateTerm(SSyncLogReplMgr* pMgr, SyncIndex index, SyncTerm term) { + if (pMgr->endIndex == 0) return -1; + ASSERT(pMgr->startIndex <= index && index < pMgr->endIndex); + pMgr->states[(index + pMgr->size) % pMgr->size].term = term; + return 0; +} + +SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index); +int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm, + SRaftId* pDestId, bool* pBarrier); +int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); +int32_t syncLogBufferReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); +int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); +int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); +int32_t syncLogResetLogReplMgr(SSyncLogReplMgr* pMgr); +int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); +int32_t syncLogReplMgrProcessReplyInNormalMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); +int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode); +int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg); + +int32_t syncNodeSendAppendEntries(SSyncNode* pNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg); +int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg); +void syncLogDestroyAppendEntries(SRpcMsg* pRpcMsg); + +// others +bool syncLogReplMgrValidate(SSyncLogReplMgr* pMgr); + +typedef struct SSyncLogBufEntry { + SSyncRaftEntry* pItem; + SyncIndex prevLogIndex; + SyncTerm prevLogTerm; +} SSyncLogBufEntry; + +typedef struct SSyncLogBuffer { + SSyncLogBufEntry entries[TSDB_SYNC_LOG_BUFFER_SIZE]; + int64_t startIndex; + int64_t commitIndex; + int64_t matchIndex; + int64_t endIndex; + int64_t size; + TdThreadMutex mutex; +} SSyncLogBuffer; + +SSyncLogBuffer* syncLogBufferCreate(); +void syncLogBufferDestroy(SSyncLogBuffer* pBuf); +int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode); + +// access +int64_t syncLogBufferGetEndIndex(SSyncLogBuffer* pBuf); +int32_t syncLogBufferAppend(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry); +int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevTerm); +int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode); +int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t commitIndex); +int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode); + +// private +SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index, bool* pInBuf); +int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf); +int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SyncIndex toIndex); +int32_t syncLogBufferReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm); + +// others +bool syncNodeAgreedUpon(SSyncNode* pNode, SyncIndex index); +void syncIndexMgrSetIndex(SSyncIndexMgr* pSyncIndexMgr, const SRaftId* pRaftId, SyncIndex index); +int64_t syncNodeUpdateCommitIndex(SSyncNode* ths, SyncIndex commtIndex); +int32_t syncLogToAppendEntries(SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm, SRpcMsg* pRpcMsg); + +#ifdef __cplusplus +} +#endif + +#endif /*_TD_LIBS_SYNC_LOG_BUFFER_H*/ diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c index 8197119b87..4eff19ced8 100644 --- a/source/libs/sync/src/syncAppendEntries.c +++ b/source/libs/sync/src/syncAppendEntries.c @@ -15,6 +15,7 @@ #define _DEFAULT_SOURCE #include "syncAppendEntries.h" +#include "syncLogBuffer.h" #include "syncMessage.h" #include "syncRaftLog.h" #include "syncRaftStore.h" @@ -125,187 +126,6 @@ int32_t syncNodeFollowerCommit(SSyncNode* ths, SyncIndex newCommitIndex) { return 0; } -SSyncRaftEntry* syncEntryBuildDummy(SyncTerm term, SyncIndex index, int32_t vgId) { - return syncEntryBuildNoop(term, index, vgId); -} - -int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { - taosThreadMutexLock(&pBuf->mutex); - ASSERT(pNode->pLogStore != NULL && "log store not created"); - ASSERT(pNode->pFsm != NULL && "pFsm not registered"); - ASSERT(pNode->pFsm->FpGetSnapshotInfo != NULL && "FpGetSnapshotInfo not registered"); - - SSnapshot snapshot; - if (pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot) < 0) { - sError("vgId:%d, failed to get snapshot info since %s", pNode->vgId, terrstr()); - goto _err; - } - SyncIndex commitIndex = snapshot.lastApplyIndex; - SyncTerm commitTerm = snapshot.lastApplyTerm; - - SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); - if (lastVer < commitIndex) { - sError("vgId:%d, lastVer of WAL log less than tsdb commit version. lastVer: %" PRId64 - ", tsdb commit version: %" PRId64 "", - pNode->vgId, lastVer, commitIndex); - terrno = TSDB_CODE_WAL_LOG_INCOMPLETE; - goto _err; - } - - ASSERT(lastVer >= commitIndex); - SyncIndex toIndex = lastVer; - // update match index - pBuf->commitIndex = commitIndex; - pBuf->matchIndex = toIndex; - pBuf->endIndex = toIndex + 1; - - // load log entries in reverse order - SSyncLogStore* pLogStore = pNode->pLogStore; - SyncIndex index = toIndex; - SSyncRaftEntry* pEntry = NULL; - bool takeDummy = false; - - while (true) { - if (index <= pBuf->commitIndex) { - takeDummy = true; - break; - } - - if (pLogStore->syncLogGetEntry(pLogStore, index, &pEntry) < 0) { - sError("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); - ASSERT(0); - break; - } - - bool taken = false; - if (toIndex <= index + pBuf->size - 1) { - SSyncLogBufEntry tmp = {.pItem = pEntry, .prevLogIndex = -1, .prevLogTerm = -1}; - pBuf->entries[index % pBuf->size] = tmp; - taken = true; - } - - if (index < toIndex) { - pBuf->entries[(index + 1) % pBuf->size].prevLogIndex = pEntry->index; - pBuf->entries[(index + 1) % pBuf->size].prevLogTerm = pEntry->term; - } - - if (!taken) { - syncEntryDestroy(pEntry); - pEntry = NULL; - break; - } - - index--; - } - - // put a dummy record at commitIndex if present in log buffer - if (takeDummy) { - ASSERT(index == pBuf->commitIndex); - - SSyncRaftEntry* pDummy = syncEntryBuildDummy(commitTerm, commitIndex, pNode->vgId); - if (pDummy == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } - SSyncLogBufEntry tmp = {.pItem = pDummy, .prevLogIndex = commitIndex - 1, .prevLogTerm = commitTerm}; - pBuf->entries[(commitIndex + pBuf->size) % pBuf->size] = tmp; - - if (index < toIndex) { - pBuf->entries[(index + 1) % pBuf->size].prevLogIndex = commitIndex; - pBuf->entries[(index + 1) % pBuf->size].prevLogTerm = commitTerm; - } - } - - // update startIndex - pBuf->startIndex = takeDummy ? index : index + 1; - - // validate - syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); - return 0; - -_err: - taosThreadMutexUnlock(&pBuf->mutex); - return -1; -} - -FORCE_INLINE SyncTerm syncLogBufferGetLastMatchTerm(SSyncLogBuffer* pBuf) { - SyncIndex index = pBuf->matchIndex; - SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; - ASSERT(pEntry != NULL); - return pEntry->term; -} - -int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevTerm) { - taosThreadMutexLock(&pBuf->mutex); - syncLogBufferValidate(pBuf); - int32_t ret = -1; - SyncIndex index = pEntry->index; - SyncIndex prevIndex = pEntry->index - 1; - SyncTerm lastMatchTerm = syncLogBufferGetLastMatchTerm(pBuf); - - if (index <= pBuf->commitIndex) { - sInfo("vgId:%d, raft entry already committed. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 - " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, - pBuf->endIndex); - ret = 0; - goto _out; - } - - if (index - pBuf->startIndex >= pBuf->size) { - sInfo("vgId:%d, raft entry out of buffer capacity. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 - " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, - pBuf->endIndex); - goto _out; - } - - if (index > pBuf->matchIndex && lastMatchTerm != prevTerm) { - sInfo("vgId:%d, not ready to accept raft entry. index: %" PRId64 ", term: %" PRId64 ": prevterm: %" PRId64 - " != lastmatch: %" PRId64 ". log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pEntry->index, pEntry->term, prevTerm, lastMatchTerm, pBuf->startIndex, pBuf->commitIndex, - pBuf->matchIndex, pBuf->endIndex); - goto _out; - } - - // check current in buffer - SSyncRaftEntry* pExist = pBuf->entries[index % pBuf->size].pItem; - if (pExist != NULL) { - ASSERT(pEntry->index == pExist->index); - - if (pEntry->term != pExist->term) { - (void)syncLogBufferRollback(pBuf, index); - } else { - sDebug("vgId:%d, duplicate raft entry received. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 - " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, - pBuf->endIndex); - SyncTerm existPrevTerm = pBuf->entries[index % pBuf->size].prevLogTerm; - ASSERT(pEntry->term == pExist->term && prevTerm == existPrevTerm); - ret = 0; - goto _out; - } - } - - // update - SSyncLogBufEntry tmp = {.pItem = pEntry, .prevLogIndex = prevIndex, .prevLogTerm = prevTerm}; - pEntry = NULL; - pBuf->entries[index % pBuf->size] = tmp; - - // update end index - pBuf->endIndex = TMAX(index + 1, pBuf->endIndex); - - // success - ret = 0; - -_out: - syncEntryDestroy(pEntry); - syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); - return ret; -} - SSyncRaftEntry* syncLogAppendEntriesToRaftEntry(const SyncAppendEntries* pMsg) { SSyncRaftEntry* pEntry = taosMemoryMalloc(pMsg->dataLen); if (pEntry == NULL) { @@ -317,218 +137,6 @@ SSyncRaftEntry* syncLogAppendEntriesToRaftEntry(const SyncAppendEntries* pMsg) { return pEntry; } -int32_t syncLogStorePersist(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) { - ASSERT(pEntry->index >= 0); - SyncIndex lastVer = pLogStore->syncLogLastIndex(pLogStore); - if (lastVer >= pEntry->index && pLogStore->syncLogTruncate(pLogStore, pEntry->index) < 0) { - sError("failed to truncate log store since %s. from index:%" PRId64 "", terrstr(), pEntry->index); - return -1; - } - lastVer = pLogStore->syncLogLastIndex(pLogStore); - ASSERT(pEntry->index == lastVer + 1); - - if (pLogStore->syncLogAppendEntry(pLogStore, pEntry) < 0) { - sError("failed to append raft log entry since %s. index:%" PRId64 ", term:%" PRId64 "", terrstr(), pEntry->index, - pEntry->term); - return -1; - } - - lastVer = pLogStore->syncLogLastIndex(pLogStore); - ASSERT(pEntry->index == lastVer); - return 0; -} - -int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode) { - taosThreadMutexLock(&pBuf->mutex); - syncLogBufferValidate(pBuf); - - SSyncLogStore* pLogStore = pNode->pLogStore; - int64_t matchIndex = pBuf->matchIndex; - - while (pBuf->matchIndex + 1 < pBuf->endIndex) { - int64_t index = pBuf->matchIndex + 1; - ASSERT(index >= 0); - - // try to proceed - SSyncLogBufEntry* pBufEntry = &pBuf->entries[index % pBuf->size]; - SyncIndex prevLogIndex = pBufEntry->prevLogIndex; - SyncTerm prevLogTerm = pBufEntry->prevLogTerm; - SSyncRaftEntry* pEntry = pBufEntry->pItem; - if (pEntry == NULL) { - sDebug("vgId:%d, cannot proceed match index in log buffer. no raft entry at next pos of matchIndex:%" PRId64, - pNode->vgId, pBuf->matchIndex); - goto _out; - } - - ASSERT(index == pEntry->index); - - // match - SSyncRaftEntry* pMatch = pBuf->entries[(pBuf->matchIndex + pBuf->size) % pBuf->size].pItem; - ASSERT(pMatch != NULL); - ASSERT(pMatch->index == pBuf->matchIndex); - ASSERT(pMatch->index + 1 == pEntry->index); - ASSERT(prevLogIndex == pMatch->index); - - if (pMatch->term != prevLogTerm) { - sInfo( - "vgId:%d, mismatching raft log entries encountered. " - "{ index:%" PRId64 ", term:%" PRId64 - " } " - "{ index:%" PRId64 ", term:%" PRId64 ", prevLogIndex:%" PRId64 ", prevLogTerm:%" PRId64 " } ", - pNode->vgId, pMatch->index, pMatch->term, pEntry->index, pEntry->term, prevLogIndex, prevLogTerm); - goto _out; - } - - // increase match index - pBuf->matchIndex = index; - - sInfo("vgId:%d, log buffer proceed. start index: %" PRId64 ", match index: %" PRId64 ", end index: %" PRId64, - pNode->vgId, pBuf->startIndex, pBuf->matchIndex, pBuf->endIndex); - - // replicate on demand - (void)syncNodeReplicate(pNode); - - // persist - if (syncLogStorePersist(pLogStore, pEntry) < 0) { - sError("vgId:%d, failed to persist raft log entry from log buffer since %s. index:%" PRId64, pNode->vgId, - terrstr(), pEntry->index); - goto _out; - } - ASSERT(pEntry->index == pBuf->matchIndex); - - // update my match index - matchIndex = pBuf->matchIndex; - syncIndexMgrSetIndex(pNode->pMatchIndex, &pNode->myRaftId, pBuf->matchIndex); - } // end of while - -_out: - pBuf->matchIndex = matchIndex; - syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); - return matchIndex; -} - -int32_t syncLogFsmExecute(SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncRaftEntry* pEntry) { - ASSERT(pFsm->FpCommitCb != NULL && "No commit cb registered for the FSM"); - - SRpcMsg rpcMsg; - syncEntry2OriginalRpc(pEntry, &rpcMsg); - - SFsmCbMeta cbMeta = {0}; - cbMeta.index = pEntry->index; - cbMeta.lastConfigIndex = -1; - cbMeta.isWeak = pEntry->isWeak; - cbMeta.code = 0; - cbMeta.state = role; - cbMeta.seqNum = pEntry->seqNum; - cbMeta.term = pEntry->term; - cbMeta.currentTerm = term; - cbMeta.flag = -1; - - pFsm->FpCommitCb(pFsm, &rpcMsg, &cbMeta); - return 0; -} - -int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf) { - ASSERT(pBuf->startIndex <= pBuf->matchIndex); - ASSERT(pBuf->commitIndex <= pBuf->matchIndex); - ASSERT(pBuf->matchIndex < pBuf->endIndex); - ASSERT(pBuf->endIndex - pBuf->startIndex <= pBuf->size); - ASSERT(pBuf->entries[(pBuf->matchIndex + pBuf->size) % pBuf->size].pItem); - return 0; -} - -int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t commitIndex) { - taosThreadMutexLock(&pBuf->mutex); - syncLogBufferValidate(pBuf); - - SSyncLogStore* pLogStore = pNode->pLogStore; - SSyncFSM* pFsm = pNode->pFsm; - ESyncState role = pNode->state; - SyncTerm term = pNode->pRaftStore->currentTerm; - SyncGroupId vgId = pNode->vgId; - int32_t ret = 0; - int64_t upperIndex = TMIN(commitIndex, pBuf->matchIndex); - SSyncRaftEntry* pEntry = NULL; - bool inBuf = false; - - if (commitIndex <= pBuf->commitIndex) { - sDebug("vgId:%d, stale commit update. current:%" PRId64 ", notified:%" PRId64 "", vgId, pBuf->commitIndex, - commitIndex); - ret = 0; - goto _out; - } - - sDebug("vgId:%d, log buffer info. role: %d, term: %" PRId64 ". start index:%" PRId64 ", commit index:%" PRId64 - ", match index: %" PRId64 ", end index:%" PRId64 "", - pNode->vgId, role, term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); - - // execute in fsm - for (int64_t index = pBuf->commitIndex + 1; index <= upperIndex; index++) { - // get a log entry - pEntry = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf); - if (pEntry == NULL) { - goto _out; - } - - // execute it - if (!syncUtilUserCommit(pEntry->originalRpcType)) { - sInfo("vgId:%d, non-user msg in raft log entry. index: %" PRId64 ", term:%" PRId64 "", vgId, pEntry->index, - pEntry->term); - pBuf->commitIndex = index; - if (!inBuf) { - syncEntryDestroy(pEntry); - pEntry = NULL; - } - continue; - } - - if (syncLogFsmExecute(pFsm, role, term, pEntry) != 0) { - sError("vgId:%d, failed to execute raft entry in FSM. log index:%" PRId64 ", term:%" PRId64 "", vgId, - pEntry->index, pEntry->term); - ret = -1; - goto _out; - } - pBuf->commitIndex = index; - - sDebug("vgId:%d, committed index: %" PRId64 ", term: %" PRId64 ", role: %d, current term: %" PRId64 "", pNode->vgId, - pEntry->index, pEntry->term, role, term); - - if (!inBuf) { - syncEntryDestroy(pEntry); - pEntry = NULL; - } - } - - // recycle - SyncIndex used = pBuf->endIndex - pBuf->startIndex; - SyncIndex until = pBuf->commitIndex - (pBuf->size - used) / 2; - for (SyncIndex index = pBuf->startIndex; index < until; index++) { - SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; - ASSERT(pEntry != NULL); - syncEntryDestroy(pEntry); - memset(&pBuf->entries[(index + pBuf->size) % pBuf->size], 0, sizeof(pBuf->entries[0])); - pBuf->startIndex = index + 1; - } - -_out: - // mark as restored if needed - if (!pNode->restoreFinish && pBuf->commitIndex >= pNode->commitIndex) { - pNode->pFsm->FpRestoreFinishCb(pNode->pFsm); - pNode->restoreFinish = true; - sInfo("vgId:%d, restore finished. pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, - pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); - } - - if (!inBuf) { - syncEntryDestroy(pEntry); - pEntry = NULL; - } - syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); - return ret; -} - int32_t syncNodeOnAppendEntries(SSyncNode* ths, const SRpcMsg* pRpcMsg) { SyncAppendEntries* pMsg = pRpcMsg->pCont; SRpcMsg rpcRsp = {0}; diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index 3295f03016..36eb6fefc7 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -17,6 +17,7 @@ #include "syncAppendEntriesReply.h" #include "syncCommit.h" #include "syncIndexMgr.h" +#include "syncLogBuffer.h" #include "syncMessage.h" #include "syncRaftEntry.h" #include "syncRaftStore.h" @@ -56,82 +57,6 @@ int64_t syncNodeCheckCommitIndex(SSyncNode* ths, SyncIndex indexLikely) { return ths->commitIndex; } -SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index, bool* pInBuf) { - SSyncRaftEntry* pEntry = NULL; - if (index >= pBuf->endIndex) { - return NULL; - } - if (index > pBuf->startIndex) { // startIndex might be dummy - *pInBuf = true; - pEntry = pBuf->entries[index % pBuf->size].pItem; - } else { - *pInBuf = false; - if (pNode->pLogStore->syncLogGetEntry(pNode->pLogStore, index, &pEntry) < 0) { - sError("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); - } - } - return pEntry; -} - -bool syncLogReplMgrValidate(SSyncLogReplMgr* pMgr) { - ASSERT(pMgr->startIndex <= pMgr->endIndex); - for (SyncIndex index = pMgr->startIndex; index < pMgr->endIndex; index++) { - ASSERT(pMgr->states[(index + pMgr->size) % pMgr->size].barrier == false || index + 1 == pMgr->endIndex); - } - return true; -} - -int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm, - SRaftId* pDestId, bool* pBarrier) { - SSyncRaftEntry* pEntry = NULL; - SRpcMsg msgOut = {0}; - bool inBuf = false; - int32_t ret = -1; - SyncTerm prevLogTerm = -1; - SSyncLogBuffer* pBuf = pNode->pLogBuf; - - pEntry = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf); - if (pEntry == NULL) { - sError("vgId:%d, failed to get raft entry for index: %" PRId64 "", pNode->vgId, index); - goto _err; - } - *pBarrier = syncLogIsReplicationBarrier(pEntry); - - prevLogTerm = syncLogReplMgrGetPrevLogTerm(pMgr, pNode, index); - if (prevLogTerm < 0) { - sError("vgId:%d, failed to get prev log term since %s. index: %" PRId64 "", pNode->vgId, terrstr(), index); - goto _err; - } - if (pTerm) *pTerm = pEntry->term; - - int32_t code = syncLogToAppendEntries(pNode, pEntry, prevLogTerm, &msgOut); - if (code < 0) { - sError("vgId:%d, failed to get append entries for index:%" PRId64 "", pNode->vgId, index); - goto _err; - } - - (void)syncNodeSendAppendEntries(pNode, pDestId, &msgOut); - ret = 0; - - sInfo("vgId:%d, replicate one msg index: %" PRId64 " term: %" PRId64 " prevterm: %" PRId64 " to dest: 0x%016" PRIx64, - pNode->vgId, pEntry->index, pEntry->term, prevLogTerm, pDestId->addr); - - if (!inBuf) { - syncEntryDestroy(pEntry); - pEntry = NULL; - } - return 0; - -_err: - rpcFreeCont(msgOut.pCont); - msgOut.pCont = NULL; - if (!inBuf) { - syncEntryDestroy(pEntry); - pEntry = NULL; - } - return -1; -} - int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) { SyncAppendEntriesReply* pMsg = pRpcMsg->pCont; int32_t ret = 0; diff --git a/source/libs/sync/src/syncLogBuffer.c b/source/libs/sync/src/syncLogBuffer.c new file mode 100644 index 0000000000..36f33fa46e --- /dev/null +++ b/source/libs/sync/src/syncLogBuffer.c @@ -0,0 +1,944 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#define _DEFAULT_SOURCE + +#include "syncLogBuffer.h" +#include "syncInt.h" +#include "syncRaftEntry.h" +#include "syncRaftStore.h" +#include "syncReplication.h" +#include "syncUtil.h" + +int64_t syncLogBufferGetEndIndex(SSyncLogBuffer* pBuf) { + taosThreadMutexLock(&pBuf->mutex); + int64_t index = pBuf->endIndex; + taosThreadMutexUnlock(&pBuf->mutex); + return index; +} + +int32_t syncLogBufferAppend(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry) { + taosThreadMutexLock(&pBuf->mutex); + syncLogBufferValidate(pBuf); + SyncIndex index = pEntry->index; + + if (index - pBuf->startIndex >= pBuf->size) { + sError("vgId:%d, failed to append due to log buffer full. index:%" PRId64 "", pNode->vgId, index); + goto _out; + } + + ASSERT(index == pBuf->endIndex); + + SSyncRaftEntry* pExist = pBuf->entries[index % pBuf->size].pItem; + ASSERT(pExist == NULL); + + // initial log buffer with at least one item, e.g. commitIndex + SSyncRaftEntry* pMatch = pBuf->entries[(index - 1 + pBuf->size) % pBuf->size].pItem; + ASSERT(pMatch != NULL && "no matched raft log entry"); + ASSERT(pMatch->index + 1 == index); + + SSyncLogBufEntry tmp = {.pItem = pEntry, .prevLogIndex = pMatch->index, .prevLogTerm = pMatch->term}; + pBuf->entries[index % pBuf->size] = tmp; + pBuf->endIndex = index + 1; + + syncLogBufferValidate(pBuf); + taosThreadMutexUnlock(&pBuf->mutex); + return 0; + +_out: + syncLogBufferValidate(pBuf); + syncEntryDestroy(pEntry); + taosThreadMutexUnlock(&pBuf->mutex); + return -1; +} + +SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index) { + SSyncLogBuffer* pBuf = pNode->pLogBuf; + SSyncRaftEntry* pEntry = NULL; + SyncIndex prevIndex = index - 1; + SyncTerm prevLogTerm = -1; + terrno = TSDB_CODE_SUCCESS; + + if (prevIndex == -1) return 0; + + if (index - 1 > pBuf->matchIndex) { + terrno = TSDB_CODE_WAL_LOG_NOT_EXIST; + return -1; + } + + ASSERT(index - 1 == prevIndex); + + if (index - 1 >= pBuf->startIndex) { + pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; + ASSERT(pEntry != NULL && "no log entry found"); + prevLogTerm = pBuf->entries[(index + pBuf->size) % pBuf->size].prevLogTerm; + return prevLogTerm; + } + + if (pMgr->startIndex <= prevIndex && prevIndex < pMgr->endIndex) { + int64_t timeMs = pMgr->states[(prevIndex + pMgr->size) % pMgr->size].timeMs; + ASSERT(timeMs != 0 && "no log entry found"); + prevLogTerm = pMgr->states[(prevIndex + pMgr->size) % pMgr->size].term; + ASSERT(prevIndex == 0 || prevLogTerm != 0); + return prevLogTerm; + } + + SSnapshot snapshot; + if (pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot) == 0 && prevIndex == snapshot.lastApplyIndex) { + return snapshot.lastApplyTerm; + } + + if (pNode->pLogStore->syncLogGetEntry(pNode->pLogStore, prevIndex, &pEntry) == 0) { + prevLogTerm = pEntry->term; + syncEntryDestroy(pEntry); + pEntry = NULL; + return prevLogTerm; + } + + sError("vgId:%d, failed to get log term since %s. index: %" PRId64 "", pNode->vgId, terrstr(), prevIndex); + terrno = TSDB_CODE_WAL_LOG_NOT_EXIST; + return -1; +} + +SSyncRaftEntry* syncEntryBuildDummy(SyncTerm term, SyncIndex index, int32_t vgId) { + return syncEntryBuildNoop(term, index, vgId); +} + +int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { + taosThreadMutexLock(&pBuf->mutex); + ASSERT(pNode->pLogStore != NULL && "log store not created"); + ASSERT(pNode->pFsm != NULL && "pFsm not registered"); + ASSERT(pNode->pFsm->FpGetSnapshotInfo != NULL && "FpGetSnapshotInfo not registered"); + + SSnapshot snapshot; + if (pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot) < 0) { + sError("vgId:%d, failed to get snapshot info since %s", pNode->vgId, terrstr()); + goto _err; + } + SyncIndex commitIndex = snapshot.lastApplyIndex; + SyncTerm commitTerm = snapshot.lastApplyTerm; + + SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); + if (lastVer < commitIndex) { + sError("vgId:%d, lastVer of WAL log less than tsdb commit version. lastVer: %" PRId64 + ", tsdb commit version: %" PRId64 "", + pNode->vgId, lastVer, commitIndex); + terrno = TSDB_CODE_WAL_LOG_INCOMPLETE; + goto _err; + } + + ASSERT(lastVer >= commitIndex); + SyncIndex toIndex = lastVer; + // update match index + pBuf->commitIndex = commitIndex; + pBuf->matchIndex = toIndex; + pBuf->endIndex = toIndex + 1; + + // load log entries in reverse order + SSyncLogStore* pLogStore = pNode->pLogStore; + SyncIndex index = toIndex; + SSyncRaftEntry* pEntry = NULL; + bool takeDummy = false; + + while (true) { + if (index <= pBuf->commitIndex) { + takeDummy = true; + break; + } + + if (pLogStore->syncLogGetEntry(pLogStore, index, &pEntry) < 0) { + sError("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); + ASSERT(0); + break; + } + + bool taken = false; + if (toIndex <= index + pBuf->size - 1) { + SSyncLogBufEntry tmp = {.pItem = pEntry, .prevLogIndex = -1, .prevLogTerm = -1}; + pBuf->entries[index % pBuf->size] = tmp; + taken = true; + } + + if (index < toIndex) { + pBuf->entries[(index + 1) % pBuf->size].prevLogIndex = pEntry->index; + pBuf->entries[(index + 1) % pBuf->size].prevLogTerm = pEntry->term; + } + + if (!taken) { + syncEntryDestroy(pEntry); + pEntry = NULL; + break; + } + + index--; + } + + // put a dummy record at commitIndex if present in log buffer + if (takeDummy) { + ASSERT(index == pBuf->commitIndex); + + SSyncRaftEntry* pDummy = syncEntryBuildDummy(commitTerm, commitIndex, pNode->vgId); + if (pDummy == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } + SSyncLogBufEntry tmp = {.pItem = pDummy, .prevLogIndex = commitIndex - 1, .prevLogTerm = commitTerm}; + pBuf->entries[(commitIndex + pBuf->size) % pBuf->size] = tmp; + + if (index < toIndex) { + pBuf->entries[(index + 1) % pBuf->size].prevLogIndex = commitIndex; + pBuf->entries[(index + 1) % pBuf->size].prevLogTerm = commitTerm; + } + } + + // update startIndex + pBuf->startIndex = takeDummy ? index : index + 1; + + // validate + syncLogBufferValidate(pBuf); + taosThreadMutexUnlock(&pBuf->mutex); + return 0; + +_err: + taosThreadMutexUnlock(&pBuf->mutex); + return -1; +} + +FORCE_INLINE SyncTerm syncLogBufferGetLastMatchTerm(SSyncLogBuffer* pBuf) { + SyncIndex index = pBuf->matchIndex; + SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; + ASSERT(pEntry != NULL); + return pEntry->term; +} + +int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevTerm) { + taosThreadMutexLock(&pBuf->mutex); + syncLogBufferValidate(pBuf); + int32_t ret = -1; + SyncIndex index = pEntry->index; + SyncIndex prevIndex = pEntry->index - 1; + SyncTerm lastMatchTerm = syncLogBufferGetLastMatchTerm(pBuf); + + if (index <= pBuf->commitIndex) { + sInfo("vgId:%d, raft entry already committed. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, + pBuf->endIndex); + ret = 0; + goto _out; + } + + if (index - pBuf->startIndex >= pBuf->size) { + sInfo("vgId:%d, raft entry out of buffer capacity. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, + pBuf->endIndex); + goto _out; + } + + if (index > pBuf->matchIndex && lastMatchTerm != prevTerm) { + sInfo("vgId:%d, not ready to accept raft entry. index: %" PRId64 ", term: %" PRId64 ": prevterm: %" PRId64 + " != lastmatch: %" PRId64 ". log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, prevTerm, lastMatchTerm, pBuf->startIndex, pBuf->commitIndex, + pBuf->matchIndex, pBuf->endIndex); + goto _out; + } + + // check current in buffer + SSyncRaftEntry* pExist = pBuf->entries[index % pBuf->size].pItem; + if (pExist != NULL) { + ASSERT(pEntry->index == pExist->index); + + if (pEntry->term != pExist->term) { + (void)syncLogBufferRollback(pBuf, index); + } else { + sDebug("vgId:%d, duplicate raft entry received. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, + pBuf->endIndex); + SyncTerm existPrevTerm = pBuf->entries[index % pBuf->size].prevLogTerm; + ASSERT(pEntry->term == pExist->term && prevTerm == existPrevTerm); + ret = 0; + goto _out; + } + } + + // update + SSyncLogBufEntry tmp = {.pItem = pEntry, .prevLogIndex = prevIndex, .prevLogTerm = prevTerm}; + pEntry = NULL; + pBuf->entries[index % pBuf->size] = tmp; + + // update end index + pBuf->endIndex = TMAX(index + 1, pBuf->endIndex); + + // success + ret = 0; + +_out: + syncEntryDestroy(pEntry); + syncLogBufferValidate(pBuf); + taosThreadMutexUnlock(&pBuf->mutex); + return ret; +} + +int32_t syncLogStorePersist(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) { + ASSERT(pEntry->index >= 0); + SyncIndex lastVer = pLogStore->syncLogLastIndex(pLogStore); + if (lastVer >= pEntry->index && pLogStore->syncLogTruncate(pLogStore, pEntry->index) < 0) { + sError("failed to truncate log store since %s. from index:%" PRId64 "", terrstr(), pEntry->index); + return -1; + } + lastVer = pLogStore->syncLogLastIndex(pLogStore); + ASSERT(pEntry->index == lastVer + 1); + + if (pLogStore->syncLogAppendEntry(pLogStore, pEntry) < 0) { + sError("failed to append raft log entry since %s. index:%" PRId64 ", term:%" PRId64 "", terrstr(), pEntry->index, + pEntry->term); + return -1; + } + + lastVer = pLogStore->syncLogLastIndex(pLogStore); + ASSERT(pEntry->index == lastVer); + return 0; +} + +int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode) { + taosThreadMutexLock(&pBuf->mutex); + syncLogBufferValidate(pBuf); + + SSyncLogStore* pLogStore = pNode->pLogStore; + int64_t matchIndex = pBuf->matchIndex; + + while (pBuf->matchIndex + 1 < pBuf->endIndex) { + int64_t index = pBuf->matchIndex + 1; + ASSERT(index >= 0); + + // try to proceed + SSyncLogBufEntry* pBufEntry = &pBuf->entries[index % pBuf->size]; + SyncIndex prevLogIndex = pBufEntry->prevLogIndex; + SyncTerm prevLogTerm = pBufEntry->prevLogTerm; + SSyncRaftEntry* pEntry = pBufEntry->pItem; + if (pEntry == NULL) { + sDebug("vgId:%d, cannot proceed match index in log buffer. no raft entry at next pos of matchIndex:%" PRId64, + pNode->vgId, pBuf->matchIndex); + goto _out; + } + + ASSERT(index == pEntry->index); + + // match + SSyncRaftEntry* pMatch = pBuf->entries[(pBuf->matchIndex + pBuf->size) % pBuf->size].pItem; + ASSERT(pMatch != NULL); + ASSERT(pMatch->index == pBuf->matchIndex); + ASSERT(pMatch->index + 1 == pEntry->index); + ASSERT(prevLogIndex == pMatch->index); + + if (pMatch->term != prevLogTerm) { + sInfo( + "vgId:%d, mismatching raft log entries encountered. " + "{ index:%" PRId64 ", term:%" PRId64 + " } " + "{ index:%" PRId64 ", term:%" PRId64 ", prevLogIndex:%" PRId64 ", prevLogTerm:%" PRId64 " } ", + pNode->vgId, pMatch->index, pMatch->term, pEntry->index, pEntry->term, prevLogIndex, prevLogTerm); + goto _out; + } + + // increase match index + pBuf->matchIndex = index; + + sInfo("vgId:%d, log buffer proceed. start index: %" PRId64 ", match index: %" PRId64 ", end index: %" PRId64, + pNode->vgId, pBuf->startIndex, pBuf->matchIndex, pBuf->endIndex); + + // replicate on demand + (void)syncNodeReplicate(pNode); + + // persist + if (syncLogStorePersist(pLogStore, pEntry) < 0) { + sError("vgId:%d, failed to persist raft log entry from log buffer since %s. index:%" PRId64, pNode->vgId, + terrstr(), pEntry->index); + goto _out; + } + ASSERT(pEntry->index == pBuf->matchIndex); + + // update my match index + matchIndex = pBuf->matchIndex; + syncIndexMgrSetIndex(pNode->pMatchIndex, &pNode->myRaftId, pBuf->matchIndex); + } // end of while + +_out: + pBuf->matchIndex = matchIndex; + syncLogBufferValidate(pBuf); + taosThreadMutexUnlock(&pBuf->mutex); + return matchIndex; +} + +int32_t syncLogFsmExecute(SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncRaftEntry* pEntry) { + ASSERT(pFsm->FpCommitCb != NULL && "No commit cb registered for the FSM"); + + SRpcMsg rpcMsg; + syncEntry2OriginalRpc(pEntry, &rpcMsg); + + SFsmCbMeta cbMeta = {0}; + cbMeta.index = pEntry->index; + cbMeta.lastConfigIndex = -1; + cbMeta.isWeak = pEntry->isWeak; + cbMeta.code = 0; + cbMeta.state = role; + cbMeta.seqNum = pEntry->seqNum; + cbMeta.term = pEntry->term; + cbMeta.currentTerm = term; + cbMeta.flag = -1; + + pFsm->FpCommitCb(pFsm, &rpcMsg, &cbMeta); + return 0; +} + +int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf) { + ASSERT(pBuf->startIndex <= pBuf->matchIndex); + ASSERT(pBuf->commitIndex <= pBuf->matchIndex); + ASSERT(pBuf->matchIndex < pBuf->endIndex); + ASSERT(pBuf->endIndex - pBuf->startIndex <= pBuf->size); + ASSERT(pBuf->entries[(pBuf->matchIndex + pBuf->size) % pBuf->size].pItem); + return 0; +} + +int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t commitIndex) { + taosThreadMutexLock(&pBuf->mutex); + syncLogBufferValidate(pBuf); + + SSyncLogStore* pLogStore = pNode->pLogStore; + SSyncFSM* pFsm = pNode->pFsm; + ESyncState role = pNode->state; + SyncTerm term = pNode->pRaftStore->currentTerm; + SyncGroupId vgId = pNode->vgId; + int32_t ret = 0; + int64_t upperIndex = TMIN(commitIndex, pBuf->matchIndex); + SSyncRaftEntry* pEntry = NULL; + bool inBuf = false; + + if (commitIndex <= pBuf->commitIndex) { + sDebug("vgId:%d, stale commit update. current:%" PRId64 ", notified:%" PRId64 "", vgId, pBuf->commitIndex, + commitIndex); + ret = 0; + goto _out; + } + + sDebug("vgId:%d, log buffer info. role: %d, term: %" PRId64 ". start index:%" PRId64 ", commit index:%" PRId64 + ", match index: %" PRId64 ", end index:%" PRId64 "", + pNode->vgId, role, term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + + // execute in fsm + for (int64_t index = pBuf->commitIndex + 1; index <= upperIndex; index++) { + // get a log entry + pEntry = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf); + if (pEntry == NULL) { + goto _out; + } + + // execute it + if (!syncUtilUserCommit(pEntry->originalRpcType)) { + sInfo("vgId:%d, non-user msg in raft log entry. index: %" PRId64 ", term:%" PRId64 "", vgId, pEntry->index, + pEntry->term); + pBuf->commitIndex = index; + if (!inBuf) { + syncEntryDestroy(pEntry); + pEntry = NULL; + } + continue; + } + + if (syncLogFsmExecute(pFsm, role, term, pEntry) != 0) { + sError("vgId:%d, failed to execute raft entry in FSM. log index:%" PRId64 ", term:%" PRId64 "", vgId, + pEntry->index, pEntry->term); + ret = -1; + goto _out; + } + pBuf->commitIndex = index; + + sDebug("vgId:%d, committed index: %" PRId64 ", term: %" PRId64 ", role: %d, current term: %" PRId64 "", pNode->vgId, + pEntry->index, pEntry->term, role, term); + + if (!inBuf) { + syncEntryDestroy(pEntry); + pEntry = NULL; + } + } + + // recycle + SyncIndex used = pBuf->endIndex - pBuf->startIndex; + SyncIndex until = pBuf->commitIndex - (pBuf->size - used) / 2; + for (SyncIndex index = pBuf->startIndex; index < until; index++) { + SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; + ASSERT(pEntry != NULL); + syncEntryDestroy(pEntry); + memset(&pBuf->entries[(index + pBuf->size) % pBuf->size], 0, sizeof(pBuf->entries[0])); + pBuf->startIndex = index + 1; + } + +_out: + // mark as restored if needed + if (!pNode->restoreFinish && pBuf->commitIndex >= pNode->commitIndex) { + pNode->pFsm->FpRestoreFinishCb(pNode->pFsm); + pNode->restoreFinish = true; + sInfo("vgId:%d, restore finished. pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + } + + if (!inBuf) { + syncEntryDestroy(pEntry); + pEntry = NULL; + } + syncLogBufferValidate(pBuf); + taosThreadMutexUnlock(&pBuf->mutex); + return ret; +} + +int32_t syncLogResetLogReplMgr(SSyncLogReplMgr* pMgr) { + ASSERT(pMgr->startIndex >= 0); + for (SyncIndex index = pMgr->startIndex; index < pMgr->endIndex; index++) { + memset(&pMgr->states[index % pMgr->size], 0, sizeof(pMgr->states[0])); + } + pMgr->startIndex = 0; + pMgr->matchIndex = 0; + pMgr->endIndex = 0; + pMgr->restored = false; + pMgr->retryBackoff = 0; + return 0; +} + +_Atomic int64_t tsRetryCnt = 0; + +int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { + if (pMgr->endIndex <= pMgr->startIndex) { + return 0; + } + + int32_t ret = -1; + bool retried = false; + int64_t retryWaitMs = syncLogGetRetryBackoffTimeMs(pMgr); + + for (SyncIndex index = pMgr->startIndex; index < pMgr->endIndex; index++) { + int64_t pos = index % pMgr->size; + ASSERT(!pMgr->states[pos].barrier || (index == pMgr->startIndex || index + 1 == pMgr->endIndex)); + if (pMgr->states[pos].acked) { + continue; + } + int64_t nowMs = taosGetMonoTimestampMs(); + if (nowMs < pMgr->states[pos].timeMs + retryWaitMs) { + break; + } + + SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; + bool barrier = false; + SyncTerm term = -1; + if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { + sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, + terrstr(), index, pDestId->addr); + goto _out; + } + ASSERT(barrier == pMgr->states[pos].barrier); + pMgr->states[pos].timeMs = nowMs; + pMgr->states[pos].term = term; + pMgr->states[pos].acked = false; + retried = true; + tsRetryCnt++; + } + + ret = 0; +_out: + if (retried) { + pMgr->retryBackoff = syncLogGetNextRetryBackoff(pMgr); + } + return ret; +} + +int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, + SyncAppendEntriesReply* pMsg) { + SSyncLogBuffer* pBuf = pNode->pLogBuf; + SRaftId destId = pMsg->srcId; + ASSERT(pMgr->restored == false); + char host[64]; + uint16_t port; + syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); + + if (pMgr->endIndex == 0) { + ASSERT(pMgr->startIndex == 0); + ASSERT(pMgr->matchIndex == 0); + if (pMsg->matchIndex < 0) { + pMgr->restored = true; + sInfo("vgId:%d, sync log repl mgr of peer %s:%d restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 + "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, host, port, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + return 0; + } + } else { + if (pMsg->lastSendIndex < pMgr->startIndex || pMsg->lastSendIndex >= pMgr->endIndex) { + syncLogReplMgrRetryOnNeed(pMgr, pNode); + return 0; + } + + pMgr->states[pMsg->lastSendIndex % pMgr->size].acked = true; + + if (pMsg->matchIndex == pMsg->lastSendIndex) { + pMgr->restored = true; + sInfo("vgId:%d, sync log repl mgr of peer %s:%d restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 + "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, host, port, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + return 0; + } + + (void)syncLogResetLogReplMgr(pMgr); + } + + // send match index + SyncIndex index = TMIN(pMsg->matchIndex, pNode->pLogBuf->matchIndex); + bool barrier = false; + SyncTerm term = -1; + ASSERT(index >= 0); + if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, &destId, &barrier) < 0) { + sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, + terrstr(), index, destId.addr); + return -1; + } + + int64_t nowMs = taosGetMonoTimestampMs(); + pMgr->states[index % pMgr->size].barrier = barrier; + pMgr->states[index % pMgr->size].timeMs = nowMs; + pMgr->states[index % pMgr->size].term = term; + pMgr->states[index % pMgr->size].acked = false; + + pMgr->matchIndex = index; + pMgr->startIndex = index; + pMgr->endIndex = index + 1; + return 0; +} + +int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg) { + SSyncLogBuffer* pBuf = pNode->pLogBuf; + taosThreadMutexLock(&pBuf->mutex); + if (pMsg->startTime != 0 && pMsg->startTime != pMgr->peerStartTime) { + sInfo("vgId:%d, reset sync log repl mgr in heartbeat. start time:%" PRId64 ", old start time:%" PRId64 "", + pNode->vgId, pMsg->startTime, pMgr->peerStartTime); + syncLogResetLogReplMgr(pMgr); + pMgr->peerStartTime = pMsg->startTime; + } + taosThreadMutexUnlock(&pBuf->mutex); + return 0; +} + +int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) { + SSyncLogBuffer* pBuf = pNode->pLogBuf; + taosThreadMutexLock(&pBuf->mutex); + if (pMsg->startTime != pMgr->peerStartTime) { + sInfo("vgId:%d, reset sync log repl mgr in append entries reply. start time:%" PRId64 ", old start time:%" PRId64 + "", + pNode->vgId, pMsg->startTime, pMgr->peerStartTime); + syncLogResetLogReplMgr(pMgr); + pMgr->peerStartTime = pMsg->startTime; + } + + if (pMgr->restored) { + (void)syncLogReplMgrProcessReplyInNormalMode(pMgr, pNode, pMsg); + } else { + (void)syncLogReplMgrProcessReplyInRecoveryMode(pMgr, pNode, pMsg); + } + taosThreadMutexUnlock(&pBuf->mutex); + return 0; +} + +int32_t syncLogBufferReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { + SSyncLogBuffer* pBuf = pNode->pLogBuf; + if (pMgr->restored) { + (void)syncLogReplMgrReplicateAttemptedOnce(pMgr, pNode); + } else { + (void)syncLogReplMgrReplicateProbeOnce(pMgr, pNode); + } + return 0; +} + +int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { + ASSERT(!pMgr->restored); + SyncIndex index = pNode->pLogBuf->matchIndex; + SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; + bool barrier = false; + SyncTerm term = -1; + if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { + sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, + terrstr(), index, pDestId->addr); + return -1; + } + + SSyncLogBuffer* pBuf = pNode->pLogBuf; + sDebug("vgId:%d, attempted to probe the %d'th peer with msg of index:%" PRId64 " term: %" PRId64 + ". pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 + ")", + pNode->vgId, pMgr->peerId, index, term, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + return 0; +} + +_Atomic int64_t tsSendCnt = 0; + +int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { + ASSERT(pMgr->restored); + SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; + int32_t batchSize = TMAX(1, pMgr->size / 20); + int32_t count = 0; + int64_t nowMs = taosGetMonoTimestampMs(); + + for (SyncIndex index = pMgr->endIndex; index <= pNode->pLogBuf->matchIndex; index++) { + if (batchSize < count++ || pMgr->startIndex + pMgr->size <= index) { + break; + } + if (pMgr->startIndex + 1 < index && pMgr->states[(index - 1) % pMgr->size].barrier) { + break; + } + int64_t pos = index % pMgr->size; + SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; + bool barrier = false; + SyncTerm term = -1; + if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { + sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, + terrstr(), index, pDestId->addr); + return -1; + } + pMgr->states[pos].barrier = barrier; + pMgr->states[pos].timeMs = nowMs; + pMgr->states[pos].term = term; + pMgr->states[pos].acked = false; + + pMgr->endIndex = index + 1; + tsSendCnt++; + if (barrier) { + break; + } + } + + SSyncLogBuffer* pBuf = pNode->pLogBuf; + sDebug("vgId:%d, attempted to replicate %d msgs to the %d'th peer. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 + "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, count, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + syncLogReplMgrRetryOnNeed(pMgr, pNode); + return 0; +} + +int32_t syncLogReplMgrProcessReplyInNormalMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) { + ASSERT(pMgr->restored == true); + if (pMgr->startIndex <= pMsg->lastSendIndex && pMsg->lastSendIndex < pMgr->endIndex) { + pMgr->states[pMsg->lastSendIndex % pMgr->size].acked = true; + pMgr->matchIndex = TMAX(pMgr->matchIndex, pMsg->matchIndex); + for (SyncIndex index = pMgr->startIndex; index < pMgr->matchIndex; index++) { + memset(&pMgr->states[index % pMgr->size], 0, sizeof(pMgr->states[0])); + } + pMgr->startIndex = pMgr->matchIndex; + } + + return syncLogReplMgrReplicateAttemptedOnce(pMgr, pNode); +} + +SSyncLogReplMgr* syncLogReplMgrCreate() { + SSyncLogReplMgr* pMgr = taosMemoryCalloc(1, sizeof(SSyncLogReplMgr)); + if (pMgr == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } + + pMgr->size = sizeof(pMgr->states) / sizeof(pMgr->states[0]); + + ASSERT(pMgr->size == TSDB_SYNC_LOG_BUFFER_SIZE); + + return pMgr; + +_err: + taosMemoryFree(pMgr); + return NULL; +} + +void syncLogReplMgrDestroy(SSyncLogReplMgr* pMgr) { + if (pMgr == NULL) { + return; + } + (void)taosMemoryFree(pMgr); + return; +} + +int32_t syncNodeLogReplMgrInit(SSyncNode* pNode) { + for (int i = 0; i < TSDB_MAX_REPLICA; i++) { + ASSERT(pNode->logReplMgrs[i] == NULL); + pNode->logReplMgrs[i] = syncLogReplMgrCreate(); + pNode->logReplMgrs[i]->peerId = i; + ASSERT(pNode->logReplMgrs[i] != NULL && "Out of memory."); + } + return 0; +} + +void syncNodeLogReplMgrDestroy(SSyncNode* pNode) { + for (int i = 0; i < TSDB_MAX_REPLICA; i++) { + syncLogReplMgrDestroy(pNode->logReplMgrs[i]); + pNode->logReplMgrs[i] = NULL; + } +} + +SSyncLogBuffer* syncLogBufferCreate() { + SSyncLogBuffer* pBuf = taosMemoryCalloc(1, sizeof(SSyncLogBuffer)); + if (pBuf == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } + + pBuf->size = sizeof(pBuf->entries) / sizeof(pBuf->entries[0]); + + ASSERT(pBuf->size == TSDB_SYNC_LOG_BUFFER_SIZE); + + if (taosThreadMutexInit(&pBuf->mutex, NULL) < 0) { + sError("failed to init log buffer mutex due to %s", strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + return pBuf; + +_err: + taosMemoryFree(pBuf); + return NULL; +} + +void syncLogBufferDestroy(SSyncLogBuffer* pBuf) { + if (pBuf == NULL) { + return; + } + (void)taosThreadMutexDestroy(&pBuf->mutex); + (void)taosMemoryFree(pBuf); + return; +} + +int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SyncIndex toIndex) { + ASSERT(pBuf->commitIndex < toIndex && toIndex <= pBuf->endIndex); + + SyncIndex index = pBuf->endIndex - 1; + while (index >= toIndex) { + SSyncRaftEntry* pEntry = pBuf->entries[index % pBuf->size].pItem; + if (pEntry != NULL) { + syncEntryDestroy(pEntry); + pEntry = NULL; + memset(&pBuf->entries[index % pBuf->size], 0, sizeof(pBuf->entries[0])); + } + index--; + } + pBuf->endIndex = toIndex; + pBuf->matchIndex = TMIN(pBuf->matchIndex, index); + ASSERT(index + 1 == toIndex); + return 0; +} + +int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode) { + taosThreadMutexLock(&pBuf->mutex); + SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); + ASSERT(lastVer == pBuf->matchIndex); + SyncIndex index = pBuf->endIndex - 1; + + (void)syncLogBufferRollback(pBuf, pBuf->matchIndex + 1); + + sInfo("vgId:%d, reset log buffer. pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + + pBuf->endIndex = pBuf->matchIndex + 1; + + // reset repl mgr + for (int i = 0; i < pNode->replicaNum; i++) { + SSyncLogReplMgr* pMgr = pNode->logReplMgrs[i]; + syncLogResetLogReplMgr(pMgr); + } + taosThreadMutexUnlock(&pBuf->mutex); + return 0; +} + +SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index, bool* pInBuf) { + SSyncRaftEntry* pEntry = NULL; + if (index >= pBuf->endIndex) { + return NULL; + } + if (index > pBuf->startIndex) { // startIndex might be dummy + *pInBuf = true; + pEntry = pBuf->entries[index % pBuf->size].pItem; + } else { + *pInBuf = false; + if (pNode->pLogStore->syncLogGetEntry(pNode->pLogStore, index, &pEntry) < 0) { + sError("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); + } + } + return pEntry; +} + +bool syncLogReplMgrValidate(SSyncLogReplMgr* pMgr) { + ASSERT(pMgr->startIndex <= pMgr->endIndex); + for (SyncIndex index = pMgr->startIndex; index < pMgr->endIndex; index++) { + ASSERT(pMgr->states[(index + pMgr->size) % pMgr->size].barrier == false || index + 1 == pMgr->endIndex); + } + return true; +} + +int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm, + SRaftId* pDestId, bool* pBarrier) { + SSyncRaftEntry* pEntry = NULL; + SRpcMsg msgOut = {0}; + bool inBuf = false; + int32_t ret = -1; + SyncTerm prevLogTerm = -1; + SSyncLogBuffer* pBuf = pNode->pLogBuf; + + pEntry = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf); + if (pEntry == NULL) { + sError("vgId:%d, failed to get raft entry for index: %" PRId64 "", pNode->vgId, index); + goto _err; + } + *pBarrier = syncLogIsReplicationBarrier(pEntry); + + prevLogTerm = syncLogReplMgrGetPrevLogTerm(pMgr, pNode, index); + if (prevLogTerm < 0) { + sError("vgId:%d, failed to get prev log term since %s. index: %" PRId64 "", pNode->vgId, terrstr(), index); + goto _err; + } + if (pTerm) *pTerm = pEntry->term; + + int32_t code = syncLogToAppendEntries(pNode, pEntry, prevLogTerm, &msgOut); + if (code < 0) { + sError("vgId:%d, failed to get append entries for index:%" PRId64 "", pNode->vgId, index); + goto _err; + } + + (void)syncNodeSendAppendEntries(pNode, pDestId, &msgOut); + ret = 0; + + sInfo("vgId:%d, replicate one msg index: %" PRId64 " term: %" PRId64 " prevterm: %" PRId64 " to dest: 0x%016" PRIx64, + pNode->vgId, pEntry->index, pEntry->term, prevLogTerm, pDestId->addr); + + if (!inBuf) { + syncEntryDestroy(pEntry); + pEntry = NULL; + } + return 0; + +_err: + rpcFreeCont(msgOut.pCont); + msgOut.pCont = NULL; + if (!inBuf) { + syncEntryDestroy(pEntry); + pEntry = NULL; + } + return -1; +} diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 7e19b9aa5c..33c24bcca8 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -22,6 +22,7 @@ #include "syncEnv.h" #include "syncIndexMgr.h" #include "syncInt.h" +#include "syncLogBuffer.h" #include "syncMessage.h" #include "syncRaftCfg.h" #include "syncRaftLog.h" @@ -704,327 +705,6 @@ static int32_t syncHbTimerStop(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer) { return ret; } -int32_t syncLogResetLogReplMgr(SSyncLogReplMgr* pMgr) { - ASSERT(pMgr->startIndex >= 0); - for (SyncIndex index = pMgr->startIndex; index < pMgr->endIndex; index++) { - memset(&pMgr->states[index % pMgr->size], 0, sizeof(pMgr->states[0])); - } - pMgr->startIndex = 0; - pMgr->matchIndex = 0; - pMgr->endIndex = 0; - pMgr->restored = false; - pMgr->retryBackoff = 0; - return 0; -} - -_Atomic int64_t tsRetryCnt = 0; - -int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { - if (pMgr->endIndex <= pMgr->startIndex) { - return 0; - } - - int32_t ret = -1; - bool retried = false; - int64_t retryWaitMs = syncLogGetRetryBackoffTimeMs(pMgr); - - for (SyncIndex index = pMgr->startIndex; index < pMgr->endIndex; index++) { - int64_t pos = index % pMgr->size; - ASSERT(!pMgr->states[pos].barrier || (index == pMgr->startIndex || index + 1 == pMgr->endIndex)); - if (pMgr->states[pos].acked) { - continue; - } - int64_t nowMs = taosGetMonoTimestampMs(); - if (nowMs < pMgr->states[pos].timeMs + retryWaitMs) { - break; - } - - SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; - bool barrier = false; - SyncTerm term = -1; - if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { - sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, - terrstr(), index, pDestId->addr); - goto _out; - } - ASSERT(barrier == pMgr->states[pos].barrier); - pMgr->states[pos].timeMs = nowMs; - pMgr->states[pos].term = term; - pMgr->states[pos].acked = false; - retried = true; - tsRetryCnt++; - } - - ret = 0; -_out: - if (retried) { - pMgr->retryBackoff = syncLogGetNextRetryBackoff(pMgr); - } - return ret; -} - -int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, - SyncAppendEntriesReply* pMsg) { - SSyncLogBuffer* pBuf = pNode->pLogBuf; - SRaftId destId = pMsg->srcId; - ASSERT(pMgr->restored == false); - char host[64]; - uint16_t port; - syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); - - if (pMgr->endIndex == 0) { - ASSERT(pMgr->startIndex == 0); - ASSERT(pMgr->matchIndex == 0); - if (pMsg->matchIndex < 0) { - pMgr->restored = true; - sInfo("vgId:%d, sync log repl mgr of peer %s:%d restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 - "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, host, port, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, - pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); - return 0; - } - } else { - if (pMsg->lastSendIndex < pMgr->startIndex || pMsg->lastSendIndex >= pMgr->endIndex) { - syncLogReplMgrRetryOnNeed(pMgr, pNode); - return 0; - } - - pMgr->states[pMsg->lastSendIndex % pMgr->size].acked = true; - - if (pMsg->matchIndex == pMsg->lastSendIndex) { - pMgr->restored = true; - sInfo("vgId:%d, sync log repl mgr of peer %s:%d restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 - "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, host, port, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, - pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); - return 0; - } - - (void)syncLogResetLogReplMgr(pMgr); - } - - // send match index - SyncIndex index = TMIN(pMsg->matchIndex, pNode->pLogBuf->matchIndex); - bool barrier = false; - SyncTerm term = -1; - ASSERT(index >= 0); - if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, &destId, &barrier) < 0) { - sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, - terrstr(), index, destId.addr); - return -1; - } - - int64_t nowMs = taosGetMonoTimestampMs(); - pMgr->states[index % pMgr->size].barrier = barrier; - pMgr->states[index % pMgr->size].timeMs = nowMs; - pMgr->states[index % pMgr->size].term = term; - pMgr->states[index % pMgr->size].acked = false; - - pMgr->matchIndex = index; - pMgr->startIndex = index; - pMgr->endIndex = index + 1; - return 0; -} - -int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg) { - SSyncLogBuffer* pBuf = pNode->pLogBuf; - taosThreadMutexLock(&pBuf->mutex); - if (pMsg->startTime != 0 && pMsg->startTime != pMgr->peerStartTime) { - sInfo("vgId:%d, reset sync log repl mgr in heartbeat. start time:%" PRId64 ", old start time:%" PRId64 "", - pNode->vgId, pMsg->startTime, pMgr->peerStartTime); - syncLogResetLogReplMgr(pMgr); - pMgr->peerStartTime = pMsg->startTime; - } - taosThreadMutexUnlock(&pBuf->mutex); - return 0; -} - -int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) { - SSyncLogBuffer* pBuf = pNode->pLogBuf; - taosThreadMutexLock(&pBuf->mutex); - if (pMsg->startTime != pMgr->peerStartTime) { - sInfo("vgId:%d, reset sync log repl mgr in append entries reply. start time:%" PRId64 ", old start time:%" PRId64 - "", - pNode->vgId, pMsg->startTime, pMgr->peerStartTime); - syncLogResetLogReplMgr(pMgr); - pMgr->peerStartTime = pMsg->startTime; - } - - if (pMgr->restored) { - (void)syncLogReplMgrProcessReplyInNormalMode(pMgr, pNode, pMsg); - } else { - (void)syncLogReplMgrProcessReplyInRecoveryMode(pMgr, pNode, pMsg); - } - taosThreadMutexUnlock(&pBuf->mutex); - return 0; -} - -int32_t syncLogBufferReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { - SSyncLogBuffer* pBuf = pNode->pLogBuf; - if (pMgr->restored) { - (void)syncLogReplMgrReplicateAttemptedOnce(pMgr, pNode); - } else { - (void)syncLogReplMgrReplicateProbeOnce(pMgr, pNode); - } - return 0; -} - -int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { - ASSERT(!pMgr->restored); - SyncIndex index = pNode->pLogBuf->matchIndex; - SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; - bool barrier = false; - SyncTerm term = -1; - if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { - sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, - terrstr(), index, pDestId->addr); - return -1; - } - - SSyncLogBuffer* pBuf = pNode->pLogBuf; - sDebug("vgId:%d, attempted to probe the %d'th peer with msg of index:%" PRId64 " term: %" PRId64 - ". pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 - ")", - pNode->vgId, pMgr->peerId, index, term, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, - pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); - return 0; -} - -_Atomic int64_t tsSendCnt = 0; - -int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { - ASSERT(pMgr->restored); - SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; - int32_t batchSize = TMAX(1, pMgr->size / 20); - int32_t count = 0; - int64_t nowMs = taosGetMonoTimestampMs(); - - for (SyncIndex index = pMgr->endIndex; index <= pNode->pLogBuf->matchIndex; index++) { - if (batchSize < count++ || pMgr->startIndex + pMgr->size <= index) { - break; - } - if (pMgr->startIndex + 1 < index && pMgr->states[(index - 1) % pMgr->size].barrier) { - break; - } - int64_t pos = index % pMgr->size; - SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; - bool barrier = false; - SyncTerm term = -1; - if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { - sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, - terrstr(), index, pDestId->addr); - return -1; - } - pMgr->states[pos].barrier = barrier; - pMgr->states[pos].timeMs = nowMs; - pMgr->states[pos].term = term; - pMgr->states[pos].acked = false; - - pMgr->endIndex = index + 1; - tsSendCnt++; - if (barrier) { - break; - } - } - - SSyncLogBuffer* pBuf = pNode->pLogBuf; - sDebug("vgId:%d, attempted to replicate %d msgs to the %d'th peer. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 - "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, count, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, - pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); - syncLogReplMgrRetryOnNeed(pMgr, pNode); - return 0; -} - -int32_t syncLogReplMgrProcessReplyInNormalMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) { - ASSERT(pMgr->restored == true); - if (pMgr->startIndex <= pMsg->lastSendIndex && pMsg->lastSendIndex < pMgr->endIndex) { - pMgr->states[pMsg->lastSendIndex % pMgr->size].acked = true; - pMgr->matchIndex = TMAX(pMgr->matchIndex, pMsg->matchIndex); - for (SyncIndex index = pMgr->startIndex; index < pMgr->matchIndex; index++) { - memset(&pMgr->states[index % pMgr->size], 0, sizeof(pMgr->states[0])); - } - pMgr->startIndex = pMgr->matchIndex; - } - - return syncLogReplMgrReplicateAttemptedOnce(pMgr, pNode); -} - -SSyncLogReplMgr* syncLogReplMgrCreate() { - SSyncLogReplMgr* pMgr = taosMemoryCalloc(1, sizeof(SSyncLogReplMgr)); - if (pMgr == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; - } - - pMgr->size = sizeof(pMgr->states) / sizeof(pMgr->states[0]); - - ASSERT(pMgr->size == TSDB_SYNC_LOG_BUFFER_SIZE); - - return pMgr; - -_err: - taosMemoryFree(pMgr); - return NULL; -} - -void syncLogReplMgrDestroy(SSyncLogReplMgr* pMgr) { - if (pMgr == NULL) { - return; - } - (void)taosMemoryFree(pMgr); - return; -} - -int32_t syncNodeLogReplMgrInit(SSyncNode* pNode) { - for (int i = 0; i < TSDB_MAX_REPLICA; i++) { - ASSERT(pNode->logReplMgrs[i] == NULL); - pNode->logReplMgrs[i] = syncLogReplMgrCreate(); - pNode->logReplMgrs[i]->peerId = i; - ASSERT(pNode->logReplMgrs[i] != NULL && "Out of memory."); - } - return 0; -} - -void syncNodeLogReplMgrDestroy(SSyncNode* pNode) { - for (int i = 0; i < TSDB_MAX_REPLICA; i++) { - syncLogReplMgrDestroy(pNode->logReplMgrs[i]); - pNode->logReplMgrs[i] = NULL; - } -} - -SSyncLogBuffer* syncLogBufferCreate() { - SSyncLogBuffer* pBuf = taosMemoryCalloc(1, sizeof(SSyncLogBuffer)); - if (pBuf == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; - } - - pBuf->size = sizeof(pBuf->entries) / sizeof(pBuf->entries[0]); - - ASSERT(pBuf->size == TSDB_SYNC_LOG_BUFFER_SIZE); - - if (taosThreadMutexInit(&pBuf->mutex, NULL) < 0) { - sError("failed to init log buffer mutex due to %s", strerror(errno)); - terrno = TAOS_SYSTEM_ERROR(errno); - goto _err; - } - return pBuf; - -_err: - taosMemoryFree(pBuf); - return NULL; -} - -void syncLogBufferDestroy(SSyncLogBuffer* pBuf) { - if (pBuf == NULL) { - return; - } - (void)taosThreadMutexDestroy(&pBuf->mutex); - (void)taosMemoryFree(pBuf); - return; -} - // open/close -------------- SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) { SSyncNode* pSyncNode = taosMemoryCalloc(1, sizeof(SSyncNode)); @@ -1895,47 +1575,6 @@ void syncNodeStepDown(SSyncNode* pSyncNode, SyncTerm newTerm) { void syncNodeLeaderChangeRsp(SSyncNode* pSyncNode) { syncRespCleanRsp(pSyncNode->pSyncRespMgr); } -int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SyncIndex toIndex) { - ASSERT(pBuf->commitIndex < toIndex && toIndex <= pBuf->endIndex); - - SyncIndex index = pBuf->endIndex - 1; - while (index >= toIndex) { - SSyncRaftEntry* pEntry = pBuf->entries[index % pBuf->size].pItem; - if (pEntry != NULL) { - syncEntryDestroy(pEntry); - pEntry = NULL; - memset(&pBuf->entries[index % pBuf->size], 0, sizeof(pBuf->entries[0])); - } - index--; - } - pBuf->endIndex = toIndex; - pBuf->matchIndex = TMIN(pBuf->matchIndex, index); - ASSERT(index + 1 == toIndex); - return 0; -} - -int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode) { - taosThreadMutexLock(&pBuf->mutex); - SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); - ASSERT(lastVer == pBuf->matchIndex); - SyncIndex index = pBuf->endIndex - 1; - - (void)syncLogBufferRollback(pBuf, pBuf->matchIndex + 1); - - sInfo("vgId:%d, reset log buffer. pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, - pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); - - pBuf->endIndex = pBuf->matchIndex + 1; - - // reset repl mgr - for (int i = 0; i < pNode->replicaNum; i++) { - SSyncLogReplMgr* pMgr = pNode->logReplMgrs[i]; - syncLogResetLogReplMgr(pMgr); - } - taosThreadMutexUnlock(&pBuf->mutex); - return 0; -} - void syncNodeBecomeFollower(SSyncNode* pSyncNode, const char* debugStr) { // maybe clear leader cache if (pSyncNode->state == TAOS_SYNC_STATE_LEADER) { @@ -2675,96 +2314,6 @@ int32_t syncNodeOnLocalCmd(SSyncNode* ths, const SRpcMsg* pRpcMsg) { return 0; } -int64_t syncLogBufferGetEndIndex(SSyncLogBuffer* pBuf) { - taosThreadMutexLock(&pBuf->mutex); - int64_t index = pBuf->endIndex; - taosThreadMutexUnlock(&pBuf->mutex); - return index; -} - -int32_t syncLogBufferAppend(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry) { - taosThreadMutexLock(&pBuf->mutex); - syncLogBufferValidate(pBuf); - SyncIndex index = pEntry->index; - - if (index - pBuf->startIndex >= pBuf->size) { - sError("vgId:%d, failed to append due to log buffer full. index:%" PRId64 "", pNode->vgId, index); - goto _out; - } - - ASSERT(index == pBuf->endIndex); - - SSyncRaftEntry* pExist = pBuf->entries[index % pBuf->size].pItem; - ASSERT(pExist == NULL); - - // initial log buffer with at least one item, e.g. commitIndex - SSyncRaftEntry* pMatch = pBuf->entries[(index - 1 + pBuf->size) % pBuf->size].pItem; - ASSERT(pMatch != NULL && "no matched raft log entry"); - ASSERT(pMatch->index + 1 == index); - - SSyncLogBufEntry tmp = {.pItem = pEntry, .prevLogIndex = pMatch->index, .prevLogTerm = pMatch->term}; - pBuf->entries[index % pBuf->size] = tmp; - pBuf->endIndex = index + 1; - - syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); - return 0; - -_out: - syncLogBufferValidate(pBuf); - syncEntryDestroy(pEntry); - taosThreadMutexUnlock(&pBuf->mutex); - return -1; -} - -SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index) { - SSyncLogBuffer* pBuf = pNode->pLogBuf; - SSyncRaftEntry* pEntry = NULL; - SyncIndex prevIndex = index - 1; - SyncTerm prevLogTerm = -1; - terrno = TSDB_CODE_SUCCESS; - - if (prevIndex == -1) return 0; - - if (index - 1 > pBuf->matchIndex) { - terrno = TSDB_CODE_WAL_LOG_NOT_EXIST; - return -1; - } - - ASSERT(index - 1 == prevIndex); - - if (index - 1 >= pBuf->startIndex) { - pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; - ASSERT(pEntry != NULL && "no log entry found"); - prevLogTerm = pBuf->entries[(index + pBuf->size) % pBuf->size].prevLogTerm; - return prevLogTerm; - } - - if (pMgr->startIndex <= prevIndex && prevIndex < pMgr->endIndex) { - int64_t timeMs = pMgr->states[(prevIndex + pMgr->size) % pMgr->size].timeMs; - ASSERT(timeMs != 0 && "no log entry found"); - prevLogTerm = pMgr->states[(prevIndex + pMgr->size) % pMgr->size].term; - ASSERT(prevIndex == 0 || prevLogTerm != 0); - return prevLogTerm; - } - - SSnapshot snapshot; - if (pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot) == 0 && prevIndex == snapshot.lastApplyIndex) { - return snapshot.lastApplyTerm; - } - - if (pNode->pLogStore->syncLogGetEntry(pNode->pLogStore, prevIndex, &pEntry) == 0) { - prevLogTerm = pEntry->term; - syncEntryDestroy(pEntry); - pEntry = NULL; - return prevLogTerm; - } - - sError("vgId:%d, failed to get log term since %s. index: %" PRId64 "", pNode->vgId, terrstr(), prevIndex); - terrno = TSDB_CODE_WAL_LOG_NOT_EXIST; - return -1; -} - int32_t syncLogToAppendEntries(SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm, SRpcMsg* pRpcMsg) { uint32_t dataLen = pEntry->bytes; uint32_t bytes = sizeof(SyncAppendEntries) + dataLen; @@ -3014,7 +2563,7 @@ int32_t syncNodeUpdateNewConfigIndex(SSyncNode* ths, SSyncCfg* pNewCfg) { } bool syncNodeIsOptimizedOneReplica(SSyncNode* ths, SRpcMsg* pMsg) { - return false; + // return false; return (ths->replicaNum == 1 && syncUtilUserCommit(pMsg->msgType) && ths->vgId != 1); } diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c index 46c7649e02..e8709f95a2 100644 --- a/source/libs/sync/src/syncReplication.c +++ b/source/libs/sync/src/syncReplication.c @@ -16,6 +16,7 @@ #define _DEFAULT_SOURCE #include "syncReplication.h" #include "syncIndexMgr.h" +#include "syncLogBuffer.h" #include "syncRaftEntry.h" #include "syncRaftStore.h" #include "syncUtil.h" @@ -45,6 +46,8 @@ // mdest |-> j]) // /\ UNCHANGED <> +int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg); + int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId, bool snapshot) { // next index SyncIndex nextIndex = syncIndexMgrGetIndex(pSyncNode->pNextIndex, pDestId); diff --git a/source/os/src/osTimer.c b/source/os/src/osTimer.c index d2b8f3134a..d1c233ea9c 100644 --- a/source/os/src/osTimer.c +++ b/source/os/src/osTimer.c @@ -216,7 +216,7 @@ int64_t taosGetMonotonicMs() { #if 0 return getMonotonicUs() / 1000; #else - return taosGetMonoTimestampMs(); + return taosGetTimestampMs(); #endif } From 363cbc8985dce3d223be1b6596563fa797b44042 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Fri, 18 Nov 2022 09:37:58 +0800 Subject: [PATCH 012/105] fix: update cbMeta rsp handle info in syncLogFsmExecute --- source/dnode/vnode/src/vnd/vnodeSync.c | 2 +- source/libs/sync/inc/syncCommit.h | 5 ++ source/libs/sync/inc/syncLogBuffer.h | 47 +++++++++---------- source/libs/sync/inc/syncReplication.h | 3 ++ source/libs/sync/inc/syncSnapshot.h | 2 + source/libs/sync/src/syncAppendEntriesReply.c | 18 ------- source/libs/sync/src/syncCommit.c | 18 +++++++ source/libs/sync/src/syncLogBuffer.c | 32 ++++++------- source/libs/sync/src/syncMain.c | 1 - source/libs/transport/src/tmsgcb.c | 5 +- 10 files changed, 66 insertions(+), 67 deletions(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index feecbc6d3b..c67ee41b12 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -415,7 +415,7 @@ static void vnodeRestoreFinish(const SSyncFSM *pFsm) { walApplyVer(pVnode->pWal, pVnode->state.applied); pVnode->restored = true; - vDebug("vgId:%d, sync restore finished", pVnode->config.vgId); + vInfo("vgId:%d, sync restore finished", pVnode->config.vgId); } static void vnodeBecomeFollower(const SSyncFSM *pFsm) { diff --git a/source/libs/sync/inc/syncCommit.h b/source/libs/sync/inc/syncCommit.h index d3ba556f82..7d638a7336 100644 --- a/source/libs/sync/inc/syncCommit.h +++ b/source/libs/sync/inc/syncCommit.h @@ -47,8 +47,13 @@ extern "C" { // void syncOneReplicaAdvance(SSyncNode* pSyncNode); void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode); + bool syncAgreeIndex(SSyncNode* pSyncNode, SRaftId* pRaftId, SyncIndex index); bool syncAgree(SSyncNode* pSyncNode, SyncIndex index); +bool syncNodeAgreedUpon(SSyncNode* pNode, SyncIndex index); + +int64_t syncNodeUpdateCommitIndex(SSyncNode* ths, SyncIndex commitIndex); +int64_t syncNodeCheckCommitIndex(SSyncNode* ths, SyncIndex indexLikely); #ifdef __cplusplus } diff --git a/source/libs/sync/inc/syncLogBuffer.h b/source/libs/sync/inc/syncLogBuffer.h index 4c209549b4..39b4439d62 100644 --- a/source/libs/sync/inc/syncLogBuffer.h +++ b/source/libs/sync/inc/syncLogBuffer.h @@ -41,8 +41,28 @@ typedef struct SSyncLogReplMgr { int32_t peerId; } SSyncLogReplMgr; +typedef struct SSyncLogBufEntry { + SSyncRaftEntry* pItem; + SyncIndex prevLogIndex; + SyncTerm prevLogTerm; +} SSyncLogBufEntry; + +typedef struct SSyncLogBuffer { + SSyncLogBufEntry entries[TSDB_SYNC_LOG_BUFFER_SIZE]; + int64_t startIndex; + int64_t commitIndex; + int64_t matchIndex; + int64_t endIndex; + int64_t size; + TdThreadMutex mutex; +} SSyncLogBuffer; + +// SSyncLogRepMgr + SSyncLogReplMgr* syncLogReplMgrCreate(); void syncLogReplMgrDestroy(SSyncLogReplMgr* pMgr); +int32_t syncLogReplMgrReset(SSyncLogReplMgr* pMgr); + int32_t syncNodeLogReplMgrInit(SSyncNode* pNode); void syncNodeLogReplMgrDestroy(SSyncNode* pNode); @@ -69,35 +89,12 @@ int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn int32_t syncLogBufferReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); -int32_t syncLogResetLogReplMgr(SSyncLogReplMgr* pMgr); int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); int32_t syncLogReplMgrProcessReplyInNormalMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode); int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg); -int32_t syncNodeSendAppendEntries(SSyncNode* pNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg); -int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg); -void syncLogDestroyAppendEntries(SRpcMsg* pRpcMsg); - -// others -bool syncLogReplMgrValidate(SSyncLogReplMgr* pMgr); - -typedef struct SSyncLogBufEntry { - SSyncRaftEntry* pItem; - SyncIndex prevLogIndex; - SyncTerm prevLogTerm; -} SSyncLogBufEntry; - -typedef struct SSyncLogBuffer { - SSyncLogBufEntry entries[TSDB_SYNC_LOG_BUFFER_SIZE]; - int64_t startIndex; - int64_t commitIndex; - int64_t matchIndex; - int64_t endIndex; - int64_t size; - TdThreadMutex mutex; -} SSyncLogBuffer; - +// SSyncLogBuffer SSyncLogBuffer* syncLogBufferCreate(); void syncLogBufferDestroy(SSyncLogBuffer* pBuf); int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode); @@ -117,8 +114,6 @@ int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SyncIndex toIndex); int32_t syncLogBufferReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm); // others -bool syncNodeAgreedUpon(SSyncNode* pNode, SyncIndex index); -void syncIndexMgrSetIndex(SSyncIndexMgr* pSyncIndexMgr, const SRaftId* pRaftId, SyncIndex index); int64_t syncNodeUpdateCommitIndex(SSyncNode* ths, SyncIndex commtIndex); int32_t syncLogToAppendEntries(SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm, SRpcMsg* pRpcMsg); diff --git a/source/libs/sync/inc/syncReplication.h b/source/libs/sync/inc/syncReplication.h index 7da610a9ed..f077306475 100644 --- a/source/libs/sync/inc/syncReplication.h +++ b/source/libs/sync/inc/syncReplication.h @@ -53,6 +53,9 @@ int32_t syncNodeSendHeartbeat(SSyncNode* pSyncNode, const SRaftId* pDestId, SRpc int32_t syncNodeReplicate(SSyncNode* pSyncNode); int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId, bool snapshot); +int32_t syncNodeSendAppendEntries(SSyncNode* pNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg); +int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg); + #ifdef __cplusplus } #endif diff --git a/source/libs/sync/inc/syncSnapshot.h b/source/libs/sync/inc/syncSnapshot.h index 7b8e768391..1f9675a3cd 100644 --- a/source/libs/sync/inc/syncSnapshot.h +++ b/source/libs/sync/inc/syncSnapshot.h @@ -87,6 +87,8 @@ void snapshotReceiverForceStop(SSyncSnapshotReceiver *pReceive int32_t syncNodeOnSnapshot(SSyncNode *ths, const SRpcMsg *pMsg); int32_t syncNodeOnSnapshotReply(SSyncNode *ths, const SRpcMsg *pMsg); +SyncIndex syncNodeGetSnapshotConfigIndex(SSyncNode *pSyncNode, SyncIndex snapshotLastApplyIndex); + // start #ifdef __cplusplus diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index 36eb6fefc7..234e8bffeb 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -39,24 +39,6 @@ // /\ UNCHANGED <> // -int64_t syncNodeUpdateCommitIndex(SSyncNode* ths, SyncIndex commitIndex) { - SyncIndex lastVer = ths->pLogStore->syncLogLastIndex(ths->pLogStore); - commitIndex = TMAX(commitIndex, ths->commitIndex); - ths->commitIndex = TMIN(commitIndex, lastVer); - ths->pLogStore->syncLogUpdateCommitIndex(ths->pLogStore, ths->commitIndex); - return ths->commitIndex; -} - -int64_t syncNodeCheckCommitIndex(SSyncNode* ths, SyncIndex indexLikely) { - if (indexLikely > ths->commitIndex && syncNodeAgreedUpon(ths, indexLikely)) { - SyncIndex commitIndex = indexLikely; - syncNodeUpdateCommitIndex(ths, commitIndex); - sInfo("vgId:%d, agreed upon. role:%d, term:%" PRId64 ", index: %" PRId64 "", ths->vgId, ths->state, - ths->pRaftStore->currentTerm, commitIndex); - } - return ths->commitIndex; -} - int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) { SyncAppendEntriesReply* pMsg = pRpcMsg->pCont; int32_t ret = 0; diff --git a/source/libs/sync/src/syncCommit.c b/source/libs/sync/src/syncCommit.c index 73fc3050ef..fc7ea7cc30 100644 --- a/source/libs/sync/src/syncCommit.c +++ b/source/libs/sync/src/syncCommit.c @@ -311,3 +311,21 @@ bool syncAgree(SSyncNode* pNode, SyncIndex index) { } return false; } + +int64_t syncNodeUpdateCommitIndex(SSyncNode* ths, SyncIndex commitIndex) { + SyncIndex lastVer = ths->pLogStore->syncLogLastIndex(ths->pLogStore); + commitIndex = TMAX(commitIndex, ths->commitIndex); + ths->commitIndex = TMIN(commitIndex, lastVer); + ths->pLogStore->syncLogUpdateCommitIndex(ths->pLogStore, ths->commitIndex); + return ths->commitIndex; +} + +int64_t syncNodeCheckCommitIndex(SSyncNode* ths, SyncIndex indexLikely) { + if (indexLikely > ths->commitIndex && syncNodeAgreedUpon(ths, indexLikely)) { + SyncIndex commitIndex = indexLikely; + syncNodeUpdateCommitIndex(ths, commitIndex); + sInfo("vgId:%d, agreed upon. role:%d, term:%" PRId64 ", index: %" PRId64 "", ths->vgId, ths->state, + ths->pRaftStore->currentTerm, commitIndex); + } + return ths->commitIndex; +} diff --git a/source/libs/sync/src/syncLogBuffer.c b/source/libs/sync/src/syncLogBuffer.c index 36f33fa46e..621bce6683 100644 --- a/source/libs/sync/src/syncLogBuffer.c +++ b/source/libs/sync/src/syncLogBuffer.c @@ -16,10 +16,13 @@ #define _DEFAULT_SOURCE #include "syncLogBuffer.h" +#include "syncIndexMgr.h" #include "syncInt.h" #include "syncRaftEntry.h" #include "syncRaftStore.h" #include "syncReplication.h" +#include "syncRespMgr.h" +#include "syncSnapshot.h" #include "syncUtil.h" int64_t syncLogBufferGetEndIndex(SSyncLogBuffer* pBuf) { @@ -384,7 +387,7 @@ _out: return matchIndex; } -int32_t syncLogFsmExecute(SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncRaftEntry* pEntry) { +int32_t syncLogFsmExecute(SSyncNode* pNode, SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncRaftEntry* pEntry) { ASSERT(pFsm->FpCommitCb != NULL && "No commit cb registered for the FSM"); SRpcMsg rpcMsg; @@ -392,7 +395,7 @@ int32_t syncLogFsmExecute(SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncR SFsmCbMeta cbMeta = {0}; cbMeta.index = pEntry->index; - cbMeta.lastConfigIndex = -1; + cbMeta.lastConfigIndex = syncNodeGetSnapshotConfigIndex(pNode, pEntry->index); cbMeta.isWeak = pEntry->isWeak; cbMeta.code = 0; cbMeta.state = role; @@ -401,6 +404,7 @@ int32_t syncLogFsmExecute(SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncR cbMeta.currentTerm = term; cbMeta.flag = -1; + (void)syncRespMgrGetAndDel(pNode->pSyncRespMgr, cbMeta.seqNum, &rpcMsg.info); pFsm->FpCommitCb(pFsm, &rpcMsg, &cbMeta); return 0; } @@ -423,7 +427,7 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm ESyncState role = pNode->state; SyncTerm term = pNode->pRaftStore->currentTerm; SyncGroupId vgId = pNode->vgId; - int32_t ret = 0; + int32_t ret = -1; int64_t upperIndex = TMIN(commitIndex, pBuf->matchIndex); SSyncRaftEntry* pEntry = NULL; bool inBuf = false; @@ -459,10 +463,9 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm continue; } - if (syncLogFsmExecute(pFsm, role, term, pEntry) != 0) { + if (syncLogFsmExecute(pNode, pFsm, role, term, pEntry) != 0) { sError("vgId:%d, failed to execute raft entry in FSM. log index:%" PRId64 ", term:%" PRId64 "", vgId, pEntry->index, pEntry->term); - ret = -1; goto _out; } pBuf->commitIndex = index; @@ -487,6 +490,7 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm pBuf->startIndex = index + 1; } + ret = 0; _out: // mark as restored if needed if (!pNode->restoreFinish && pBuf->commitIndex >= pNode->commitIndex) { @@ -505,7 +509,7 @@ _out: return ret; } -int32_t syncLogResetLogReplMgr(SSyncLogReplMgr* pMgr) { +int32_t syncLogReplMgrReset(SSyncLogReplMgr* pMgr) { ASSERT(pMgr->startIndex >= 0); for (SyncIndex index = pMgr->startIndex; index < pMgr->endIndex; index++) { memset(&pMgr->states[index % pMgr->size], 0, sizeof(pMgr->states[0])); @@ -601,7 +605,7 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod return 0; } - (void)syncLogResetLogReplMgr(pMgr); + (void)syncLogReplMgrReset(pMgr); } // send match index @@ -633,7 +637,7 @@ int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pN if (pMsg->startTime != 0 && pMsg->startTime != pMgr->peerStartTime) { sInfo("vgId:%d, reset sync log repl mgr in heartbeat. start time:%" PRId64 ", old start time:%" PRId64 "", pNode->vgId, pMsg->startTime, pMgr->peerStartTime); - syncLogResetLogReplMgr(pMgr); + syncLogReplMgrReset(pMgr); pMgr->peerStartTime = pMsg->startTime; } taosThreadMutexUnlock(&pBuf->mutex); @@ -647,7 +651,7 @@ int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Sync sInfo("vgId:%d, reset sync log repl mgr in append entries reply. start time:%" PRId64 ", old start time:%" PRId64 "", pNode->vgId, pMsg->startTime, pMgr->peerStartTime); - syncLogResetLogReplMgr(pMgr); + syncLogReplMgrReset(pMgr); pMgr->peerStartTime = pMsg->startTime; } @@ -861,7 +865,7 @@ int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode) { // reset repl mgr for (int i = 0; i < pNode->replicaNum; i++) { SSyncLogReplMgr* pMgr = pNode->logReplMgrs[i]; - syncLogResetLogReplMgr(pMgr); + syncLogReplMgrReset(pMgr); } taosThreadMutexUnlock(&pBuf->mutex); return 0; @@ -884,14 +888,6 @@ SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, return pEntry; } -bool syncLogReplMgrValidate(SSyncLogReplMgr* pMgr) { - ASSERT(pMgr->startIndex <= pMgr->endIndex); - for (SyncIndex index = pMgr->startIndex; index < pMgr->endIndex; index++) { - ASSERT(pMgr->states[(index + pMgr->size) % pMgr->size].barrier == false || index + 1 == pMgr->endIndex); - } - return true; -} - int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm, SRaftId* pDestId, bool* pBarrier) { SSyncRaftEntry* pEntry = NULL; diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 33c24bcca8..457ef7eedd 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -58,7 +58,6 @@ static int32_t syncNodeLeaderTransferTo(SSyncNode* pSyncNode, SNodeInfo newLeade static int32_t syncDoLeaderTransfer(SSyncNode* ths, SRpcMsg* pRpcMsg, SSyncRaftEntry* pEntry); static ESyncStrategy syncNodeStrategy(SSyncNode* pSyncNode); -static SyncIndex syncNodeGetSnapshotConfigIndex(SSyncNode* pSyncNode, SyncIndex snapshotLastApplyIndex); int64_t syncOpen(SSyncInfo* pSyncInfo) { SSyncNode* pSyncNode = syncNodeOpen(pSyncInfo); diff --git a/source/libs/transport/src/tmsgcb.c b/source/libs/transport/src/tmsgcb.c index 2007bc474f..48f557c1a8 100644 --- a/source/libs/transport/src/tmsgcb.c +++ b/source/libs/transport/src/tmsgcb.c @@ -16,6 +16,7 @@ #define _DEFAULT_SOURCE #include "tmsgcb.h" #include "taoserror.h" +#include "transLog.h" #include "trpc.h" static SMsgCb defaultMsgCb; @@ -23,9 +24,7 @@ static SMsgCb defaultMsgCb; void tmsgSetDefault(const SMsgCb* msgcb) { defaultMsgCb = *msgcb; } int32_t tmsgPutToQueue(const SMsgCb* msgcb, EQueueType qtype, SRpcMsg* pMsg) { - if (msgcb == NULL) { - return -1; - } + ASSERT(msgcb != NULL); int32_t code = (*msgcb->putToQueueFp)(msgcb->mgmt, qtype, pMsg); if (code != 0) { rpcFreeCont(pMsg->pCont); From 03b88ff41cba1c13a6fc0417447c9eaa9ab2f841 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Fri, 18 Nov 2022 09:50:36 +0800 Subject: [PATCH 013/105] enh: rename syncLogBuffer.h|c to syncPipeline.h|c --- .../libs/sync/inc/{syncLogBuffer.h => syncPipeline.h} | 11 +++-------- source/libs/sync/src/syncAppendEntries.c | 3 ++- source/libs/sync/src/syncAppendEntriesReply.c | 2 +- source/libs/sync/src/syncMain.c | 2 +- .../libs/sync/src/{syncLogBuffer.c => syncPipeline.c} | 2 +- source/libs/sync/src/syncReplication.c | 2 +- 6 files changed, 9 insertions(+), 13 deletions(-) rename source/libs/sync/inc/{syncLogBuffer.h => syncPipeline.h} (93%) rename source/libs/sync/src/{syncLogBuffer.c => syncPipeline.c} (99%) diff --git a/source/libs/sync/inc/syncLogBuffer.h b/source/libs/sync/inc/syncPipeline.h similarity index 93% rename from source/libs/sync/inc/syncLogBuffer.h rename to source/libs/sync/inc/syncPipeline.h index 39b4439d62..666515078a 100644 --- a/source/libs/sync/inc/syncLogBuffer.h +++ b/source/libs/sync/inc/syncPipeline.h @@ -13,8 +13,8 @@ * along with this program. If not, see . */ -#ifndef _TD_LIBS_SYNC_LOG_BUFFER_H -#define _TD_LIBS_SYNC_LOG_BUFFER_H +#ifndef _TD_LIBS_SYNC_PIPELINE_H +#define _TD_LIBS_SYNC_PIPELINE_H #ifdef __cplusplus extern "C" { @@ -58,7 +58,6 @@ typedef struct SSyncLogBuffer { } SSyncLogBuffer; // SSyncLogRepMgr - SSyncLogReplMgr* syncLogReplMgrCreate(); void syncLogReplMgrDestroy(SSyncLogReplMgr* pMgr); int32_t syncLogReplMgrReset(SSyncLogReplMgr* pMgr); @@ -113,12 +112,8 @@ int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf); int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SyncIndex toIndex); int32_t syncLogBufferReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm); -// others -int64_t syncNodeUpdateCommitIndex(SSyncNode* ths, SyncIndex commtIndex); -int32_t syncLogToAppendEntries(SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm, SRpcMsg* pRpcMsg); - #ifdef __cplusplus } #endif -#endif /*_TD_LIBS_SYNC_LOG_BUFFER_H*/ +#endif /*_TD_LIBS_SYNC_PIPELINE_H*/ diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c index 4eff19ced8..f2bdf6be70 100644 --- a/source/libs/sync/src/syncAppendEntries.c +++ b/source/libs/sync/src/syncAppendEntries.c @@ -15,12 +15,13 @@ #define _DEFAULT_SOURCE #include "syncAppendEntries.h" -#include "syncLogBuffer.h" +#include "syncPipeline.h" #include "syncMessage.h" #include "syncRaftLog.h" #include "syncRaftStore.h" #include "syncReplication.h" #include "syncUtil.h" +#include "syncCommit.h" // TLA+ Spec // HandleAppendEntriesRequest(i, j, m) == diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index 234e8bffeb..ad388e193a 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -17,7 +17,7 @@ #include "syncAppendEntriesReply.h" #include "syncCommit.h" #include "syncIndexMgr.h" -#include "syncLogBuffer.h" +#include "syncPipeline.h" #include "syncMessage.h" #include "syncRaftEntry.h" #include "syncRaftStore.h" diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 457ef7eedd..8dd972506a 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -22,7 +22,7 @@ #include "syncEnv.h" #include "syncIndexMgr.h" #include "syncInt.h" -#include "syncLogBuffer.h" +#include "syncPipeline.h" #include "syncMessage.h" #include "syncRaftCfg.h" #include "syncRaftLog.h" diff --git a/source/libs/sync/src/syncLogBuffer.c b/source/libs/sync/src/syncPipeline.c similarity index 99% rename from source/libs/sync/src/syncLogBuffer.c rename to source/libs/sync/src/syncPipeline.c index 621bce6683..c8bb6260e8 100644 --- a/source/libs/sync/src/syncLogBuffer.c +++ b/source/libs/sync/src/syncPipeline.c @@ -15,7 +15,7 @@ #define _DEFAULT_SOURCE -#include "syncLogBuffer.h" +#include "syncPipeline.h" #include "syncIndexMgr.h" #include "syncInt.h" #include "syncRaftEntry.h" diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c index e8709f95a2..d4a046b7ae 100644 --- a/source/libs/sync/src/syncReplication.c +++ b/source/libs/sync/src/syncReplication.c @@ -16,7 +16,7 @@ #define _DEFAULT_SOURCE #include "syncReplication.h" #include "syncIndexMgr.h" -#include "syncLogBuffer.h" +#include "syncPipeline.h" #include "syncRaftEntry.h" #include "syncRaftStore.h" #include "syncUtil.h" From c9c05761d6204f186eef626fe059927e87c27dc7 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Fri, 18 Nov 2022 10:09:31 +0800 Subject: [PATCH 014/105] enh: rename syncLogToAppendEntries to syncBuildAppendEntriesFromRaftLog --- source/libs/sync/inc/syncMessage.h | 2 ++ source/libs/sync/src/syncMain.c | 27 --------------------------- source/libs/sync/src/syncMessage.c | 29 +++++++++++++++++++++++++++++ source/libs/sync/src/syncPipeline.c | 2 +- 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/source/libs/sync/inc/syncMessage.h b/source/libs/sync/inc/syncMessage.h index 92e7b555a4..c5fdc27426 100644 --- a/source/libs/sync/inc/syncMessage.h +++ b/source/libs/sync/inc/syncMessage.h @@ -243,6 +243,8 @@ int32_t syncBuildRequestVote(SRpcMsg* pMsg, int32_t vgId); int32_t syncBuildRequestVoteReply(SRpcMsg* pMsg, int32_t vgId); int32_t syncBuildAppendEntries(SRpcMsg* pMsg, int32_t dataLen, int32_t vgId); int32_t syncBuildAppendEntriesReply(SRpcMsg* pMsg, int32_t vgId); +int32_t syncBuildAppendEntriesFromRaftLog(SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm, + SRpcMsg* pRpcMsg); int32_t syncBuildHeartbeat(SRpcMsg* pMsg, int32_t vgId); int32_t syncBuildHeartbeatReply(SRpcMsg* pMsg, int32_t vgId); int32_t syncBuildPreSnapshot(SRpcMsg* pMsg, int32_t vgId); diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 8dd972506a..c95a3aba62 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -2313,33 +2313,6 @@ int32_t syncNodeOnLocalCmd(SSyncNode* ths, const SRpcMsg* pRpcMsg) { return 0; } -int32_t syncLogToAppendEntries(SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm, SRpcMsg* pRpcMsg) { - uint32_t dataLen = pEntry->bytes; - uint32_t bytes = sizeof(SyncAppendEntries) + dataLen; - pRpcMsg->contLen = bytes; - pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen); - if (pRpcMsg->pCont == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; - } - - SyncAppendEntries* pMsg = pRpcMsg->pCont; - pMsg->bytes = pRpcMsg->contLen; - pMsg->msgType = pRpcMsg->msgType = TDMT_SYNC_APPEND_ENTRIES; - pMsg->dataLen = dataLen; - - (void)memcpy(pMsg->data, pEntry, dataLen); - - pMsg->prevLogIndex = pEntry->index - 1; - pMsg->prevLogTerm = prevLogTerm; - pMsg->vgId = pNode->vgId; - pMsg->srcId = pNode->myRaftId; - pMsg->term = pNode->pRaftStore->currentTerm; - pMsg->commitIndex = pNode->commitIndex; - pMsg->privateTerm = 0; - return 0; -} - // TLA+ Spec // ClientRequest(i, v) == // /\ state[i] = Leader diff --git a/source/libs/sync/src/syncMessage.c b/source/libs/sync/src/syncMessage.c index ce98419980..ef1d585a89 100644 --- a/source/libs/sync/src/syncMessage.c +++ b/source/libs/sync/src/syncMessage.c @@ -16,6 +16,7 @@ #define _DEFAULT_SOURCE #include "syncMessage.h" #include "syncRaftEntry.h" +#include "syncRaftStore.h" int32_t syncBuildTimeout(SRpcMsg* pMsg, ESyncTimeoutType timeoutType, uint64_t logicClock, int32_t timerMS, SSyncNode* pNode) { @@ -152,6 +153,34 @@ int32_t syncBuildAppendEntriesReply(SRpcMsg* pMsg, int32_t vgId) { return 0; } +int32_t syncBuildAppendEntriesFromRaftLog(SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm, + SRpcMsg* pRpcMsg) { + uint32_t dataLen = pEntry->bytes; + uint32_t bytes = sizeof(SyncAppendEntries) + dataLen; + pRpcMsg->contLen = bytes; + pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen); + if (pRpcMsg->pCont == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } + + SyncAppendEntries* pMsg = pRpcMsg->pCont; + pMsg->bytes = pRpcMsg->contLen; + pMsg->msgType = pRpcMsg->msgType = TDMT_SYNC_APPEND_ENTRIES; + pMsg->dataLen = dataLen; + + (void)memcpy(pMsg->data, pEntry, dataLen); + + pMsg->prevLogIndex = pEntry->index - 1; + pMsg->prevLogTerm = prevLogTerm; + pMsg->vgId = pNode->vgId; + pMsg->srcId = pNode->myRaftId; + pMsg->term = pNode->pRaftStore->currentTerm; + pMsg->commitIndex = pNode->commitIndex; + pMsg->privateTerm = 0; + return 0; +} + int32_t syncBuildHeartbeat(SRpcMsg* pMsg, int32_t vgId) { int32_t bytes = sizeof(SyncHeartbeat); pMsg->pCont = rpcMallocCont(bytes); diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index c8bb6260e8..501efa8782 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -911,7 +911,7 @@ int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn } if (pTerm) *pTerm = pEntry->term; - int32_t code = syncLogToAppendEntries(pNode, pEntry, prevLogTerm, &msgOut); + int32_t code = syncBuildAppendEntriesFromRaftLog(pNode, pEntry, prevLogTerm, &msgOut); if (code < 0) { sError("vgId:%d, failed to get append entries for index:%" PRId64 "", pNode->vgId, index); goto _err; From b90ee796236f4ce551a36c93d3eaff109d81e8d3 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Mon, 21 Nov 2022 13:51:01 +0800 Subject: [PATCH 015/105] fix: use syncLogBufferCommit in syncNodeOnLocalCmd --- include/util/tdef.h | 2 +- source/dnode/vnode/src/tsdb/tsdbCommit.c | 4 +- source/dnode/vnode/src/vnd/vnodeSvr.c | 7 ++++ source/dnode/vnode/src/vnd/vnodeSync.c | 8 ++-- source/libs/sync/src/syncAppendEntries.c | 6 +-- source/libs/sync/src/syncAppendEntriesReply.c | 4 +- source/libs/sync/src/syncCommit.c | 4 +- source/libs/sync/src/syncMain.c | 38 ++++++++++++++++--- source/libs/sync/src/syncPipeline.c | 26 +++++++------ source/libs/transport/src/transSvr.c | 1 + 10 files changed, 68 insertions(+), 32 deletions(-) diff --git a/include/util/tdef.h b/include/util/tdef.h index ef0eca4db3..124d98e3dc 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -281,7 +281,7 @@ typedef enum ELogicConditionType { #define TSDB_DNODE_ROLE_VNODE 2 #define TSDB_MAX_REPLICA 5 -#define TSDB_SYNC_LOG_BUFFER_SIZE 1024 +#define TSDB_SYNC_LOG_BUFFER_SIZE 4096 #define TSDB_TBNAME_COLUMN_INDEX (-1) #define TSDB_MULTI_TABLEMETA_MAX_NUM 100000 // maximum batch size allowed to load table meta diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 65a46331aa..65fd266083 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -1258,7 +1258,7 @@ static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) } } } else { - ASSERT(0); + ASSERT(0 && "dup rows not allowed"); } if (pBDataW->nRow >= pCommitter->maxRow) { @@ -1679,4 +1679,4 @@ _exit: tsdbInfo("vgId:%d, tsdb rollback commit", TD_VID(pTsdb->pVnode)); } return code; -} \ No newline at end of file +} diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 5c8c166833..4abbeb61b4 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -178,6 +178,13 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp return -1; } + if (version <= pVnode->state.applied) { + vError("vgId:%d, duplicate write request. version: %" PRId64 ", applied: %" PRId64 "", TD_VID(pVnode), version, + pVnode->state.applied); + pRsp->info.handle = NULL; + return -1; + } + vDebug("vgId:%d, start to process write request %s, index:%" PRId64, TD_VID(pVnode), TMSG_INFO(pMsg->msgType), version); diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index c67ee41b12..6837dd1341 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -307,10 +307,10 @@ static void vnodeSyncApplyMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const S rpcMsg.info.conn.applyTerm = pMeta->term; const STraceId *trace = &pMsg->info.traceId; - vGInfo("vgId:%d, commit-cb is excuted, fsm:%p, index:%" PRId64 ", term:%" PRIu64 ", msg-index:%" PRId64 - ", weak:%d, code:%d, state:%d %s, type:%s", - pVnode->config.vgId, pFsm, pMeta->index, pMeta->term, rpcMsg.info.conn.applyIndex, pMeta->isWeak, - pMeta->code, pMeta->state, syncStr(pMeta->state), TMSG_INFO(pMsg->msgType)); + vGTrace("vgId:%d, commit-cb is excuted, fsm:%p, index:%" PRId64 ", term:%" PRIu64 ", msg-index:%" PRId64 + ", weak:%d, code:%d, state:%d %s, type:%s", + pVnode->config.vgId, pFsm, pMeta->index, pMeta->term, rpcMsg.info.conn.applyIndex, pMeta->isWeak, + pMeta->code, pMeta->state, syncStr(pMeta->state), TMSG_INFO(pMsg->msgType)); tmsgPutToQueue(&pVnode->msgCb, APPLY_QUEUE, &rpcMsg); } else { diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c index f2bdf6be70..9634f4ee26 100644 --- a/source/libs/sync/src/syncAppendEntries.c +++ b/source/libs/sync/src/syncAppendEntries.c @@ -195,9 +195,9 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, const SRpcMsg* pRpcMsg) { goto _IGNORE; } - sInfo("vgId:%d, recv append entries msg. index:%" PRId64 ", term:%" PRId64 ", preLogIndex:%" PRId64 - ", prevLogTerm:%" PRId64 " commitIndex:%" PRId64 "", - pMsg->vgId, pMsg->prevLogIndex + 1, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->commitIndex); + sTrace("vgId:%d, recv append entries msg. index:%" PRId64 ", term:%" PRId64 ", preLogIndex:%" PRId64 + ", prevLogTerm:%" PRId64 " commitIndex:%" PRId64 "", + pMsg->vgId, pMsg->prevLogIndex + 1, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->commitIndex); // accept if (syncLogBufferAccept(ths->pLogBuf, ths, pEntry, pMsg->prevLogTerm) < 0) { diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index ad388e193a..32e424666b 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -64,8 +64,8 @@ int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) { ASSERT(pMsg->term == ths->pRaftStore->currentTerm); - sInfo("vgId:%d received append entries reply. srcId:0x%016" PRIx64 ", term:%" PRId64 ", matchIndex:%" PRId64 "", - pMsg->vgId, pMsg->srcId.addr, pMsg->term, pMsg->matchIndex); + sTrace("vgId:%d received append entries reply. srcId:0x%016" PRIx64 ", term:%" PRId64 ", matchIndex:%" PRId64 "", + pMsg->vgId, pMsg->srcId.addr, pMsg->term, pMsg->matchIndex); if (pMsg->success) { SyncIndex oldMatchIndex = syncIndexMgrGetIndex(ths->pMatchIndex, &(pMsg->srcId)); diff --git a/source/libs/sync/src/syncCommit.c b/source/libs/sync/src/syncCommit.c index fc7ea7cc30..5d4298552d 100644 --- a/source/libs/sync/src/syncCommit.c +++ b/source/libs/sync/src/syncCommit.c @@ -324,8 +324,8 @@ int64_t syncNodeCheckCommitIndex(SSyncNode* ths, SyncIndex indexLikely) { if (indexLikely > ths->commitIndex && syncNodeAgreedUpon(ths, indexLikely)) { SyncIndex commitIndex = indexLikely; syncNodeUpdateCommitIndex(ths, commitIndex); - sInfo("vgId:%d, agreed upon. role:%d, term:%" PRId64 ", index: %" PRId64 "", ths->vgId, ths->state, - ths->pRaftStore->currentTerm, commitIndex); + sTrace("vgId:%d, agreed upon. role:%d, term:%" PRId64 ", index: %" PRId64 "", ths->vgId, ths->state, + ths->pRaftStore->currentTerm, commitIndex); } return ths->commitIndex; } diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index c95a3aba62..8177f3b6db 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -595,7 +595,7 @@ void syncGetRetryEpSet(int64_t rid, SEpSet* pEpSet) { tstrncpy(pEp->fqdn, pSyncNode->pRaftCfg->cfg.nodeInfo[i].nodeFqdn, TSDB_FQDN_LEN); pEp->port = (pSyncNode->pRaftCfg->cfg.nodeInfo)[i].nodePort; pEpSet->numOfEps++; - sInfo("vgId:%d, sync get retry epset, index:%d %s:%d", pSyncNode->vgId, i, pEp->fqdn, pEp->port); + sDebug("vgId:%d, sync get retry epset, index:%d %s:%d", pSyncNode->vgId, i, pEp->fqdn, pEp->port); } if (pEpSet->numOfEps > 0) { pEpSet->inUse = (pSyncNode->pRaftCfg->cfg.myIndex + 1) % pEpSet->numOfEps; @@ -1028,6 +1028,12 @@ int32_t syncNodeRestore(SSyncNode* pSyncNode) { SyncIndex lastVer = pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore); SyncIndex commitIndex = pSyncNode->pLogStore->syncLogCommitIndex(pSyncNode->pLogStore); SyncIndex endIndex = pSyncNode->pLogBuf->endIndex; + if (lastVer != -1 && endIndex != lastVer + 1) { + terrno = TSDB_CODE_WAL_LOG_INCOMPLETE; + sError("vgId:%d, failed to restore sync node since %s. expected lastLogIndex: %" PRId64 ", lastVer: %" PRId64 "", + pSyncNode->vgId, terrstr(), endIndex - 1, lastVer); + return -1; + } ASSERT(endIndex == lastVer + 1); commitIndex = TMAX(pSyncNode->commitIndex, commitIndex); @@ -2141,10 +2147,10 @@ int32_t syncNodeAppend(SSyncNode* ths, SSyncRaftEntry* pEntry) { // proceed match index, with replicating on needed SyncIndex matchIndex = syncLogBufferProceed(ths->pLogBuf, ths); - sInfo("vgId:%d, append raft entry. index: %" PRId64 ", term: %" PRId64 " pBuf: [%" PRId64 " %" PRId64 " %" PRId64 - ", %" PRId64 ")", - ths->vgId, pEntry->index, pEntry->term, ths->pLogBuf->startIndex, ths->pLogBuf->commitIndex, - ths->pLogBuf->matchIndex, ths->pLogBuf->endIndex); + sDebug("vgId:%d, append raft entry. index: %" PRId64 ", term: %" PRId64 " pBuf: [%" PRId64 " %" PRId64 " %" PRId64 + ", %" PRId64 ")", + ths->vgId, pEntry->index, pEntry->term, ths->pLogBuf->startIndex, ths->pLogBuf->commitIndex, + ths->pLogBuf->matchIndex, ths->pLogBuf->endIndex); // multi replica if (ths->replicaNum > 1) { @@ -2300,6 +2306,26 @@ int32_t syncNodeOnLocalCmd(SSyncNode* ths, const SRpcMsg* pRpcMsg) { SyncLocalCmd* pMsg = pRpcMsg->pCont; syncLogRecvLocalCmd(ths, pMsg, ""); + if (pMsg->cmd == SYNC_LOCAL_CMD_STEP_DOWN) { + syncNodeStepDown(ths, pMsg->sdNewTerm); + + } else if (pMsg->cmd == SYNC_LOCAL_CMD_FOLLOWER_CMT) { + (void)syncNodeUpdateCommitIndex(ths, pMsg->fcIndex); + if (syncLogBufferCommit(ths->pLogBuf, ths, ths->commitIndex) < 0) { + sError("vgId:%d, failed to commit raft log since %s. commit index: %" PRId64 "", ths->vgId, terrstr(), + ths->commitIndex); + } + } else { + sError("error local cmd"); + } + + return 0; +} + +int32_t syncNodeOnLocalCmdOld(SSyncNode* ths, const SRpcMsg* pRpcMsg) { + SyncLocalCmd* pMsg = pRpcMsg->pCont; + syncLogRecvLocalCmd(ths, pMsg, ""); + if (pMsg->cmd == SYNC_LOCAL_CMD_STEP_DOWN) { syncNodeStepDown(ths, pMsg->sdNewTerm); @@ -2535,11 +2561,11 @@ int32_t syncNodeUpdateNewConfigIndex(SSyncNode* ths, SSyncCfg* pNewCfg) { } bool syncNodeIsOptimizedOneReplica(SSyncNode* ths, SRpcMsg* pMsg) { - // return false; return (ths->replicaNum == 1 && syncUtilUserCommit(pMsg->msgType) && ths->vgId != 1); } int32_t syncNodeDoCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endIndex, uint64_t flag) { + ASSERT(false); if (beginIndex > endIndex) { return 0; } diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 501efa8782..656b32bd7b 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -163,7 +163,6 @@ int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { if (pLogStore->syncLogGetEntry(pLogStore, index, &pEntry) < 0) { sError("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); - ASSERT(0); break; } @@ -334,7 +333,7 @@ int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode) { SyncTerm prevLogTerm = pBufEntry->prevLogTerm; SSyncRaftEntry* pEntry = pBufEntry->pItem; if (pEntry == NULL) { - sDebug("vgId:%d, cannot proceed match index in log buffer. no raft entry at next pos of matchIndex:%" PRId64, + sTrace("vgId:%d, cannot proceed match index in log buffer. no raft entry at next pos of matchIndex:%" PRId64, pNode->vgId, pBuf->matchIndex); goto _out; } @@ -361,8 +360,8 @@ int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode) { // increase match index pBuf->matchIndex = index; - sInfo("vgId:%d, log buffer proceed. start index: %" PRId64 ", match index: %" PRId64 ", end index: %" PRId64, - pNode->vgId, pBuf->startIndex, pBuf->matchIndex, pBuf->endIndex); + sTrace("vgId:%d, log buffer proceed. start index: %" PRId64 ", match index: %" PRId64 ", end index: %" PRId64, + pNode->vgId, pBuf->startIndex, pBuf->matchIndex, pBuf->endIndex); // replicate on demand (void)syncNodeReplicate(pNode); @@ -390,6 +389,10 @@ _out: int32_t syncLogFsmExecute(SSyncNode* pNode, SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncRaftEntry* pEntry) { ASSERT(pFsm->FpCommitCb != NULL && "No commit cb registered for the FSM"); + if ((pNode->replicaNum == 1) && pNode->restoreFinish && pNode->vgId != 1) { + return 0; + } + SRpcMsg rpcMsg; syncEntry2OriginalRpc(pEntry, &rpcMsg); @@ -439,7 +442,7 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm goto _out; } - sDebug("vgId:%d, log buffer info. role: %d, term: %" PRId64 ". start index:%" PRId64 ", commit index:%" PRId64 + sTrace("vgId:%d, log buffer info. role: %d, term: %" PRId64 ". start index:%" PRId64 ", commit index:%" PRId64 ", match index: %" PRId64 ", end index:%" PRId64 "", pNode->vgId, role, term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); @@ -470,7 +473,7 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm } pBuf->commitIndex = index; - sDebug("vgId:%d, committed index: %" PRId64 ", term: %" PRId64 ", role: %d, current term: %" PRId64 "", pNode->vgId, + sTrace("vgId:%d, committed index: %" PRId64 ", term: %" PRId64 ", role: %d, current term: %" PRId64 "", pNode->vgId, pEntry->index, pEntry->term, role, term); if (!inBuf) { @@ -480,8 +483,7 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm } // recycle - SyncIndex used = pBuf->endIndex - pBuf->startIndex; - SyncIndex until = pBuf->commitIndex - (pBuf->size - used) / 2; + SyncIndex until = pBuf->commitIndex - (pBuf->size >> 4); for (SyncIndex index = pBuf->startIndex; index < until; index++) { SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; ASSERT(pEntry != NULL); @@ -687,7 +689,7 @@ int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode } SSyncLogBuffer* pBuf = pNode->pLogBuf; - sDebug("vgId:%d, attempted to probe the %d'th peer with msg of index:%" PRId64 " term: %" PRId64 + sTrace("vgId:%d, attempted to probe the %d'th peer with msg of index:%" PRId64 " term: %" PRId64 ". pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pMgr->peerId, index, term, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, @@ -733,7 +735,7 @@ int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* p } SSyncLogBuffer* pBuf = pNode->pLogBuf; - sDebug("vgId:%d, attempted to replicate %d msgs to the %d'th peer. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 + sTrace("vgId:%d, attempted to replicate %d msgs to the %d'th peer. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, count, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); @@ -920,8 +922,8 @@ int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn (void)syncNodeSendAppendEntries(pNode, pDestId, &msgOut); ret = 0; - sInfo("vgId:%d, replicate one msg index: %" PRId64 " term: %" PRId64 " prevterm: %" PRId64 " to dest: 0x%016" PRIx64, - pNode->vgId, pEntry->index, pEntry->term, prevLogTerm, pDestId->addr); + sTrace("vgId:%d, replicate one msg index: %" PRId64 " term: %" PRId64 " prevterm: %" PRId64 " to dest: 0x%016" PRIx64, + pNode->vgId, pEntry->index, pEntry->term, prevLogTerm, pDestId->addr); if (!inBuf) { syncEntryDestroy(pEntry); diff --git a/source/libs/transport/src/transSvr.c b/source/libs/transport/src/transSvr.c index 5f36d91023..ef59b54124 100644 --- a/source/libs/transport/src/transSvr.c +++ b/source/libs/transport/src/transSvr.c @@ -1246,6 +1246,7 @@ _return2: tTrace("handle %p failed to send to release handle", exh); return -1; } + int transSendResponse(const STransMsg* msg) { if (msg->info.noResp) { rpcFreeCont(msg->pCont); From 8ef5ca78eec2135e713afb0b9ba6ccd14ce9948c Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Tue, 22 Nov 2022 10:54:32 +0800 Subject: [PATCH 016/105] fix: protect syncNodeReplicate with mutex lock --- source/libs/sync/inc/syncPipeline.h | 2 +- source/libs/sync/inc/syncReplication.h | 1 + source/libs/sync/src/syncAppendEntriesReply.c | 8 +++++--- source/libs/sync/src/syncPipeline.c | 15 +++++++-------- source/libs/sync/src/syncReplication.c | 10 +++++++++- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/source/libs/sync/inc/syncPipeline.h b/source/libs/sync/inc/syncPipeline.h index 666515078a..d8697da64b 100644 --- a/source/libs/sync/inc/syncPipeline.h +++ b/source/libs/sync/inc/syncPipeline.h @@ -82,10 +82,10 @@ static FORCE_INLINE int32_t syncLogReplMgrUpdateTerm(SSyncLogReplMgr* pMgr, Sync } SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index); +int32_t syncLogReplMgrReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm, SRaftId* pDestId, bool* pBarrier); int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); -int32_t syncLogBufferReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); diff --git a/source/libs/sync/inc/syncReplication.h b/source/libs/sync/inc/syncReplication.h index f077306475..f2e240344f 100644 --- a/source/libs/sync/inc/syncReplication.h +++ b/source/libs/sync/inc/syncReplication.h @@ -52,6 +52,7 @@ int32_t syncNodeSendHeartbeat(SSyncNode* pSyncNode, const SRaftId* pDestId, SRpc int32_t syncNodeReplicate(SSyncNode* pSyncNode); int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId, bool snapshot); +int32_t syncNodeReplicateWithoutLock(SSyncNode* pNode); int32_t syncNodeSendAppendEntries(SSyncNode* pNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg); int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg); diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index 32e424666b..ed38ea9559 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -81,10 +81,12 @@ int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) { // replicate log SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(ths, &pMsg->srcId); - // ASSERT(pMgr != NULL); - if (pMgr != NULL) { - (void)syncLogReplMgrProcessReply(pMgr, ths, pMsg); + if (pMgr == NULL) { + sError("vgId:%d, failed to get log repl mgr for src addr: 0x%016" PRIx64, ths->vgId, pMsg->srcId.addr); + return -1; } + ASSERT(pMgr != NULL); + (void)syncLogReplMgrProcessReply(pMgr, ths, pMsg); } return 0; } diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 656b32bd7b..199ef289f3 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -234,10 +234,10 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt SyncTerm lastMatchTerm = syncLogBufferGetLastMatchTerm(pBuf); if (index <= pBuf->commitIndex) { - sInfo("vgId:%d, raft entry already committed. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 - " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, - pBuf->endIndex); + sTrace("vgId:%d, raft entry already committed. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, + pBuf->endIndex); ret = 0; goto _out; } @@ -364,7 +364,7 @@ int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode) { pNode->vgId, pBuf->startIndex, pBuf->matchIndex, pBuf->endIndex); // replicate on demand - (void)syncNodeReplicate(pNode); + (void)syncNodeReplicateWithoutLock(pNode); // persist if (syncLogStorePersist(pLogStore, pEntry) < 0) { @@ -393,7 +393,7 @@ int32_t syncLogFsmExecute(SSyncNode* pNode, SSyncFSM* pFsm, ESyncState role, Syn return 0; } - SRpcMsg rpcMsg; + SRpcMsg rpcMsg = {0}; syncEntry2OriginalRpc(pEntry, &rpcMsg); SFsmCbMeta cbMeta = {0}; @@ -666,8 +666,7 @@ int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Sync return 0; } -int32_t syncLogBufferReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { - SSyncLogBuffer* pBuf = pNode->pLogBuf; +int32_t syncLogReplMgrReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { if (pMgr->restored) { (void)syncLogReplMgrReplicateAttemptedOnce(pMgr, pNode); } else { diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c index d4a046b7ae..2623eebc23 100644 --- a/source/libs/sync/src/syncReplication.c +++ b/source/libs/sync/src/syncReplication.c @@ -135,6 +135,14 @@ int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId, bool snapsh } int32_t syncNodeReplicate(SSyncNode* pNode) { + SSyncLogBuffer* pBuf = pNode->pLogBuf; + taosThreadMutexLock(&pBuf->mutex); + int32_t ret = syncNodeReplicateWithoutLock(pNode); + taosThreadMutexUnlock(&pBuf->mutex); + return ret; +} + +int32_t syncNodeReplicateWithoutLock(SSyncNode* pNode) { if (pNode->state != TAOS_SYNC_STATE_LEADER || pNode->replicaNum == 1) { return -1; } @@ -143,7 +151,7 @@ int32_t syncNodeReplicate(SSyncNode* pNode) { continue; } SSyncLogReplMgr* pMgr = pNode->logReplMgrs[i]; - (void)syncLogBufferReplicateOnce(pMgr, pNode); + (void)syncLogReplMgrReplicateOnce(pMgr, pNode); } return 0; } From b80095dc870547ff30cecc16e471e88ec173c338 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Tue, 22 Nov 2022 22:24:20 +0800 Subject: [PATCH 017/105] enh: snapshot during recovery of SSynclogReplMgr --- source/libs/sync/src/syncPipeline.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 199ef289f3..3dbca1210d 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -610,6 +610,15 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod (void)syncLogReplMgrReset(pMgr); } + // check existence of WAl log + SyncIndex firstVer = pNode->pLogStore->syncLogBeginIndex(pNode->pLogStore); + if (pMsg->matchIndex < firstVer) { + if (syncNodeStartSnapshot(pNode, &destId) < 0) { + sError("vgId:%d, failed to start snapshot for dest: 0x%016" PRIx64, pNode->vgId, destId.addr); + } + return 0; + } + // send match index SyncIndex index = TMIN(pMsg->matchIndex, pNode->pLogBuf->matchIndex); bool barrier = false; @@ -901,6 +910,13 @@ int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn pEntry = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf); if (pEntry == NULL) { sError("vgId:%d, failed to get raft entry for index: %" PRId64 "", pNode->vgId, index); + if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) { + SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(pNode, pDestId); + if (pMgr) { + sInfo("vgId:%d, reset log repl mgr for dest: 0x%016" PRIx64, pNode->vgId, pDestId->addr); + (void)syncLogReplMgrReset(pMgr); + } + } goto _err; } *pBarrier = syncLogIsReplicationBarrier(pEntry); From 95f8e96eb50ec251f838070e83050de6747cf259 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Tue, 22 Nov 2022 23:41:58 +0800 Subject: [PATCH 018/105] fix: align firstVer with lastVer too if no WAL logs exist --- source/libs/wal/src/walMeta.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/libs/wal/src/walMeta.c b/source/libs/wal/src/walMeta.c index 6cac4b6093..d77acbbb6f 100644 --- a/source/libs/wal/src/walMeta.c +++ b/source/libs/wal/src/walMeta.c @@ -285,6 +285,9 @@ void walAlignVersions(SWal* pWal) { if (pWal->vers.lastVer < pWal->vers.snapshotVer) { wWarn("vgId:%d, lastVer:%" PRId64 " is less than snapshotVer:%" PRId64 ". align with it.", pWal->cfg.vgId, pWal->vers.lastVer, pWal->vers.snapshotVer); + if (pWal->vers.lastVer < pWal->vers.firstVer) { + pWal->vers.firstVer = pWal->vers.snapshotVer + 1; + } pWal->vers.lastVer = pWal->vers.snapshotVer; } if (pWal->vers.commitVer < pWal->vers.snapshotVer) { From 006e13e6638475a7f34662fe3aee437865f69684 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Wed, 23 Nov 2022 10:24:17 +0800 Subject: [PATCH 019/105] enh: validate alignment of WAL and tsdb commit during syncLogBufferInit --- source/libs/sync/src/syncPipeline.c | 28 ++++++++++++++++++++++------ source/libs/sync/src/syncUtil.c | 7 ++++--- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 3dbca1210d..a31812e51e 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -119,6 +119,26 @@ SSyncRaftEntry* syncEntryBuildDummy(SyncTerm term, SyncIndex index, int32_t vgId return syncEntryBuildNoop(term, index, vgId); } +int32_t syncLogValidateAlignmentOfCommit(SSyncNode* pNode, SyncIndex commitIndex) { + SyncIndex firstVer = pNode->pLogStore->syncLogBeginIndex(pNode->pLogStore); + if (firstVer > commitIndex + 1) { + sError("vgId:%d, firstVer of WAL log greater than tsdb commit version + 1. firstVer: %" PRId64 + ", tsdb commit version: %" PRId64 "", + pNode->vgId, firstVer, commitIndex); + return -1; + } + + SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); + if (lastVer < commitIndex) { + sError("vgId:%d, lastVer of WAL log less than tsdb commit version. lastVer: %" PRId64 + ", tsdb commit version: %" PRId64 "", + pNode->vgId, lastVer, commitIndex); + return -1; + } + + return 0; +} + int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { taosThreadMutexLock(&pBuf->mutex); ASSERT(pNode->pLogStore != NULL && "log store not created"); @@ -132,16 +152,12 @@ int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { } SyncIndex commitIndex = snapshot.lastApplyIndex; SyncTerm commitTerm = snapshot.lastApplyTerm; - - SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); - if (lastVer < commitIndex) { - sError("vgId:%d, lastVer of WAL log less than tsdb commit version. lastVer: %" PRId64 - ", tsdb commit version: %" PRId64 "", - pNode->vgId, lastVer, commitIndex); + if (syncLogValidateAlignmentOfCommit(pNode, commitIndex)) { terrno = TSDB_CODE_WAL_LOG_INCOMPLETE; goto _err; } + SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); ASSERT(lastVer >= commitIndex); SyncIndex toIndex = lastVer; // update match index diff --git a/source/libs/sync/src/syncUtil.c b/source/libs/sync/src/syncUtil.c index b50336cd63..97de188253 100644 --- a/source/libs/sync/src/syncUtil.c +++ b/source/libs/sync/src/syncUtil.c @@ -238,9 +238,10 @@ void syncPrintNodeLog(const char* flags, ELogLevel level, int32_t dflag, SSyncNo taosPrintLog(flags, level, dflag, "vgId:%d, sync %s " "%s" - ", tm:%" PRIu64 ", cmt:%" PRId64 ", fst:%" PRId64 ", lst:%" PRId64 ", min:%" PRId64 ", snap:%" PRId64 - ", snap-tm:%" PRIu64 ", sby:%d, aq:%d, bch:%d, r-num:%d, lcfg:%" PRId64 - ", chging:%d, rsto:%d, dquorum:%d, elt:%" PRId64 ", hb:%" PRId64 ", %s, %s", + ", term:%" PRIu64 ", commitIdx:%" PRId64 ", firstVer:%" PRId64 ", lastVer:%" PRId64 ", min:%" PRId64 + ", snap.lastApply:%" PRId64 ", snap.term:%" PRIu64 + ", standby:%d, aqItems:%d, batchSz:%d, replicaNum:%d, lastCfgIdx:%" PRId64 + ", changing:%d, restore:%d, quorum:%d, electTimer:%" PRId64 ", hb:%" PRId64 ", %s, %s", pNode->vgId, syncStr(pNode->state), eventLog, currentTerm, pNode->commitIndex, logBeginIndex, logLastIndex, pNode->minMatchIndex, snapshot.lastApplyIndex, snapshot.lastApplyTerm, pNode->pRaftCfg->isStandBy, aqItems, pNode->pRaftCfg->batchSize, pNode->replicaNum, From f68e41a40e12d0554bbbab2344894193b7848bf0 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Wed, 23 Nov 2022 15:57:40 +0800 Subject: [PATCH 020/105] enh: initialize log buffer again after receiving a complete snapshot --- source/libs/sync/inc/syncPipeline.h | 5 +++-- source/libs/sync/src/syncMain.c | 25 +++++++++++++++++++++ source/libs/sync/src/syncPipeline.c | 35 ++++++++++++++++++++++++----- source/libs/sync/src/syncSnapshot.c | 12 +++++++++- source/libs/wal/src/walWrite.c | 2 +- 5 files changed, 69 insertions(+), 10 deletions(-) diff --git a/source/libs/sync/inc/syncPipeline.h b/source/libs/sync/inc/syncPipeline.h index d8697da64b..9a68b1e0c8 100644 --- a/source/libs/sync/inc/syncPipeline.h +++ b/source/libs/sync/inc/syncPipeline.h @@ -89,14 +89,15 @@ int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); -int32_t syncLogReplMgrProcessReplyInNormalMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); -int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode); +int32_t syncLogReplMgrProcessReplyInNormalMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg); +int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode); // SSyncLogBuffer SSyncLogBuffer* syncLogBufferCreate(); void syncLogBufferDestroy(SSyncLogBuffer* pBuf); int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode); +int32_t syncLogBufferReInit(SSyncLogBuffer* pBuf, SSyncNode* pNode); // access int64_t syncLogBufferGetEndIndex(SSyncLogBuffer* pBuf); diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 8177f3b6db..a4c0022d98 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -704,6 +704,28 @@ static int32_t syncHbTimerStop(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer) { return ret; } +int32_t syncNodeLogStoreRestoreOnNeed(SSyncNode* pNode) { + ASSERT(pNode->pLogStore != NULL && "log store not created"); + ASSERT(pNode->pFsm != NULL && "pFsm not registered"); + ASSERT(pNode->pFsm->FpGetSnapshotInfo != NULL && "FpGetSnapshotInfo not registered"); + SSnapshot snapshot; + if (pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot) < 0) { + sError("vgId:%d, failed to get snapshot info since %s", pNode->vgId, terrstr()); + return -1; + } + SyncIndex commitIndex = snapshot.lastApplyIndex; + SyncIndex firstVer = pNode->pLogStore->syncLogBeginIndex(pNode->pLogStore); + SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); + if (lastVer < commitIndex || firstVer > commitIndex + 1) { + if (pNode->pLogStore->syncLogRestoreFromSnapshot(pNode->pLogStore, commitIndex)) { + sError("vgId:%d, failed to restore log store from snapshot since %s. lastVer: %" PRId64 ", snapshotVer: %" PRId64, + pNode->vgId, terrstr(), lastVer, commitIndex); + return -1; + } + } + return 0; +} + // open/close -------------- SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) { SSyncNode* pSyncNode = taosMemoryCalloc(1, sizeof(SSyncNode)); @@ -912,6 +934,9 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) { } pSyncNode->commitIndex = commitIndex; + if (syncNodeLogStoreRestoreOnNeed(pSyncNode) < 0) { + goto _error; + } // timer ms init pSyncNode->pingBaseLine = PING_TIMER_MS; pSyncNode->electBaseLine = ELECT_TIMER_MS_MIN; diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index a31812e51e..71ac5d1464 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -139,8 +139,7 @@ int32_t syncLogValidateAlignmentOfCommit(SSyncNode* pNode, SyncIndex commitIndex return 0; } -int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { - taosThreadMutexLock(&pBuf->mutex); +int32_t syncLogBufferInitWithoutLock(SSyncLogBuffer* pBuf, SSyncNode* pNode) { ASSERT(pNode->pLogStore != NULL && "log store not created"); ASSERT(pNode->pFsm != NULL && "pFsm not registered"); ASSERT(pNode->pFsm->FpGetSnapshotInfo != NULL && "FpGetSnapshotInfo not registered"); @@ -226,14 +225,37 @@ int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { // validate syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); return 0; _err: - taosThreadMutexUnlock(&pBuf->mutex); return -1; } +int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { + taosThreadMutexLock(&pBuf->mutex); + int32_t ret = syncLogBufferInitWithoutLock(pBuf, pNode); + taosThreadMutexUnlock(&pBuf->mutex); + return ret; +} + +int32_t syncLogBufferReInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { + taosThreadMutexLock(&pBuf->mutex); + for (SyncIndex index = pBuf->startIndex; index < pBuf->endIndex; index++) { + SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; + if (pEntry == NULL) continue; + syncEntryDestroy(pEntry); + pEntry = NULL; + memset(&pBuf->entries[(index + pBuf->size) % pBuf->size], 0, sizeof(pBuf->entries[0])); + } + pBuf->startIndex = pBuf->commitIndex = pBuf->matchIndex = pBuf->endIndex = 0; + int32_t ret = syncLogBufferInitWithoutLock(pBuf, pNode); + if (ret < 0) { + sError("vgId:%d, failed to re-initialize sync log buffer since %s.", pNode->vgId, terrstr()); + } + taosThreadMutexUnlock(&pBuf->mutex); + return ret; +} + FORCE_INLINE SyncTerm syncLogBufferGetLastMatchTerm(SSyncLogBuffer* pBuf) { SyncIndex index = pBuf->matchIndex; SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; @@ -628,7 +650,7 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod // check existence of WAl log SyncIndex firstVer = pNode->pLogStore->syncLogBeginIndex(pNode->pLogStore); - if (pMsg->matchIndex < firstVer) { + if (pMsg->matchIndex + 1 < firstVer) { if (syncNodeStartSnapshot(pNode, &destId) < 0) { sError("vgId:%d, failed to start snapshot for dest: 0x%016" PRIx64, pNode->vgId, destId.addr); } @@ -929,7 +951,8 @@ int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) { SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(pNode, pDestId); if (pMgr) { - sInfo("vgId:%d, reset log repl mgr for dest: 0x%016" PRIx64, pNode->vgId, pDestId->addr); + sInfo("vgId:%d, reset sync log repl mgr for peer: 0x%016" PRIx64 " since %s. index: %" PRId64, pNode->vgId, + pDestId->addr, terrstr(), index); (void)syncLogReplMgrReset(pMgr); } } diff --git a/source/libs/sync/src/syncSnapshot.c b/source/libs/sync/src/syncSnapshot.c index 222b7c4e1e..1035925c2b 100644 --- a/source/libs/sync/src/syncSnapshot.c +++ b/source/libs/sync/src/syncSnapshot.c @@ -16,6 +16,7 @@ #define _DEFAULT_SOURCE #include "syncSnapshot.h" #include "syncIndexMgr.h" +#include "syncPipeline.h" #include "syncRaftCfg.h" #include "syncRaftLog.h" #include "syncRaftStore.h" @@ -273,6 +274,11 @@ int32_t syncNodeStartSnapshot(SSyncNode *pSyncNode, SRaftId *pDestId) { return 1; } + char host[64]; + uint16_t port; + syncUtilU642Addr(pDestId->addr, host, sizeof(host), &port); + sInfo("vgId:%d, start snapshot for peer: %s:%d", pSyncNode->vgId, host, port); + code = snapshotSenderStart(pSender); if (code != 0) { sNError(pSyncNode, "snapshot sender start error"); @@ -372,7 +378,10 @@ int32_t snapshotReceiverStartWriter(SSyncSnapshotReceiver *pReceiver, SyncSnapsh } int32_t snapshotReceiverStart(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pPreMsg) { - ASSERT(!snapshotReceiverIsStart(pReceiver)); + if (snapshotReceiverIsStart(pReceiver)) { + sWarn("vgId:%d, snapshot receiver has started.", pReceiver->pSyncNode->vgId); + return 0; + } pReceiver->start = true; pReceiver->ack = SYNC_SNAPSHOT_SEQ_PRE_SNAPSHOT; @@ -738,6 +747,7 @@ int32_t syncNodeOnSnapshot(SSyncNode *pSyncNode, const SRpcMsg *pRpcMsg) { } else if (pMsg->seq == SYNC_SNAPSHOT_SEQ_END) { syncNodeOnSnapshotEnd(pSyncNode, pMsg); + (void)syncLogBufferReInit(pSyncNode->pLogBuf, pSyncNode); } else if (pMsg->seq == SYNC_SNAPSHOT_SEQ_FORCE_CLOSE) { // force close, no response diff --git a/source/libs/wal/src/walWrite.c b/source/libs/wal/src/walWrite.c index 10fb2ee97e..4a1b2d1444 100644 --- a/source/libs/wal/src/walWrite.c +++ b/source/libs/wal/src/walWrite.c @@ -70,7 +70,7 @@ int32_t walRestoreFromSnapshot(SWal *pWal, int64_t ver) { pWal->lastRollSeq = -1; taosArrayClear(pWal->fileInfoSet); - pWal->vers.firstVer = -1; + pWal->vers.firstVer = ver + 1; pWal->vers.lastVer = ver; pWal->vers.commitVer = ver; pWal->vers.snapshotVer = ver; From 2e640e8e68c2aae790dbe69f50237b7dffc1955e Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Thu, 24 Nov 2022 10:25:06 +0800 Subject: [PATCH 021/105] feat: start snapshot in recovery mode of sync repl mgr with lastMatchTerm in reply msg --- source/libs/sync/inc/syncMessage.h | 2 +- source/libs/sync/inc/syncPipeline.h | 2 +- source/libs/sync/src/syncAppendEntries.c | 2 +- source/libs/sync/src/syncMain.c | 2 +- source/libs/sync/src/syncPipeline.c | 60 +++++++++++++++--------- source/libs/sync/src/syncUtil.c | 4 +- 6 files changed, 45 insertions(+), 27 deletions(-) diff --git a/source/libs/sync/inc/syncMessage.h b/source/libs/sync/inc/syncMessage.h index c5fdc27426..2af2e7b5cd 100644 --- a/source/libs/sync/inc/syncMessage.h +++ b/source/libs/sync/inc/syncMessage.h @@ -105,7 +105,7 @@ typedef struct SyncAppendEntriesReply { SRaftId destId; // private data SyncTerm term; - SyncTerm privateTerm; + SyncTerm lastMatchTerm; bool success; SyncIndex matchIndex; SyncIndex lastSendIndex; diff --git a/source/libs/sync/inc/syncPipeline.h b/source/libs/sync/inc/syncPipeline.h index 9a68b1e0c8..ca07876def 100644 --- a/source/libs/sync/inc/syncPipeline.h +++ b/source/libs/sync/inc/syncPipeline.h @@ -103,7 +103,7 @@ int32_t syncLogBufferReInit(SSyncLogBuffer* pBuf, SSyncNode* pNode); int64_t syncLogBufferGetEndIndex(SSyncLogBuffer* pBuf); int32_t syncLogBufferAppend(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry); int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevTerm); -int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode); +int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncTerm* pMatchTerm); int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t commitIndex); int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode); diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c index 9634f4ee26..d719169470 100644 --- a/source/libs/sync/src/syncAppendEntries.c +++ b/source/libs/sync/src/syncAppendEntries.c @@ -206,7 +206,7 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, const SRpcMsg* pRpcMsg) { accepted = true; _SEND_RESPONSE: - pReply->matchIndex = syncLogBufferProceed(ths->pLogBuf, ths); + pReply->matchIndex = syncLogBufferProceed(ths->pLogBuf, ths, &pReply->lastMatchTerm); bool matched = (pReply->matchIndex >= pReply->lastSendIndex); if (accepted && matched) { pReply->success = true; diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index a4c0022d98..108b9ab5bd 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -2170,7 +2170,7 @@ int32_t syncNodeAppend(SSyncNode* ths, SSyncRaftEntry* pEntry) { } // proceed match index, with replicating on needed - SyncIndex matchIndex = syncLogBufferProceed(ths->pLogBuf, ths); + SyncIndex matchIndex = syncLogBufferProceed(ths->pLogBuf, ths, NULL); sDebug("vgId:%d, append raft entry. index: %" PRId64 ", term: %" PRId64 " pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 71ac5d1464..a7a983a06e 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -76,17 +76,17 @@ SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, S if (prevIndex == -1) return 0; - if (index - 1 > pBuf->matchIndex) { + if (prevIndex > pBuf->matchIndex) { terrno = TSDB_CODE_WAL_LOG_NOT_EXIST; return -1; } ASSERT(index - 1 == prevIndex); - if (index - 1 >= pBuf->startIndex) { - pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; + if (prevIndex >= pBuf->startIndex) { + pEntry = pBuf->entries[(prevIndex + pBuf->size) % pBuf->size].pItem; ASSERT(pEntry != NULL && "no log entry found"); - prevLogTerm = pBuf->entries[(index + pBuf->size) % pBuf->size].prevLogTerm; + prevLogTerm = pEntry->term; return prevLogTerm; } @@ -354,7 +354,7 @@ int32_t syncLogStorePersist(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) { return 0; } -int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode) { +int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncTerm* pMatchTerm) { taosThreadMutexLock(&pBuf->mutex); syncLogBufferValidate(pBuf); @@ -419,6 +419,9 @@ int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode) { _out: pBuf->matchIndex = matchIndex; + if (pMatchTerm) { + *pMatchTerm = pBuf->entries[(matchIndex + pBuf->size) % pBuf->size].pItem->term; + } syncLogBufferValidate(pBuf); taosThreadMutexUnlock(&pBuf->mutex); return matchIndex; @@ -615,16 +618,16 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod ASSERT(pMgr->restored == false); char host[64]; uint16_t port; - syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); + syncUtilU642Addr(destId.addr, host, sizeof(host), &port); if (pMgr->endIndex == 0) { ASSERT(pMgr->startIndex == 0); ASSERT(pMgr->matchIndex == 0); if (pMsg->matchIndex < 0) { pMgr->restored = true; - sInfo("vgId:%d, sync log repl mgr of peer %s:%d restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 + sInfo("vgId:%d, sync log repl mgr of peer %s:%d (%" PRIx64 ") restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, host, port, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pNode->vgId, host, port, destId.addr, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } @@ -638,9 +641,9 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod if (pMsg->matchIndex == pMsg->lastSendIndex) { pMgr->restored = true; - sInfo("vgId:%d, sync log repl mgr of peer %s:%d restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 + sInfo("vgId:%d, sync log repl mgr of peer %s:%d (%" PRIx64 ") restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, host, port, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, + pNode->vgId, host, port, destId.addr, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } @@ -648,23 +651,38 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod (void)syncLogReplMgrReset(pMgr); } - // check existence of WAl log + // check last match term + SyncTerm term = -1; SyncIndex firstVer = pNode->pLogStore->syncLogBeginIndex(pNode->pLogStore); - if (pMsg->matchIndex + 1 < firstVer) { - if (syncNodeStartSnapshot(pNode, &destId) < 0) { - sError("vgId:%d, failed to start snapshot for dest: 0x%016" PRIx64, pNode->vgId, destId.addr); + SyncIndex index = TMIN(pMsg->matchIndex, pNode->pLogBuf->matchIndex); + + if (pMsg->matchIndex < pNode->pLogBuf->matchIndex) { + term = syncLogReplMgrGetPrevLogTerm(pMgr, pNode, index + 1); + + if (term < 0 || (term != pMsg->lastMatchTerm && (index + 1 == firstVer || index == firstVer))) { + ASSERT(term >= 0 || terrno == TSDB_CODE_WAL_LOG_NOT_EXIST); + if (syncNodeStartSnapshot(pNode, &destId) < 0) { + sError("vgId:%d, failed to start snapshot for peer %s:%d", pNode->vgId, host, port); + } + return 0; + } + + ASSERT(index + 1 >= firstVer); + + if (term == pMsg->lastMatchTerm) { + index = index + 1; + ASSERT(index <= pNode->pLogBuf->matchIndex); + } else { + ASSERT(index > firstVer); } - return 0; } - // send match index - SyncIndex index = TMIN(pMsg->matchIndex, pNode->pLogBuf->matchIndex); - bool barrier = false; - SyncTerm term = -1; + // attempt to replicate the raft log at index + bool barrier = false; ASSERT(index >= 0); if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, &destId, &barrier) < 0) { - sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, - terrstr(), index, destId.addr); + sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", peer %s:%d", pNode->vgId, + terrstr(), index, host, port); return -1; } diff --git a/source/libs/sync/src/syncUtil.c b/source/libs/sync/src/syncUtil.c index 97de188253..181ddffd5b 100644 --- a/source/libs/sync/src/syncUtil.c +++ b/source/libs/sync/src/syncUtil.c @@ -373,7 +373,7 @@ void syncLogSendAppendEntriesReply(SSyncNode* pSyncNode, const SyncAppendEntries sNTrace(pSyncNode, "send sync-append-entries-reply to %s:%d, {term:%" PRId64 ", pterm:%" PRId64 ", success:%d, lsend-index:%" PRId64 ", match:%" PRId64 "}, %s", - host, port, pMsg->term, pMsg->privateTerm, pMsg->success, pMsg->lastSendIndex, pMsg->matchIndex, s); + host, port, pMsg->term, pMsg->lastMatchTerm, pMsg->success, pMsg->lastSendIndex, pMsg->matchIndex, s); } void syncLogRecvAppendEntriesReply(SSyncNode* pSyncNode, const SyncAppendEntriesReply* pMsg, const char* s) { @@ -384,7 +384,7 @@ void syncLogRecvAppendEntriesReply(SSyncNode* pSyncNode, const SyncAppendEntries sNTrace(pSyncNode, "recv sync-append-entries-reply from %s:%d {term:%" PRId64 ", pterm:%" PRId64 ", success:%d, lsend-index:%" PRId64 ", match:%" PRId64 "}, %s", - host, port, pMsg->term, pMsg->privateTerm, pMsg->success, pMsg->lastSendIndex, pMsg->matchIndex, s); + host, port, pMsg->term, pMsg->lastMatchTerm, pMsg->success, pMsg->lastSendIndex, pMsg->matchIndex, s); } void syncLogSendHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, const char* s) { From 22d64b9c0befba2a0c36b6156a293a9d0d393cc3 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Thu, 24 Nov 2022 15:55:31 +0800 Subject: [PATCH 022/105] fix: remove syncNodeReplicateOne from syncNodeOnSnapshotReply --- source/dnode/vnode/src/vnd/vnodeBufPool.c | 3 +++ source/libs/sync/src/syncPipeline.c | 27 ++++++++++++----------- source/libs/sync/src/syncReplication.c | 1 + source/libs/sync/src/syncSnapshot.c | 4 ++-- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/source/dnode/vnode/src/vnd/vnodeBufPool.c b/source/dnode/vnode/src/vnd/vnodeBufPool.c index 71e926bd35..dcc323f778 100644 --- a/source/dnode/vnode/src/vnd/vnodeBufPool.c +++ b/source/dnode/vnode/src/vnd/vnodeBufPool.c @@ -176,6 +176,9 @@ void vnodeBufPoolRef(SVBufPool *pPool) { } void vnodeBufPoolUnRef(SVBufPool *pPool) { + if (pPool == NULL) { + return; + } int32_t nRef = atomic_sub_fetch_32(&pPool->nRef, 1); if (nRef == 0) { SVnode *pVnode = pPool->pVnode; diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index a7a983a06e..891547e80f 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -497,8 +497,8 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm // execute it if (!syncUtilUserCommit(pEntry->originalRpcType)) { - sInfo("vgId:%d, non-user msg in raft log entry. index: %" PRId64 ", term:%" PRId64 "", vgId, pEntry->index, - pEntry->term); + sInfo("vgId:%d, raft mgmt msg in log entry. index: %" PRId64 ", term:%" PRId64 ", type: %s", vgId, pEntry->index, + pEntry->term, TMSG_INFO(pEntry->originalRpcType)); pBuf->commitIndex = index; if (!inBuf) { syncEntryDestroy(pEntry); @@ -539,7 +539,7 @@ _out: if (!pNode->restoreFinish && pBuf->commitIndex >= pNode->commitIndex) { pNode->pFsm->FpRestoreFinishCb(pNode->pFsm); pNode->restoreFinish = true; - sInfo("vgId:%d, restore finished. pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, + sInfo("vgId:%d, restore finished. log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); } @@ -625,8 +625,8 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod ASSERT(pMgr->matchIndex == 0); if (pMsg->matchIndex < 0) { pMgr->restored = true; - sInfo("vgId:%d, sync log repl mgr of peer %s:%d (%" PRIx64 ") restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 - "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + sInfo("vgId:%d, sync log repl mgr restored. peer: %s:%d (%" PRIx64 "), repl mgr(rs:%d): [%" PRId64 " %" PRId64 + ", %" PRId64 "), log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, host, port, destId.addr, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; @@ -641,8 +641,8 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod if (pMsg->matchIndex == pMsg->lastSendIndex) { pMgr->restored = true; - sInfo("vgId:%d, sync log repl mgr of peer %s:%d (%" PRIx64 ") restored. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 - "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + sInfo("vgId:%d, sync log repl mgr restored. peer: %s:%d (%" PRIx64 "), repl mgr(rs:%d): [%" PRId64 " %" PRId64 + ", %" PRId64 "), log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, host, port, destId.addr, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; @@ -663,7 +663,9 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod ASSERT(term >= 0 || terrno == TSDB_CODE_WAL_LOG_NOT_EXIST); if (syncNodeStartSnapshot(pNode, &destId) < 0) { sError("vgId:%d, failed to start snapshot for peer %s:%d", pNode->vgId, host, port); + return -1; } + sInfo("vgId:%d, snapshot replication to peer %s:%d started", pNode->vgId, host, port); return 0; } @@ -702,8 +704,8 @@ int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pN SSyncLogBuffer* pBuf = pNode->pLogBuf; taosThreadMutexLock(&pBuf->mutex); if (pMsg->startTime != 0 && pMsg->startTime != pMgr->peerStartTime) { - sInfo("vgId:%d, reset sync log repl mgr in heartbeat. start time:%" PRId64 ", old start time:%" PRId64 "", - pNode->vgId, pMsg->startTime, pMgr->peerStartTime); + sInfo("vgId:%d, reset sync log repl mgr in heartbeat. peer: %" PRIx64 ", start time:%" PRId64 ", old:%" PRId64 "", + pNode->vgId, pMsg->srcId.addr, pMsg->startTime, pMgr->peerStartTime); syncLogReplMgrReset(pMgr); pMgr->peerStartTime = pMsg->startTime; } @@ -715,9 +717,8 @@ int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Sync SSyncLogBuffer* pBuf = pNode->pLogBuf; taosThreadMutexLock(&pBuf->mutex); if (pMsg->startTime != pMgr->peerStartTime) { - sInfo("vgId:%d, reset sync log repl mgr in append entries reply. start time:%" PRId64 ", old start time:%" PRId64 - "", - pNode->vgId, pMsg->startTime, pMgr->peerStartTime); + sInfo("vgId:%d, reset sync log repl mgr in append entries reply. peer: %" PRIx64 ", start time:%" PRId64 ", old:%" PRId64, + pNode->vgId, pMsg->srcId.addr, pMsg->startTime, pMgr->peerStartTime); syncLogReplMgrReset(pMgr); pMgr->peerStartTime = pMsg->startTime; } @@ -923,7 +924,7 @@ int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode) { (void)syncLogBufferRollback(pBuf, pBuf->matchIndex + 1); - sInfo("vgId:%d, reset log buffer. pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, + sInfo("vgId:%d, reset log buffer. log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); pBuf->endIndex = pBuf->matchIndex + 1; diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c index 2623eebc23..cfa6b5215e 100644 --- a/source/libs/sync/src/syncReplication.c +++ b/source/libs/sync/src/syncReplication.c @@ -49,6 +49,7 @@ int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg); int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId, bool snapshot) { + ASSERT(false && "deplicated"); // next index SyncIndex nextIndex = syncIndexMgrGetIndex(pSyncNode->pNextIndex, pDestId); diff --git a/source/libs/sync/src/syncSnapshot.c b/source/libs/sync/src/syncSnapshot.c index 1035925c2b..4ceb2c9fc9 100644 --- a/source/libs/sync/src/syncSnapshot.c +++ b/source/libs/sync/src/syncSnapshot.c @@ -881,8 +881,8 @@ int32_t syncNodeOnSnapshotReply(SSyncNode *pSyncNode, const SRpcMsg *pRpcMsg) { snapshotSenderStop(pSender, true); // update next-index - syncIndexMgrSetIndex(pSyncNode->pNextIndex, &(pMsg->srcId), pMsg->lastIndex + 1); - syncNodeReplicateOne(pSyncNode, &(pMsg->srcId), false); + // syncIndexMgrSetIndex(pSyncNode->pNextIndex, &(pMsg->srcId), pMsg->lastIndex + 1); + // syncNodeReplicateOne(pSyncNode, &(pMsg->srcId), false); return 0; } From 6729c130f8dafd9117f491c0caa026bbfa575022 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Thu, 24 Nov 2022 16:43:26 +0800 Subject: [PATCH 023/105] fix: leave some free space in log buffer during syncLogBufferInit --- source/libs/sync/src/syncPipeline.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 891547e80f..f5f0ee7c69 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -182,7 +182,8 @@ int32_t syncLogBufferInitWithoutLock(SSyncLogBuffer* pBuf, SSyncNode* pNode) { } bool taken = false; - if (toIndex <= index + pBuf->size - 1) { + int emptySize = 5; + if (toIndex - index + 1 <= pBuf->size - emptySize) { SSyncLogBufEntry tmp = {.pItem = pEntry, .prevLogIndex = -1, .prevLogTerm = -1}; pBuf->entries[index % pBuf->size] = tmp; taken = true; From ff286e1f1c1ad01a7c751b799183629843d4b8e4 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Thu, 24 Nov 2022 18:37:31 +0800 Subject: [PATCH 024/105] enh: spool commit sync barrier as info in syncLogBufferCommit --- source/libs/sync/src/syncPipeline.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index f5f0ee7c69..3c485b4872 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -498,7 +498,7 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm // execute it if (!syncUtilUserCommit(pEntry->originalRpcType)) { - sInfo("vgId:%d, raft mgmt msg in log entry. index: %" PRId64 ", term:%" PRId64 ", type: %s", vgId, pEntry->index, + sInfo("vgId:%d, commit sync barrier. index: %" PRId64 ", term:%" PRId64 ", type: %s", vgId, pEntry->index, pEntry->term, TMSG_INFO(pEntry->originalRpcType)); pBuf->commitIndex = index; if (!inBuf) { @@ -925,7 +925,7 @@ int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode) { (void)syncLogBufferRollback(pBuf, pBuf->matchIndex + 1); - sInfo("vgId:%d, reset log buffer. log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, + sInfo("vgId:%d, reset sync log buffer. log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); pBuf->endIndex = pBuf->matchIndex + 1; From d5ae1ca18a69006374f2a6b1eeb64ed5aea4d82f Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Fri, 25 Nov 2022 10:37:25 +0800 Subject: [PATCH 025/105] enh: make the range span of unconfirmed logs sent less than half of the size of log ring buffer --- include/libs/sync/sync.h | 2 +- source/libs/sync/src/syncPipeline.c | 43 ++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/include/libs/sync/sync.h b/include/libs/sync/sync.h index 55f67c430e..11e3cbd494 100644 --- a/include/libs/sync/sync.h +++ b/include/libs/sync/sync.h @@ -41,7 +41,7 @@ extern "C" { #define SNAPSHOT_WAIT_MS 1000 * 30 #define SYNC_MAX_RETRY_BACKOFF 5 -#define SYNC_LOG_REPL_RETRY_WAIT_MS 50 +#define SYNC_LOG_REPL_RETRY_WAIT_MS 100 #define SYNC_APPEND_ENTRIES_TIMEOUT_MS 10000 #define SYNC_MAX_BATCH_SIZE 1 diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 3c485b4872..1af31efd5d 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -566,33 +566,42 @@ int32_t syncLogReplMgrReset(SSyncLogReplMgr* pMgr) { return 0; } -_Atomic int64_t tsRetryCnt = 0; - int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { if (pMgr->endIndex <= pMgr->startIndex) { return 0; } + SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; + if (pMgr->retryBackoff == SYNC_MAX_RETRY_BACKOFF) { + syncLogReplMgrReset(pMgr); + sWarn("vgId:%d, reset sync log repl mgr since retry backoff exceeding limit. peer: %" PRIx64, pNode->vgId, + pDestId->addr); + return -1; + } + int32_t ret = -1; bool retried = false; int64_t retryWaitMs = syncLogGetRetryBackoffTimeMs(pMgr); + int64_t nowMs = taosGetMonoTimestampMs(); + int count = 0; + int64_t firstIndex = -1; + SyncTerm term = -1; for (SyncIndex index = pMgr->startIndex; index < pMgr->endIndex; index++) { int64_t pos = index % pMgr->size; ASSERT(!pMgr->states[pos].barrier || (index == pMgr->startIndex || index + 1 == pMgr->endIndex)); - if (pMgr->states[pos].acked) { - continue; - } - int64_t nowMs = taosGetMonoTimestampMs(); + if (nowMs < pMgr->states[pos].timeMs + retryWaitMs) { break; } - SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; - bool barrier = false; - SyncTerm term = -1; + if (pMgr->states[pos].acked) { + continue; + } + + bool barrier = false; if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { - sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, + sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: %" PRIx64 "", pNode->vgId, terrstr(), index, pDestId->addr); goto _out; } @@ -601,13 +610,19 @@ int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { pMgr->states[pos].term = term; pMgr->states[pos].acked = false; retried = true; - tsRetryCnt++; + if (firstIndex == -1) firstIndex = index; + count++; } ret = 0; _out: if (retried) { pMgr->retryBackoff = syncLogGetNextRetryBackoff(pMgr); + sInfo("vgId:%d, resend %d raft log entries. dest: %" PRIx64 ", for indexes: %" PRId64 + " etc., maybe of term: %" PRId64 ", retryWaitMs: %" PRId64 ", repl mgr: [%" PRId64 " %" PRId64 ", %" PRId64 + ")", + pNode->vgId, count, pDestId->addr, firstIndex, term, retryWaitMs, pMgr->startIndex, pMgr->matchIndex, + pMgr->endIndex); } return ret; } @@ -771,9 +786,10 @@ int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* p int32_t batchSize = TMAX(1, pMgr->size / 20); int32_t count = 0; int64_t nowMs = taosGetMonoTimestampMs(); + int64_t limit = pMgr->size >> 1; for (SyncIndex index = pMgr->endIndex; index <= pNode->pLogBuf->matchIndex; index++) { - if (batchSize < count++ || pMgr->startIndex + pMgr->size <= index) { + if (batchSize < count++ || limit <= index - pMgr->startIndex) { break; } if (pMgr->startIndex + 1 < index && pMgr->states[(index - 1) % pMgr->size].barrier) { @@ -800,12 +816,13 @@ int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* p } } + syncLogReplMgrRetryOnNeed(pMgr, pNode); + SSyncLogBuffer* pBuf = pNode->pLogBuf; sTrace("vgId:%d, attempted to replicate %d msgs to the %d'th peer. pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, count, pMgr->peerId, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); - syncLogReplMgrRetryOnNeed(pMgr, pNode); return 0; } From 143a2e8552008e2a3fb21c2c0f435ae5816297ff Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Fri, 25 Nov 2022 18:56:14 +0800 Subject: [PATCH 026/105] feat: start snapshot replication to rollback in recovery mode --- source/libs/sync/src/syncAppendEntries.c | 2 +- source/libs/sync/src/syncAppendEntriesReply.c | 1 - source/libs/sync/src/syncPipeline.c | 23 +++++++++++++++---- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c index d719169470..3a9e97a08f 100644 --- a/source/libs/sync/src/syncAppendEntries.c +++ b/source/libs/sync/src/syncAppendEntries.c @@ -188,7 +188,7 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, const SRpcMsg* pRpcMsg) { goto _IGNORE; } - if (pMsg->prevLogIndex + 1 != pEntry->index) { + if (pMsg->prevLogIndex + 1 != pEntry->index || pEntry->term < 0) { sError("vgId:%d, invalid previous log index in msg. index:%" PRId64 ", term:%" PRId64 ", prevLogIndex:%" PRId64 ", prevLogTerm:%" PRId64, ths->vgId, pEntry->index, pEntry->term, pMsg->prevLogIndex, pMsg->prevLogTerm); diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c index b1ebd5d8d1..524abf3c2a 100644 --- a/source/libs/sync/src/syncAppendEntriesReply.c +++ b/source/libs/sync/src/syncAppendEntriesReply.c @@ -85,7 +85,6 @@ int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) { sError("vgId:%d, failed to get log repl mgr for src addr: 0x%016" PRIx64, ths->vgId, pMsg->srcId.addr); return -1; } - ASSERT(pMgr != NULL); (void)syncLogReplMgrProcessReply(pMgr, ths, pMsg); } return 0; diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 1af31efd5d..f1d401759b 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -90,7 +90,7 @@ SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, S return prevLogTerm; } - if (pMgr->startIndex <= prevIndex && prevIndex < pMgr->endIndex) { + if (pMgr && pMgr->startIndex <= prevIndex && prevIndex < pMgr->endIndex) { int64_t timeMs = pMgr->states[(prevIndex + pMgr->size) % pMgr->size].timeMs; ASSERT(timeMs != 0 && "no log entry found"); prevLogTerm = pMgr->states[(prevIndex + pMgr->size) % pMgr->size].term; @@ -277,7 +277,11 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); - ret = 0; + SyncTerm term = syncLogReplMgrGetPrevLogTerm(NULL, pNode, index + 1); + ASSERT(pEntry->term >= 0); + if (term == pEntry->term) { + ret = 0; + } goto _out; } @@ -655,7 +659,7 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod pMgr->states[pMsg->lastSendIndex % pMgr->size].acked = true; - if (pMsg->matchIndex == pMsg->lastSendIndex) { + if (pMsg->success && pMsg->matchIndex == pMsg->lastSendIndex) { pMgr->restored = true; sInfo("vgId:%d, sync log repl mgr restored. peer: %s:%d (%" PRIx64 "), repl mgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", @@ -664,6 +668,17 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod return 0; } + if (pMsg->success == false && pMsg->matchIndex >= pMsg->lastSendIndex) { + sError("vgId:%d, failed to rollback match index. peer: %s:%d, match index: %" PRId64 ", last sent: %" PRId64, pNode->vgId, + host, port, pMsg->matchIndex, pMsg->lastSendIndex); + if (syncNodeStartSnapshot(pNode, &destId) < 0) { + sError("vgId:%d, failed to start snapshot for peer %s:%d", pNode->vgId, host, port); + return -1; + } + sInfo("vgId:%d, snapshot replication to rollback. peer: %s:%d", pNode->vgId, host, port); + return 0; + } + (void)syncLogReplMgrReset(pMgr); } @@ -681,7 +696,7 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod sError("vgId:%d, failed to start snapshot for peer %s:%d", pNode->vgId, host, port); return -1; } - sInfo("vgId:%d, snapshot replication to peer %s:%d started", pNode->vgId, host, port); + sInfo("vgId:%d, snapshot replication to peer %s:%d", pNode->vgId, host, port); return 0; } From b63afcd52f64fcd30c6fdd33a749ae000085fe5b Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Fri, 25 Nov 2022 23:32:32 +0800 Subject: [PATCH 027/105] enh: reset sync log repl mgr on snapshot ending --- source/libs/sync/src/syncSnapshot.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/source/libs/sync/src/syncSnapshot.c b/source/libs/sync/src/syncSnapshot.c index 4ceb2c9fc9..8a8af1468e 100644 --- a/source/libs/sync/src/syncSnapshot.c +++ b/source/libs/sync/src/syncSnapshot.c @@ -879,11 +879,10 @@ int32_t syncNodeOnSnapshotReply(SSyncNode *pSyncNode, const SRpcMsg *pRpcMsg) { // receive ack is finish, close sender if (pMsg->ack == SYNC_SNAPSHOT_SEQ_END) { snapshotSenderStop(pSender, true); - - // update next-index - // syncIndexMgrSetIndex(pSyncNode->pNextIndex, &(pMsg->srcId), pMsg->lastIndex + 1); - // syncNodeReplicateOne(pSyncNode, &(pMsg->srcId), false); - + SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(pSyncNode, &pMsg->srcId); + if (pMgr) { + syncLogReplMgrReset(pMgr); + } return 0; } From 736a1cc017126af1f5fc8754f13bb187b07ac6c7 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Fri, 25 Nov 2022 23:35:28 +0800 Subject: [PATCH 028/105] enh: adjust some info msgs for raft pipelining --- source/libs/sync/src/syncMain.c | 8 ++-- source/libs/sync/src/syncPipeline.c | 64 ++++++++++++++--------------- 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 47eab279a5..5a1acb4731 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -89,7 +89,7 @@ int32_t syncStart(int64_t rid) { } if (syncNodeRestore(pSyncNode) < 0) { - sError("vgId:%d, failed to restore raft log buffer since %s", pSyncNode->vgId, terrstr()); + sError("vgId:%d, failed to restore sync log buffer since %s", pSyncNode->vgId, terrstr()); goto _err; } @@ -847,7 +847,7 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) { // create raft log ring buffer pSyncNode->pLogBuf = syncLogBufferCreate(); if (pSyncNode->pLogBuf == NULL) { - sError("failed to init log buffer since %s. vgId:%d", terrstr(), pSyncNode->vgId); + sError("failed to init sync log buffer since %s. vgId:%d", terrstr(), pSyncNode->vgId); goto _error; } @@ -1060,7 +1060,7 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) { // init log buffer if (syncLogBufferInit(pSyncNode->pLogBuf, pSyncNode) < 0) { - sError("vgId:%d, failed to init raft log buffer since %s", pSyncNode->vgId, terrstr()); + sError("vgId:%d, failed to init sync log buffer since %s", pSyncNode->vgId, terrstr()); goto _error; } @@ -2239,7 +2239,7 @@ int32_t syncCacheEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry, LRUHand int32_t syncNodeAppend(SSyncNode* ths, SSyncRaftEntry* pEntry) { // append to log buffer if (syncLogBufferAppend(ths->pLogBuf, ths, pEntry) < 0) { - sError("vgId:%d, failed to enqueue log buffer. index:%" PRId64 "", ths->vgId, pEntry->index); + sError("vgId:%d, failed to enqueue sync log buffer. index:%" PRId64 "", ths->vgId, pEntry->index); return -1; } diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index f1d401759b..cfea6e8bc6 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -38,7 +38,7 @@ int32_t syncLogBufferAppend(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt SyncIndex index = pEntry->index; if (index - pBuf->startIndex >= pBuf->size) { - sError("vgId:%d, failed to append due to log buffer full. index:%" PRId64 "", pNode->vgId, index); + sError("vgId:%d, failed to append due to sync log buffer full. index:%" PRId64 "", pNode->vgId, index); goto _out; } @@ -49,7 +49,7 @@ int32_t syncLogBufferAppend(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt // initial log buffer with at least one item, e.g. commitIndex SSyncRaftEntry* pMatch = pBuf->entries[(index - 1 + pBuf->size) % pBuf->size].pItem; - ASSERT(pMatch != NULL && "no matched raft log entry"); + ASSERT(pMatch != NULL && "no matched log entry"); ASSERT(pMatch->index + 1 == index); SSyncLogBufEntry tmp = {.pItem = pEntry, .prevLogIndex = pMatch->index, .prevLogTerm = pMatch->term}; @@ -273,8 +273,8 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt SyncTerm lastMatchTerm = syncLogBufferGetLastMatchTerm(pBuf); if (index <= pBuf->commitIndex) { - sTrace("vgId:%d, raft entry already committed. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 - " %" PRId64 " %" PRId64 ", %" PRId64 ")", + sTrace("vgId:%d, already committed. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 " %" PRId64 + " %" PRId64 ", %" PRId64 ")", pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); SyncTerm term = syncLogReplMgrGetPrevLogTerm(NULL, pNode, index + 1); @@ -286,15 +286,15 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt } if (index - pBuf->startIndex >= pBuf->size) { - sInfo("vgId:%d, raft entry out of buffer capacity. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 - " %" PRId64 " %" PRId64 ", %" PRId64 ")", + sInfo("vgId:%d, out of buffer range. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 " %" PRId64 + " %" PRId64 ", %" PRId64 ")", pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); goto _out; } if (index > pBuf->matchIndex && lastMatchTerm != prevTerm) { - sInfo("vgId:%d, not ready to accept raft entry. index: %" PRId64 ", term: %" PRId64 ": prevterm: %" PRId64 + sInfo("vgId:%d, not ready to accept. index: %" PRId64 ", term: %" PRId64 ": prevterm: %" PRId64 " != lastmatch: %" PRId64 ". log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pEntry->index, pEntry->term, prevTerm, lastMatchTerm, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); @@ -309,7 +309,7 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt if (pEntry->term != pExist->term) { (void)syncLogBufferRollback(pBuf, index); } else { - sDebug("vgId:%d, duplicate raft entry received. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + sDebug("vgId:%d, duplicate log entry received. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); @@ -349,7 +349,7 @@ int32_t syncLogStorePersist(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) { ASSERT(pEntry->index == lastVer + 1); if (pLogStore->syncLogAppendEntry(pLogStore, pEntry) < 0) { - sError("failed to append raft log entry since %s. index:%" PRId64 ", term:%" PRId64 "", terrstr(), pEntry->index, + sError("failed to append sync log entry since %s. index:%" PRId64 ", term:%" PRId64 "", terrstr(), pEntry->index, pEntry->term); return -1; } @@ -392,7 +392,7 @@ int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncTerm* p if (pMatch->term != prevLogTerm) { sInfo( - "vgId:%d, mismatching raft log entries encountered. " + "vgId:%d, mismatching sync log entries encountered. " "{ index:%" PRId64 ", term:%" PRId64 " } " "{ index:%" PRId64 ", term:%" PRId64 ", prevLogIndex:%" PRId64 ", prevLogTerm:%" PRId64 " } ", @@ -411,8 +411,8 @@ int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncTerm* p // persist if (syncLogStorePersist(pLogStore, pEntry) < 0) { - sError("vgId:%d, failed to persist raft log entry from log buffer since %s. index:%" PRId64, pNode->vgId, - terrstr(), pEntry->index); + sError("vgId:%d, failed to persist sync log entry from buffer since %s. index:%" PRId64, pNode->vgId, terrstr(), + pEntry->index); goto _out; } ASSERT(pEntry->index == pBuf->matchIndex); @@ -482,15 +482,14 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm bool inBuf = false; if (commitIndex <= pBuf->commitIndex) { - sDebug("vgId:%d, stale commit update. current:%" PRId64 ", notified:%" PRId64 "", vgId, pBuf->commitIndex, + sDebug("vgId:%d, stale commit index. current:%" PRId64 ", notified:%" PRId64 "", vgId, pBuf->commitIndex, commitIndex); ret = 0; goto _out; } - sTrace("vgId:%d, log buffer info. role: %d, term: %" PRId64 ". start index:%" PRId64 ", commit index:%" PRId64 - ", match index: %" PRId64 ", end index:%" PRId64 "", - pNode->vgId, role, term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + sTrace("vgId:%d, commit. log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 "), role: %d, term: %" PRId64, + pNode->vgId, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex, role, term); // execute in fsm for (int64_t index = pBuf->commitIndex + 1; index <= upperIndex; index++) { @@ -513,7 +512,7 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm } if (syncLogFsmExecute(pNode, pFsm, role, term, pEntry) != 0) { - sError("vgId:%d, failed to execute raft entry in FSM. log index:%" PRId64 ", term:%" PRId64 "", vgId, + sError("vgId:%d, failed to execute sync log entry in FSM. log index:%" PRId64 ", term:%" PRId64 "", vgId, pEntry->index, pEntry->term); goto _out; } @@ -605,7 +604,7 @@ int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { bool barrier = false; if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { - sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", dest: %" PRIx64 "", pNode->vgId, + sError("vgId:%d, failed to replicate sync log entry since %s. index: %" PRId64 ", dest: %" PRIx64 "", pNode->vgId, terrstr(), index, pDestId->addr); goto _out; } @@ -622,9 +621,8 @@ int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { _out: if (retried) { pMgr->retryBackoff = syncLogGetNextRetryBackoff(pMgr); - sInfo("vgId:%d, resend %d raft log entries. dest: %" PRIx64 ", for indexes: %" PRId64 - " etc., maybe of term: %" PRId64 ", retryWaitMs: %" PRId64 ", repl mgr: [%" PRId64 " %" PRId64 ", %" PRId64 - ")", + sInfo("vgId:%d, resend %d sync log entries. dest: %" PRIx64 ", indexes: %" PRId64 " ..., likely term: %" PRId64 + ", retryWaitMs: %" PRId64 ", repl mgr: [%" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, count, pDestId->addr, firstIndex, term, retryWaitMs, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex); } @@ -645,8 +643,8 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod ASSERT(pMgr->matchIndex == 0); if (pMsg->matchIndex < 0) { pMgr->restored = true; - sInfo("vgId:%d, sync log repl mgr restored. peer: %s:%d (%" PRIx64 "), repl mgr(rs:%d): [%" PRId64 " %" PRId64 - ", %" PRId64 "), log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + sInfo("vgId:%d, sync log repl mgr restored. peer: %s:%d (%" PRIx64 "), mgr: rs(%d) [%" PRId64 " %" PRId64 + ", %" PRId64 "), buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, host, port, destId.addr, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; @@ -661,21 +659,21 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod if (pMsg->success && pMsg->matchIndex == pMsg->lastSendIndex) { pMgr->restored = true; - sInfo("vgId:%d, sync log repl mgr restored. peer: %s:%d (%" PRIx64 "), repl mgr(rs:%d): [%" PRId64 " %" PRId64 - ", %" PRId64 "), log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + sInfo("vgId:%d, sync log repl mgr restored. peer: %s:%d (%" PRIx64 "), mgr: rs(%d) [%" PRId64 " %" PRId64 + ", %" PRId64 "), buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, host, port, destId.addr, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); return 0; } if (pMsg->success == false && pMsg->matchIndex >= pMsg->lastSendIndex) { - sError("vgId:%d, failed to rollback match index. peer: %s:%d, match index: %" PRId64 ", last sent: %" PRId64, pNode->vgId, - host, port, pMsg->matchIndex, pMsg->lastSendIndex); + sError("vgId:%d, failed to rollback match index. peer: %s:%d, match index: %" PRId64 ", last sent: %" PRId64, + pNode->vgId, host, port, pMsg->matchIndex, pMsg->lastSendIndex); if (syncNodeStartSnapshot(pNode, &destId) < 0) { sError("vgId:%d, failed to start snapshot for peer %s:%d", pNode->vgId, host, port); return -1; } - sInfo("vgId:%d, snapshot replication to rollback. peer: %s:%d", pNode->vgId, host, port); + sInfo("vgId:%d, snapshot replication to peer %s:%d", pNode->vgId, host, port); return 0; } @@ -748,7 +746,8 @@ int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Sync SSyncLogBuffer* pBuf = pNode->pLogBuf; taosThreadMutexLock(&pBuf->mutex); if (pMsg->startTime != pMgr->peerStartTime) { - sInfo("vgId:%d, reset sync log repl mgr in append entries reply. peer: %" PRIx64 ", start time:%" PRId64 ", old:%" PRId64, + sInfo("vgId:%d, reset sync log repl mgr in appendlog reply. peer: %" PRIx64 ", start time:%" PRId64 + ", old:%" PRId64, pNode->vgId, pMsg->srcId.addr, pMsg->startTime, pMgr->peerStartTime); syncLogReplMgrReset(pMgr); pMgr->peerStartTime = pMsg->startTime; @@ -793,8 +792,6 @@ int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode return 0; } -_Atomic int64_t tsSendCnt = 0; - int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { ASSERT(pMgr->restored); SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; @@ -825,7 +822,6 @@ int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* p pMgr->states[pos].acked = false; pMgr->endIndex = index + 1; - tsSendCnt++; if (barrier) { break; } @@ -957,7 +953,7 @@ int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode) { (void)syncLogBufferRollback(pBuf, pBuf->matchIndex + 1); - sInfo("vgId:%d, reset sync log buffer. log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, + sInfo("vgId:%d, reset sync log buffer. buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); pBuf->endIndex = pBuf->matchIndex + 1; @@ -1003,7 +999,7 @@ int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Syn if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) { SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(pNode, pDestId); if (pMgr) { - sInfo("vgId:%d, reset sync log repl mgr for peer: 0x%016" PRIx64 " since %s. index: %" PRId64, pNode->vgId, + sInfo("vgId:%d, reset sync log repl mgr of peer: %" PRIx64 " since %s. index: %" PRId64, pNode->vgId, pDestId->addr, terrstr(), index); (void)syncLogReplMgrReset(pMgr); } From 082428acab600583f5afc37754cb573af0a9f41f Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Sat, 26 Nov 2022 12:46:51 +0800 Subject: [PATCH 029/105] enh: reduce the number of probing msgs under stress in recovery mode --- source/libs/sync/inc/syncPipeline.h | 2 +- source/libs/sync/src/syncPipeline.c | 52 +++++++++++++++-------------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/source/libs/sync/inc/syncPipeline.h b/source/libs/sync/inc/syncPipeline.h index ca07876def..e7980bc2dd 100644 --- a/source/libs/sync/inc/syncPipeline.h +++ b/source/libs/sync/inc/syncPipeline.h @@ -87,7 +87,7 @@ int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Sy SRaftId* pDestId, bool* pBarrier); int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); -int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); +int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index); int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); int32_t syncLogReplMgrProcessReplyInNormalMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg); diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index cfea6e8bc6..b4f2541f9c 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -612,6 +612,7 @@ int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { pMgr->states[pos].timeMs = nowMs; pMgr->states[pos].term = term; pMgr->states[pos].acked = false; + retried = true; if (firstIndex == -1) firstIndex = index; count++; @@ -658,6 +659,7 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod pMgr->states[pMsg->lastSendIndex % pMgr->size].acked = true; if (pMsg->success && pMsg->matchIndex == pMsg->lastSendIndex) { + pMgr->matchIndex = pMsg->matchIndex; pMgr->restored = true; sInfo("vgId:%d, sync log repl mgr restored. peer: %s:%d (%" PRIx64 "), mgr: rs(%d) [%" PRId64 " %" PRId64 ", %" PRId64 "), buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", @@ -667,8 +669,8 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod } if (pMsg->success == false && pMsg->matchIndex >= pMsg->lastSendIndex) { - sError("vgId:%d, failed to rollback match index. peer: %s:%d, match index: %" PRId64 ", last sent: %" PRId64, - pNode->vgId, host, port, pMsg->matchIndex, pMsg->lastSendIndex); + sWarn("vgId:%d, failed to rollback match index. peer: %s:%d, match index: %" PRId64 ", last sent: %" PRId64, + pNode->vgId, host, port, pMsg->matchIndex, pMsg->lastSendIndex); if (syncNodeStartSnapshot(pNode, &destId) < 0) { sError("vgId:%d, failed to start snapshot for peer %s:%d", pNode->vgId, host, port); return -1; @@ -676,8 +678,6 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod sInfo("vgId:%d, snapshot replication to peer %s:%d", pNode->vgId, host, port); return 0; } - - (void)syncLogReplMgrReset(pMgr); } // check last match term @@ -709,24 +709,8 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod } // attempt to replicate the raft log at index - bool barrier = false; - ASSERT(index >= 0); - if (syncLogBufferReplicateOneTo(pMgr, pNode, index, &term, &destId, &barrier) < 0) { - sError("vgId:%d, failed to replicate log entry since %s. index: %" PRId64 ", peer %s:%d", pNode->vgId, - terrstr(), index, host, port); - return -1; - } - - int64_t nowMs = taosGetMonoTimestampMs(); - pMgr->states[index % pMgr->size].barrier = barrier; - pMgr->states[index % pMgr->size].timeMs = nowMs; - pMgr->states[index % pMgr->size].term = term; - pMgr->states[index % pMgr->size].acked = false; - - pMgr->matchIndex = index; - pMgr->startIndex = index; - pMgr->endIndex = index + 1; - return 0; + (void)syncLogReplMgrReset(pMgr); + return syncLogReplMgrReplicateProbeOnce(pMgr, pNode, index); } int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg) { @@ -766,14 +750,23 @@ int32_t syncLogReplMgrReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { if (pMgr->restored) { (void)syncLogReplMgrReplicateAttemptedOnce(pMgr, pNode); } else { - (void)syncLogReplMgrReplicateProbeOnce(pMgr, pNode); + (void)syncLogReplMgrReplicateProbeOnce(pMgr, pNode, pNode->pLogBuf->matchIndex); } return 0; } -int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { +int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index) { ASSERT(!pMgr->restored); - SyncIndex index = pNode->pLogBuf->matchIndex; + ASSERT(pMgr->startIndex >= 0); + int64_t retryMaxWaitMs = SYNC_LOG_REPL_RETRY_WAIT_MS * (1 << SYNC_MAX_RETRY_BACKOFF); + int64_t nowMs = taosGetMonoTimestampMs(); + + if (pMgr->endIndex > pMgr->startIndex && + nowMs < pMgr->states[pMgr->startIndex % pMgr->size].timeMs + retryMaxWaitMs) { + return 0; + } + (void)syncLogReplMgrReset(pMgr); + SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; bool barrier = false; SyncTerm term = -1; @@ -783,6 +776,15 @@ int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode return -1; } + ASSERT(index >= 0); + pMgr->states[index % pMgr->size].barrier = barrier; + pMgr->states[index % pMgr->size].timeMs = nowMs; + pMgr->states[index % pMgr->size].term = term; + pMgr->states[index % pMgr->size].acked = false; + + pMgr->startIndex = index; + pMgr->endIndex = index + 1; + SSyncLogBuffer* pBuf = pNode->pLogBuf; sTrace("vgId:%d, attempted to probe the %d'th peer with msg of index:%" PRId64 " term: %" PRId64 ". pMgr(rs:%d): [%" PRId64 " %" PRId64 ", %" PRId64 "), pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 From 012bcf1a5d89af225cb5bc42f27f631813a9e82b Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Sat, 26 Nov 2022 13:31:43 +0800 Subject: [PATCH 030/105] enh: adjust logging levels in syncLogBufferAccept, e.g. sInfo to sWarn --- source/libs/sync/src/syncPipeline.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index b4f2541f9c..994d62ca73 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -286,7 +286,7 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt } if (index - pBuf->startIndex >= pBuf->size) { - sInfo("vgId:%d, out of buffer range. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 " %" PRId64 + sWarn("vgId:%d, out of buffer range. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); @@ -294,7 +294,7 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt } if (index > pBuf->matchIndex && lastMatchTerm != prevTerm) { - sInfo("vgId:%d, not ready to accept. index: %" PRId64 ", term: %" PRId64 ": prevterm: %" PRId64 + sWarn("vgId:%d, not ready to accept. index: %" PRId64 ", term: %" PRId64 ": prevterm: %" PRId64 " != lastmatch: %" PRId64 ". log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pEntry->index, pEntry->term, prevTerm, lastMatchTerm, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); @@ -309,7 +309,7 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt if (pEntry->term != pExist->term) { (void)syncLogBufferRollback(pBuf, index); } else { - sDebug("vgId:%d, duplicate log entry received. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 + sTrace("vgId:%d, duplicate log entry received. index: %" PRId64 ", term: %" PRId64 ". log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); @@ -622,7 +622,7 @@ int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { _out: if (retried) { pMgr->retryBackoff = syncLogGetNextRetryBackoff(pMgr); - sInfo("vgId:%d, resend %d sync log entries. dest: %" PRIx64 ", indexes: %" PRId64 " ..., likely term: %" PRId64 + sInfo("vgId:%d, resend %d sync log entries. dest: %" PRIx64 ", indexes: %" PRId64 " ..., terms: ... %" PRId64 ", retryWaitMs: %" PRId64 ", repl mgr: [%" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, count, pDestId->addr, firstIndex, term, retryWaitMs, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex); From a01f34fd83fcb7c8977a1af8dde91866df8dd0ef Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Sat, 26 Nov 2022 16:20:08 +0800 Subject: [PATCH 031/105] fix: clear sync log buffer in syncLogBufferDestroy --- source/libs/sync/src/syncPipeline.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 994d62ca73..bf8f830185 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -622,7 +622,7 @@ int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { _out: if (retried) { pMgr->retryBackoff = syncLogGetNextRetryBackoff(pMgr); - sInfo("vgId:%d, resend %d sync log entries. dest: %" PRIx64 ", indexes: %" PRId64 " ..., terms: ... %" PRId64 + sInfo("vgId:%d, resent %d sync log entries. dest: %" PRIx64 ", indexes: %" PRId64 " ..., terms: ... %" PRId64 ", retryWaitMs: %" PRId64 ", repl mgr: [%" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, count, pDestId->addr, firstIndex, term, retryWaitMs, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex); @@ -919,10 +919,24 @@ _err: return NULL; } +void syncLogBufferClear(SSyncLogBuffer* pBuf) { + taosThreadMutexLock(&pBuf->mutex); + for (SyncIndex index = pBuf->startIndex; index < pBuf->endIndex; index++) { + SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; + if (pEntry == NULL) continue; + syncEntryDestroy(pEntry); + pEntry = NULL; + memset(&pBuf->entries[(index + pBuf->size) % pBuf->size], 0, sizeof(pBuf->entries[0])); + } + pBuf->startIndex = pBuf->commitIndex = pBuf->matchIndex = pBuf->endIndex = 0; + taosThreadMutexUnlock(&pBuf->mutex); +} + void syncLogBufferDestroy(SSyncLogBuffer* pBuf) { if (pBuf == NULL) { return; } + syncLogBufferClear(pBuf); (void)taosThreadMutexDestroy(&pBuf->mutex); (void)taosMemoryFree(pBuf); return; From 4edef438eabb3c050ab36f84ba9f294ad3fa9909 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Sat, 26 Nov 2022 21:53:38 +0800 Subject: [PATCH 032/105] enh: transfer ownership of msgs while committing sync log entries --- include/libs/sync/sync.h | 10 +++++----- source/dnode/mgmt/mgmt_mnode/src/mmWorker.c | 2 ++ source/dnode/mgmt/mgmt_qnode/src/qmWorker.c | 2 ++ source/dnode/mgmt/mgmt_snode/src/smWorker.c | 1 + source/dnode/mgmt/mgmt_vnode/src/vmWorker.c | 2 +- source/dnode/mnode/impl/src/mndSync.c | 12 +++++++----- source/dnode/vnode/src/vnd/vnodeSync.c | 21 ++++++++------------- source/libs/sync/src/syncPipeline.c | 1 + source/libs/sync/src/syncRaftEntry.c | 2 +- 9 files changed, 28 insertions(+), 25 deletions(-) diff --git a/include/libs/sync/sync.h b/include/libs/sync/sync.h index 7fb3a890cb..00935f280a 100644 --- a/include/libs/sync/sync.h +++ b/include/libs/sync/sync.h @@ -134,13 +134,13 @@ typedef struct SSnapshotMeta { typedef struct SSyncFSM { void* data; - void (*FpCommitCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SFsmCbMeta* pMeta); - void (*FpPreCommitCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SFsmCbMeta* pMeta); - void (*FpRollBackCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SFsmCbMeta* pMeta); + void (*FpCommitCb)(const struct SSyncFSM* pFsm, SRpcMsg* pMsg, const SFsmCbMeta* pMeta); + void (*FpPreCommitCb)(const struct SSyncFSM* pFsm, SRpcMsg* pMsg, const SFsmCbMeta* pMeta); + void (*FpRollBackCb)(const struct SSyncFSM* pFsm, SRpcMsg* pMsg, const SFsmCbMeta* pMeta); void (*FpRestoreFinishCb)(const struct SSyncFSM* pFsm); - void (*FpReConfigCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SReConfigCbMeta* pMeta); - void (*FpLeaderTransferCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SFsmCbMeta* pMeta); + void (*FpReConfigCb)(const struct SSyncFSM* pFsm, SRpcMsg* pMsg, const SReConfigCbMeta* pMeta); + void (*FpLeaderTransferCb)(const struct SSyncFSM* pFsm, SRpcMsg* pMsg, const SFsmCbMeta* pMeta); bool (*FpApplyQueueEmptyCb)(const struct SSyncFSM* pFsm); int32_t (*FpApplyQueueItems)(const struct SSyncFSM* pFsm); diff --git a/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c b/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c index d3d92e1bbf..212de0bfb4 100644 --- a/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c +++ b/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c @@ -162,11 +162,13 @@ int32_t mmPutMsgToQueue(SMnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) { SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM); if (pMsg == NULL) return -1; memcpy(pMsg, pRpc, sizeof(SRpcMsg)); + pRpc->pCont = NULL; dTrace("msg:%p, is created and will put into %s queue, type:%s", pMsg, pWorker->name, TMSG_INFO(pRpc->msgType)); int32_t code = mmPutMsgToWorker(pMgmt, pWorker, pMsg); if (code != 0) { dTrace("msg:%p, is freed", pMsg); + rpcFreeCont(pMsg->pCont); taosFreeQitem(pMsg); } return code; diff --git a/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c b/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c index edbe9882a4..3e5ad65db7 100644 --- a/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c +++ b/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c @@ -61,6 +61,7 @@ int32_t qmPutRpcMsgToQueue(SQnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) { SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM); if (pMsg == NULL) return -1; memcpy(pMsg, pRpc, sizeof(SRpcMsg)); + pRpc->pCont = NULL; switch (qtype) { case QUERY_QUEUE: @@ -74,6 +75,7 @@ int32_t qmPutRpcMsgToQueue(SQnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) { return 0; default: terrno = TSDB_CODE_INVALID_PARA; + rpcFreeCont(pMsg->pCont); taosFreeQitem(pMsg); return -1; } diff --git a/source/dnode/mgmt/mgmt_snode/src/smWorker.c b/source/dnode/mgmt/mgmt_snode/src/smWorker.c index f6942c8114..2d2a121795 100644 --- a/source/dnode/mgmt/mgmt_snode/src/smWorker.c +++ b/source/dnode/mgmt/mgmt_snode/src/smWorker.c @@ -151,6 +151,7 @@ int32_t smPutMsgToQueue(SSnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) { pHead->contLen = htonl(pHead->contLen); pHead->vgId = SNODE_HANDLE; memcpy(pMsg, pRpc, sizeof(SRpcMsg)); + pRpc->pCont = NULL; switch (qtype) { case STREAM_QUEUE: diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c b/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c index 4aa07cad98..08ea880b97 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c @@ -246,12 +246,12 @@ int32_t vmPutRpcMsgToQueue(SVnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) { pHead->contLen = htonl(pHead->contLen); pHead->vgId = htonl(pHead->vgId); memcpy(pMsg, pRpc, sizeof(SRpcMsg)); + pRpc->pCont = NULL; int32_t code = vmPutMsgToQueue(pMgmt, pMsg, qtype); if (code != 0) { dTrace("msg:%p, is freed", pMsg); rpcFreeCont(pMsg->pCont); - pRpc->pCont = NULL; taosFreeQitem(pMsg); } diff --git a/source/dnode/mnode/impl/src/mndSync.c b/source/dnode/mnode/impl/src/mndSync.c index 320cc10d40..10cd6416b4 100644 --- a/source/dnode/mnode/impl/src/mndSync.c +++ b/source/dnode/mnode/impl/src/mndSync.c @@ -72,15 +72,11 @@ static int32_t mndSyncSendMsg(const SEpSet *pEpSet, SRpcMsg *pMsg) { return code; } -void mndSyncCommitMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const SFsmCbMeta *pMeta) { +void mndProcessWriteMsg(const SSyncFSM *pFsm, SRpcMsg *pMsg, const SFsmCbMeta *pMeta) { SMnode *pMnode = pFsm->data; SSyncMgmt *pMgmt = &pMnode->syncMgmt; SSdbRaw *pRaw = pMsg->pCont; - // delete msg handle - SRpcMsg rpcMsg = {0}; - rpcMsg.info = pMsg->info; - int32_t transId = sdbGetIdFromRaw(pMnode->pSdb, pRaw); pMgmt->errCode = pMeta->code; mInfo("trans:%d, is proposed, saved:%d code:0x%x, apply index:%" PRId64 " term:%" PRIu64 " config:%" PRId64 @@ -120,6 +116,12 @@ void mndSyncCommitMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const SFsmCbMet } } +void mndSyncCommitMsg(const SSyncFSM *pFsm, SRpcMsg *pMsg, const SFsmCbMeta *pMeta) { + mndProcessWriteMsg(pFsm, pMsg, pMeta); + rpcFreeCont(pMsg->pCont); + pMsg->pCont = NULL; +} + int32_t mndSyncGetSnapshot(const SSyncFSM *pFsm, SSnapshot *pSnapshot, void *pReaderParam, void **ppReader) { mInfo("start to read snapshot from sdb in atomic way"); SMnode *pMnode = pFsm->data; diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index bc6eb81275..f5c1e1b169 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -295,36 +295,31 @@ static int32_t vnodeSyncGetSnapshot(const SSyncFSM *pFsm, SSnapshot *pSnapshot) return 0; } -static void vnodeSyncApplyMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const SFsmCbMeta *pMeta) { +static void vnodeSyncApplyMsg(const SSyncFSM *pFsm, SRpcMsg *pMsg, const SFsmCbMeta *pMeta) { SVnode *pVnode = pFsm->data; - - SRpcMsg rpcMsg = {.msgType = pMsg->msgType, .contLen = pMsg->contLen}; - rpcMsg.pCont = rpcMallocCont(rpcMsg.contLen); - memcpy(rpcMsg.pCont, pMsg->pCont, pMsg->contLen); - rpcMsg.info = pMsg->info; - rpcMsg.info.conn.applyIndex = pMeta->index; - rpcMsg.info.conn.applyTerm = pMeta->term; + pMsg->info.conn.applyIndex = pMeta->index; + pMsg->info.conn.applyTerm = pMeta->term; const STraceId *trace = &pMsg->info.traceId; vGTrace("vgId:%d, commit-cb is excuted, fsm:%p, index:%" PRId64 ", term:%" PRIu64 ", msg-index:%" PRId64 ", weak:%d, code:%d, state:%d %s, type:%s", - pVnode->config.vgId, pFsm, pMeta->index, pMeta->term, rpcMsg.info.conn.applyIndex, pMeta->isWeak, pMeta->code, + pVnode->config.vgId, pFsm, pMeta->index, pMeta->term, pMsg->info.conn.applyIndex, pMeta->isWeak, pMeta->code, pMeta->state, syncStr(pMeta->state), TMSG_INFO(pMsg->msgType)); - tmsgPutToQueue(&pVnode->msgCb, APPLY_QUEUE, &rpcMsg); + tmsgPutToQueue(&pVnode->msgCb, APPLY_QUEUE, pMsg); } -static void vnodeSyncCommitMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const SFsmCbMeta *pMeta) { +static void vnodeSyncCommitMsg(const SSyncFSM *pFsm, SRpcMsg *pMsg, const SFsmCbMeta *pMeta) { vnodeSyncApplyMsg(pFsm, pMsg, pMeta); } -static void vnodeSyncPreCommitMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const SFsmCbMeta *pMeta) { +static void vnodeSyncPreCommitMsg(const SSyncFSM *pFsm, SRpcMsg *pMsg, const SFsmCbMeta *pMeta) { if (pMeta->isWeak == 1) { vnodeSyncApplyMsg(pFsm, pMsg, pMeta); } } -static void vnodeSyncRollBackMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const SFsmCbMeta *pMeta) { +static void vnodeSyncRollBackMsg(const SSyncFSM *pFsm, SRpcMsg *pMsg, const SFsmCbMeta *pMeta) { SVnode *pVnode = pFsm->data; vTrace("vgId:%d, rollback-cb is excuted, fsm:%p, index:%" PRId64 ", weak:%d, code:%d, state:%d %s, type:%s", pVnode->config.vgId, pFsm, pMeta->index, pMeta->isWeak, pMeta->code, pMeta->state, syncStr(pMeta->state), diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index bf8f830185..2000379160 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -455,6 +455,7 @@ int32_t syncLogFsmExecute(SSyncNode* pNode, SSyncFSM* pFsm, ESyncState role, Syn (void)syncRespMgrGetAndDel(pNode->pSyncRespMgr, cbMeta.seqNum, &rpcMsg.info); pFsm->FpCommitCb(pFsm, &rpcMsg, &cbMeta); + ASSERT(rpcMsg.pCont == NULL); return 0; } diff --git a/source/libs/sync/src/syncRaftEntry.c b/source/libs/sync/src/syncRaftEntry.c index 959e00fcde..988a86cc67 100644 --- a/source/libs/sync/src/syncRaftEntry.c +++ b/source/libs/sync/src/syncRaftEntry.c @@ -20,7 +20,7 @@ SSyncRaftEntry* syncEntryBuild(int32_t dataLen) { int32_t bytes = sizeof(SSyncRaftEntry) + dataLen; - SSyncRaftEntry* pEntry = taosMemoryMalloc(bytes); + SSyncRaftEntry* pEntry = taosMemoryCalloc(1, bytes); if (pEntry == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; From 5f4fb90f699993098ce2ca91397375f294370f06 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Mon, 28 Nov 2022 13:47:07 +0800 Subject: [PATCH 033/105] enh: reduce retryBackoff if first timeMs less than last one for half the current retryWaitMs --- source/libs/sync/src/syncPipeline.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 2000379160..00f3791ea2 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -843,6 +843,14 @@ int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* p int32_t syncLogReplMgrProcessReplyInNormalMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) { ASSERT(pMgr->restored == true); if (pMgr->startIndex <= pMsg->lastSendIndex && pMsg->lastSendIndex < pMgr->endIndex) { + if (pMgr->startIndex < pMgr->matchIndex && pMgr->retryBackoff > 0) { + int64_t firstSentMs = pMgr->states[pMgr->startIndex % pMgr->size].timeMs; + int64_t lastSentMs = pMgr->states[(pMgr->endIndex - 1) % pMgr->size].timeMs; + int64_t timeDiffMs = lastSentMs - firstSentMs; + if (timeDiffMs > 0 && timeDiffMs < (SYNC_LOG_REPL_RETRY_WAIT_MS << (pMgr->retryBackoff - 1))) { + pMgr->retryBackoff -= 1; + } + } pMgr->states[pMsg->lastSendIndex % pMgr->size].acked = true; pMgr->matchIndex = TMAX(pMgr->matchIndex, pMsg->matchIndex); for (SyncIndex index = pMgr->startIndex; index < pMgr->matchIndex; index++) { From 8475aaaaf1efd95b8cdc4928848ff3778e053ce2 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Mon, 28 Nov 2022 13:48:57 +0800 Subject: [PATCH 034/105] enh: add ASSERT info msg in tsdbStartCommit --- source/dnode/vnode/src/tsdb/tsdbCommit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 520ae36c73..391e10e223 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -811,7 +811,7 @@ static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter) { int32_t lino = 0; memset(pCommitter, 0, sizeof(*pCommitter)); - ASSERT(pTsdb->mem && pTsdb->imem == NULL); + ASSERT(pTsdb->mem && pTsdb->imem == NULL && "last tsdb commit incomplete"); taosThreadRwlockWrlock(&pTsdb->rwLock); pTsdb->imem = pTsdb->mem; From d52e7319535c59b287950ebbf4299863e834db3b Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Tue, 29 Nov 2022 09:34:28 +0800 Subject: [PATCH 035/105] fix: define CLOCK_MONOTONIC for Win OS --- include/os/osTime.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/os/osTime.h b/include/os/osTime.h index 88eabd206d..0a0a54119b 100644 --- a/include/os/osTime.h +++ b/include/os/osTime.h @@ -35,6 +35,7 @@ extern "C" { #ifdef WINDOWS #define CLOCK_REALTIME 0 +#define CLOCK_MONOTONIC 0 #define MILLISECOND_PER_SECOND (1000i64) #else From 5425d67c9a5ecf7deafef98efcf4386c0e5ddd06 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 29 Nov 2022 11:40:58 +0800 Subject: [PATCH 036/105] add timestamp to msg head --- include/os/osSocket.h | 3 +++ source/libs/transport/inc/transComm.h | 1 + source/libs/transport/src/transCli.c | 10 ++++++++++ source/libs/transport/src/transSvr.c | 25 ++++++++++++++++++++----- source/os/src/osSocket.c | 27 +++++++++++++++++++++++++++ 5 files changed, 61 insertions(+), 5 deletions(-) diff --git a/include/os/osSocket.h b/include/os/osSocket.h index 2c7c579401..3ba28d8156 100644 --- a/include/os/osSocket.h +++ b/include/os/osSocket.h @@ -169,6 +169,9 @@ void taosSetMaskSIGPIPE(); uint32_t taosInetAddr(const char *ipAddr); const char *taosInetNtoa(struct in_addr ipInt, char *dstStr, int32_t len); +uint64_t taosHton64(uint64_t val); +uint64_t taosNtoh64(uint64_t val); + #ifdef __cplusplus } #endif diff --git a/source/libs/transport/inc/transComm.h b/source/libs/transport/inc/transComm.h index ac54749ae1..4aa9c6be42 100644 --- a/source/libs/transport/inc/transComm.h +++ b/source/libs/transport/inc/transComm.h @@ -161,6 +161,7 @@ typedef struct { char spi : 2; char hasEpSet : 2; // contain epset or not, 0(default): no epset, 1: contain epset + uint64_t timestamp; char user[TSDB_UNI_LEN]; uint32_t magicNum; STraceId traceId; diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 71cc14493f..b4b0b0caf7 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -758,6 +758,14 @@ static void cliSendCb(uv_write_t* req, int status) { SCliConn* pConn = transReqQueueRemove(req); if (pConn == NULL) return; + SCliMsg* pMsg = !transQueueEmpty(&pConn->cliMsgs) ? transQueueGet(&pConn->cliMsgs, 0) : NULL; + if (pMsg != NULL) { + int64_t cost = taosGetTimestampUs() - pMsg->st; + if (cost > 1000) { + tWarn("%s conn %p send cost:%dus, send exception", CONN_GET_INST_LABEL(pConn), pConn, (int)cost); + } + } + if (status == 0) { tTrace("%s conn %p data already was written out", CONN_GET_INST_LABEL(pConn), pConn); } else { @@ -806,6 +814,7 @@ void cliSend(SCliConn* pConn) { pHead->traceId = pMsg->info.traceId; pHead->magicNum = htonl(TRANS_MAGIC_NUM); } + pHead->timestamp = taosHton64(taosGetTimestampUs()); if (pHead->persist == 1) { CONN_SET_PERSIST_BY_APP(pConn); @@ -1568,6 +1577,7 @@ int transReleaseCliHandle(void* handle) { SCliMsg* cmsg = taosMemoryCalloc(1, sizeof(SCliMsg)); cmsg->msg = tmsg; + cmsg->st = taosGetTimestampUs(); cmsg->type = Release; cmsg->ctx = pCtx; diff --git a/source/libs/transport/src/transSvr.c b/source/libs/transport/src/transSvr.c index 395e28d68f..562e1dc6f6 100644 --- a/source/libs/transport/src/transSvr.c +++ b/source/libs/transport/src/transSvr.c @@ -231,14 +231,29 @@ static bool uvHandleReq(SSvrConn* pConn) { } } STraceId* trace = &pHead->traceId; + + int64_t cost = taosGetTimestampUs() - taosNtoh64(pHead->timestamp); + static int64_t EXCEPTION_LIMIT_US = 100 * 1000; + if (pConn->status == ConnNormal && pHead->noResp == 0) { transRefSrvHandle(pConn); - - tGDebug("%s conn %p %s received from %s, local info:%s, len:%d", transLabel(pTransInst), pConn, - TMSG_INFO(transMsg.msgType), pConn->dst, pConn->src, msgLen); + if (cost >= EXCEPTION_LIMIT_US) { + tGWarn("%s conn %p %s received from %s, local info:%s, len:%d, cost:%dus, recv exception", transLabel(pTransInst), + pConn, TMSG_INFO(transMsg.msgType), pConn->dst, pConn->src, msgLen, (int)cost); + } else { + tGDebug("%s conn %p %s received from %s, local info:%s, len:%d, cost:%dus", transLabel(pTransInst), pConn, + TMSG_INFO(transMsg.msgType), pConn->dst, pConn->src, msgLen, (int)cost); + } } else { - tGDebug("%s conn %p %s received from %s, local info:%s, len:%d, resp:%d, code:%d", transLabel(pTransInst), pConn, - TMSG_INFO(transMsg.msgType), pConn->dst, pConn->src, msgLen, pHead->noResp, transMsg.code); + if (cost >= EXCEPTION_LIMIT_US) { + tGWarn("%s conn %p %s received from %s, local info:%s, len:%d, resp:%d, code:%d, cost:%dus, recv exception", + transLabel(pTransInst), pConn, TMSG_INFO(transMsg.msgType), pConn->dst, pConn->src, msgLen, pHead->noResp, + transMsg.code, (int)(cost)); + } else { + tGWarn("%s conn %p %s received from %s, local info:%s, len:%d, resp:%d, code:%d, cost:%dus", + transLabel(pTransInst), pConn, TMSG_INFO(transMsg.msgType), pConn->dst, pConn->src, msgLen, pHead->noResp, + transMsg.code, (int)(cost)); + } } // pHead->noResp = 1, diff --git a/source/os/src/osSocket.c b/source/os/src/osSocket.c index fd5bde90ba..db2a9937b5 100644 --- a/source/os/src/osSocket.c +++ b/source/os/src/osSocket.c @@ -1103,3 +1103,30 @@ void taosWinSocketInit() { #else #endif } + +uint64_t taosHton64(uint64_t val) { +#if defined(WINDOWS) || defined(DARWIN) + return ((val & 0x00000000000000ff) << 7 * 8) | ((val & 0x000000000000ff00) << 5 * 8) | + ((val & 0x0000000000ff0000) << 3 * 8) | ((val & 0x00000000ff000000) << 1 * 8) | + ((val & 0x000000ff00000000) >> 1 * 8) | ((val & 0x0000ff0000000000) >> 3 * 8) | + ((val & 0x00ff000000000000) >> 5 * 8) | ((val & 0xff00000000000000) >> 7 * 8); +#else + if (__BYTE_ORDER == __LITTLE_ENDIAN) { + return (((uint64_t)htonl((int)((val << 32) >> 32))) << 32) | (unsigned int)htonl((int)(val >> 32)); + } else if (__BYTE_ORDER == __BIG_ENDIAN) { + return val; + } +#endif +} + +uint64_t taosNtoh64(uint64_t val) { +#if defined(WINDOWS) || defined(DARWIN) + return taosHton64(val); +#else + if (__BYTE_ORDER == __LITTLE_ENDIAN) { + return (((uint64_t)htonl((int)((val << 32) >> 32))) << 32) | (unsigned int)htonl((int)(val >> 32)); + } else if (__BYTE_ORDER == __BIG_ENDIAN) { + return val; + } +#endif +} From 03eaf16d0801271c83c7c966bbd819261985cac7 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 29 Nov 2022 11:42:24 +0800 Subject: [PATCH 037/105] add timestamp to msg head --- tests/system-test/0-others/compatibility.py | 30 +++++++++++---------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index 30513ac020..17733f4c15 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -72,9 +72,8 @@ class TDTestCase: def buildTaosd(self,bPath): - # os.system(f"mv {bPath}/build_bak {bPath}/build ") - os.system(f" cd {bPath} && make install ") - + print(f" build path {bPath} ") + os.system(f" cd {bPath} && cmake -DBUILD_TOOLS=on .. && make -j4 && make install") def run(self): bPath=self.getBuildPath() @@ -86,18 +85,18 @@ class TDTestCase: tableNumbers=100 recordNumbers1=100 recordNumbers2=1000 - tdsqlF=tdCom.newTdSql() - print(tdsqlF) - tdsqlF.query(f"SELECT SERVER_VERSION();") - print(tdsqlF.query(f"SELECT SERVER_VERSION();")) - oldServerVersion=tdsqlF.queryResult[0][0] - tdLog.info(f"Base server version is {oldServerVersion}") - tdsqlF.query(f"SELECT CLIENT_VERSION();") + # tdsqlF=tdCom.newTdSql() + # print(tdsqlF) + # tdsqlF.query(f"SELECT SERVER_VERSION();") + # print(tdsqlF.query(f"SELECT SERVER_VERSION();")) + # oldServerVersion=tdsqlF.queryResult[0][0] + # tdLog.info(f"Base server version is {oldServerVersion}") + # tdsqlF.query(f"SELECT CLIENT_VERSION();") - # the oldClientVersion can't be updated in the same python process,so the version is new compiled verison - oldClientVersion=tdsqlF.queryResult[0][0] - tdLog.info(f"Base client version is {oldClientVersion}") - + # # the oldClientVersion can't be updated in the same python process,so the version is new compiled verison + # oldClientVersion=tdsqlF.queryResult[0][0] + # tdLog.info(f"Base client version is {oldClientVersion}") + oldServerVersion="3.0.1.0" tdLog.printNoPrefix(f"==========step1:prepare and check data in old version-{oldServerVersion}") tdLog.info(f" LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") os.system(f"LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") @@ -138,6 +137,9 @@ class TDTestCase: os.system(f"taosBenchmark -t {tableNumbers} -n {recordNumbers2} -y ") tdsql.query(f"select count(*) from {stb}") tdsql.checkData(0,0,tableNumbers*recordNumbers2) + tdsql.query("select count(*) from db4096.stb0") + tdsql.checkData(0,0,50000) + tdsql=tdCom.newTdSql() tdLog.printNoPrefix(f"==========step4:verify backticks in taos Sql-TD18542") From 4f37947e42ab6f6e37b6759292495005bfec539f Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Tue, 29 Nov 2022 17:15:48 +0800 Subject: [PATCH 038/105] fix: minimum commitTerm as 0 in syncLogBufferInit --- source/libs/sync/inc/syncPipeline.h | 13 ++++--------- source/libs/sync/src/syncPipeline.c | 2 +- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/source/libs/sync/inc/syncPipeline.h b/source/libs/sync/inc/syncPipeline.h index e7980bc2dd..a59b14259a 100644 --- a/source/libs/sync/inc/syncPipeline.h +++ b/source/libs/sync/inc/syncPipeline.h @@ -74,22 +74,18 @@ static FORCE_INLINE int32_t syncLogGetNextRetryBackoff(SSyncLogReplMgr* pMgr) { return TMIN(pMgr->retryBackoff + 1, SYNC_MAX_RETRY_BACKOFF); } -static FORCE_INLINE int32_t syncLogReplMgrUpdateTerm(SSyncLogReplMgr* pMgr, SyncIndex index, SyncTerm term) { - if (pMgr->endIndex == 0) return -1; - ASSERT(pMgr->startIndex <= index && index < pMgr->endIndex); - pMgr->states[(index + pMgr->size) % pMgr->size].term = term; - return 0; -} - SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index); + int32_t syncLogReplMgrReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); int32_t syncLogBufferReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm, SRaftId* pDestId, bool* pBarrier); -int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode); int32_t syncLogReplMgrReplicateProbeOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index); + +int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); int32_t syncLogReplMgrProcessReplyInNormalMode(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg); + int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg); int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode); @@ -111,7 +107,6 @@ int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode); SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index, bool* pInBuf); int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf); int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SyncIndex toIndex); -int32_t syncLogBufferReplicate(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevLogTerm); #ifdef __cplusplus } diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 00f3791ea2..1fc6798471 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -150,7 +150,7 @@ int32_t syncLogBufferInitWithoutLock(SSyncLogBuffer* pBuf, SSyncNode* pNode) { goto _err; } SyncIndex commitIndex = snapshot.lastApplyIndex; - SyncTerm commitTerm = snapshot.lastApplyTerm; + SyncTerm commitTerm = TMAX(snapshot.lastApplyTerm, 0); if (syncLogValidateAlignmentOfCommit(pNode, commitIndex)) { terrno = TSDB_CODE_WAL_LOG_INCOMPLETE; goto _err; From f1991ac88271541ecab48be0d7674fd4dd40395b Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Tue, 29 Nov 2022 17:19:47 +0800 Subject: [PATCH 039/105] enh: improve runOneLinux and TDTestCase of python test scripts --- tests/pytest/util/cases.py | 2 +- tests/system-test/0-others/taosdShell.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/pytest/util/cases.py b/tests/pytest/util/cases.py index 3eb5cf2548..82aa552359 100644 --- a/tests/pytest/util/cases.py +++ b/tests/pytest/util/cases.py @@ -63,7 +63,7 @@ class TDCases: tdLog.info("total %d Linux test case(s) executed" % (runNum)) - def runOneLinux(self, conn, fileName, replicaVar): + def runOneLinux(self, conn, fileName, replicaVar=1): testModule = self.__dynamicLoadModule(fileName) runNum = 0 diff --git a/tests/system-test/0-others/taosdShell.py b/tests/system-test/0-others/taosdShell.py index 581448a6d9..7ad7e4d0ef 100644 --- a/tests/system-test/0-others/taosdShell.py +++ b/tests/system-test/0-others/taosdShell.py @@ -166,7 +166,7 @@ class TDTestCase: # keyDict['c'] = cfgPath # keyDict['P'] = self.serverPort tdDnodes=cluster.dnodes - for i in range(5): + for i in range(len(tdDnodes)): tdDnodes[i].stoptaosd() From 20187bacc6bfd22c65632c8fa84ae99855b2bd70 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 29 Nov 2022 17:37:43 +0800 Subject: [PATCH 040/105] change parameterr --- tests/system-test/0-others/compatibility.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index 17733f4c15..e1ce9e13af 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -98,8 +98,8 @@ class TDTestCase: # tdLog.info(f"Base client version is {oldClientVersion}") oldServerVersion="3.0.1.0" tdLog.printNoPrefix(f"==========step1:prepare and check data in old version-{oldServerVersion}") - tdLog.info(f" LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") - os.system(f"LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") + tdLog.info(f"taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") + os.system(f"/usr/local/bin/taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") sleep(3) # tdsqlF.query(f"select count(*) from {stb}") @@ -108,10 +108,10 @@ class TDTestCase: sleep(2) print(f"start taosd: nohup taosd -c {cPath} & ") - os.system(f" nohup taosd -c {cPath} & " ) + os.system(f" nohup /usr/bin/taosd -c {cPath} & " ) sleep(10) tdLog.info(" LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y ") - os.system("LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y") + os.system("/usr/local/bin/taosBenchmark -f 0-others/compa4096.json -y") os.system("pkill -9 taosd") @@ -134,7 +134,7 @@ class TDTestCase: tdLog.printNoPrefix(f"==========step3:prepare and check data in new version-{nowServerVersion}") tdsql.query(f"select count(*) from {stb}") tdsql.checkData(0,0,tableNumbers*recordNumbers1) - os.system(f"taosBenchmark -t {tableNumbers} -n {recordNumbers2} -y ") + os.system(f"/usr/local/bin/taosBenchmark -t {tableNumbers} -n {recordNumbers2} -y ") tdsql.query(f"select count(*) from {stb}") tdsql.checkData(0,0,tableNumbers*recordNumbers2) tdsql.query("select count(*) from db4096.stb0") From 81e6a9d906e34088ac54274aa30a77c9a3669cf6 Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Tue, 29 Nov 2022 21:41:07 +0800 Subject: [PATCH 041/105] fix:concurrency conflicts occur when obtaining windows system time --- source/os/src/osTime.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/source/os/src/osTime.c b/source/os/src/osTime.c index 58a09565f9..4634fae24a 100644 --- a/source/os/src/osTime.c +++ b/source/os/src/osTime.c @@ -551,17 +551,26 @@ int32_t taosClockGetTime(int clock_id, struct timespec *pTS) { static SYSTEMTIME ss; static LARGE_INTEGER offset; - ss.wYear = 1970; - ss.wMonth = 1; - ss.wDay = 1; - ss.wHour = 0; - ss.wMinute = 0; - ss.wSecond = 0; - ss.wMilliseconds = 0; - SystemTimeToFileTime(&ss, &ff); - offset.QuadPart = ff.dwHighDateTime; - offset.QuadPart <<= 32; - offset.QuadPart |= ff.dwLowDateTime; + static int8_t offsetInit = 0; + static volatile bool offsetInitFinished = false; + int8_t old = atomic_val_compare_exchange_8(&offsetInit, 0, 1); + if (0 == old) { + ss.wYear = 1970; + ss.wMonth = 1; + ss.wDay = 1; + ss.wHour = 0; + ss.wMinute = 0; + ss.wSecond = 0; + ss.wMilliseconds = 0; + SystemTimeToFileTime(&ss, &ff); + offset.QuadPart = ff.dwHighDateTime; + offset.QuadPart <<= 32; + offset.QuadPart |= ff.dwLowDateTime; + offsetInitFinished = true; + } else { + while (!offsetInitFinished) + ; // Ensure initialization is completed. + } GetSystemTimeAsFileTime(&f); t.QuadPart = f.dwHighDateTime; From cb09f2be939c366b552e2520f4a933bd53363981 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Tue, 29 Nov 2022 22:43:34 +0800 Subject: [PATCH 042/105] fix compile --- tests/system-test/0-others/compatibility.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index e1ce9e13af..7926812dff 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -132,8 +132,8 @@ class TDTestCase: tdLog.info(f"New client version is {nowClientVersion}") tdLog.printNoPrefix(f"==========step3:prepare and check data in new version-{nowServerVersion}") - tdsql.query(f"select count(*) from {stb}") - tdsql.checkData(0,0,tableNumbers*recordNumbers1) + #tdsql.query(f"select count(*) from {stb}") + #tdsql.checkData(0,0,tableNumbers*recordNumbers1) os.system(f"/usr/local/bin/taosBenchmark -t {tableNumbers} -n {recordNumbers2} -y ") tdsql.query(f"select count(*) from {stb}") tdsql.checkData(0,0,tableNumbers*recordNumbers2) From decb17fcb16c38f548bd2a1bed1258ba1400038d Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Tue, 29 Nov 2022 20:21:33 +0800 Subject: [PATCH 043/105] fix: use recursive mutex for relocking ring log buffer in syncNodeDoConfigChange --- source/libs/sync/inc/syncPipeline.h | 1 + source/libs/sync/src/syncCommit.c | 1 + source/libs/sync/src/syncMain.c | 2 +- source/libs/sync/src/syncPipeline.c | 16 +++++++++++++++- source/libs/sync/src/syncReplication.c | 2 +- 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/source/libs/sync/inc/syncPipeline.h b/source/libs/sync/inc/syncPipeline.h index a59b14259a..4208d40a69 100644 --- a/source/libs/sync/inc/syncPipeline.h +++ b/source/libs/sync/inc/syncPipeline.h @@ -55,6 +55,7 @@ typedef struct SSyncLogBuffer { int64_t endIndex; int64_t size; TdThreadMutex mutex; + TdThreadMutexAttr attr; } SSyncLogBuffer; // SSyncLogRepMgr diff --git a/source/libs/sync/src/syncCommit.c b/source/libs/sync/src/syncCommit.c index 3377efe12c..07b1101256 100644 --- a/source/libs/sync/src/syncCommit.c +++ b/source/libs/sync/src/syncCommit.c @@ -84,6 +84,7 @@ void syncOneReplicaAdvance(SSyncNode* pSyncNode) { } void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) { + ASSERT(false && "deprecated"); if (pSyncNode == NULL) { sError("pSyncNode is NULL"); return; diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 2b72c8d287..d809c28090 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -1602,7 +1602,7 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde // Raft 3.6.2 Committing entries from previous terms syncNodeAppendNoop(pSyncNode); - syncMaybeAdvanceCommitIndex(pSyncNode); + // syncMaybeAdvanceCommitIndex(pSyncNode); } else { syncNodeBecomeFollower(pSyncNode, tmpbuf); diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 1fc6798471..e655ed13c8 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -916,11 +916,24 @@ SSyncLogBuffer* syncLogBufferCreate() { ASSERT(pBuf->size == TSDB_SYNC_LOG_BUFFER_SIZE); - if (taosThreadMutexInit(&pBuf->mutex, NULL) < 0) { + if (taosThreadMutexAttrInit(&pBuf->attr) < 0) { + sError("failed to init log buffer mutexattr due to %s", strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + if (taosThreadMutexAttrSetType(&pBuf->attr, PTHREAD_MUTEX_RECURSIVE) < 0) { + sError("failed to set log buffer mutexattr type due to %s", strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + if (taosThreadMutexInit(&pBuf->mutex, &pBuf->attr) < 0) { sError("failed to init log buffer mutex due to %s", strerror(errno)); terrno = TAOS_SYSTEM_ERROR(errno); goto _err; } + return pBuf; _err: @@ -947,6 +960,7 @@ void syncLogBufferDestroy(SSyncLogBuffer* pBuf) { } syncLogBufferClear(pBuf); (void)taosThreadMutexDestroy(&pBuf->mutex); + (void)taosThreadMutexAttrDestroy(&pBuf->attr); (void)taosMemoryFree(pBuf); return; } diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c index ba9fe5b56a..0f56921ec7 100644 --- a/source/libs/sync/src/syncReplication.c +++ b/source/libs/sync/src/syncReplication.c @@ -49,7 +49,7 @@ int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg); int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId, bool snapshot) { - ASSERT(false && "deplicated"); + ASSERT(false && "deprecated"); // next index SyncIndex nextIndex = syncIndexMgrGetIndex(pSyncNode->pNextIndex, pDestId); From 2888574be92e4622c99c5158b90044e42e60160a Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Wed, 30 Nov 2022 10:51:57 +0800 Subject: [PATCH 044/105] fix compile --- tests/system-test/0-others/compatibility.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index 7926812dff..635046e37a 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -110,7 +110,7 @@ class TDTestCase: print(f"start taosd: nohup taosd -c {cPath} & ") os.system(f" nohup /usr/bin/taosd -c {cPath} & " ) sleep(10) - tdLog.info(" LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y ") + #tdLog.info(" LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y ") os.system("/usr/local/bin/taosBenchmark -f 0-others/compa4096.json -y") os.system("pkill -9 taosd") @@ -134,7 +134,7 @@ class TDTestCase: tdLog.printNoPrefix(f"==========step3:prepare and check data in new version-{nowServerVersion}") #tdsql.query(f"select count(*) from {stb}") #tdsql.checkData(0,0,tableNumbers*recordNumbers1) - os.system(f"/usr/local/bin/taosBenchmark -t {tableNumbers} -n {recordNumbers2} -y ") + os.system(f"taosBenchmark -t {tableNumbers} -n {recordNumbers2} -y ") tdsql.query(f"select count(*) from {stb}") tdsql.checkData(0,0,tableNumbers*recordNumbers2) tdsql.query("select count(*) from db4096.stb0") From b6d3d2322ccee0bef8d9c32d78a7c63cbf33be77 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 30 Nov 2022 11:02:07 +0800 Subject: [PATCH 045/105] fix: cannot close vnode while transferring snapshot --- source/dnode/vnode/src/vnd/vnodeSync.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index 6c205b5522..ad6f153aca 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -515,6 +515,16 @@ void vnodeSyncPreClose(SVnode *pVnode) { vInfo("vgId:%d, pre close sync", pVnode->config.vgId); syncLeaderTransfer(pVnode->sync); syncPreStop(pVnode->sync); + + while (!syncSnapshotRecving(pVnode->sync)) { + vInfo("vgId:%s, snapshot is recving"); + taosMsleep(300); + } + while (!syncSnapshotSending(pVnode->sync)) { + vInfo("vgId:%s, snapshot is sending"); + taosMsleep(300); + } + taosThreadMutexLock(&pVnode->lock); if (pVnode->blocked) { vInfo("vgId:%d, post block after close sync", pVnode->config.vgId); From 82bc543ed7d08ae28955a32216cc62c534e09811 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 30 Nov 2022 11:05:25 +0800 Subject: [PATCH 046/105] fix: cannot close mnode while transferring snapshot --- source/dnode/mnode/impl/src/mndMain.c | 9 +++++++++ source/dnode/vnode/src/vnd/vnodeSync.c | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index 2d888d2ff7..1b74b00dac 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -491,6 +491,15 @@ void mndPreClose(SMnode *pMnode) { if (pMnode != NULL) { syncLeaderTransfer(pMnode->syncMgmt.sync); syncPreStop(pMnode->syncMgmt.sync); + + while (!syncSnapshotRecving(pMnode->syncMgmt.sync)) { + mInfo("vgId:1, snapshot is recving"); + taosMsleep(300); + } + while (!syncSnapshotSending(pMnode->syncMgmt.sync)) { + mInfo("vgId:1, snapshot is sending"); + taosMsleep(300); + } } } diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index ad6f153aca..5ae9813bef 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -517,11 +517,11 @@ void vnodeSyncPreClose(SVnode *pVnode) { syncPreStop(pVnode->sync); while (!syncSnapshotRecving(pVnode->sync)) { - vInfo("vgId:%s, snapshot is recving"); + vInfo("vgId:%d, snapshot is recving", pVnode->config.vgId); taosMsleep(300); } while (!syncSnapshotSending(pVnode->sync)) { - vInfo("vgId:%s, snapshot is sending"); + vInfo("vgId:%d, snapshot is sending", pVnode->config.vgId); taosMsleep(300); } From 5ecbcb10544ae59b9d279cfa63f918e1ce421620 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 30 Nov 2022 11:07:14 +0800 Subject: [PATCH 047/105] fix: cannot close mnode while transferring snapshot --- source/dnode/mnode/impl/src/mndMain.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index 1b74b00dac..a88fb61e0c 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -492,11 +492,11 @@ void mndPreClose(SMnode *pMnode) { syncLeaderTransfer(pMnode->syncMgmt.sync); syncPreStop(pMnode->syncMgmt.sync); - while (!syncSnapshotRecving(pMnode->syncMgmt.sync)) { + while (syncSnapshotRecving(pMnode->syncMgmt.sync)) { mInfo("vgId:1, snapshot is recving"); taosMsleep(300); } - while (!syncSnapshotSending(pMnode->syncMgmt.sync)) { + while (syncSnapshotSending(pMnode->syncMgmt.sync)) { mInfo("vgId:1, snapshot is sending"); taosMsleep(300); } From 3850b58a3d9a783a45b55ff1d4faa9fa2ddc2ac8 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 30 Nov 2022 11:08:30 +0800 Subject: [PATCH 048/105] fix: cannot close vnode while transferring snapshot --- source/dnode/vnode/src/vnd/vnodeSync.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index 5ae9813bef..dd382411c1 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -516,11 +516,11 @@ void vnodeSyncPreClose(SVnode *pVnode) { syncLeaderTransfer(pVnode->sync); syncPreStop(pVnode->sync); - while (!syncSnapshotRecving(pVnode->sync)) { + while (syncSnapshotRecving(pVnode->sync)) { vInfo("vgId:%d, snapshot is recving", pVnode->config.vgId); taosMsleep(300); } - while (!syncSnapshotSending(pVnode->sync)) { + while (syncSnapshotSending(pVnode->sync)) { vInfo("vgId:%d, snapshot is sending", pVnode->config.vgId); taosMsleep(300); } From a8832e881498eaa1a6f81ef42600ad8718aa48c1 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Wed, 30 Nov 2022 11:20:03 +0800 Subject: [PATCH 049/105] refactor(sync): modify info log --- source/libs/sync/inc/syncInt.h | 1 + source/libs/sync/src/syncMain.c | 1 + source/libs/sync/src/syncTimeout.c | 8 +++++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index d764901ab3..145880fa3e 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -197,6 +197,7 @@ typedef struct SSyncNode { int32_t configChangeNum; int32_t hbSlowNum; int32_t hbrSlowNum; + int32_t tmrRoutineNum; bool isStart; diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 19a3bd06cf..3117f6e4c9 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -1037,6 +1037,7 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) { pSyncNode->configChangeNum = 0; pSyncNode->hbSlowNum = 0; pSyncNode->hbrSlowNum = 0; + pSyncNode->tmrRoutineNum = 0; sNTrace(pSyncNode, "sync open, node:%p", pSyncNode); diff --git a/source/libs/sync/src/syncTimeout.c b/source/libs/sync/src/syncTimeout.c index ca67eb1880..0b58f1080f 100644 --- a/source/libs/sync/src/syncTimeout.c +++ b/source/libs/sync/src/syncTimeout.c @@ -52,7 +52,13 @@ static void syncNodeCleanConfigIndex(SSyncNode* ths) { } static int32_t syncNodeTimerRoutine(SSyncNode* ths) { - sNInfo(ths, "timer routines"); + ths->tmrRoutineNum++; + + if (ths->tmrRoutineNum % 60 == 0 && ths->replicaNum > 1) { + sNInfo(ths, "timer routines"); + } else { + sNTrace(ths, "timer routines"); + } // timer replicate syncNodeReplicate(ths); From 3b33b4dadbbfb5ba42962151d2204521da513398 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 30 Nov 2022 11:37:50 +0800 Subject: [PATCH 050/105] change parameterr --- tests/system-test/0-others/compatibility.py | 44 ++++++++++----------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index 7926812dff..30513ac020 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -72,8 +72,9 @@ class TDTestCase: def buildTaosd(self,bPath): - print(f" build path {bPath} ") - os.system(f" cd {bPath} && cmake -DBUILD_TOOLS=on .. && make -j4 && make install") + # os.system(f"mv {bPath}/build_bak {bPath}/build ") + os.system(f" cd {bPath} && make install ") + def run(self): bPath=self.getBuildPath() @@ -85,21 +86,21 @@ class TDTestCase: tableNumbers=100 recordNumbers1=100 recordNumbers2=1000 - # tdsqlF=tdCom.newTdSql() - # print(tdsqlF) - # tdsqlF.query(f"SELECT SERVER_VERSION();") - # print(tdsqlF.query(f"SELECT SERVER_VERSION();")) - # oldServerVersion=tdsqlF.queryResult[0][0] - # tdLog.info(f"Base server version is {oldServerVersion}") - # tdsqlF.query(f"SELECT CLIENT_VERSION();") + tdsqlF=tdCom.newTdSql() + print(tdsqlF) + tdsqlF.query(f"SELECT SERVER_VERSION();") + print(tdsqlF.query(f"SELECT SERVER_VERSION();")) + oldServerVersion=tdsqlF.queryResult[0][0] + tdLog.info(f"Base server version is {oldServerVersion}") + tdsqlF.query(f"SELECT CLIENT_VERSION();") - # # the oldClientVersion can't be updated in the same python process,so the version is new compiled verison - # oldClientVersion=tdsqlF.queryResult[0][0] - # tdLog.info(f"Base client version is {oldClientVersion}") - oldServerVersion="3.0.1.0" + # the oldClientVersion can't be updated in the same python process,so the version is new compiled verison + oldClientVersion=tdsqlF.queryResult[0][0] + tdLog.info(f"Base client version is {oldClientVersion}") + tdLog.printNoPrefix(f"==========step1:prepare and check data in old version-{oldServerVersion}") - tdLog.info(f"taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") - os.system(f"/usr/local/bin/taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") + tdLog.info(f" LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") + os.system(f"LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") sleep(3) # tdsqlF.query(f"select count(*) from {stb}") @@ -108,10 +109,10 @@ class TDTestCase: sleep(2) print(f"start taosd: nohup taosd -c {cPath} & ") - os.system(f" nohup /usr/bin/taosd -c {cPath} & " ) + os.system(f" nohup taosd -c {cPath} & " ) sleep(10) tdLog.info(" LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y ") - os.system("/usr/local/bin/taosBenchmark -f 0-others/compa4096.json -y") + os.system("LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y") os.system("pkill -9 taosd") @@ -132,14 +133,11 @@ class TDTestCase: tdLog.info(f"New client version is {nowClientVersion}") tdLog.printNoPrefix(f"==========step3:prepare and check data in new version-{nowServerVersion}") - #tdsql.query(f"select count(*) from {stb}") - #tdsql.checkData(0,0,tableNumbers*recordNumbers1) - os.system(f"/usr/local/bin/taosBenchmark -t {tableNumbers} -n {recordNumbers2} -y ") + tdsql.query(f"select count(*) from {stb}") + tdsql.checkData(0,0,tableNumbers*recordNumbers1) + os.system(f"taosBenchmark -t {tableNumbers} -n {recordNumbers2} -y ") tdsql.query(f"select count(*) from {stb}") tdsql.checkData(0,0,tableNumbers*recordNumbers2) - tdsql.query("select count(*) from db4096.stb0") - tdsql.checkData(0,0,50000) - tdsql=tdCom.newTdSql() tdLog.printNoPrefix(f"==========step4:verify backticks in taos Sql-TD18542") From 5556fd0c45194cc755e4fda8e47df7d62c3f32c6 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 30 Nov 2022 12:02:54 +0800 Subject: [PATCH 051/105] enh: add sync offline state --- include/libs/sync/sync.h | 1 + source/dnode/mgmt/mgmt_dnode/src/dmHandle.c | 4 ++-- source/dnode/mnode/impl/src/mndMain.c | 6 +++--- source/dnode/mnode/impl/src/mndMnode.c | 2 +- source/dnode/mnode/impl/src/mndVgroup.c | 4 ++-- source/libs/sync/src/syncMain.c | 6 +++++- 6 files changed, 14 insertions(+), 9 deletions(-) diff --git a/include/libs/sync/sync.h b/include/libs/sync/sync.h index 1b65d95cb1..604e1479d5 100644 --- a/include/libs/sync/sync.h +++ b/include/libs/sync/sync.h @@ -67,6 +67,7 @@ typedef struct SWal SWal; typedef struct SSyncRaftEntry SSyncRaftEntry; typedef enum { + TAOS_SYNC_STATE_OFFLINE = 0, TAOS_SYNC_STATE_FOLLOWER = 100, TAOS_SYNC_STATE_CANDIDATE = 101, TAOS_SYNC_STATE_LEADER = 102, diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c index 8a8561161b..a7ad983b0c 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c @@ -150,7 +150,7 @@ static void dmGetServerRunStatus(SDnodeMgmt *pMgmt, SServerStatusRsp *pStatus) { SServerStatusRsp statusRsp = {0}; SMonMloadInfo minfo = {0}; (*pMgmt->getMnodeLoadsFp)(&minfo); - if (minfo.isMnode && minfo.load.syncState == TAOS_SYNC_STATE_ERROR) { + if (minfo.isMnode && (minfo.load.syncState == TAOS_SYNC_STATE_ERROR || minfo.load.syncState == TAOS_SYNC_STATE_OFFLINE)) { pStatus->statusCode = TSDB_SRV_STATUS_SERVICE_DEGRADED; snprintf(pStatus->details, sizeof(pStatus->details), "mnode sync state is %s", syncStr(minfo.load.syncState)); return; @@ -160,7 +160,7 @@ static void dmGetServerRunStatus(SDnodeMgmt *pMgmt, SServerStatusRsp *pStatus) { (*pMgmt->getVnodeLoadsFp)(&vinfo); for (int32_t i = 0; i < taosArrayGetSize(vinfo.pVloads); ++i) { SVnodeLoad *pLoad = taosArrayGet(vinfo.pVloads, i); - if (pLoad->syncState == TAOS_SYNC_STATE_ERROR) { + if (pLoad->syncState == TAOS_SYNC_STATE_ERROR || pLoad->syncState == TAOS_SYNC_STATE_OFFLINE) { pStatus->statusCode = TSDB_SRV_STATUS_SERVICE_DEGRADED; snprintf(pStatus->details, sizeof(pStatus->details), "vnode:%d sync state is %s", pLoad->vgId, syncStr(pLoad->syncState)); diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index a88fb61e0c..f533fafeee 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -151,10 +151,10 @@ static void mndSetVgroupOffline(SMnode *pMnode, int32_t dnodeId, int64_t curMs) bool roleChanged = false; for (int32_t vg = 0; vg < pVgroup->replica; ++vg) { if (pVgroup->vnodeGid[vg].dnodeId == dnodeId) { - if (pVgroup->vnodeGid[vg].syncState != TAOS_SYNC_STATE_ERROR) { + if (pVgroup->vnodeGid[vg].syncState != TAOS_SYNC_STATE_OFFLINE) { mInfo("vgId:%d, state changed by offline check, old state:%s restored:%d new state:error restored:0", pVgroup->vgId, syncStr(pVgroup->vnodeGid[vg].syncState), pVgroup->vnodeGid[vg].syncRestore); - pVgroup->vnodeGid[vg].syncState = TAOS_SYNC_STATE_ERROR; + pVgroup->vnodeGid[vg].syncState = TAOS_SYNC_STATE_OFFLINE; pVgroup->vnodeGid[vg].syncRestore = 0; roleChanged = true; } @@ -756,7 +756,7 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr tstrncpy(desc.status, "ready", sizeof(desc.status)); pClusterInfo->vgroups_alive++; } - if (pVgid->syncState != TAOS_SYNC_STATE_ERROR) { + if (pVgid->syncState != TAOS_SYNC_STATE_ERROR && pVgid->syncState != TAOS_SYNC_STATE_OFFLINE) { pClusterInfo->vnodes_alive++; } pClusterInfo->vnodes_total++; diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c index b02ca4c773..7c86a5be22 100644 --- a/source/dnode/mnode/impl/src/mndMnode.c +++ b/source/dnode/mnode/impl/src/mndMnode.c @@ -185,7 +185,7 @@ static int32_t mndMnodeActionInsert(SSdb *pSdb, SMnodeObj *pObj) { return -1; } - pObj->syncState = TAOS_SYNC_STATE_ERROR; + pObj->syncState = TAOS_SYNC_STATE_OFFLINE; mndReloadSyncConfig(pSdb->pMnode); return 0; } diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index 4fa00dcf7c..dda0d7d26a 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -887,7 +887,7 @@ int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) { } pVgid->dnodeId = pDnode->id; - pVgid->syncState = TAOS_SYNC_STATE_ERROR; + pVgid->syncState = TAOS_SYNC_STATE_OFFLINE; mInfo("db:%s, vgId:%d, vn:%d is added, memory:%" PRId64 ", dnode:%d avail:%" PRId64 " used:%" PRId64, pVgroup->dbName, pVgroup->vgId, pVgroup->replica, vgMem, pVgid->dnodeId, pDnode->memAvail, pDnode->memUsed); @@ -1193,7 +1193,7 @@ static int32_t mndAddIncVgroupReplicaToTrans(SMnode *pMnode, STrans *pTrans, SDb SVnodeGid *pGid = &pVgroup->vnodeGid[pVgroup->replica]; pVgroup->replica++; pGid->dnodeId = newDnodeId; - pGid->syncState = TAOS_SYNC_STATE_ERROR; + pGid->syncState = TAOS_SYNC_STATE_OFFLINE; for (int32_t i = 0; i < pVgroup->replica - 1; ++i) { if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, pVgroup, pVgroup->vnodeGid[i].dnodeId) != 0) return -1; diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 19a3bd06cf..7a72b89078 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -2457,8 +2457,12 @@ const char* syncStr(ESyncState state) { return "candidate"; case TAOS_SYNC_STATE_LEADER: return "leader"; - default: + case TAOS_SYNC_STATE_ERROR: return "error"; + case TAOS_SYNC_STATE_OFFLINE: + return "offline"; + default: + return "unknown"; } } From 12191a46f7a2906c98c739cd506f6b12cfea0a0c Mon Sep 17 00:00:00 2001 From: plum-lihui Date: Wed, 30 Nov 2022 12:05:53 +0800 Subject: [PATCH 052/105] test: modify limit2.sim to limit.py --- tests/parallel_test/cases.task | 1 + tests/system-test/2-query/limit.py | 353 +++++++++++++++++++++++++++++ 2 files changed, 354 insertions(+) create mode 100644 tests/system-test/2-query/limit.py diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 1df0d5ef71..6c5c1718b2 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -529,6 +529,7 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/leastsquares.py -R ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/length.py ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/length.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/limit.py ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/log.py ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/log.py -R ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/lower.py diff --git a/tests/system-test/2-query/limit.py b/tests/system-test/2-query/limit.py new file mode 100644 index 0000000000..91719aa21b --- /dev/null +++ b/tests/system-test/2-query/limit.py @@ -0,0 +1,353 @@ + +import taos +import sys +import time +import socket +import os +import threading +import math + +from util.log import * +from util.sql import * +from util.cases import * +from util.dnodes import * +from util.common import * +# from tmqCommon import * + +class TDTestCase: + def __init__(self): + self.vgroups = 2 + self.ctbNum = 10 + self.rowsPerTbl = 10000 + + def init(self, conn, logSql, replicaVar=1): + self.replicaVar = int(replicaVar) + tdLog.debug(f"start to excute {__file__}") + tdSql.init(conn.cursor(), False) + + def create_database(self,tsql, dbName,dropFlag=1,vgroups=2,replica=1): + if dropFlag == 1: + tsql.execute("drop database if exists %s"%(dbName)) + + tsql.execute("create database if not exists %s vgroups %d replica %d"%(dbName, vgroups, replica)) + tdLog.debug("complete to create database %s"%(dbName)) + return + + def create_stable(self,tsql, paraDict): + colString = tdCom.gen_column_type_str(colname_prefix=paraDict["colPrefix"], column_elm_list=paraDict["colSchema"]) + tagString = tdCom.gen_tag_type_str(tagname_prefix=paraDict["tagPrefix"], tag_elm_list=paraDict["tagSchema"]) + # tdLog.debug(colString) + # tdLog.debug(tagString) + sqlString = f"create table if not exists %s.%s (%s) tags (%s)"%(paraDict["dbName"], paraDict["stbName"], colString, tagString) + tdLog.debug("%s"%(sqlString)) + tsql.execute(sqlString) + return + + def create_ctable(self,tsql=None, dbName='dbx',stbName='stb',ctbPrefix='ctb',ctbNum=1,ctbStartIdx=0): + for i in range(ctbNum): + sqlString = "create table %s.%s%d using %s.%s tags(%d, 'tb%d', 'tb%d', %d, %d, %d)"%(dbName,ctbPrefix,i+ctbStartIdx,dbName,stbName,i+ctbStartIdx,i+ctbStartIdx,i+ctbStartIdx,i+ctbStartIdx,i+ctbStartIdx,i+ctbStartIdx) + tsql.execute(sqlString) + + tdLog.debug("complete to create %d child tables by %s.%s" %(ctbNum, dbName, stbName)) + return + + def insert_data(self,tsql,dbName,ctbPrefix,ctbNum,rowsPerTbl,batchNum,startTs,tsStep): + tdLog.debug("start to insert data ............") + tsql.execute("use %s" %dbName) + pre_insert = "insert into " + sql = pre_insert + + # t = time.time() + # startTs = int(round(t * 1000)) + #tdLog.debug("doing insert data into stable:%s rows:%d ..."%(stbName, allRows)) + for i in range(ctbNum): + rowsBatched = 0 + sql += " %s%d values "%(ctbPrefix,i) + for j in range(rowsPerTbl): + if (i < ctbNum/2): + sql += "(%d, %d, %d, %d,%d,%d,%d,true,'binary%d', 'nchar%d') "%(startTs + j*tsStep, j%10, j%10, j%10, j%10, j%10, j%10, j%10, j%10) + else: + sql += "(%d, %d, NULL, %d,NULL,%d,%d,true,'binary%d', 'nchar%d') "%(startTs + j*tsStep, j%10, j%10, j%10, j%10, j%10, j%10) + rowsBatched += 1 + if ((rowsBatched == batchNum) or (j == rowsPerTbl - 1)): + tsql.execute(sql) + # print("===sql: %s"%(sql)) + rowsBatched = 0 + if j < rowsPerTbl - 1: + sql = "insert into %s%d values " %(ctbPrefix,i) + else: + sql = "insert into " + #end sql + if sql != pre_insert: + #print("insert sql:%s"%sql) + tsql.execute(sql) + # print("===sql: %s"%(sql)) + tdLog.debug("insert data ............ [OK]") + return + + def prepareTestEnv(self): + tdLog.printNoPrefix("======== prepare test env include database, stable, ctables, and insert data: ") + paraDict = {'dbName': 'lm2_db0', + 'dropFlag': 1, + 'vgroups': 2, + 'stbName': 'lm2_stb0', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'FLOAT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'smallint', 'count':1},{'type': 'tinyint', 'count':1},{'type': 'bool', 'count':1},{'type': 'binary', 'len':10, 'count':1},{'type': 'nchar', 'len':10, 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1},{'type': 'nchar', 'len':20, 'count':1},{'type': 'binary', 'len':20, 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'smallint', 'count':1},{'type': 'DOUBLE', 'count':1}], + 'ctbPrefix': 'lm2_tb', + 'ctbStartIdx': 0, + 'ctbNum': 10, + 'rowsPerTbl': 10000, + 'batchNum': 3000, + 'startTs': 1537146000000, + 'tsStep': 600000} + + paraDict['vgroups'] = self.vgroups + paraDict['ctbNum'] = self.ctbNum + paraDict['rowsPerTbl'] = self.rowsPerTbl + + tdLog.info("create database") + self.create_database(tsql=tdSql, dbName=paraDict["dbName"], dropFlag=paraDict["dropFlag"], vgroups=paraDict["vgroups"], replica=self.replicaVar) + + tdLog.info("create stb") + self.create_stable(tsql=tdSql, paraDict=paraDict) + + tdLog.info("create child tables") + self.create_ctable(tsql=tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"],ctbPrefix=paraDict["ctbPrefix"],ctbNum=paraDict["ctbNum"],ctbStartIdx=paraDict["ctbStartIdx"]) + self.insert_data(tsql=tdSql, dbName=paraDict["dbName"],ctbPrefix=paraDict["ctbPrefix"],ctbNum=paraDict["ctbNum"],rowsPerTbl=paraDict["rowsPerTbl"],batchNum=paraDict["batchNum"],startTs=paraDict["startTs"],tsStep=paraDict["tsStep"]) + return + + def tmqCase1(self): + tdLog.printNoPrefix("======== test case 1: ") + paraDict = {'dbName': 'lm2_db0', + 'dropFlag': 1, + 'vgroups': 2, + 'stbName': 'lm2_stb0', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'FLOAT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'smallint', 'count':1},{'type': 'tinyint', 'count':1},{'type': 'bool', 'count':1},{'type': 'binary', 'len':10, 'count':1},{'type': 'nchar', 'len':10, 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1},{'type': 'nchar', 'len':20, 'count':1},{'type': 'binary', 'len':20, 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'smallint', 'count':1},{'type': 'DOUBLE', 'count':1}], + 'ctbPrefix': 'lm2_tb', + 'ctbStartIdx': 0, + 'ctbNum': 10, + 'rowsPerTbl': 10000, + 'batchNum': 3000, + 'startTs': 1537146000000, + 'tsStep': 600000} + + val1 = 1 + val2 = paraDict["ctbNum"] - 1 + # select count(*), t1, t2, t3, t4, t5, t6 from $stb where t1 > $val1 and t1 < $val2 group by t1, t2, t3, t4, t5, t6 order by t1 asc limit 1 offset 0 + sqlStr = f"select count(*), t1, t2, t3, t4, t5, t6 from %s where t1 > %d and t1 < %d group by t1, t2, t3, t4, t5, t6 order by t1 asc limit 1 offset 0"%(paraDict["stbName"], val1, val2) + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(1) + tdSql.checkData(0, 0, paraDict["rowsPerTbl"]) + tdSql.checkData(0, 1, 2) + tdSql.checkData(0, 2, "tb2") + tdSql.checkData(0, 3, "tb2") + tdSql.checkData(0, 4, 2) + tdSql.checkData(0, 5, 2) + + # select count(*), t3, t4 from $stb where t2 like '%' and t1 > 2 and t1 < 5 group by t3, t4 order by t3 desc limit 2 offset 0 + sqlStr = f"select count(*), t3, t4 from %s where t2 like '%%' and t1 > 2 and t1 < 5 group by t3, t4 order by t3 desc limit 2 offset 0"%(paraDict["stbName"]) + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(2) + tdSql.checkData(0, 0, paraDict["rowsPerTbl"]) + tdSql.checkData(0, 1, "tb4") + tdSql.checkData(0, 2, 4) + + tdSql.checkData(1, 1, "tb3") + tdSql.checkData(1, 2, 3) + + # select count(*) from $stb where t2 like '%' and t1 > 2 and t1 < 5 group by t3, t4 order by t3 desc limit 1 offset 1 + sqlStr = f"select count(*) from %s where t2 like '%%' and t1 > 2 and t1 < 5 group by t3, t4 order by t3 desc limit 1 offset 1"%(paraDict["stbName"]) + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(1) + + ## TBASE-348 + tdSql.error(f"select count(*) from %s where t1 like 1"%(paraDict["stbName"])) + + ts0 = paraDict["startTs"] + delta = paraDict["tsStep"] + tsu = paraDict["rowsPerTbl"] * delta + tsu = tsu - delta + tsu = tsu + ts0 + tb = paraDict["ctbPrefix"] + '0' + # select _wstart, max(c1) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, -1) limit 10 offset 1 + sqlStr = f"select _wstart, max(c1) from %s where ts >= %d and ts <= %d interval(5m) fill(value, -1) limit 10 offset 1"%(tb, ts0, tsu) + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(10) + tdSql.checkData(0, 0, "18-09-17 09:05:00.000") + tdSql.checkData(0, 1, -1) + tdSql.checkData(1, 1, 1) + tdSql.checkData(9, 0, "18-09-17 09:50:00.000") + tdSql.checkData(9, 1, 5) + + tb5 = paraDict["ctbPrefix"] + '5' + sqlStr = f"select max(c1), min(c2) from %s where ts >= %d and ts <= %d interval(5m) fill(value, -1, -2) limit 10 offset 1"%(tb5, ts0, tsu) + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(10) + tdSql.checkData(0, 0, -1) + tdSql.checkData(0, 1, -2) + tdSql.checkData(1, 0, 1) + tdSql.checkData(1, 1, -2) + tdSql.checkData(9, 0, 5) + tdSql.checkData(9, 1, -2) + + ### [TBASE-350] + ## tb + interval + fill(value) + limit offset + tb = paraDict["ctbPrefix"] + '0' + limit = paraDict["rowsPerTbl"] + offset = limit / 2 + sqlStr = f"select max(c1), min(c2), sum(c3), avg(c4), stddev(c5), spread(c6), first(c7), last(c8), first(c9) from %s where ts >= %d and ts <= %d interval(5m) fill(value, -1, -2 ,-3, -4 , -5, -6 ,-7 ,'-8', '-9') limit %d offset %d"%(tb, ts0, tsu, limit, offset) + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(limit) + tdSql.checkData(0, 1, 0) + + sqlStr = f"select max(c1) from lm2_tb0 where ts >= 1537146000000 and ts <= 1543145400000 interval(5m) fill(value, -1000) limit 8200" + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(8200) + + sqlStr = f"select max(c1) from lm2_tb0 where ts >= 1537146000000 and ts <= 1543145400000 interval(5m) fill(value, -1000) limit 100000;" + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + + sqlStr = f"select max(c1) from lm2_tb0 where ts >= 1537146000000 and ts <= 1543145400000 interval(5m) fill(value, -1000) limit 10 offset 8190;" + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(10) + tdSql.checkData(0, 0, 5) + tdSql.checkData(1, 0, -1000) + tdSql.checkData(2, 0, 6) + tdSql.checkData(3, 0, -1000) + + + sqlStr = f"select max(c1) from lm2_tb0 where ts >= 1537146000000 and ts <= 1543145400000 interval(5m) fill(value, -1000) limit 10 offset 10001;" + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(10) + tdSql.checkData(0, 0, -1000) + tdSql.checkData(1, 0, 1) + tdSql.checkData(2, 0, -1000) + tdSql.checkData(3, 0, 2) + + sqlStr = f"select max(c1) from lm2_tb0 where ts >= 1537146000000 and ts <= 1543145400000 interval(5m) fill(value, -1000) limit 10000 offset 10001;" + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(9998) + + + sqlStr = f"select max(c1) from lm2_tb0 where ts >= 1537146000000 and ts <= 1543145400000 interval(5m) fill(value, -1000) limit 100 offset 20001;" + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(0) + + # tb + interval + fill(linear) + limit offset + limit = paraDict["rowsPerTbl"] + offset = limit / 2 + sqlStr = f"select _wstart,max(c1), min(c2), sum(c3), avg(c4), stddev(c5), spread(c6), first(c7), last(c8), first(c9) from %s where ts >= %d and ts <= %d interval(5m) fill(linear) limit %d offset %d"%(tb,ts0,tsu,limit, offset) + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(limit) + tdSql.checkData(0, 1, 0) + tdSql.checkData(1, 1, 0) + tdSql.checkData(1, 3, 0.500000000) + tdSql.checkData(3, 5, 0.000000000) + tdSql.checkData(4, 6, 0.000000000) + tdSql.checkData(4, 7, 1) + tdSql.checkData(5, 7, None) + tdSql.checkData(6, 8, "binary3") + tdSql.checkData(7, 9, None) + + + + limit = paraDict["rowsPerTbl"] + offset = limit / 2 + sqlStr = f"select max(c1), min(c2), sum(c3), avg(c4), stddev(c5), spread(c6), first(c7), last(c8), first(c9) from %s where ts >= %d and ts <= %d interval(5m) fill(prev) limit %d offset %d"%(tb,ts0,tsu,limit, offset) + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(limit) + + + limit = paraDict["rowsPerTbl"] + offset = limit / 2 + 10 + sqlStr = f"select _wstart,max(c1), min(c2), sum(c3), avg(c4), stddev(c5), spread(c6), first(c7), last(c8), first(c9) from %s where ts >= %d and ts <= %d and c1 = 5 interval(5m) fill(value, -1, -2 ,-3, -4 , -5, -6 ,-7 ,'-8', '-9') limit %d offset %d"%(tb,ts0,tsu,limit, offset) + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(limit) + tdSql.checkData(0, 1, 5) + tdSql.checkData(0, 2, 5) + tdSql.checkData(0, 3, 5.000000000) + tdSql.checkData(0, 4, 5.000000000) + tdSql.checkData(0, 5, 0.000000000) + tdSql.checkData(0, 7, 1) + tdSql.checkData(0, 8, "binary5") + tdSql.checkData(0, 9, "nchar5") + tdSql.checkData(1, 8, None) + tdSql.checkData(1, 9, None) + + + limit = paraDict["rowsPerTbl"] + offset = limit * 2 - 11 + sqlStr = f"select _wstart,max(c1), min(c2), sum(c3), avg(c4), stddev(c5), spread(c6), first(c7), last(c8), first(c9) from %s where ts >= %d and ts <= %d and c1 = 5 interval(5m) fill(value, -1, -2 ,-3, -4 , -5, -6 ,-7 ,'-8', '-9') limit %d offset %d"%(tb,ts0,tsu,limit, offset) + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(10) + tdSql.checkData(0, 1, -1) + tdSql.checkData(0, 2, -2) + tdSql.checkData(1, 1, 5) + tdSql.checkData(1, 2, 5) + tdSql.checkData(1, 3, 5.000000000) + tdSql.checkData(1, 5, 0.000000000) + tdSql.checkData(1, 6, 0.000000000) + tdSql.checkData(1, 8, "binary5") + tdSql.checkData(1, 9, "nchar5") + + ### [TBASE-350] + ## stb + interval + fill + group by + limit offset + sqlStr = f"select max(c1), min(c2), sum(c3), avg(c4), first(c7), last(c8), first(c9) from lm2_tb0 where ts >= 1537146000000 and ts <= 1543145400000 partition by t1 interval(5m) fill(value, -1, -2, -3, -4 ,-7 ,'-8', '-9') limit 2 offset 10" + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(2) + + limit = 5 + offset = paraDict["rowsPerTbl"] * 2 + offset = offset - 2 + sqlStr = f"select max(c1), min(c2), sum(c3), avg(c4), first(c7), last(c8), first(c9) from lm2_tb0 where ts >= 1537146000000 and ts <= 1543145400000 partition by t1 interval(5m) fill(value, -1, -2, -3, -4 ,-7 ,'-8', '-9') order by t1 limit %d offset %d"%(limit, offset) + print("====sql:%s"%(sqlStr)) + tdSql.query(sqlStr) + tdSql.checkRows(1) + tdSql.checkData(0, 0, 9) + tdSql.checkData(0, 1, 9) + tdSql.checkData(0, 2, 9.000000000) + tdSql.checkData(0, 3, 9.000000000) + tdSql.checkData(0, 4, 1) + tdSql.checkData(0, 5, "binary9") + tdSql.checkData(0, 6, "nchar9") + + #add one more test case + sqlStr = f"select max(c1), last(c8) from lm2_db0.lm2_tb0 where ts >= 1537146000000 and ts <= 1543145400000 interval(5m) fill(linear) limit 10 offset 4089;" + + tdLog.printNoPrefix("======== test case 1 end ...... ") + + def run(self): + tdSql.prepare() + self.prepareTestEnv() + self.tmqCase1() + + def stop(self): + tdSql.close() + tdLog.success(f"{__file__} successfully executed") + +event = threading.Event() + +tdCases.addLinux(__file__, TDTestCase()) +tdCases.addWindows(__file__, TDTestCase()) From e45023f3e98c869c1e6dc1525b573552ad03281f Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 30 Nov 2022 12:23:08 +0800 Subject: [PATCH 053/105] fix(query): add an null ptr checking before copying memory. --- source/dnode/vnode/src/tsdb/tsdbRead.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index 4ba311212a..26c9ce6810 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -775,7 +775,10 @@ static void doCopyColVal(SColumnInfoData* pColInfoData, int32_t rowIndex, int32_ } else { varDataSetLen(pSup->buildBuf[colIndex], pColVal->value.nData); ASSERT(pColVal->value.nData <= pColInfoData->info.bytes); - memcpy(varDataVal(pSup->buildBuf[colIndex]), pColVal->value.pData, pColVal->value.nData); + if (pColVal->value.nData > 0) { // pData may be null, if nData is 0 + memcpy(varDataVal(pSup->buildBuf[colIndex]), pColVal->value.pData, pColVal->value.nData); + } + colDataAppend(pColInfoData, rowIndex, pSup->buildBuf[colIndex], false); } } else { From b29f1634c032634190e8168c820a65246d90dd69 Mon Sep 17 00:00:00 2001 From: Zhengmao Zhu <70138133+fenghuazzm@users.noreply.github.com> Date: Wed, 30 Nov 2022 12:48:36 +0800 Subject: [PATCH 054/105] docs:Update 02-intro.md Update 02-intro.md 19k star >> 20k star --- docs/zh/02-intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/02-intro.md b/docs/zh/02-intro.md index 47bfd3f96b..525c8aa5c9 100644 --- a/docs/zh/02-intro.md +++ b/docs/zh/02-intro.md @@ -69,7 +69,7 @@ TDengine 的主要功能如下: - **[分析能力](https://www.taosdata.com/tdengine/easy_data_analytics)**:通过超级表、存储计算分离、分区分片、预计算和其它技术,TDengine 能够高效地浏览、格式化和访问数据。 -- **[核心开源](https://www.taosdata.com/tdengine/open_source_time-series_database)**:TDengine 的核心代码包括集群功能全部在开源协议下公开。全球超过 140k 个运行实例,GitHub Star 19k,且拥有一个活跃的开发者社区。 +- **[核心开源](https://www.taosdata.com/tdengine/open_source_time-series_database)**:TDengine 的核心代码包括集群功能全部在开源协议下公开。全球超过 140k 个运行实例,GitHub Star 20k,且拥有一个活跃的开发者社区。 采用 TDengine,可将典型的物联网、车联网、工业互联网大数据平台的总拥有成本大幅降低。表现在几个方面: From 76cc7a89fb3db1132ebb4448a2204b8c10af59ec Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Wed, 30 Nov 2022 13:44:22 +0800 Subject: [PATCH 055/105] refacotr(sync), force stop snapshot sender/receiver when stop node --- source/libs/sync/src/syncMain.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 3117f6e4c9..44abf3c5e9 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -1142,12 +1142,21 @@ void syncNodeClose(SSyncNode* pSyncNode) { for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) { if ((pSyncNode->senders)[i] != NULL) { sSTrace((pSyncNode->senders)[i], "snapshot sender destroy while close, data:%p", (pSyncNode->senders)[i]); + + if (snapshotSenderIsStart((pSyncNode->senders)[i])) { + snapshotSenderStop((pSyncNode->senders)[i], false); + } + snapshotSenderDestroy((pSyncNode->senders)[i]); (pSyncNode->senders)[i] = NULL; } } if (pSyncNode->pNewNodeReceiver != NULL) { + if (snapshotReceiverIsStart(pSyncNode->pNewNodeReceiver)) { + snapshotReceiverForceStop(pSyncNode->pNewNodeReceiver); + } + snapshotReceiverDestroy(pSyncNode->pNewNodeReceiver); pSyncNode->pNewNodeReceiver = NULL; } From e07823c55a0644267bb2e5f79b4f35919ee5cf71 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 30 Nov 2022 13:59:33 +0800 Subject: [PATCH 056/105] opti: get meta logic for schemaless --- source/client/src/clientSml.c | 43 ++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index f4d8c80e3f..985b758869 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -467,6 +467,13 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { goto end; } info->cost.numOfCreateSTables++; + taosMemoryFreeClear(pTableMeta); + + code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta); + if (code != TSDB_CODE_SUCCESS) { + uError("SML:0x%" PRIx64 " catalogGetSTableMeta failed. super table name %s", info->id, pName.tname); + goto end; + } } else if (code == TSDB_CODE_SUCCESS) { hashTmp = taosHashInit(pTableMeta->tableInfo.numOfTags, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); @@ -505,16 +512,16 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { uError("SML:0x%" PRIx64 " smlSendMetaMsg failed. can not create %s", info->id, pName.tname); goto end; } - } - taosMemoryFreeClear(pTableMeta); - code = catalogRefreshTableMeta(info->pCatalog, &conn, &pName, -1); - if (code != TSDB_CODE_SUCCESS) { - goto end; - } - code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta); - if (code != TSDB_CODE_SUCCESS) { - goto end; + taosMemoryFreeClear(pTableMeta); + code = catalogRefreshTableMeta(info->pCatalog, &conn, &pName, -1); + if (code != TSDB_CODE_SUCCESS) { + goto end; + } + code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta); + if (code != TSDB_CODE_SUCCESS) { + goto end; + } } taosHashClear(hashTmp); @@ -552,12 +559,13 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { uError("SML:0x%" PRIx64 " smlSendMetaMsg failed. can not create %s", info->id, pName.tname); goto end; } + + code = catalogRefreshTableMeta(info->pCatalog, &conn, &pName, -1); + if (code != TSDB_CODE_SUCCESS) { + goto end; + } } - code = catalogRefreshTableMeta(info->pCatalog, &conn, &pName, -1); - if (code != TSDB_CODE_SUCCESS) { - goto end; - } needCheckMeta = true; taosHashCleanup(hashTmp); hashTmp = NULL; @@ -565,13 +573,6 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { uError("SML:0x%" PRIx64 " load table meta error: %s", info->id, tstrerror(code)); goto end; } - taosMemoryFreeClear(pTableMeta); - - code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta); - if (code != TSDB_CODE_SUCCESS) { - uError("SML:0x%" PRIx64 " catalogGetSTableMeta failed. super table name %s", info->id, pName.tname); - goto end; - } if (needCheckMeta) { code = smlCheckMeta(&(pTableMeta->schema[pTableMeta->tableInfo.numOfColumns]), pTableMeta->tableInfo.numOfTags, @@ -596,7 +597,7 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { end: taosHashCleanup(hashTmp); taosMemoryFreeClear(pTableMeta); - catalogRefreshTableMeta(info->pCatalog, &conn, &pName, 1); +// catalogRefreshTableMeta(info->pCatalog, &conn, &pName, 1); return code; } From 7e9b7f4e150caee6c58bbdf4320e3d482c90f82a Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 30 Nov 2022 14:06:22 +0800 Subject: [PATCH 057/105] enh: show more info while drop dnode --- source/common/src/systable.c | 2 + source/dnode/mnode/impl/inc/mndVgroup.h | 2 - source/dnode/mnode/impl/src/mndVgroup.c | 172 +++++++++++++++--------- 3 files changed, 108 insertions(+), 68 deletions(-) diff --git a/source/common/src/systable.c b/source/common/src/systable.c index c3a1f9f67e..1829101639 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -212,6 +212,8 @@ static const SSysDbTableSchema vgroupsSchema[] = { {.name = "v2_status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, {.name = "v3_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, {.name = "v3_status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "v4_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, + {.name = "v4_status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, {.name = "status", .bytes = 12 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, {.name = "cacheload", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, {.name = "nfiles", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, diff --git a/source/dnode/mnode/impl/inc/mndVgroup.h b/source/dnode/mnode/impl/inc/mndVgroup.h index 94469899fc..765d4fd33d 100644 --- a/source/dnode/mnode/impl/inc/mndVgroup.h +++ b/source/dnode/mnode/impl/inc/mndVgroup.h @@ -36,8 +36,6 @@ int64_t mndGetVgroupMemory(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup); SArray *mndBuildDnodesArray(SMnode *, int32_t exceptDnodeId); int32_t mndAllocSmaVgroup(SMnode *, SDbObj *pDb, SVgObj *pVgroup); int32_t mndAllocVgroup(SMnode *, SDbObj *pDb, SVgObj **ppVgroups); -int32_t mndAddVnodeToVgroup(SMnode *, SVgObj *pVgroup, SArray *pArray); -int32_t mndRemoveVnodeFromVgroup(SMnode *, SVgObj *pVgroup, SArray *pArray, SVnodeGid *pDelVgid); int32_t mndAddCreateVnodeAction(SMnode *, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SVnodeGid *pVgid); int32_t mndAddAlterVnodeConfirmAction(SMnode *, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup); int32_t mndAddAlterVnodeAction(SMnode *, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, tmsg_t msgType); diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index dda0d7d26a..dd2b985c14 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -179,6 +179,16 @@ static int32_t mndVgroupActionUpdate(SSdb *pSdb, SVgObj *pOld, SVgObj *pNew) { pOld->hashEnd = pNew->hashEnd; pOld->replica = pNew->replica; pOld->isTsma = pNew->isTsma; + for (int32_t i = 0; i < pNew->replica; ++i) { + SVnodeGid *pNewGid = &pNew->vnodeGid[i]; + for (int32_t j = 0; j < pOld->replica; ++j) { + SVnodeGid *pOldGid = &pOld->vnodeGid[j]; + if (pNewGid->dnodeId == pOldGid->dnodeId) { + pNewGid->syncState = pOldGid->syncState; + pNewGid->syncRestore = pOldGid->syncRestore; + } + } + } memcpy(pOld->vnodeGid, pNew->vnodeGid, TSDB_MAX_REPLICA * sizeof(SVnodeGid)); return 0; } @@ -659,8 +669,8 @@ static int32_t mndRetrieveVgroups(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->numOfTables, false); - // default 3 replica - for (int32_t i = 0; i < 3; ++i) { + // default 3 replica, add 1 replica if move vnode + for (int32_t i = 0; i < 4; ++i) { pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); if (i < pVgroup->replica) { colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->vnodeGid[i].dnodeId, false); @@ -851,7 +861,7 @@ static void mndCancelGetNextVnode(SMnode *pMnode, void *pIter) { sdbCancelFetch(pSdb, pIter); } -int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) { +static int32_t mndAddVnodeToVgroup(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup, SArray *pArray) { taosArraySort(pArray, (__compar_fn_t)mndCompareDnodeVnodes); for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) { SDnodeObj *pDnode = taosArrayGet(pArray, i); @@ -893,6 +903,15 @@ int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) { pVgroup->replica++; pDnode->numOfVnodes++; + + SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup); + if (pVgRaw == NULL) return -1; + if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) { + sdbFreeRaw(pVgRaw); + return -1; + } + (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY); + return 0; } @@ -901,7 +920,8 @@ int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) { return -1; } -int32_t mndRemoveVnodeFromVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray, SVnodeGid *pDelVgid) { +static int32_t mndRemoveVnodeFromVgroup(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup, SArray *pArray, + SVnodeGid *pDelVgid) { taosArraySort(pArray, (__compar_fn_t)mndCompareDnodeVnodes); for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) { SDnodeObj *pDnode = taosArrayGet(pArray, i); @@ -941,6 +961,15 @@ _OVER: SVnodeGid *pVgid = &pVgroup->vnodeGid[vn]; mInfo("db:%s, vgId:%d, vn:%d dnode:%d is reserved", pVgroup->dbName, pVgroup->vgId, vn, pVgid->dnodeId); } + + SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup); + if (pVgRaw == NULL) return -1; + if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) { + sdbFreeRaw(pVgRaw); + return -1; + } + (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY); + return 0; } @@ -1088,7 +1117,7 @@ int32_t mndSetMoveVgroupInfoToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, if (!force) { mInfo("vgId:%d, will add 1 vnode", pVgroup->vgId); - if (mndAddVnodeToVgroup(pMnode, &newVg, pArray) != 0) return -1; + if (mndAddVnodeToVgroup(pMnode, pTrans, &newVg, pArray) != 0) return -1; for (int32_t i = 0; i < newVg.replica - 1; ++i) { if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg, newVg.vnodeGid[i].dnodeId) != 0) return -1; } @@ -1100,6 +1129,16 @@ int32_t mndSetMoveVgroupInfoToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVnodeGid del = newVg.vnodeGid[vnIndex]; newVg.vnodeGid[vnIndex] = newVg.vnodeGid[newVg.replica]; memset(&newVg.vnodeGid[newVg.replica], 0, sizeof(SVnodeGid)); + { + SSdbRaw *pRaw = mndVgroupActionEncode(&newVg); + if (pRaw == NULL) return -1; + if (mndTransAppendRedolog(pTrans, pRaw) != 0) { + sdbFreeRaw(pRaw); + return -1; + } + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); + } + if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVg, &del, true) != 0) return -1; for (int32_t i = 0; i < newVg.replica; ++i) { if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg, newVg.vnodeGid[i].dnodeId) != 0) return -1; @@ -1107,11 +1146,20 @@ int32_t mndSetMoveVgroupInfoToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVg) != 0) return -1; } else { mInfo("vgId:%d, will add 1 vnode and force remove 1 vnode", pVgroup->vgId); - if (mndAddVnodeToVgroup(pMnode, &newVg, pArray) != 0) return -1; + if (mndAddVnodeToVgroup(pMnode, pTrans, &newVg, pArray) != 0) return -1; newVg.replica--; SVnodeGid del = newVg.vnodeGid[vnIndex]; newVg.vnodeGid[vnIndex] = newVg.vnodeGid[newVg.replica]; memset(&newVg.vnodeGid[newVg.replica], 0, sizeof(SVnodeGid)); + { + SSdbRaw *pRaw = mndVgroupActionEncode(&newVg); + if (pRaw == NULL) return -1; + if (mndTransAppendRedolog(pTrans, pRaw) != 0) { + sdbFreeRaw(pRaw); + return -1; + } + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); + } for (int32_t i = 0; i < newVg.replica; ++i) { if (i != vnIndex) { @@ -1128,16 +1176,12 @@ int32_t mndSetMoveVgroupInfoToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, { SSdbRaw *pRaw = mndVgroupActionEncode(&newVg); - if (pRaw == NULL || mndTransAppendRedolog(pTrans, pRaw) != 0) return -1; + if (pRaw == NULL) return -1; + if (mndTransAppendCommitlog(pTrans, pRaw) != 0) { + sdbFreeRaw(pRaw); + return -1; + } (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); - pRaw = NULL; - } - - { - SSdbRaw *pRaw = mndVgroupActionEncode(&newVg); - if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) return -1; - (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); - pRaw = NULL; } mInfo("vgId:%d, vgroup info after move, replica:%d", newVg.vgId, newVg.replica); @@ -1195,6 +1239,14 @@ static int32_t mndAddIncVgroupReplicaToTrans(SMnode *pMnode, STrans *pTrans, SDb pGid->dnodeId = newDnodeId; pGid->syncState = TAOS_SYNC_STATE_OFFLINE; + SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup); + if (pVgRaw == NULL) return -1; + if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) { + sdbFreeRaw(pVgRaw); + return -1; + } + (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY); + for (int32_t i = 0; i < pVgroup->replica - 1; ++i) { if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, pVgroup, pVgroup->vnodeGid[i].dnodeId) != 0) return -1; } @@ -1224,6 +1276,14 @@ static int32_t mndAddDecVgroupReplicaFromTrans(SMnode *pMnode, STrans *pTrans, S memcpy(pGid, &pVgroup->vnodeGid[pVgroup->replica], sizeof(SVnodeGid)); memset(&pVgroup->vnodeGid[pVgroup->replica], 0, sizeof(SVnodeGid)); + SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup); + if (pVgRaw == NULL) return -1; + if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) { + sdbFreeRaw(pVgRaw); + return -1; + } + (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY); + if (mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, &delGid, true) != 0) return -1; for (int32_t i = 0; i < pVgroup->replica; ++i) { if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, pVgroup, pVgroup->vnodeGid[i].dnodeId) != 0) return -1; @@ -1236,9 +1296,8 @@ static int32_t mndAddDecVgroupReplicaFromTrans(SMnode *pMnode, STrans *pTrans, S static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj *pVgroup, SDnodeObj *pNew1, SDnodeObj *pOld1, SDnodeObj *pNew2, SDnodeObj *pOld2, SDnodeObj *pNew3, SDnodeObj *pOld3) { - int32_t code = -1; - SSdbRaw *pRaw = NULL; - STrans *pTrans = NULL; + int32_t code = -1; + STrans *pTrans = NULL; pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pReq, "red-vgroup"); if (pTrans == NULL) goto _OVER; @@ -1319,17 +1378,13 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, } { - pRaw = mndVgroupActionEncode(&newVg); - if (pRaw == NULL || mndTransAppendRedolog(pTrans, pRaw) != 0) goto _OVER; + SSdbRaw *pRaw = mndVgroupActionEncode(&newVg); + if (pRaw == NULL) return -1; + if (mndTransAppendCommitlog(pTrans, pRaw) != 0) { + sdbFreeRaw(pRaw); + return -1; + } (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); - pRaw = NULL; - } - - { - pRaw = mndVgroupActionEncode(&newVg); - if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER; - (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); - pRaw = NULL; } mInfo("vgId:%d, vgroup info after redistribute, replica:%d", newVg.vgId, newVg.replica); @@ -1342,7 +1397,6 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, _OVER: mndTransDrop(pTrans); - sdbFreeRaw(pRaw); mndReleaseDb(pMnode, pDb); return code; } @@ -1593,13 +1647,13 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb mInfo("db:%s, vgId:%d, will add 2 vnodes, vn:0 dnode:%d", pVgroup->dbName, pVgroup->vgId, pVgroup->vnodeGid[0].dnodeId); - if (mndAddVnodeToVgroup(pMnode, &newVgroup, pArray) != 0) return -1; + if (mndAddVnodeToVgroup(pMnode, pTrans, &newVgroup, pArray) != 0) return -1; if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, &newVgroup, newVgroup.vnodeGid[0].dnodeId) != 0) return -1; if (mndAddCreateVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, &newVgroup.vnodeGid[1]) != 0) return -1; if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, &newVgroup) != 0) return -1; - if (mndAddVnodeToVgroup(pMnode, &newVgroup, pArray) != 0) return -1; + if (mndAddVnodeToVgroup(pMnode, pTrans, &newVgroup, pArray) != 0) return -1; if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, &newVgroup, newVgroup.vnodeGid[0].dnodeId) != 0) return -1; if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, &newVgroup, newVgroup.vnodeGid[1].dnodeId) != 0) @@ -1612,7 +1666,7 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb SVnodeGid del1 = {0}; SVnodeGid del2 = {0}; - if (mndRemoveVnodeFromVgroup(pMnode, &newVgroup, pArray, &del1) != 0) return -1; + if (mndRemoveVnodeFromVgroup(pMnode, pTrans, &newVgroup, pArray, &del1) != 0) return -1; if (mndAddDropVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, &del1, true) != 0) return -1; if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, &newVgroup, newVgroup.vnodeGid[0].dnodeId) != 0) return -1; @@ -1620,7 +1674,7 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb return -1; if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, &newVgroup) != 0) return -1; - if (mndRemoveVnodeFromVgroup(pMnode, &newVgroup, pArray, &del2) != 0) return -1; + if (mndRemoveVnodeFromVgroup(pMnode, pTrans, &newVgroup, pArray, &del2) != 0) return -1; if (mndAddDropVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, &del2, true) != 0) return -1; if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, &newVgroup, newVgroup.vnodeGid[0].dnodeId) != 0) return -1; @@ -1629,16 +1683,6 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb return -1; } - { - SSdbRaw *pVgRaw = mndVgroupActionEncode(&newVgroup); - if (pVgRaw == NULL) return -1; - if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) { - sdbFreeRaw(pVgRaw); - return -1; - } - (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY); - } - { SSdbRaw *pVgRaw = mndVgroupActionEncode(&newVgroup); if (pVgRaw == NULL) return -1; @@ -1657,10 +1701,9 @@ static int32_t mndAddAdjustVnodeHashRangeAction(SMnode *pMnode, STrans *pTrans, } static int32_t mndSplitVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj *pVgroup) { - int32_t code = -1; - SSdbRaw *pRaw = NULL; - STrans *pTrans = NULL; - SArray *pArray = mndBuildDnodesArray(pMnode, 0); + int32_t code = -1; + STrans *pTrans = NULL; + SArray *pArray = mndBuildDnodesArray(pMnode, 0); pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pReq, "split-vgroup"); if (pTrans == NULL) goto _OVER; @@ -1676,13 +1719,13 @@ static int32_t mndSplitVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj } if (newVg1.replica == 1) { - if (mndAddVnodeToVgroup(pMnode, &newVg1, pArray) != 0) goto _OVER; + if (mndAddVnodeToVgroup(pMnode, pTrans, &newVg1, pArray) != 0) goto _OVER; if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg1, newVg1.vnodeGid[0].dnodeId) != 0) goto _OVER; if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVg1, &newVg1.vnodeGid[1]) != 0) goto _OVER; if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVg1) != 0) goto _OVER; } else if (newVg1.replica == 3) { SVnodeGid del1 = {0}; - if (mndRemoveVnodeFromVgroup(pMnode, &newVg1, pArray, &del1) != 0) goto _OVER; + if (mndRemoveVnodeFromVgroup(pMnode, pTrans, &newVg1, pArray, &del1) != 0) goto _OVER; if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVg1, &del1, true) != 0) goto _OVER; if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg1, newVg1.vnodeGid[0].dnodeId) != 0) goto _OVER; if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg1, newVg1.vnodeGid[1].dnodeId) != 0) goto _OVER; @@ -1727,17 +1770,23 @@ static int32_t mndSplitVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj #endif { - pRaw = mndVgroupActionEncode(&newVg1); - if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER; + SSdbRaw *pRaw = mndVgroupActionEncode(&newVg1); + if (pRaw == NULL) return -1; + if (mndTransAppendCommitlog(pTrans, pRaw) != 0) { + sdbFreeRaw(pRaw); + return -1; + } (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); - pRaw = NULL; } { - pRaw = mndVgroupActionEncode(&newVg2); - if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER; + SSdbRaw *pRaw = mndVgroupActionEncode(&newVg2); + if (pRaw == NULL) return -1; + if (mndTransAppendCommitlog(pTrans, pRaw) != 0) { + sdbFreeRaw(pRaw); + return -1; + } (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); - pRaw = NULL; } mInfo("vgId:%d, vgroup info after adjust hash, replica:%d hashBegin:%u hashEnd:%u vnode:0 dnode:%d", newVg1.vgId, @@ -1757,7 +1806,6 @@ static int32_t mndSplitVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj _OVER: taosArrayDestroy(pArray); mndTransDrop(pTrans); - sdbFreeRaw(pRaw); return code; } @@ -1802,16 +1850,8 @@ static int32_t mndSetBalanceVgroupInfoToTrans(SMnode *pMnode, STrans *pTrans, SD { SSdbRaw *pRaw = mndVgroupActionEncode(&newVg); - if (pRaw == NULL || mndTransAppendRedolog(pTrans, pRaw) != 0) { - sdbFreeRaw(pRaw); - return -1; - } - (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); - } - - { - SSdbRaw *pRaw = mndVgroupActionEncode(&newVg); - if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) { + if (pRaw == NULL) return -1; + if (mndTransAppendCommitlog(pTrans, pRaw) != 0) { sdbFreeRaw(pRaw); return -1; } From 162575ea66a4fedadbbf225dc692c5fbff4bc5b5 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 30 Nov 2022 14:30:44 +0800 Subject: [PATCH 058/105] opti:get meta cost for schemaless & add config for write batch in schemaless --- include/common/tglobal.h | 1 + source/client/src/clientSml.c | 5 ++--- source/common/src/tglobal.c | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/include/common/tglobal.h b/include/common/tglobal.h index 0ded2bc4b5..24ed898163 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -125,6 +125,7 @@ extern char tsUdfdLdLibPath[]; extern char tsSmlChildTableName[]; extern char tsSmlTagName[]; extern bool tsSmlDataFormat; +extern int32_t tsSmlBatchSize; // wal extern int64_t tsWalFsyncDataSizeLimit; diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index 985b758869..28e873cca3 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -79,7 +79,6 @@ #define NCHAR_ADD_LEN 3 // L"nchar" 3 means L" " #define MAX_RETRY_TIMES 5 -#define LINE_BATCH 2000 //================================================================================================= typedef TSDB_SML_PROTOCOL_TYPE SMLProtocolType; @@ -2563,7 +2562,7 @@ TAOS_RES *taos_schemaless_insert_inner(SRequestObj *request, char *lines[], char goto end; } - batchs = ceil(((double)numLines) / LINE_BATCH); + batchs = ceil(((double)numLines) / tsSmlBatchSize); params.total = batchs; for (int i = 0; i < batchs; ++i) { SRequestObj *req = (SRequestObj *)createRequest(pTscObj->id, TSDB_SQL_INSERT, 0); @@ -2582,7 +2581,7 @@ TAOS_RES *taos_schemaless_insert_inner(SRequestObj *request, char *lines[], char info->isRawLine = (rawLine == NULL); info->ttl = ttl; - int32_t perBatch = LINE_BATCH; + int32_t perBatch = tsSmlBatchSize; if (numLines > perBatch) { numLines -= perBatch; diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index aeef1b5277..d922b5342b 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -75,6 +75,7 @@ char tsSmlChildTableName[TSDB_TABLE_NAME_LEN] = ""; // user defined child table // If set to empty system will generate table name using MD5 hash. // true means that the name and order of cols in each line are the same(only for influx protocol) bool tsSmlDataFormat = false; +int32_t tsSmlBatchSize = 10000; // query int32_t tsQueryPolicy = 1; @@ -302,6 +303,7 @@ static int32_t taosAddClientCfg(SConfig *pCfg) { if (cfgAddString(pCfg, "smlChildTableName", "", 1) != 0) return -1; if (cfgAddString(pCfg, "smlTagName", tsSmlTagName, 1) != 0) return -1; if (cfgAddBool(pCfg, "smlDataFormat", tsSmlDataFormat, 1) != 0) return -1; + if (cfgAddInt32(pCfg, "smlBatchSize", tsSmlBatchSize, 1, INT32_MAX, true) != 0) return -1; if (cfgAddInt32(pCfg, "maxMemUsedByInsert", tsMaxMemUsedByInsert, 1, INT32_MAX, true) != 0) return -1; if (cfgAddInt32(pCfg, "rpcRetryLimit", tsRpcRetryLimit, 1, 100000, 0) != 0) return -1; if (cfgAddInt32(pCfg, "rpcRetryInterval", tsRpcRetryInterval, 1, 100000, 0) != 0) return -1; @@ -643,6 +645,7 @@ static int32_t taosSetClientCfg(SConfig *pCfg) { tstrncpy(tsSmlTagName, cfgGetItem(pCfg, "smlTagName")->str, TSDB_COL_NAME_LEN); tsSmlDataFormat = cfgGetItem(pCfg, "smlDataFormat")->bval; + tsSmlBatchSize = cfgGetItem(pCfg, "smlBatchSize")->i32; tsMaxMemUsedByInsert = cfgGetItem(pCfg, "maxMemUsedByInsert")->i32; tsShellActivityTimer = cfgGetItem(pCfg, "shellActivityTimer")->i32; @@ -1013,6 +1016,8 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) { tstrncpy(tsSmlTagName, cfgGetItem(pCfg, "smlTagName")->str, TSDB_COL_NAME_LEN); } else if (strcasecmp("smlDataFormat", name) == 0) { tsSmlDataFormat = cfgGetItem(pCfg, "smlDataFormat")->bval; + } else if (strcasecmp("smlBatchSize", name) == 0) { + tsSmlBatchSize = cfgGetItem(pCfg, "smlBatchSize")->i32; } else if (strcasecmp("shellActivityTimer", name) == 0) { tsShellActivityTimer = cfgGetItem(pCfg, "shellActivityTimer")->i32; } else if (strcasecmp("supportVnodes", name) == 0) { From 4c21f20118e0a1767df71247d25976e14aac04e3 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Wed, 30 Nov 2022 14:42:31 +0800 Subject: [PATCH 059/105] fix compile --- tests/system-test/0-others/compatibility.py | 254 ++++++++++---------- 1 file changed, 129 insertions(+), 125 deletions(-) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index 30513ac020..377cdbd7e6 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -15,155 +15,159 @@ from util.cluster import * class TDTestCase: - def caseDescription(self): - ''' - 3.0 data compatibility test - case1: basedata version is 3.0.1.0 - ''' - return + def caseDescription(self): + ''' + 3.0 data compatibility test + case1: basedata version is 3.0.1.0 + ''' + return - def init(self, conn, logSql, replicaVar=1): - self.replicaVar = int(replicaVar) - tdLog.debug(f"start to excute {__file__}") - tdSql.init(conn.cursor()) + def init(self, conn, logSql, replicaVar=1): + self.replicaVar = int(replicaVar) + tdLog.debug(f"start to excute {__file__}") + tdSql.init(conn.cursor()) - def getBuildPath(self): - selfPath = os.path.dirname(os.path.realpath(__file__)) + def getBuildPath(self): + selfPath = os.path.dirname(os.path.realpath(__file__)) - if ("community" in selfPath): - projPath = selfPath[:selfPath.find("community")] - else: - projPath = selfPath[:selfPath.find("tests")] + if ("community" in selfPath): + projPath = selfPath[:selfPath.find("community")] + else: + projPath = selfPath[:selfPath.find("tests")] - for root, dirs, files in os.walk(projPath): - if ("taosd" in files or "taosd.exe" in files): - rootRealPath = os.path.dirname(os.path.realpath(root)) - if ("packaging" not in rootRealPath): - buildPath = root[:len(root)-len("/build/bin")] - break - return buildPath + for root, dirs, files in os.walk(projPath): + if ("taosd" in files or "taosd.exe" in files): + rootRealPath = os.path.dirname(os.path.realpath(root)) + if ("packaging" not in rootRealPath): + buildPath = root[:len(root)-len("/build/bin")] + break + return buildPath - def getCfgPath(self): - buildPath = self.getBuildPath() - selfPath = os.path.dirname(os.path.realpath(__file__)) + def getCfgPath(self): + buildPath = self.getBuildPath() + selfPath = os.path.dirname(os.path.realpath(__file__)) - if ("community" in selfPath): - cfgPath = buildPath + "/../sim/dnode1/cfg/" - else: - cfgPath = buildPath + "/../sim/dnode1/cfg/" + if ("community" in selfPath): + cfgPath = buildPath + "/../sim/dnode1/cfg/" + else: + cfgPath = buildPath + "/../sim/dnode1/cfg/" - return cfgPath + return cfgPath - def installTaosd(self,bPath,cPath): - # os.system(f"rmtaos && mkdir -p {self.getBuildPath()}/build/lib/temp && mv {self.getBuildPath()}/build/lib/libtaos.so* {self.getBuildPath()}/build/lib/temp/ ") - # os.system(f" mv {bPath}/build {bPath}/build_bak ") - # os.system(f"mv {self.getBuildPath()}/build/lib/libtaos.so {self.getBuildPath()}/build/lib/libtaos.so_bak ") - # os.system(f"mv {self.getBuildPath()}/build/lib/libtaos.so.1 {self.getBuildPath()}/build/lib/libtaos.so.1_bak ") + def installTaosd(self,bPath,cPath): + # os.system(f"rmtaos && mkdir -p {self.getBuildPath()}/build/lib/temp && mv {self.getBuildPath()}/build/lib/libtaos.so* {self.getBuildPath()}/build/lib/temp/ ") + # os.system(f" mv {bPath}/build {bPath}/build_bak ") + # os.system(f"mv {self.getBuildPath()}/build/lib/libtaos.so {self.getBuildPath()}/build/lib/libtaos.so_bak ") + # os.system(f"mv {self.getBuildPath()}/build/lib/libtaos.so.1 {self.getBuildPath()}/build/lib/libtaos.so.1_bak ") - packagePath="/usr/local/src/" - packageName="TDengine-server-3.0.1.0-Linux-x64.tar.gz" - os.system(f"cd {packagePath} && tar xvf TDengine-server-3.0.1.0-Linux-x64.tar.gz && cd TDengine-server-3.0.1.0 && ./install.sh -e no " ) - tdDnodes.stop(1) - print(f"start taosd: nohup taosd -c {cPath} & ") - os.system(f" nohup taosd -c {cPath} & " ) - sleep(1) + packagePath="/usr/local/src/" + packageName="TDengine-server-3.0.1.0-Linux-x64.tar.gz" + os.system(f"cd {packagePath} && tar xvf TDengine-server-3.0.1.0-Linux-x64.tar.gz && cd TDengine-server-3.0.1.0 && ./install.sh -e no " ) + tdDnodes.stop(1) + print(f"start taosd: nohup taosd -c {cPath} & ") + os.system(f" nohup taosd -c {cPath} & " ) + sleep(1) - - def buildTaosd(self,bPath): - # os.system(f"mv {bPath}/build_bak {bPath}/build ") - os.system(f" cd {bPath} && make install ") + + def buildTaosd(self,bPath): + # os.system(f"mv {bPath}/build_bak {bPath}/build ") + os.system(f" cd {bPath} && make install ") - def run(self): - bPath=self.getBuildPath() - cPath=self.getCfgPath() - dbname = "test" - stb = f"{dbname}.meters" - self.installTaosd(bPath,cPath) - os.system("echo 'debugFlag 143' > /etc/taos/taos.cfg ") - tableNumbers=100 - recordNumbers1=100 - recordNumbers2=1000 - tdsqlF=tdCom.newTdSql() - print(tdsqlF) - tdsqlF.query(f"SELECT SERVER_VERSION();") - print(tdsqlF.query(f"SELECT SERVER_VERSION();")) - oldServerVersion=tdsqlF.queryResult[0][0] - tdLog.info(f"Base server version is {oldServerVersion}") - tdsqlF.query(f"SELECT CLIENT_VERSION();") - - # the oldClientVersion can't be updated in the same python process,so the version is new compiled verison - oldClientVersion=tdsqlF.queryResult[0][0] - tdLog.info(f"Base client version is {oldClientVersion}") + def run(self): + print(f"start taosd run") + bPath=self.getBuildPath() + cPath=self.getCfgPath() + dbname = "test" + stb = f"{dbname}.meters" + self.installTaosd(bPath,cPath) + os.system("echo 'debugFlag 143' > /etc/taos/taos.cfg ") + tableNumbers=100 + recordNumbers1=100 + recordNumbers2=1000 + #tdsqlF=tdCom.newTdSql() + #print(tdsqlF) - tdLog.printNoPrefix(f"==========step1:prepare and check data in old version-{oldServerVersion}") - tdLog.info(f" LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") - os.system(f"LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") - sleep(3) + oldServerVersion = '3.0.1.0' + #tdsqlF.query(f"SELECT SERVER_VERSION();") + #print(tdsqlF.query(f"SELECT SERVER_VERSION();")) + #oldServerVersion=tdsqlF.queryResult[0][0] + #tdLog.info(f"Base server version is {oldServerVersion}") + #tdsqlF.query(f"SELECT CLIENT_VERSION();") + # + ## the oldClientVersion can't be updated in the same python process,so the version is new compiled verison + #oldClientVersion=tdsqlF.queryResult[0][0] - # tdsqlF.query(f"select count(*) from {stb}") - # tdsqlF.checkData(0,0,tableNumbers*recordNumbers1) - os.system("pkill taosd") - sleep(2) + #tdLog.info(f"Base client version is {oldClientVersion}") - print(f"start taosd: nohup taosd -c {cPath} & ") - os.system(f" nohup taosd -c {cPath} & " ) - sleep(10) - tdLog.info(" LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y ") - os.system("LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y") - os.system("pkill -9 taosd") + tdLog.printNoPrefix(f"==========step1:prepare and check data in old version-{oldServerVersion}") + tdLog.info(f" LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") + os.system(f"LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") + sleep(3) + + # tdsqlF.query(f"select count(*) from {stb}") + # tdsqlF.checkData(0,0,tableNumbers*recordNumbers1) + os.system("pkill taosd") + sleep(2) + + print(f"start taosd: nohup taosd -c {cPath} & ") + os.system(f" nohup taosd -c {cPath} & " ) + sleep(10) + tdLog.info(" LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y ") + os.system("LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y") + os.system("pkill -9 taosd") - tdLog.printNoPrefix("==========step2:update new version ") - self.buildTaosd(bPath) - tdDnodes.start(1) - sleep(1) - tdsql=tdCom.newTdSql() - print(tdsql) + tdLog.printNoPrefix("==========step2:update new version ") + self.buildTaosd(bPath) + tdDnodes.start(1) + sleep(1) + tdsql=tdCom.newTdSql() + print(tdsql) - tdsql.query(f"SELECT SERVER_VERSION();") - nowServerVersion=tdsql.queryResult[0][0] - tdLog.info(f"New server version is {nowServerVersion}") - tdsql.query(f"SELECT CLIENT_VERSION();") - nowClientVersion=tdsql.queryResult[0][0] - tdLog.info(f"New client version is {nowClientVersion}") + tdsql.query(f"SELECT SERVER_VERSION();") + nowServerVersion=tdsql.queryResult[0][0] + tdLog.info(f"New server version is {nowServerVersion}") + tdsql.query(f"SELECT CLIENT_VERSION();") + nowClientVersion=tdsql.queryResult[0][0] + tdLog.info(f"New client version is {nowClientVersion}") - tdLog.printNoPrefix(f"==========step3:prepare and check data in new version-{nowServerVersion}") - tdsql.query(f"select count(*) from {stb}") - tdsql.checkData(0,0,tableNumbers*recordNumbers1) - os.system(f"taosBenchmark -t {tableNumbers} -n {recordNumbers2} -y ") - tdsql.query(f"select count(*) from {stb}") - tdsql.checkData(0,0,tableNumbers*recordNumbers2) + tdLog.printNoPrefix(f"==========step3:prepare and check data in new version-{nowServerVersion}") + tdsql.query(f"select count(*) from {stb}") + tdsql.checkData(0,0,tableNumbers*recordNumbers1) + os.system(f"taosBenchmark -t {tableNumbers} -n {recordNumbers2} -y ") + tdsql.query(f"select count(*) from {stb}") + tdsql.checkData(0,0,tableNumbers*recordNumbers2) - tdsql=tdCom.newTdSql() - tdLog.printNoPrefix(f"==========step4:verify backticks in taos Sql-TD18542") - tdsql.execute("drop database if exists db") - tdsql.execute("create database db") - tdsql.execute("use db") - tdsql.execute("create stable db.stb1 (ts timestamp, c1 int) tags (t1 int);") - tdsql.execute("insert into db.ct1 using db.stb1 TAGS(1) values(now(),11);") - tdsql.error(" insert into `db.ct2` using db.stb1 TAGS(9) values(now(),11);") - tdsql.error(" insert into db.`db.ct2` using db.stb1 TAGS(9) values(now(),11);") - tdsql.execute("insert into `db`.ct3 using db.stb1 TAGS(3) values(now(),13);") - tdsql.query("select * from db.ct3") - tdsql.checkData(0,1,13) - tdsql.execute("insert into db.`ct4` using db.stb1 TAGS(4) values(now(),14);") - tdsql.query("select * from db.ct4") - tdsql.checkData(0,1,14) - tdsql.query("describe information_schema.ins_databases;") - qRows=tdsql.queryRows - for i in range(qRows) : - if tdsql.queryResult[i][0]=="retentions" : - return True - else: - return False - def stop(self): - tdSql.close() - tdLog.success(f"{__file__} successfully executed") + tdsql=tdCom.newTdSql() + tdLog.printNoPrefix(f"==========step4:verify backticks in taos Sql-TD18542") + tdsql.execute("drop database if exists db") + tdsql.execute("create database db") + tdsql.execute("use db") + tdsql.execute("create stable db.stb1 (ts timestamp, c1 int) tags (t1 int);") + tdsql.execute("insert into db.ct1 using db.stb1 TAGS(1) values(now(),11);") + tdsql.error(" insert into `db.ct2` using db.stb1 TAGS(9) values(now(),11);") + tdsql.error(" insert into db.`db.ct2` using db.stb1 TAGS(9) values(now(),11);") + tdsql.execute("insert into `db`.ct3 using db.stb1 TAGS(3) values(now(),13);") + tdsql.query("select * from db.ct3") + tdsql.checkData(0,1,13) + tdsql.execute("insert into db.`ct4` using db.stb1 TAGS(4) values(now(),14);") + tdsql.query("select * from db.ct4") + tdsql.checkData(0,1,14) + tdsql.query("describe information_schema.ins_databases;") + qRows=tdsql.queryRows + for i in range(qRows) : + if tdsql.queryResult[i][0]=="retentions" : + return True + else: + return False + def stop(self): + tdSql.close() + tdLog.success(f"{__file__} successfully executed") tdCases.addLinux(__file__, TDTestCase()) tdCases.addWindows(__file__, TDTestCase()) From 4ea7d139ba22b506d7c302d0ce1b6f841b23f545 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Wed, 30 Nov 2022 14:48:39 +0800 Subject: [PATCH 060/105] fix(query): fix avg calculation error after SIMD optimize TD-20803 --- .../libs/function/src/detail/tavgfunction.c | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/source/libs/function/src/detail/tavgfunction.c b/source/libs/function/src/detail/tavgfunction.c index 4cafbd4e6e..e8bd5f8d3c 100644 --- a/source/libs/function/src/detail/tavgfunction.c +++ b/source/libs/function/src/detail/tavgfunction.c @@ -502,7 +502,11 @@ int32_t avgFunction(SqlFunctionCtx* pCtx) { i8VectorSumAVX2(plist, numOfRows, type, pAvgRes); } else { for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) { - pAvgRes->sum.usum += plist[i]; + if (type == TSDB_DATA_TYPE_TINYINT) { + pAvgRes->sum.isum += plist[i]; + } else { + pAvgRes->sum.usum += (uint8_t)plist[i]; + } } } break; @@ -517,7 +521,11 @@ int32_t avgFunction(SqlFunctionCtx* pCtx) { i16VectorSumAVX2(plist, numOfRows, type, pAvgRes); } else { for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) { - pAvgRes->sum.isum += plist[i]; + if (type == TSDB_DATA_TYPE_SMALLINT) { + pAvgRes->sum.isum += plist[i]; + } else { + pAvgRes->sum.usum += (uint16_t)plist[i]; + } } } break; @@ -532,7 +540,11 @@ int32_t avgFunction(SqlFunctionCtx* pCtx) { i32VectorSumAVX2(plist, numOfRows, type, pAvgRes); } else { for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) { - pAvgRes->sum.isum += plist[i]; + if (type == TSDB_DATA_TYPE_INT) { + pAvgRes->sum.isum += plist[i]; + } else { + pAvgRes->sum.usum += (uint32_t)plist[i]; + } } } break; @@ -547,7 +559,11 @@ int32_t avgFunction(SqlFunctionCtx* pCtx) { i64VectorSumAVX2(plist, numOfRows, pAvgRes); } else { for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) { - pAvgRes->sum.isum += plist[i]; + if (type == TSDB_DATA_TYPE_BIGINT) { + pAvgRes->sum.isum += plist[i]; + } else { + pAvgRes->sum.isum += (uint64_t)plist[i]; + } } } break; From b30c56bf7c27874f6a3d7507e39f28d7248ba02c Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao@163.com> Date: Wed, 30 Nov 2022 14:00:30 +0800 Subject: [PATCH 061/105] fix:stream scan handles empty datablcok --- source/libs/executor/src/scanoperator.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index a4e609ae81..3c4d888528 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -1052,6 +1052,9 @@ static uint64_t getGroupIdByData(SStreamScanInfo* pInfo, uint64_t uid, TSKEY ts, } static bool prepareRangeScan(SStreamScanInfo* pInfo, SSDataBlock* pBlock, int32_t* pRowIndex) { + if (pBlock->info.rows == 0) { + return false; + } if ((*pRowIndex) == pBlock->info.rows) { return false; } @@ -1184,10 +1187,10 @@ static SSDataBlock* doRangeScan(SStreamScanInfo* pInfo, SSDataBlock* pSDB, int32 } static int32_t generateSessionScanRange(SStreamScanInfo* pInfo, SSDataBlock* pSrcBlock, SSDataBlock* pDestBlock) { + blockDataCleanup(pDestBlock); if (pSrcBlock->info.rows == 0) { return TSDB_CODE_SUCCESS; } - blockDataCleanup(pDestBlock); int32_t code = blockDataEnsureCapacity(pDestBlock, pSrcBlock->info.rows); if (code != TSDB_CODE_SUCCESS) { return code; @@ -1837,6 +1840,12 @@ FETCH_NEXT_BLOCK: } setBlockGroupIdByUid(pInfo, pDelBlock); printDataBlock(pDelBlock, "stream scan delete recv filtered"); + if (pDelBlock->info.rows == 0) { + if (pInfo->tqReader) { + blockDataDestroy(pDelBlock); + } + goto FETCH_NEXT_BLOCK; + } if (!isIntervalWindow(pInfo) && !isSessionWindow(pInfo) && !isStateWindow(pInfo)) { generateDeleteResultBlock(pInfo, pDelBlock, pInfo->pDeleteDataRes); pInfo->pDeleteDataRes->info.type = STREAM_DELETE_RESULT; From 4048988908b906ccbdd5dd324d5eac005112a051 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Wed, 30 Nov 2022 14:48:39 +0800 Subject: [PATCH 062/105] fix(query): fix avg calculation error after SIMD optimize TD-20803 --- .../libs/function/src/detail/tavgfunction.c | 93 +++++++++++++------ 1 file changed, 63 insertions(+), 30 deletions(-) diff --git a/source/libs/function/src/detail/tavgfunction.c b/source/libs/function/src/detail/tavgfunction.c index e8bd5f8d3c..f06bafafe3 100644 --- a/source/libs/function/src/detail/tavgfunction.c +++ b/source/libs/function/src/detail/tavgfunction.c @@ -133,6 +133,14 @@ static void i8VectorSumAVX2(const int8_t* plist, int32_t numOfRows, int32_t type sum = _mm256_add_epi64(sum, extVal); p += width; } + + // let sum up the final results + const int64_t* q = (const int64_t*)∑ + pRes->sum.isum += q[0] + q[1] + q[2] + q[3]; + + for (int32_t j = 0; j < remainder; ++j) { + pRes->sum.isum += plist[j + rounds * width]; + } } else { const uint8_t* p = (const uint8_t*)plist; @@ -142,16 +150,16 @@ static void i8VectorSumAVX2(const int8_t* plist, int32_t numOfRows, int32_t type sum = _mm256_add_epi64(sum, extVal); p += width; } + + // let sum up the final results + const uint64_t* q = (const uint64_t*)∑ + pRes->sum.usum += q[0] + q[1] + q[2] + q[3]; + + for (int32_t j = 0; j < remainder; ++j) { + pRes->sum.usum += (uint8_t)plist[j + rounds * width]; + } } - // let sum up the final results - const int64_t* q = (const int64_t*)∑ - pRes->sum.isum += q[0] + q[1] + q[2] + q[3]; - - int32_t startIndex = rounds * width; - for (int32_t j = 0; j < remainder; ++j) { - pRes->sum.isum += plist[j + startIndex]; - } #endif } @@ -176,8 +184,16 @@ static void i16VectorSumAVX2(const int16_t* plist, int32_t numOfRows, int32_t ty sum = _mm256_add_epi64(sum, extVal); p += width; } + + // let sum up the final results + const int64_t* q = (const int64_t*)∑ + pRes->sum.isum += q[0] + q[1] + q[2] + q[3]; + + for (int32_t j = 0; j < remainder; ++j) { + pRes->sum.isum += plist[j + rounds * width]; + } } else { - const uint8_t* p = (const uint8_t*)plist; + const uint16_t* p = (const uint16_t*)plist; for(int32_t i = 0; i < rounds; ++i) { __m128i val = _mm_lddqu_si128((__m128i*)p); @@ -185,16 +201,16 @@ static void i16VectorSumAVX2(const int16_t* plist, int32_t numOfRows, int32_t ty sum = _mm256_add_epi64(sum, extVal); p += width; } + + // let sum up the final results + const uint64_t* q = (const uint64_t*)∑ + pRes->sum.usum += q[0] + q[1] + q[2] + q[3]; + + for (int32_t j = 0; j < remainder; ++j) { + pRes->sum.usum += (uint16_t)plist[j + rounds * width]; + } } - // let sum up the final results - const int64_t* q = (const int64_t*)∑ - pRes->sum.isum += q[0] + q[1] + q[2] + q[3]; - - int32_t startIndex = rounds * width; - for (int32_t j = 0; j < remainder; ++j) { - pRes->sum.isum += plist[j + startIndex]; - } #endif } @@ -219,6 +235,14 @@ static void i32VectorSumAVX2(const int32_t* plist, int32_t numOfRows, int32_t ty sum = _mm256_add_epi64(sum, extVal); p += width; } + + // let sum up the final results + const int64_t* q = (const int64_t*)∑ + pRes->sum.isum += q[0] + q[1] + q[2] + q[3]; + + for (int32_t j = 0; j < remainder; ++j) { + pRes->sum.isum += plist[j + rounds * width]; + } } else { const uint32_t* p = (const uint32_t*)plist; @@ -228,16 +252,16 @@ static void i32VectorSumAVX2(const int32_t* plist, int32_t numOfRows, int32_t ty sum = _mm256_add_epi64(sum, extVal); p += width; } + + // let sum up the final results + const uint64_t* q = (const uint64_t*)∑ + pRes->sum.usum += q[0] + q[1] + q[2] + q[3]; + + for (int32_t j = 0; j < remainder; ++j) { + pRes->sum.usum += (uint32_t)plist[j + rounds * width]; + } } - // let sum up the final results - const int64_t* q = (const int64_t*)∑ - pRes->sum.isum += q[0] + q[1] + q[2] + q[3]; - - int32_t startIndex = rounds * width; - for (int32_t j = 0; j < remainder; ++j) { - pRes->sum.isum += plist[j + startIndex]; - } #endif } @@ -262,13 +286,22 @@ static void i64VectorSumAVX2(const int64_t* plist, int32_t numOfRows, SAvgRes* p } // let sum up the final results - const int64_t* q = (const int64_t*)∑ - pRes->sum.isum += q[0] + q[1] + q[2] + q[3]; + if (type == TSDB_DATA_TYPE_BIGINT) { + const int64_t* q = (const int64_t*)∑ + pRes->sum.isum += q[0] + q[1] + q[2] + q[3]; - int32_t startIndex = rounds * width; - for (int32_t j = 0; j < remainder; ++j) { - pRes->sum.isum += plist[j + startIndex]; + for (int32_t j = 0; j < remainder; ++j) { + pRes->sum.isum += plist[j + rounds * width]; + } + } else { + const uint64_t* q = (const uint64_t*)∑ + pRes->sum.usum += q[0] + q[1] + q[2] + q[3]; + + for (int32_t j = 0; j < remainder; ++j) { + pRes->sum.usum += (uint64_t)plist[j + rounds * width]; + } } + #endif } From ad61b5b593e4ca745b5329fcecc2607a7bedc9d5 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 30 Nov 2022 17:07:30 +0800 Subject: [PATCH 063/105] fix:add log --- source/client/src/clientSml.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index 28e873cca3..5381b2c0dd 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -815,6 +815,11 @@ static int8_t smlGetTsTypeByPrecision(int8_t precision) { } static int64_t smlParseInfluxTime(SSmlHandle *info, const char *data, int32_t len) { + char *tmp = taosMemoryCalloc(1, len + 1); + memcpy(tmp, data, len); + uDebug("SML:0x%" PRIx64 " smlParseInfluxTime ts:%s", info->id, tmp); + taosMemoryFree(tmp); + if (len == 0 || (len == 1 && data[0] == '0')) { return taosGetTimestampNs(); } @@ -2066,7 +2071,10 @@ static int32_t smlParseJSONString(SSmlHandle *info, cJSON *root, SSmlTableInfo * static int32_t smlParseInfluxLine(SSmlHandle *info, const char *sql, const int len) { SSmlLineInfo elements = {0}; - uDebug("SML:0x%" PRIx64 " smlParseInfluxLine sql:%s", info->id, (info->isRawLine ? "rawdata" : sql)); + char *tmp = taosMemoryCalloc(1, len + 1); + memcpy(tmp, sql, len); + uDebug("SML:0x%" PRIx64 " smlParseInfluxLine raw:%d, sql:%s", info->id, info->isRawLine, (info->isRawLine ? tmp : sql)); + taosMemoryFree(tmp); int ret = smlParseInfluxString(sql, sql + len, &elements, &info->msgBuf); if (ret != TSDB_CODE_SUCCESS) { From 3f82427e7d0bed75f984ad0a9e60f835d6b83929 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 30 Nov 2022 17:11:17 +0800 Subject: [PATCH 064/105] fix:add log --- source/client/src/clientSml.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index 5381b2c0dd..17cbf377f5 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -815,7 +815,7 @@ static int8_t smlGetTsTypeByPrecision(int8_t precision) { } static int64_t smlParseInfluxTime(SSmlHandle *info, const char *data, int32_t len) { - char *tmp = taosMemoryCalloc(1, len + 1); + char *tmp = (char*)taosMemoryCalloc(1, len + 1); memcpy(tmp, data, len); uDebug("SML:0x%" PRIx64 " smlParseInfluxTime ts:%s", info->id, tmp); taosMemoryFree(tmp); @@ -2071,7 +2071,7 @@ static int32_t smlParseJSONString(SSmlHandle *info, cJSON *root, SSmlTableInfo * static int32_t smlParseInfluxLine(SSmlHandle *info, const char *sql, const int len) { SSmlLineInfo elements = {0}; - char *tmp = taosMemoryCalloc(1, len + 1); + char *tmp = (char*)taosMemoryCalloc(1, len + 1); memcpy(tmp, sql, len); uDebug("SML:0x%" PRIx64 " smlParseInfluxLine raw:%d, sql:%s", info->id, info->isRawLine, (info->isRawLine ? tmp : sql)); taosMemoryFree(tmp); From d58640dd5318ed406e5a1194ecd62e00edf17f4f Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 30 Nov 2022 17:15:23 +0800 Subject: [PATCH 065/105] enh: show more info while drop dnode --- source/common/src/systable.c | 19 ++++++++----------- source/dnode/mnode/impl/src/mndVgroup.c | 21 ++++++++++----------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/source/common/src/systable.c b/source/common/src/systable.c index 1829101639..1255116d0c 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -206,18 +206,15 @@ static const SSysDbTableSchema vgroupsSchema[] = { {.name = "vgroup_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, {.name = "db_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, {.name = "tables", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, - {.name = "v1_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, - {.name = "v1_status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, - {.name = "v2_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, - {.name = "v2_status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, - {.name = "v3_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, - {.name = "v3_status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, - {.name = "v4_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, - {.name = "v4_status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, - {.name = "status", .bytes = 12 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "v1_dnode", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true}, + {.name = "v1_status", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "v2_dnode", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true}, + {.name = "v2_status", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "v3_dnode", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true}, + {.name = "v3_status", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, + {.name = "v4_dnode", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true}, + {.name = "v4_status", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, {.name = "cacheload", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, - {.name = "nfiles", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, - {.name = "file_size", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true}, {.name = "tsma", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT, .sysInfo = true}, }; diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index dd2b985c14..d06853e470 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -189,6 +189,12 @@ static int32_t mndVgroupActionUpdate(SSdb *pSdb, SVgObj *pOld, SVgObj *pNew) { } } } + pNew->numOfTables = pOld->numOfTables; + pNew->numOfTimeSeries = pOld->numOfTimeSeries; + pNew->totalStorage = pOld->totalStorage; + pNew->compStorage = pOld->compStorage; + pNew->pointsWritten = pOld->pointsWritten; + pNew->compact = pOld->compact; memcpy(pOld->vnodeGid, pNew->vnodeGid, TSDB_MAX_REPLICA * sizeof(SVnodeGid)); return 0; } @@ -673,7 +679,8 @@ static int32_t mndRetrieveVgroups(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p for (int32_t i = 0; i < 4; ++i) { pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); if (i < pVgroup->replica) { - colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->vnodeGid[i].dnodeId, false); + int16_t dnodeId = (int16_t)pVgroup->vnodeGid[i].dnodeId; + colDataAppend(pColInfo, numOfRows, (const char *)&dnodeId, false); bool exist = false; bool online = false; @@ -705,16 +712,8 @@ static int32_t mndRetrieveVgroups(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p } pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataAppendNULL(pColInfo, numOfRows); - - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->cacheUsage, false); - - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataAppendNULL(pColInfo, numOfRows); - - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataAppendNULL(pColInfo, numOfRows); + int32_t cacheUsage = (int32_t)pVgroup->cacheUsage; + colDataAppend(pColInfo, numOfRows, (const char *)&cacheUsage, false); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->isTsma, false); From 00b6ad284c604790b882040639eaddc912056bc3 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Wed, 30 Nov 2022 17:26:14 +0800 Subject: [PATCH 066/105] fix: taosbenchmark printf format (#18569) * feat: taosbenchmark supports retry * fix: taosbenchmark printf format --- cmake/taostools_CMakeLists.txt.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in index c2ef22c338..47f2d20828 100644 --- a/cmake/taostools_CMakeLists.txt.in +++ b/cmake/taostools_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taos-tools ExternalProject_Add(taos-tools GIT_REPOSITORY https://github.com/taosdata/taos-tools.git - GIT_TAG cf30c86 + GIT_TAG b103d9b SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE From 124fb5fc5076163d091f5036b3e610d8cf8f6dd5 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 30 Nov 2022 17:52:12 +0800 Subject: [PATCH 067/105] refactor: do some internal refactor. --- include/util/tarray.h | 15 ++------------- source/dnode/mnode/impl/src/mndConsumer.c | 5 +++-- source/dnode/vnode/src/tsdb/tsdbRead.c | 1 + source/libs/stream/src/streamUpdate.c | 7 ++++++- source/util/src/tarray.c | 9 +-------- 5 files changed, 13 insertions(+), 24 deletions(-) diff --git a/include/util/tarray.h b/include/util/tarray.h index beebd70dea..0e78397ecb 100644 --- a/include/util/tarray.h +++ b/include/util/tarray.h @@ -220,15 +220,10 @@ void taosArrayClear(SArray* pArray); */ void taosArrayClearEx(SArray* pArray, void (*fp)(void*)); -/** - * clear the array (remove all element) - * @param pArray - * @param fp - */ -void taosArrayClearP(SArray* pArray, FDelete fp); - void* taosArrayDestroy(SArray* pArray); + void taosArrayDestroyP(SArray* pArray, FDelete fp); + void taosArrayDestroyEx(SArray* pArray, FDelete fp); /** @@ -238,12 +233,6 @@ void taosArrayDestroyEx(SArray* pArray, FDelete fp); */ void taosArraySort(SArray* pArray, __compar_fn_t comparFn); -/** - * sort string array - * @param pArray - */ -void taosArraySortString(SArray* pArray, __compar_fn_t comparFn); - /** * search the array * @param pArray diff --git a/source/dnode/mnode/impl/src/mndConsumer.c b/source/dnode/mnode/impl/src/mndConsumer.c index 58f8172282..4397ea0751 100644 --- a/source/dnode/mnode/impl/src/mndConsumer.c +++ b/source/dnode/mnode/impl/src/mndConsumer.c @@ -538,7 +538,7 @@ static int32_t mndProcessSubscribeReq(SRpcMsg *pMsg) { int32_t code = -1; SArray *newSub = subscribe.topicNames; - taosArraySortString(newSub, taosArrayCompareString); + taosArraySort(newSub, taosArrayCompareString); taosArrayRemoveDuplicateP(newSub, taosArrayCompareString, taosMemoryFree); int32_t newTopicNum = taosArrayGetSize(newSub); @@ -850,7 +850,8 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer, // add to current topic taosArrayPush(pOldConsumer->currentTopics, &addedTopic); - taosArraySortString(pOldConsumer->currentTopics, taosArrayCompareString); + taosArraySort(pOldConsumer->currentTopics, taosArrayCompareString); + // set status if (taosArrayGetSize(pOldConsumer->rebNewTopics) == 0 && taosArrayGetSize(pOldConsumer->rebRemovedTopics) == 0) { if (pOldConsumer->status == MQ_CONSUMER_STATUS__MODIFY || diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index 26c9ce6810..83532c2a20 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -2543,6 +2543,7 @@ int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader* goto _err; } + // TODO: opt the perf of read del index code = tsdbReadDelIdx(pDelFReader, aDelIdx); if (code != TSDB_CODE_SUCCESS) { taosArrayDestroy(aDelIdx); diff --git a/source/libs/stream/src/streamUpdate.c b/source/libs/stream/src/streamUpdate.c index 1589fddda4..1ce4a35dff 100644 --- a/source/libs/stream/src/streamUpdate.c +++ b/source/libs/stream/src/streamUpdate.c @@ -44,6 +44,11 @@ static void windowSBfAdd(SUpdateInfo *pInfo, uint64_t count) { } } +static void clearItemHelper(void* p) { + SScalableBf** pBf = p; + tScalableBfDestroy(*pBf); +} + static void windowSBfDelete(SUpdateInfo *pInfo, uint64_t count) { if (count < pInfo->numSBFs) { for (uint64_t i = 0; i < count; ++i) { @@ -52,7 +57,7 @@ static void windowSBfDelete(SUpdateInfo *pInfo, uint64_t count) { taosArrayRemove(pInfo->pTsSBFs, 0); } } else { - taosArrayClearP(pInfo->pTsSBFs, (FDelete)tScalableBfDestroy); + taosArrayClearEx(pInfo->pTsSBFs, clearItemHelper); } pInfo->minTS += pInfo->interval * count; } diff --git a/source/util/src/tarray.c b/source/util/src/tarray.c index f53b1cfd7f..ae25786375 100644 --- a/source/util/src/tarray.c +++ b/source/util/src/tarray.c @@ -399,9 +399,7 @@ void taosArrayDestroyEx(SArray* pArray, FDelete fp) { } void taosArraySort(SArray* pArray, __compar_fn_t compar) { - assert(pArray != NULL); - assert(compar != NULL); - + ASSERT(pArray != NULL && compar != NULL); taosSort(pArray->pData, pArray->size, pArray->elemSize, compar); } @@ -417,11 +415,6 @@ int32_t taosArraySearchIdx(const SArray* pArray, const void* key, __compar_fn_t return item == NULL ? -1 : (int32_t)((char*)item - (char*)pArray->pData) / pArray->elemSize; } -void taosArraySortString(SArray* pArray, __compar_fn_t comparFn) { - assert(pArray != NULL); - taosSort(pArray->pData, pArray->size, pArray->elemSize, comparFn); -} - static int32_t taosArrayPartition(SArray* pArray, int32_t i, int32_t j, __ext_compar_fn_t fn, const void* userData) { void* key = taosArrayGetP(pArray, i); while (i < j) { From ef054d9ddc0e1b45a0d7adea88eabe8ec95725c3 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Wed, 30 Nov 2022 18:01:20 +0800 Subject: [PATCH 068/105] fix(query): fix interp with fill(prev) error --- source/libs/executor/src/timesliceoperator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/executor/src/timesliceoperator.c b/source/libs/executor/src/timesliceoperator.c index d8cef86971..90f5dde7c3 100644 --- a/source/libs/executor/src/timesliceoperator.c +++ b/source/libs/executor/src/timesliceoperator.c @@ -467,11 +467,11 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) { // add current row if timestamp match if (ts == pSliceInfo->current && pSliceInfo->current <= pSliceInfo->win.ekey) { addCurrentRowToResult(pSliceInfo, &pOperator->exprSupp, pResBlock, pBlock, i); - doKeepPrevRows(pSliceInfo, pBlock, i); pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision); } + doKeepPrevRows(pSliceInfo, pBlock, i); if (pSliceInfo->current > pSliceInfo->win.ekey) { setOperatorCompleted(pOperator); From 2bd4c09568dbc7e5778638c144d3decf85585029 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 30 Nov 2022 18:02:30 +0800 Subject: [PATCH 069/105] fix:get meta if cols change in schemaless --- source/client/src/clientSml.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index 17cbf377f5..9a08f88cfa 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -563,6 +563,11 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { if (code != TSDB_CODE_SUCCESS) { goto end; } + code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta); + if (code != TSDB_CODE_SUCCESS) { + uError("SML:0x%" PRIx64 " catalogGetSTableMeta failed. super table name %s", info->id, pName.tname); + goto end; + } } needCheckMeta = true; From 4e8acca2eb98622a772a6fdda2314aafb6585475 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Wed, 30 Nov 2022 19:24:15 +0800 Subject: [PATCH 070/105] feat: sql command 'show user privileges' --- include/common/systable.h | 1 + include/common/tmsg.h | 24 +- include/common/ttokendef.h | 554 +- include/libs/nodes/cmdnodes.h | 9 +- include/libs/nodes/nodes.h | 1 + source/common/src/systable.c | 7 + source/common/src/tmsg.c | 4 +- source/dnode/mnode/impl/src/mndUser.c | 32 +- source/libs/nodes/src/nodesUtilFuncs.c | 4 +- source/libs/parser/inc/sql.y | 3 + source/libs/parser/src/parAstCreater.c | 4 +- source/libs/parser/src/parAstParser.c | 7 + source/libs/parser/src/parTokenizer.c | 2 + source/libs/parser/src/parTranslater.c | 17 +- source/libs/parser/src/sql.c | 6863 ++++++++--------- source/libs/parser/test/mockCatalog.cpp | 8 +- .../parser/test/parAlterToBalanceTest.cpp | 4 +- .../parser/test/parExplainToSyncdbTest.cpp | 28 + source/libs/parser/test/parShowToUse.cpp | 8 +- 19 files changed, 3822 insertions(+), 3758 deletions(-) diff --git a/include/common/systable.h b/include/common/systable.h index 57f85f16bc..6f65c1e8b8 100644 --- a/include/common/systable.h +++ b/include/common/systable.h @@ -47,6 +47,7 @@ extern "C" { #define TSDB_INS_TABLE_TOPICS "ins_topics" #define TSDB_INS_TABLE_STREAMS "ins_streams" #define TSDB_INS_TABLE_STREAM_TASKS "ins_stream_tasks" +#define TSDB_INS_TABLE_USER_PRIVILEGES "ins_user_privileges" #define TSDB_PERFORMANCE_SCHEMA_DB "performance_schema" #define TSDB_PERFS_TABLE_SMAS "perf_smas" diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 80590a25c0..b6966c97b9 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -141,16 +141,18 @@ typedef enum _mgmt_table { #define TSDB_FILL_PREV 4 #define TSDB_FILL_NEXT 5 -#define TSDB_ALTER_USER_PASSWD 0x1 -#define TSDB_ALTER_USER_SUPERUSER 0x2 -#define TSDB_ALTER_USER_ADD_READ_DB 0x3 -#define TSDB_ALTER_USER_REMOVE_READ_DB 0x4 -#define TSDB_ALTER_USER_ADD_WRITE_DB 0x5 -#define TSDB_ALTER_USER_REMOVE_WRITE_DB 0x6 -#define TSDB_ALTER_USER_ADD_ALL_DB 0x7 -#define TSDB_ALTER_USER_REMOVE_ALL_DB 0x8 -#define TSDB_ALTER_USER_ENABLE 0x9 -#define TSDB_ALTER_USER_SYSINFO 0xA +#define TSDB_ALTER_USER_PASSWD 0x1 +#define TSDB_ALTER_USER_SUPERUSER 0x2 +#define TSDB_ALTER_USER_ADD_READ_DB 0x3 +#define TSDB_ALTER_USER_REMOVE_READ_DB 0x4 +#define TSDB_ALTER_USER_ADD_WRITE_DB 0x5 +#define TSDB_ALTER_USER_REMOVE_WRITE_DB 0x6 +#define TSDB_ALTER_USER_ADD_ALL_DB 0x7 +#define TSDB_ALTER_USER_REMOVE_ALL_DB 0x8 +#define TSDB_ALTER_USER_ENABLE 0x9 +#define TSDB_ALTER_USER_SYSINFO 0xA +#define TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC 0xB +#define TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC 0xC #define TSDB_ALTER_USER_PRIVILEGES 0x2 @@ -620,7 +622,7 @@ typedef struct { int8_t enable; char user[TSDB_USER_LEN]; char pass[TSDB_USET_PASSWORD_LEN]; - char dbname[TSDB_DB_FNAME_LEN]; + char objname[TSDB_DB_FNAME_LEN]; // db or topic } SAlterUserReq; int32_t tSerializeSAlterUserReq(void* buf, int32_t bufLen, SAlterUserReq* pReq); diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h index f3c570aa85..ccf91600db 100644 --- a/include/common/ttokendef.h +++ b/include/common/ttokendef.h @@ -58,282 +58,284 @@ #define TK_TO 40 #define TK_REVOKE 41 #define TK_FROM 42 -#define TK_NK_COMMA 43 -#define TK_READ 44 -#define TK_WRITE 45 -#define TK_NK_DOT 46 -#define TK_DNODE 47 -#define TK_PORT 48 -#define TK_DNODES 49 -#define TK_NK_IPTOKEN 50 -#define TK_FORCE 51 -#define TK_LOCAL 52 -#define TK_QNODE 53 -#define TK_BNODE 54 -#define TK_SNODE 55 -#define TK_MNODE 56 -#define TK_DATABASE 57 -#define TK_USE 58 -#define TK_FLUSH 59 -#define TK_TRIM 60 -#define TK_IF 61 -#define TK_NOT 62 -#define TK_EXISTS 63 -#define TK_BUFFER 64 -#define TK_CACHEMODEL 65 -#define TK_CACHESIZE 66 -#define TK_COMP 67 -#define TK_DURATION 68 -#define TK_NK_VARIABLE 69 -#define TK_MAXROWS 70 -#define TK_MINROWS 71 -#define TK_KEEP 72 -#define TK_PAGES 73 -#define TK_PAGESIZE 74 -#define TK_TSDB_PAGESIZE 75 -#define TK_PRECISION 76 -#define TK_REPLICA 77 -#define TK_STRICT 78 -#define TK_VGROUPS 79 -#define TK_SINGLE_STABLE 80 -#define TK_RETENTIONS 81 -#define TK_SCHEMALESS 82 -#define TK_WAL_LEVEL 83 -#define TK_WAL_FSYNC_PERIOD 84 -#define TK_WAL_RETENTION_PERIOD 85 -#define TK_WAL_RETENTION_SIZE 86 -#define TK_WAL_ROLL_PERIOD 87 -#define TK_WAL_SEGMENT_SIZE 88 -#define TK_STT_TRIGGER 89 -#define TK_TABLE_PREFIX 90 -#define TK_TABLE_SUFFIX 91 -#define TK_NK_COLON 92 -#define TK_MAX_SPEED 93 -#define TK_TABLE 94 -#define TK_NK_LP 95 -#define TK_NK_RP 96 -#define TK_STABLE 97 -#define TK_ADD 98 -#define TK_COLUMN 99 -#define TK_MODIFY 100 -#define TK_RENAME 101 -#define TK_TAG 102 -#define TK_SET 103 -#define TK_NK_EQ 104 -#define TK_USING 105 -#define TK_TAGS 106 -#define TK_COMMENT 107 -#define TK_BOOL 108 -#define TK_TINYINT 109 -#define TK_SMALLINT 110 -#define TK_INT 111 -#define TK_INTEGER 112 -#define TK_BIGINT 113 -#define TK_FLOAT 114 -#define TK_DOUBLE 115 -#define TK_BINARY 116 -#define TK_TIMESTAMP 117 -#define TK_NCHAR 118 -#define TK_UNSIGNED 119 -#define TK_JSON 120 -#define TK_VARCHAR 121 -#define TK_MEDIUMBLOB 122 -#define TK_BLOB 123 -#define TK_VARBINARY 124 -#define TK_DECIMAL 125 -#define TK_MAX_DELAY 126 -#define TK_WATERMARK 127 -#define TK_ROLLUP 128 -#define TK_TTL 129 -#define TK_SMA 130 -#define TK_FIRST 131 -#define TK_LAST 132 -#define TK_SHOW 133 -#define TK_DATABASES 134 -#define TK_TABLES 135 -#define TK_STABLES 136 -#define TK_MNODES 137 -#define TK_QNODES 138 -#define TK_FUNCTIONS 139 -#define TK_INDEXES 140 -#define TK_ACCOUNTS 141 -#define TK_APPS 142 -#define TK_CONNECTIONS 143 -#define TK_LICENCES 144 -#define TK_GRANTS 145 -#define TK_QUERIES 146 -#define TK_SCORES 147 -#define TK_TOPICS 148 -#define TK_VARIABLES 149 -#define TK_CLUSTER 150 -#define TK_BNODES 151 -#define TK_SNODES 152 -#define TK_TRANSACTIONS 153 -#define TK_DISTRIBUTED 154 -#define TK_CONSUMERS 155 -#define TK_SUBSCRIPTIONS 156 -#define TK_VNODES 157 -#define TK_LIKE 158 -#define TK_TBNAME 159 -#define TK_QTAGS 160 -#define TK_AS 161 -#define TK_INDEX 162 -#define TK_FUNCTION 163 -#define TK_INTERVAL 164 -#define TK_TOPIC 165 -#define TK_WITH 166 -#define TK_META 167 -#define TK_CONSUMER 168 -#define TK_GROUP 169 -#define TK_DESC 170 -#define TK_DESCRIBE 171 -#define TK_RESET 172 -#define TK_QUERY 173 -#define TK_CACHE 174 -#define TK_EXPLAIN 175 -#define TK_ANALYZE 176 -#define TK_VERBOSE 177 -#define TK_NK_BOOL 178 -#define TK_RATIO 179 -#define TK_NK_FLOAT 180 -#define TK_OUTPUTTYPE 181 -#define TK_AGGREGATE 182 -#define TK_BUFSIZE 183 -#define TK_STREAM 184 -#define TK_INTO 185 -#define TK_TRIGGER 186 -#define TK_AT_ONCE 187 -#define TK_WINDOW_CLOSE 188 -#define TK_IGNORE 189 -#define TK_EXPIRED 190 -#define TK_FILL_HISTORY 191 -#define TK_SUBTABLE 192 -#define TK_KILL 193 -#define TK_CONNECTION 194 -#define TK_TRANSACTION 195 -#define TK_BALANCE 196 -#define TK_VGROUP 197 -#define TK_MERGE 198 -#define TK_REDISTRIBUTE 199 -#define TK_SPLIT 200 -#define TK_DELETE 201 -#define TK_INSERT 202 -#define TK_NULL 203 -#define TK_NK_QUESTION 204 -#define TK_NK_ARROW 205 -#define TK_ROWTS 206 -#define TK_QSTART 207 -#define TK_QEND 208 -#define TK_QDURATION 209 -#define TK_WSTART 210 -#define TK_WEND 211 -#define TK_WDURATION 212 -#define TK_IROWTS 213 -#define TK_CAST 214 -#define TK_NOW 215 -#define TK_TODAY 216 -#define TK_TIMEZONE 217 -#define TK_CLIENT_VERSION 218 -#define TK_SERVER_VERSION 219 -#define TK_SERVER_STATUS 220 -#define TK_CURRENT_USER 221 -#define TK_COUNT 222 -#define TK_LAST_ROW 223 -#define TK_CASE 224 -#define TK_END 225 -#define TK_WHEN 226 -#define TK_THEN 227 -#define TK_ELSE 228 -#define TK_BETWEEN 229 -#define TK_IS 230 -#define TK_NK_LT 231 -#define TK_NK_GT 232 -#define TK_NK_LE 233 -#define TK_NK_GE 234 -#define TK_NK_NE 235 -#define TK_MATCH 236 -#define TK_NMATCH 237 -#define TK_CONTAINS 238 -#define TK_IN 239 -#define TK_JOIN 240 -#define TK_INNER 241 -#define TK_SELECT 242 -#define TK_DISTINCT 243 -#define TK_WHERE 244 -#define TK_PARTITION 245 -#define TK_BY 246 -#define TK_SESSION 247 -#define TK_STATE_WINDOW 248 -#define TK_SLIDING 249 -#define TK_FILL 250 -#define TK_VALUE 251 -#define TK_NONE 252 -#define TK_PREV 253 -#define TK_LINEAR 254 -#define TK_NEXT 255 -#define TK_HAVING 256 -#define TK_RANGE 257 -#define TK_EVERY 258 -#define TK_ORDER 259 -#define TK_SLIMIT 260 -#define TK_SOFFSET 261 -#define TK_LIMIT 262 -#define TK_OFFSET 263 -#define TK_ASC 264 -#define TK_NULLS 265 -#define TK_ABORT 266 -#define TK_AFTER 267 -#define TK_ATTACH 268 -#define TK_BEFORE 269 -#define TK_BEGIN 270 -#define TK_BITAND 271 -#define TK_BITNOT 272 -#define TK_BITOR 273 -#define TK_BLOCKS 274 -#define TK_CHANGE 275 -#define TK_COMMA 276 -#define TK_COMPACT 277 -#define TK_CONCAT 278 -#define TK_CONFLICT 279 -#define TK_COPY 280 -#define TK_DEFERRED 281 -#define TK_DELIMITERS 282 -#define TK_DETACH 283 -#define TK_DIVIDE 284 -#define TK_DOT 285 -#define TK_EACH 286 -#define TK_FAIL 287 -#define TK_FILE 288 -#define TK_FOR 289 -#define TK_GLOB 290 -#define TK_ID 291 -#define TK_IMMEDIATE 292 -#define TK_IMPORT 293 -#define TK_INITIALLY 294 -#define TK_INSTEAD 295 -#define TK_ISNULL 296 -#define TK_KEY 297 -#define TK_MODULES 298 -#define TK_NK_BITNOT 299 -#define TK_NK_SEMI 300 -#define TK_NOTNULL 301 -#define TK_OF 302 -#define TK_PLUS 303 -#define TK_PRIVILEGE 304 -#define TK_RAISE 305 -#define TK_REPLACE 306 -#define TK_RESTRICT 307 -#define TK_ROW 308 -#define TK_SEMI 309 -#define TK_STAR 310 -#define TK_STATEMENT 311 -#define TK_STRING 312 -#define TK_TIMES 313 -#define TK_UPDATE 314 -#define TK_VALUES 315 -#define TK_VARIABLE 316 -#define TK_VIEW 317 -#define TK_WAL 318 +#define TK_SUBSCRIBE 43 +#define TK_NK_COMMA 44 +#define TK_READ 45 +#define TK_WRITE 46 +#define TK_NK_DOT 47 +#define TK_DNODE 48 +#define TK_PORT 49 +#define TK_DNODES 50 +#define TK_NK_IPTOKEN 51 +#define TK_FORCE 52 +#define TK_LOCAL 53 +#define TK_QNODE 54 +#define TK_BNODE 55 +#define TK_SNODE 56 +#define TK_MNODE 57 +#define TK_DATABASE 58 +#define TK_USE 59 +#define TK_FLUSH 60 +#define TK_TRIM 61 +#define TK_IF 62 +#define TK_NOT 63 +#define TK_EXISTS 64 +#define TK_BUFFER 65 +#define TK_CACHEMODEL 66 +#define TK_CACHESIZE 67 +#define TK_COMP 68 +#define TK_DURATION 69 +#define TK_NK_VARIABLE 70 +#define TK_MAXROWS 71 +#define TK_MINROWS 72 +#define TK_KEEP 73 +#define TK_PAGES 74 +#define TK_PAGESIZE 75 +#define TK_TSDB_PAGESIZE 76 +#define TK_PRECISION 77 +#define TK_REPLICA 78 +#define TK_STRICT 79 +#define TK_VGROUPS 80 +#define TK_SINGLE_STABLE 81 +#define TK_RETENTIONS 82 +#define TK_SCHEMALESS 83 +#define TK_WAL_LEVEL 84 +#define TK_WAL_FSYNC_PERIOD 85 +#define TK_WAL_RETENTION_PERIOD 86 +#define TK_WAL_RETENTION_SIZE 87 +#define TK_WAL_ROLL_PERIOD 88 +#define TK_WAL_SEGMENT_SIZE 89 +#define TK_STT_TRIGGER 90 +#define TK_TABLE_PREFIX 91 +#define TK_TABLE_SUFFIX 92 +#define TK_NK_COLON 93 +#define TK_MAX_SPEED 94 +#define TK_TABLE 95 +#define TK_NK_LP 96 +#define TK_NK_RP 97 +#define TK_STABLE 98 +#define TK_ADD 99 +#define TK_COLUMN 100 +#define TK_MODIFY 101 +#define TK_RENAME 102 +#define TK_TAG 103 +#define TK_SET 104 +#define TK_NK_EQ 105 +#define TK_USING 106 +#define TK_TAGS 107 +#define TK_COMMENT 108 +#define TK_BOOL 109 +#define TK_TINYINT 110 +#define TK_SMALLINT 111 +#define TK_INT 112 +#define TK_INTEGER 113 +#define TK_BIGINT 114 +#define TK_FLOAT 115 +#define TK_DOUBLE 116 +#define TK_BINARY 117 +#define TK_TIMESTAMP 118 +#define TK_NCHAR 119 +#define TK_UNSIGNED 120 +#define TK_JSON 121 +#define TK_VARCHAR 122 +#define TK_MEDIUMBLOB 123 +#define TK_BLOB 124 +#define TK_VARBINARY 125 +#define TK_DECIMAL 126 +#define TK_MAX_DELAY 127 +#define TK_WATERMARK 128 +#define TK_ROLLUP 129 +#define TK_TTL 130 +#define TK_SMA 131 +#define TK_FIRST 132 +#define TK_LAST 133 +#define TK_SHOW 134 +#define TK_PRIVILEGES 135 +#define TK_DATABASES 136 +#define TK_TABLES 137 +#define TK_STABLES 138 +#define TK_MNODES 139 +#define TK_QNODES 140 +#define TK_FUNCTIONS 141 +#define TK_INDEXES 142 +#define TK_ACCOUNTS 143 +#define TK_APPS 144 +#define TK_CONNECTIONS 145 +#define TK_LICENCES 146 +#define TK_GRANTS 147 +#define TK_QUERIES 148 +#define TK_SCORES 149 +#define TK_TOPICS 150 +#define TK_VARIABLES 151 +#define TK_CLUSTER 152 +#define TK_BNODES 153 +#define TK_SNODES 154 +#define TK_TRANSACTIONS 155 +#define TK_DISTRIBUTED 156 +#define TK_CONSUMERS 157 +#define TK_SUBSCRIPTIONS 158 +#define TK_VNODES 159 +#define TK_LIKE 160 +#define TK_TBNAME 161 +#define TK_QTAGS 162 +#define TK_AS 163 +#define TK_INDEX 164 +#define TK_FUNCTION 165 +#define TK_INTERVAL 166 +#define TK_TOPIC 167 +#define TK_WITH 168 +#define TK_META 169 +#define TK_CONSUMER 170 +#define TK_GROUP 171 +#define TK_DESC 172 +#define TK_DESCRIBE 173 +#define TK_RESET 174 +#define TK_QUERY 175 +#define TK_CACHE 176 +#define TK_EXPLAIN 177 +#define TK_ANALYZE 178 +#define TK_VERBOSE 179 +#define TK_NK_BOOL 180 +#define TK_RATIO 181 +#define TK_NK_FLOAT 182 +#define TK_OUTPUTTYPE 183 +#define TK_AGGREGATE 184 +#define TK_BUFSIZE 185 +#define TK_STREAM 186 +#define TK_INTO 187 +#define TK_TRIGGER 188 +#define TK_AT_ONCE 189 +#define TK_WINDOW_CLOSE 190 +#define TK_IGNORE 191 +#define TK_EXPIRED 192 +#define TK_FILL_HISTORY 193 +#define TK_SUBTABLE 194 +#define TK_KILL 195 +#define TK_CONNECTION 196 +#define TK_TRANSACTION 197 +#define TK_BALANCE 198 +#define TK_VGROUP 199 +#define TK_MERGE 200 +#define TK_REDISTRIBUTE 201 +#define TK_SPLIT 202 +#define TK_DELETE 203 +#define TK_INSERT 204 +#define TK_NULL 205 +#define TK_NK_QUESTION 206 +#define TK_NK_ARROW 207 +#define TK_ROWTS 208 +#define TK_QSTART 209 +#define TK_QEND 210 +#define TK_QDURATION 211 +#define TK_WSTART 212 +#define TK_WEND 213 +#define TK_WDURATION 214 +#define TK_IROWTS 215 +#define TK_CAST 216 +#define TK_NOW 217 +#define TK_TODAY 218 +#define TK_TIMEZONE 219 +#define TK_CLIENT_VERSION 220 +#define TK_SERVER_VERSION 221 +#define TK_SERVER_STATUS 222 +#define TK_CURRENT_USER 223 +#define TK_COUNT 224 +#define TK_LAST_ROW 225 +#define TK_CASE 226 +#define TK_END 227 +#define TK_WHEN 228 +#define TK_THEN 229 +#define TK_ELSE 230 +#define TK_BETWEEN 231 +#define TK_IS 232 +#define TK_NK_LT 233 +#define TK_NK_GT 234 +#define TK_NK_LE 235 +#define TK_NK_GE 236 +#define TK_NK_NE 237 +#define TK_MATCH 238 +#define TK_NMATCH 239 +#define TK_CONTAINS 240 +#define TK_IN 241 +#define TK_JOIN 242 +#define TK_INNER 243 +#define TK_SELECT 244 +#define TK_DISTINCT 245 +#define TK_WHERE 246 +#define TK_PARTITION 247 +#define TK_BY 248 +#define TK_SESSION 249 +#define TK_STATE_WINDOW 250 +#define TK_SLIDING 251 +#define TK_FILL 252 +#define TK_VALUE 253 +#define TK_NONE 254 +#define TK_PREV 255 +#define TK_LINEAR 256 +#define TK_NEXT 257 +#define TK_HAVING 258 +#define TK_RANGE 259 +#define TK_EVERY 260 +#define TK_ORDER 261 +#define TK_SLIMIT 262 +#define TK_SOFFSET 263 +#define TK_LIMIT 264 +#define TK_OFFSET 265 +#define TK_ASC 266 +#define TK_NULLS 267 +#define TK_ABORT 268 +#define TK_AFTER 269 +#define TK_ATTACH 270 +#define TK_BEFORE 271 +#define TK_BEGIN 272 +#define TK_BITAND 273 +#define TK_BITNOT 274 +#define TK_BITOR 275 +#define TK_BLOCKS 276 +#define TK_CHANGE 277 +#define TK_COMMA 278 +#define TK_COMPACT 279 +#define TK_CONCAT 280 +#define TK_CONFLICT 281 +#define TK_COPY 282 +#define TK_DEFERRED 283 +#define TK_DELIMITERS 284 +#define TK_DETACH 285 +#define TK_DIVIDE 286 +#define TK_DOT 287 +#define TK_EACH 288 +#define TK_FAIL 289 +#define TK_FILE 290 +#define TK_FOR 291 +#define TK_GLOB 292 +#define TK_ID 293 +#define TK_IMMEDIATE 294 +#define TK_IMPORT 295 +#define TK_INITIALLY 296 +#define TK_INSTEAD 297 +#define TK_ISNULL 298 +#define TK_KEY 299 +#define TK_MODULES 300 +#define TK_NK_BITNOT 301 +#define TK_NK_SEMI 302 +#define TK_NOTNULL 303 +#define TK_OF 304 +#define TK_PLUS 305 +#define TK_PRIVILEGE 306 +#define TK_RAISE 307 +#define TK_REPLACE 308 +#define TK_RESTRICT 309 +#define TK_ROW 310 +#define TK_SEMI 311 +#define TK_STAR 312 +#define TK_STATEMENT 313 +#define TK_STRING 314 +#define TK_TIMES 315 +#define TK_UPDATE 316 +#define TK_VALUES 317 +#define TK_VARIABLE 318 +#define TK_VIEW 319 +#define TK_WAL 320 #define TK_NK_SPACE 600 #define TK_NK_COMMENT 601 diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h index fc9bd461f6..e69c6e747d 100644 --- a/include/libs/nodes/cmdnodes.h +++ b/include/libs/nodes/cmdnodes.h @@ -42,9 +42,10 @@ extern "C" { #define PRIVILEGE_TYPE_MASK(n) (1 << n) -#define PRIVILEGE_TYPE_ALL PRIVILEGE_TYPE_MASK(0) -#define PRIVILEGE_TYPE_READ PRIVILEGE_TYPE_MASK(1) -#define PRIVILEGE_TYPE_WRITE PRIVILEGE_TYPE_MASK(2) +#define PRIVILEGE_TYPE_ALL PRIVILEGE_TYPE_MASK(0) +#define PRIVILEGE_TYPE_READ PRIVILEGE_TYPE_MASK(1) +#define PRIVILEGE_TYPE_WRITE PRIVILEGE_TYPE_MASK(2) +#define PRIVILEGE_TYPE_SUBSCRIBE PRIVILEGE_TYPE_MASK(3) #define PRIVILEGE_TYPE_TEST_MASK(val, mask) (((val) & (mask)) != 0) @@ -423,7 +424,7 @@ typedef struct SDropFunctionStmt { typedef struct SGrantStmt { ENodeType type; char userName[TSDB_USER_LEN]; - char dbName[TSDB_DB_NAME_LEN]; + char objName[TSDB_DB_NAME_LEN]; // db or topic int64_t privileges; } SGrantStmt; diff --git a/include/libs/nodes/nodes.h b/include/libs/nodes/nodes.h index 00e896f586..cd7cedb6c1 100644 --- a/include/libs/nodes/nodes.h +++ b/include/libs/nodes/nodes.h @@ -187,6 +187,7 @@ typedef enum ENodeType { QUERY_NODE_SHOW_TRANSACTIONS_STMT, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT, QUERY_NODE_SHOW_VNODES_STMT, + QUERY_NODE_SHOW_USER_PRIVILEGES_STMT, QUERY_NODE_SHOW_CREATE_DATABASE_STMT, QUERY_NODE_SHOW_CREATE_TABLE_STMT, QUERY_NODE_SHOW_CREATE_STABLE_STMT, diff --git a/source/common/src/systable.c b/source/common/src/systable.c index c3a1f9f67e..d24f13f292 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -274,6 +274,12 @@ static const SSysDbTableSchema vnodesSchema[] = { {.name = "dnode_ep", .bytes = TSDB_EP_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true}, }; +static const SSysDbTableSchema userUserPrivilegesSchema[] = { + {.name = "user_name", .bytes = TSDB_USER_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "privilege", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, + {.name = "object_name", .bytes = TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false}, +}; + static const SSysTableMeta infosMeta[] = { {TSDB_INS_TABLE_DNODES, dnodesSchema, tListLen(dnodesSchema), true}, {TSDB_INS_TABLE_MNODES, mnodesSchema, tListLen(mnodesSchema), true}, @@ -298,6 +304,7 @@ static const SSysTableMeta infosMeta[] = { {TSDB_INS_TABLE_STREAMS, streamSchema, tListLen(streamSchema), false}, {TSDB_INS_TABLE_STREAM_TASKS, streamTaskSchema, tListLen(streamTaskSchema), false}, {TSDB_INS_TABLE_VNODES, vnodesSchema, tListLen(vnodesSchema), true}, + {TSDB_INS_TABLE_USER_PRIVILEGES, userUserPrivilegesSchema, tListLen(userUserPrivilegesSchema), false}, }; static const SSysDbTableSchema connectionsSchema[] = { diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index c7e98415d1..3f81dbcd81 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -1288,7 +1288,7 @@ int32_t tSerializeSAlterUserReq(void *buf, int32_t bufLen, SAlterUserReq *pReq) if (tEncodeI8(&encoder, pReq->enable) < 0) return -1; if (tEncodeCStr(&encoder, pReq->user) < 0) return -1; if (tEncodeCStr(&encoder, pReq->pass) < 0) return -1; - if (tEncodeCStr(&encoder, pReq->dbname) < 0) return -1; + if (tEncodeCStr(&encoder, pReq->objname) < 0) return -1; tEndEncode(&encoder); int32_t tlen = encoder.pos; @@ -1307,7 +1307,7 @@ int32_t tDeserializeSAlterUserReq(void *buf, int32_t bufLen, SAlterUserReq *pReq if (tDecodeI8(&decoder, &pReq->enable) < 0) return -1; if (tDecodeCStrTo(&decoder, pReq->user) < 0) return -1; if (tDecodeCStrTo(&decoder, pReq->pass) < 0) return -1; - if (tDecodeCStrTo(&decoder, pReq->dbname) < 0) return -1; + if (tDecodeCStrTo(&decoder, pReq->objname) < 0) return -1; tEndDecode(&decoder); tDecoderClear(&decoder); diff --git a/source/dnode/mnode/impl/src/mndUser.c b/source/dnode/mnode/impl/src/mndUser.c index 9f4b9fc2de..2f50ab04b8 100644 --- a/source/dnode/mnode/impl/src/mndUser.c +++ b/source/dnode/mnode/impl/src/mndUser.c @@ -507,14 +507,14 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { } if (alterReq.alterType == TSDB_ALTER_USER_ADD_READ_DB || alterReq.alterType == TSDB_ALTER_USER_ADD_ALL_DB) { - if (strcmp(alterReq.dbname, "1.*") != 0) { - int32_t len = strlen(alterReq.dbname) + 1; - SDbObj *pDb = mndAcquireDb(pMnode, alterReq.dbname); + if (strcmp(alterReq.objname, "1.*") != 0) { + int32_t len = strlen(alterReq.objname) + 1; + SDbObj *pDb = mndAcquireDb(pMnode, alterReq.objname); if (pDb == NULL) { mndReleaseDb(pMnode, pDb); goto _OVER; } - if (taosHashPut(newUser.readDbs, alterReq.dbname, len, alterReq.dbname, TSDB_DB_FNAME_LEN) != 0) { + if (taosHashPut(newUser.readDbs, alterReq.objname, len, alterReq.objname, TSDB_DB_FNAME_LEN) != 0) { mndReleaseDb(pMnode, pDb); goto _OVER; } @@ -531,14 +531,14 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { } if (alterReq.alterType == TSDB_ALTER_USER_ADD_WRITE_DB || alterReq.alterType == TSDB_ALTER_USER_ADD_ALL_DB) { - if (strcmp(alterReq.dbname, "1.*") != 0) { - int32_t len = strlen(alterReq.dbname) + 1; - SDbObj *pDb = mndAcquireDb(pMnode, alterReq.dbname); + if (strcmp(alterReq.objname, "1.*") != 0) { + int32_t len = strlen(alterReq.objname) + 1; + SDbObj *pDb = mndAcquireDb(pMnode, alterReq.objname); if (pDb == NULL) { mndReleaseDb(pMnode, pDb); goto _OVER; } - if (taosHashPut(newUser.writeDbs, alterReq.dbname, len, alterReq.dbname, TSDB_DB_FNAME_LEN) != 0) { + if (taosHashPut(newUser.writeDbs, alterReq.objname, len, alterReq.objname, TSDB_DB_FNAME_LEN) != 0) { mndReleaseDb(pMnode, pDb); goto _OVER; } @@ -555,28 +555,28 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { } if (alterReq.alterType == TSDB_ALTER_USER_REMOVE_READ_DB || alterReq.alterType == TSDB_ALTER_USER_REMOVE_ALL_DB) { - if (strcmp(alterReq.dbname, "1.*") != 0) { - int32_t len = strlen(alterReq.dbname) + 1; - SDbObj *pDb = mndAcquireDb(pMnode, alterReq.dbname); + if (strcmp(alterReq.objname, "1.*") != 0) { + int32_t len = strlen(alterReq.objname) + 1; + SDbObj *pDb = mndAcquireDb(pMnode, alterReq.objname); if (pDb == NULL) { mndReleaseDb(pMnode, pDb); goto _OVER; } - taosHashRemove(newUser.readDbs, alterReq.dbname, len); + taosHashRemove(newUser.readDbs, alterReq.objname, len); } else { taosHashClear(newUser.readDbs); } } if (alterReq.alterType == TSDB_ALTER_USER_REMOVE_WRITE_DB || alterReq.alterType == TSDB_ALTER_USER_REMOVE_ALL_DB) { - if (strcmp(alterReq.dbname, "1.*") != 0) { - int32_t len = strlen(alterReq.dbname) + 1; - SDbObj *pDb = mndAcquireDb(pMnode, alterReq.dbname); + if (strcmp(alterReq.objname, "1.*") != 0) { + int32_t len = strlen(alterReq.objname) + 1; + SDbObj *pDb = mndAcquireDb(pMnode, alterReq.objname); if (pDb == NULL) { mndReleaseDb(pMnode, pDb); goto _OVER; } - taosHashRemove(newUser.writeDbs, alterReq.dbname, len); + taosHashRemove(newUser.writeDbs, alterReq.objname, len); } else { taosHashClear(newUser.writeDbs); } diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index 8c1a85b101..2f0f6b3432 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -424,6 +424,7 @@ SNode* nodesMakeNode(ENodeType type) { case QUERY_NODE_SHOW_TRANSACTIONS_STMT: case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT: case QUERY_NODE_SHOW_TAGS_STMT: + case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT: return makeNode(type, sizeof(SShowStmt)); case QUERY_NODE_SHOW_TABLE_TAGS_STMT: return makeNode(type, sizeof(SShowTableTagsStmt)); @@ -943,7 +944,8 @@ void nodesDestroyNode(SNode* pNode) { case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT: case QUERY_NODE_SHOW_TRANSACTIONS_STMT: case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT: - case QUERY_NODE_SHOW_TAGS_STMT: { + case QUERY_NODE_SHOW_TAGS_STMT: + case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT: { SShowStmt* pStmt = (SShowStmt*)pNode; nodesDestroyNode(pStmt->pDbName); nodesDestroyNode(pStmt->pTbName); diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index eb4f834096..6521161244 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -101,6 +101,7 @@ cmd ::= REVOKE privileges(A) ON priv_level(B) FROM user_name(C). %destructor privileges { } privileges(A) ::= ALL. { A = PRIVILEGE_TYPE_ALL; } privileges(A) ::= priv_type_list(B). { A = B; } +privileges(A) ::= SUBSCRIBE. { A = PRIVILEGE_TYPE_SUBSCRIBE; } %type priv_type_list { int64_t } %destructor priv_type_list { } @@ -116,6 +117,7 @@ priv_type(A) ::= WRITE. %destructor priv_level { } priv_level(A) ::= NK_STAR(B) NK_DOT NK_STAR. { A = B; } priv_level(A) ::= db_name(B) NK_DOT NK_STAR. { A = B; } +priv_level(A) ::= topic_name(B). { A = B; } /************************************************ create/drop/alter dnode *********************************************/ cmd ::= CREATE DNODE dnode_endpoint(A). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, NULL); } @@ -393,6 +395,7 @@ col_name(A) ::= column_name(B). /************************************************ show ****************************************************************/ cmd ::= SHOW DNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT); } cmd ::= SHOW USERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT); } +cmd ::= SHOW USER PRIVILEGES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USER_PRIVILEGES_STMT); } cmd ::= SHOW DATABASES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); } cmd ::= SHOW db_name_cond_opt(A) TABLES like_pattern_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, A, B, OP_TYPE_LIKE); } cmd ::= SHOW db_name_cond_opt(A) STABLES like_pattern_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, A, B, OP_TYPE_LIKE); } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index 6a8c79040d..40fb422c49 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -1815,7 +1815,7 @@ SNode* createGrantStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbN SGrantStmt* pStmt = (SGrantStmt*)nodesMakeNode(QUERY_NODE_GRANT_STMT); CHECK_OUT_OF_MEM(pStmt); pStmt->privileges = privileges; - COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); + COPY_STRING_FORM_ID_TOKEN(pStmt->objName, pDbName); COPY_STRING_FORM_ID_TOKEN(pStmt->userName, pUserName); return (SNode*)pStmt; } @@ -1828,7 +1828,7 @@ SNode* createRevokeStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDb SRevokeStmt* pStmt = (SRevokeStmt*)nodesMakeNode(QUERY_NODE_REVOKE_STMT); CHECK_OUT_OF_MEM(pStmt); pStmt->privileges = privileges; - COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); + COPY_STRING_FORM_ID_TOKEN(pStmt->objName, pDbName); COPY_STRING_FORM_ID_TOKEN(pStmt->userName, pUserName); return (SNode*)pStmt; } diff --git a/source/libs/parser/src/parAstParser.c b/source/libs/parser/src/parAstParser.c index 5aa87d780d..3481eddba4 100644 --- a/source/libs/parser/src/parAstParser.c +++ b/source/libs/parser/src/parAstParser.c @@ -504,6 +504,11 @@ static int32_t collectMetaKeyFromShowVnodes(SCollectMetaKeyCxt* pCxt, SShowVnode pCxt->pMetaCache); } +static int32_t collectMetaKeyFromShowUserPrivileges(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) { + return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USER_PRIVILEGES, + pCxt->pMetaCache); +} + static int32_t collectMetaKeyFromShowCreateDatabase(SCollectMetaKeyCxt* pCxt, SShowCreateDatabaseStmt* pStmt) { return reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache); } @@ -648,6 +653,8 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) { return collectMetaKeyFromShowDnodeVariables(pCxt, (SShowDnodeVariablesStmt*)pStmt); case QUERY_NODE_SHOW_VNODES_STMT: return collectMetaKeyFromShowVnodes(pCxt, (SShowVnodesStmt*)pStmt); + case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT: + return collectMetaKeyFromShowUserPrivileges(pCxt, (SShowStmt*)pStmt); case QUERY_NODE_SHOW_CREATE_DATABASE_STMT: return collectMetaKeyFromShowCreateDatabase(pCxt, (SShowCreateDatabaseStmt*)pStmt); case QUERY_NODE_SHOW_CREATE_TABLE_STMT: diff --git a/source/libs/parser/src/parTokenizer.c b/source/libs/parser/src/parTokenizer.c index 88a1d39ff2..7123173161 100644 --- a/source/libs/parser/src/parTokenizer.c +++ b/source/libs/parser/src/parTokenizer.c @@ -161,6 +161,7 @@ static SKeyword keywordTable[] = { {"PPS", TK_PPS}, {"PRECISION", TK_PRECISION}, {"PREV", TK_PREV}, + {"PRIVILEGES", TK_PRIVILEGES}, {"QNODE", TK_QNODE}, {"QNODES", TK_QNODES}, {"QTIME", TK_QTIME}, @@ -202,6 +203,7 @@ static SKeyword keywordTable[] = { {"STREAM", TK_STREAM}, {"STREAMS", TK_STREAMS}, {"STRICT", TK_STRICT}, + {"SUBSCRIBE", TK_SUBSCRIBE}, {"SUBSCRIPTIONS", TK_SUBSCRIPTIONS}, {"SUBTABLE", TK_SUBTABLE}, {"SYSINFO", TK_SYSINFO}, diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 9632c097b7..d2d97f7b90 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -251,6 +251,12 @@ static const SSysTableShowAdapter sysTableShowAdapter[] = { .numOfShowCols = 1, .pShowCols = {"*"} }, + { .showType = QUERY_NODE_SHOW_USER_PRIVILEGES_STMT, + .pDbName = TSDB_INFORMATION_SCHEMA_DB, + .pTableName = TSDB_INS_TABLE_USER_PRIVILEGES, + .numOfShowCols = 1, + .pShowCols = {"*"} + }, }; // clang-format on @@ -5031,7 +5037,7 @@ static int32_t translateAlterUser(STranslateContext* pCxt, SAlterUserStmt* pStmt alterReq.sysInfo = pStmt->sysinfo; snprintf(alterReq.pass, sizeof(alterReq.pass), "%s", pStmt->password); if (NULL != pCxt->pParseCxt->db) { - snprintf(alterReq.dbname, sizeof(alterReq.dbname), "%s", pCxt->pParseCxt->db); + snprintf(alterReq.objname, sizeof(alterReq.objname), "%s", pCxt->pParseCxt->db); } return buildCmdMsg(pCxt, TDMT_MND_ALTER_USER, (FSerializeFunc)tSerializeSAlterUserReq, &alterReq); @@ -5710,9 +5716,11 @@ static int32_t translateGrant(STranslateContext* pCxt, SGrantStmt* pStmt) { req.alterType = TSDB_ALTER_USER_ADD_READ_DB; } else if (PRIVILEGE_TYPE_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_WRITE)) { req.alterType = TSDB_ALTER_USER_ADD_WRITE_DB; + } else if (PRIVILEGE_TYPE_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_SUBSCRIBE)) { + req.alterType = TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC; } strcpy(req.user, pStmt->userName); - sprintf(req.dbname, "%d.%s", pCxt->pParseCxt->acctId, pStmt->dbName); + sprintf(req.objname, "%d.%s", pCxt->pParseCxt->acctId, pStmt->objName); return buildCmdMsg(pCxt, TDMT_MND_ALTER_USER, (FSerializeFunc)tSerializeSAlterUserReq, &req); } @@ -5726,9 +5734,11 @@ static int32_t translateRevoke(STranslateContext* pCxt, SRevokeStmt* pStmt) { req.alterType = TSDB_ALTER_USER_REMOVE_READ_DB; } else if (PRIVILEGE_TYPE_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_WRITE)) { req.alterType = TSDB_ALTER_USER_REMOVE_WRITE_DB; + } else if (PRIVILEGE_TYPE_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_SUBSCRIBE)) { + req.alterType = TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC; } strcpy(req.user, pStmt->userName); - sprintf(req.dbname, "%d.%s", pCxt->pParseCxt->acctId, pStmt->dbName); + sprintf(req.objname, "%d.%s", pCxt->pParseCxt->acctId, pStmt->objName); return buildCmdMsg(pCxt, TDMT_MND_ALTER_USER, (FSerializeFunc)tSerializeSAlterUserReq, &req); } @@ -7504,6 +7514,7 @@ static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) { case QUERY_NODE_SHOW_CONSUMERS_STMT: case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT: case QUERY_NODE_SHOW_TAGS_STMT: + case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT: code = rewriteShow(pCxt, pQuery); break; case QUERY_NODE_SHOW_VGROUPS_STMT: diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c index cfca98d191..616793e897 100644 --- a/source/libs/parser/src/sql.c +++ b/source/libs/parser/src/sql.c @@ -104,26 +104,26 @@ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned short int -#define YYNOCODE 454 +#define YYNOCODE 456 #define YYACTIONTYPE unsigned short int #define ParseTOKENTYPE SToken typedef union { int yyinit; ParseTOKENTYPE yy0; - ENullOrder yy153; - SNode* yy164; - bool yy193; - SAlterOption yy213; - EOrder yy238; - int32_t yy512; - int64_t yy577; - SToken yy593; - EFillMode yy638; - SNodeList* yy648; - EOperatorType yy656; - int8_t yy687; - SDataType yy720; - EJoinType yy868; + EOrder yy50; + int64_t yy93; + SNode* yy104; + bool yy185; + int32_t yy196; + EJoinType yy228; + EFillMode yy246; + SAlterOption yy557; + SNodeList* yy616; + SDataType yy640; + EOperatorType yy668; + int8_t yy695; + SToken yy737; + ENullOrder yy793; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -139,17 +139,17 @@ typedef union { #define ParseCTX_FETCH #define ParseCTX_STORE #define YYFALLBACK 1 -#define YYNSTATE 704 -#define YYNRULE 535 -#define YYNTOKEN 319 -#define YY_MAX_SHIFT 703 -#define YY_MIN_SHIFTREDUCE 1044 -#define YY_MAX_SHIFTREDUCE 1578 -#define YY_ERROR_ACTION 1579 -#define YY_ACCEPT_ACTION 1580 -#define YY_NO_ACTION 1581 -#define YY_MIN_REDUCE 1582 -#define YY_MAX_REDUCE 2116 +#define YYNSTATE 707 +#define YYNRULE 538 +#define YYNTOKEN 321 +#define YY_MAX_SHIFT 706 +#define YY_MIN_SHIFTREDUCE 1049 +#define YY_MAX_SHIFTREDUCE 1586 +#define YY_ERROR_ACTION 1587 +#define YY_ACCEPT_ACTION 1588 +#define YY_NO_ACTION 1589 +#define YY_MIN_REDUCE 1590 +#define YY_MAX_REDUCE 2127 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -216,733 +216,703 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (2619) +#define YY_ACTTAB_COUNT (2544) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 2034, 453, 1932, 454, 1617, 576, 158, 461, 1919, 454, - /* 10 */ 1617, 1688, 43, 41, 1509, 348, 1847, 557, 1844, 1915, - /* 20 */ 357, 2087, 1360, 36, 35, 1932, 2031, 42, 40, 39, - /* 30 */ 38, 37, 1950, 1439, 2092, 1358, 556, 174, 1386, 95, - /* 40 */ 572, 2088, 558, 1385, 168, 1901, 1077, 609, 1911, 1917, - /* 50 */ 340, 1387, 2092, 132, 593, 1950, 2087, 1434, 1094, 603, - /* 60 */ 1093, 1727, 16, 610, 1649, 329, 1833, 121, 1901, 1366, - /* 70 */ 609, 1931, 2091, 211, 491, 1966, 2088, 2090, 98, 1933, - /* 80 */ 613, 1935, 1936, 608, 1735, 603, 1081, 1082, 1095, 592, - /* 90 */ 171, 592, 2019, 62, 1931, 12, 351, 2015, 1966, 349, - /* 100 */ 1605, 98, 1933, 613, 1935, 1936, 608, 156, 603, 58, - /* 110 */ 176, 134, 1604, 143, 1990, 2019, 1737, 700, 2045, 351, - /* 120 */ 2015, 42, 40, 39, 38, 37, 593, 1568, 507, 506, - /* 130 */ 505, 1441, 1442, 39, 38, 37, 128, 501, 593, 121, - /* 140 */ 438, 500, 499, 1901, 43, 41, 496, 498, 504, 1245, - /* 150 */ 1246, 52, 357, 497, 1360, 1901, 1735, 1932, 362, 1415, - /* 160 */ 1424, 1780, 1782, 2091, 46, 1439, 111, 1358, 1735, 110, - /* 170 */ 109, 108, 107, 106, 105, 104, 103, 102, 1361, 159, - /* 180 */ 1359, 1594, 1297, 1298, 58, 1575, 402, 1950, 1726, 1434, - /* 190 */ 470, 395, 257, 394, 16, 572, 190, 189, 646, 1915, - /* 200 */ 1901, 1366, 609, 1364, 1365, 1603, 1414, 1417, 1418, 1419, - /* 210 */ 1420, 1421, 1422, 1423, 605, 601, 1432, 1433, 1435, 1436, - /* 220 */ 1437, 1438, 1440, 1443, 2, 317, 1931, 12, 1911, 1917, - /* 230 */ 1966, 33, 274, 98, 1933, 613, 1935, 1936, 608, 603, - /* 240 */ 603, 316, 552, 1383, 1385, 171, 168, 2019, 1901, 700, - /* 250 */ 432, 351, 2015, 443, 36, 35, 177, 78, 42, 40, - /* 260 */ 39, 38, 37, 1441, 1442, 258, 1388, 1919, 1834, 1386, - /* 270 */ 416, 127, 444, 2046, 1920, 418, 43, 41, 1915, 1574, - /* 280 */ 1730, 507, 506, 505, 357, 1915, 1360, 1888, 58, 128, - /* 290 */ 501, 1415, 1424, 569, 500, 499, 360, 1439, 1163, 1358, - /* 300 */ 498, 504, 592, 58, 156, 83, 497, 1911, 1917, 352, - /* 310 */ 1361, 177, 1359, 1737, 1911, 1917, 458, 330, 603, 58, - /* 320 */ 363, 1434, 1383, 131, 1513, 603, 16, 1385, 156, 406, - /* 330 */ 1385, 177, 1165, 1366, 379, 1364, 1365, 1737, 1414, 1417, - /* 340 */ 1418, 1419, 1420, 1421, 1422, 1423, 605, 601, 1432, 1433, - /* 350 */ 1435, 1436, 1437, 1438, 1440, 1443, 2, 442, 9, 12, - /* 360 */ 437, 436, 435, 434, 431, 430, 429, 428, 427, 423, - /* 370 */ 422, 421, 420, 331, 413, 412, 411, 46, 408, 407, - /* 380 */ 328, 700, 571, 172, 2027, 2028, 1449, 129, 2032, 1384, - /* 390 */ 593, 212, 1385, 36, 35, 1441, 1442, 42, 40, 39, - /* 400 */ 38, 37, 2092, 179, 593, 163, 2087, 235, 43, 41, - /* 410 */ 1444, 487, 483, 479, 475, 209, 357, 400, 1360, 560, - /* 420 */ 1735, 2034, 2091, 1415, 1424, 547, 2088, 2089, 25, 1439, - /* 430 */ 1787, 1358, 1582, 1787, 1735, 177, 638, 350, 1787, 1712, - /* 440 */ 361, 9, 1361, 7, 1359, 326, 1785, 2030, 47, 1785, - /* 450 */ 177, 9, 79, 1434, 1785, 207, 120, 119, 118, 117, - /* 460 */ 116, 115, 114, 113, 112, 1366, 177, 1364, 1365, 1416, - /* 470 */ 1414, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 605, 601, - /* 480 */ 1432, 1433, 1435, 1436, 1437, 1438, 1440, 1443, 2, 11, - /* 490 */ 10, 44, 1781, 1782, 265, 266, 512, 36, 35, 1950, - /* 500 */ 1602, 42, 40, 39, 38, 37, 593, 551, 553, 548, - /* 510 */ 557, 522, 452, 700, 2087, 456, 391, 264, 1366, 401, - /* 520 */ 206, 200, 1094, 205, 1093, 225, 466, 1441, 1442, 556, - /* 530 */ 174, 1416, 593, 658, 2088, 558, 1735, 393, 389, 515, - /* 540 */ 43, 41, 198, 1901, 509, 410, 644, 550, 357, 224, - /* 550 */ 1360, 322, 1095, 1932, 319, 1415, 1424, 582, 569, 580, - /* 560 */ 593, 1439, 1735, 1358, 593, 147, 146, 641, 640, 639, - /* 570 */ 595, 569, 1991, 424, 1361, 1470, 1359, 425, 1337, 1338, - /* 580 */ 503, 502, 1601, 1950, 1482, 1434, 64, 186, 131, 63, - /* 590 */ 1735, 607, 1535, 1468, 1735, 177, 1901, 1366, 609, 1364, - /* 600 */ 1365, 131, 1414, 1417, 1418, 1419, 1420, 1421, 1422, 1423, - /* 610 */ 605, 601, 1432, 1433, 1435, 1436, 1437, 1438, 1440, 1443, - /* 620 */ 2, 569, 1931, 44, 75, 1901, 1966, 74, 1724, 307, - /* 630 */ 1933, 613, 1935, 1936, 608, 606, 603, 594, 1984, 1387, - /* 640 */ 544, 1533, 1534, 1536, 1537, 700, 30, 1469, 173, 2027, - /* 650 */ 2028, 131, 129, 2032, 460, 133, 1475, 456, 1990, 1441, - /* 660 */ 1442, 255, 2027, 568, 1600, 122, 567, 1599, 593, 2087, - /* 670 */ 36, 35, 43, 41, 42, 40, 39, 38, 37, 593, - /* 680 */ 357, 364, 1360, 89, 556, 174, 576, 1415, 1424, 2088, - /* 690 */ 558, 227, 468, 1439, 1765, 1358, 36, 35, 1735, 1845, - /* 700 */ 42, 40, 39, 38, 37, 1728, 1361, 1901, 1359, 1735, - /* 710 */ 1901, 175, 2027, 2028, 1598, 129, 2032, 1434, 32, 355, - /* 720 */ 1463, 1464, 1465, 1466, 1467, 1471, 1472, 1473, 1474, 1366, - /* 730 */ 1720, 1364, 1365, 1932, 1414, 1417, 1418, 1419, 1420, 1421, - /* 740 */ 1422, 1423, 605, 601, 1432, 1433, 1435, 1436, 1437, 1438, - /* 750 */ 1440, 1443, 2, 1597, 29, 12, 170, 1901, 1545, 593, - /* 760 */ 36, 35, 78, 1950, 42, 40, 39, 38, 37, 1774, - /* 770 */ 1360, 610, 469, 593, 1506, 593, 1901, 700, 609, 1829, - /* 780 */ 257, 1596, 403, 1358, 1525, 1731, 1732, 31, 139, 1735, - /* 790 */ 182, 1441, 1442, 36, 35, 404, 1901, 42, 40, 39, - /* 800 */ 38, 37, 1931, 1735, 1829, 1735, 1966, 671, 669, 99, - /* 810 */ 1933, 613, 1935, 1936, 608, 184, 603, 1366, 1593, 1415, - /* 820 */ 1424, 1646, 521, 2019, 1901, 36, 35, 2018, 2015, 42, - /* 830 */ 40, 39, 38, 37, 597, 519, 1991, 517, 1361, 1722, - /* 840 */ 1359, 1203, 635, 634, 633, 1207, 632, 1209, 1210, 631, - /* 850 */ 1212, 628, 1718, 1218, 625, 1220, 1221, 622, 619, 230, - /* 860 */ 1843, 1901, 312, 1364, 1365, 700, 1414, 1417, 1418, 1419, - /* 870 */ 1420, 1421, 1422, 1423, 605, 601, 1432, 1433, 1435, 1436, - /* 880 */ 1437, 1438, 1440, 1443, 2, 677, 676, 675, 674, 367, - /* 890 */ 1385, 673, 672, 135, 667, 666, 665, 664, 663, 662, - /* 900 */ 661, 660, 149, 656, 655, 654, 366, 365, 651, 650, - /* 910 */ 649, 648, 647, 157, 593, 1713, 1592, 604, 292, 396, - /* 920 */ 1932, 1388, 1787, 1591, 1590, 1589, 1361, 533, 1359, 1588, - /* 930 */ 2034, 1587, 290, 67, 1586, 1842, 66, 312, 1786, 1585, - /* 940 */ 637, 36, 35, 1932, 1735, 42, 40, 39, 38, 37, - /* 950 */ 1950, 1364, 1365, 194, 449, 447, 2029, 593, 610, 1901, - /* 960 */ 537, 6, 593, 1901, 2087, 609, 1901, 1901, 1901, 1711, - /* 970 */ 573, 1388, 1901, 1950, 1901, 269, 470, 1901, 155, 2093, - /* 980 */ 174, 610, 1901, 1829, 2088, 558, 1901, 1735, 609, 1931, - /* 990 */ 58, 334, 1735, 1966, 188, 561, 98, 1933, 613, 1935, - /* 1000 */ 1936, 608, 156, 603, 593, 659, 642, 1705, 2107, 1778, - /* 1010 */ 2019, 1738, 1931, 1505, 351, 2015, 1966, 588, 1816, 98, - /* 1020 */ 1933, 613, 1935, 1936, 608, 2053, 603, 564, 97, 1416, - /* 1030 */ 646, 2107, 1710, 2019, 1735, 354, 353, 351, 2015, 643, - /* 1040 */ 226, 1932, 1778, 286, 532, 1374, 1765, 593, 2081, 1081, - /* 1050 */ 1082, 593, 335, 644, 333, 332, 1439, 493, 1367, 65, - /* 1060 */ 590, 495, 183, 495, 591, 72, 71, 399, 2039, 1502, - /* 1070 */ 181, 1950, 147, 146, 641, 640, 639, 1735, 1369, 610, - /* 1080 */ 1434, 1735, 1689, 494, 1901, 494, 609, 1636, 315, 48, - /* 1090 */ 3, 387, 1366, 385, 381, 377, 374, 371, 80, 319, - /* 1100 */ 1932, 233, 582, 593, 580, 137, 123, 73, 600, 508, - /* 1110 */ 1931, 145, 234, 60, 1966, 1595, 275, 98, 1933, 613, - /* 1120 */ 1935, 1936, 608, 1583, 603, 1577, 1578, 11, 10, 2107, - /* 1130 */ 1950, 2019, 239, 1735, 1629, 351, 2015, 177, 610, 644, - /* 1140 */ 599, 81, 1368, 1901, 111, 609, 2038, 110, 109, 108, - /* 1150 */ 107, 106, 105, 104, 103, 102, 510, 45, 147, 146, - /* 1160 */ 641, 640, 639, 1502, 51, 217, 1532, 419, 215, 1931, - /* 1170 */ 1627, 219, 221, 1966, 218, 220, 98, 1933, 613, 1935, - /* 1180 */ 1936, 608, 262, 603, 223, 241, 1932, 222, 1994, 652, - /* 1190 */ 2019, 50, 513, 140, 351, 2015, 536, 144, 145, 60, - /* 1200 */ 1123, 1375, 2059, 1370, 45, 1922, 653, 252, 1580, 545, - /* 1210 */ 1308, 1143, 210, 562, 246, 1932, 1950, 45, 617, 1951, - /* 1220 */ 144, 368, 145, 1372, 610, 124, 1378, 1380, 1141, 1901, - /* 1230 */ 144, 609, 1838, 1618, 1124, 267, 1775, 2049, 601, 1432, - /* 1240 */ 1433, 1435, 1436, 1437, 1438, 1950, 585, 565, 570, 1460, - /* 1250 */ 271, 1196, 1476, 610, 1924, 1931, 254, 1425, 1901, 1966, - /* 1260 */ 609, 251, 98, 1933, 613, 1935, 1936, 608, 1623, 603, - /* 1270 */ 285, 1224, 372, 1228, 1992, 1235, 2019, 1932, 1233, 94, - /* 1280 */ 351, 2015, 1, 148, 1931, 4, 378, 1371, 1966, 91, - /* 1290 */ 373, 98, 1933, 613, 1935, 1936, 608, 327, 603, 282, - /* 1300 */ 1324, 187, 405, 596, 1932, 2019, 1388, 1950, 414, 351, - /* 1310 */ 2015, 1839, 409, 537, 1383, 610, 695, 2087, 440, 426, - /* 1320 */ 1901, 1831, 609, 445, 446, 191, 448, 450, 439, 433, - /* 1330 */ 441, 1932, 2093, 174, 1950, 1389, 451, 2088, 558, 459, - /* 1340 */ 1391, 197, 610, 463, 1390, 199, 1931, 1901, 1932, 609, - /* 1350 */ 1966, 462, 464, 99, 1933, 613, 1935, 1936, 608, 1392, - /* 1360 */ 603, 1950, 465, 202, 204, 467, 76, 2019, 77, 610, - /* 1370 */ 471, 598, 2015, 611, 1901, 490, 609, 1966, 1950, 1097, - /* 1380 */ 99, 1933, 613, 1935, 1936, 608, 610, 603, 208, 488, - /* 1390 */ 489, 1901, 100, 609, 2019, 524, 575, 492, 321, 2015, - /* 1400 */ 1931, 1725, 1932, 318, 1966, 283, 214, 160, 1933, 613, - /* 1410 */ 1935, 1936, 608, 1721, 603, 1878, 216, 1931, 527, 546, - /* 1420 */ 534, 1966, 528, 150, 161, 1933, 613, 1935, 1936, 608, - /* 1430 */ 151, 603, 1950, 228, 1723, 1719, 152, 537, 153, 231, - /* 1440 */ 610, 2087, 526, 531, 2050, 1901, 579, 609, 538, 2056, - /* 1450 */ 370, 2065, 2060, 541, 2064, 5, 2093, 174, 1932, 543, - /* 1460 */ 341, 2088, 558, 549, 369, 555, 542, 540, 248, 237, - /* 1470 */ 240, 1931, 2041, 245, 539, 1966, 559, 2108, 99, 1933, - /* 1480 */ 613, 1935, 1936, 608, 342, 603, 250, 249, 1950, 164, - /* 1490 */ 566, 537, 2019, 247, 563, 2087, 610, 2016, 1502, 1387, - /* 1500 */ 130, 1901, 1932, 609, 345, 537, 2035, 141, 525, 2087, - /* 1510 */ 2093, 174, 2110, 574, 259, 2088, 558, 577, 1932, 142, - /* 1520 */ 586, 2086, 578, 1877, 2093, 174, 1736, 1931, 1849, 2088, - /* 1530 */ 558, 1966, 1950, 583, 160, 1933, 613, 1935, 1936, 608, - /* 1540 */ 610, 603, 253, 347, 86, 1901, 284, 609, 1950, 537, - /* 1550 */ 88, 57, 2000, 2087, 90, 1779, 610, 615, 1706, 278, - /* 1560 */ 696, 1901, 587, 609, 301, 697, 287, 699, 2093, 174, - /* 1570 */ 311, 1931, 291, 2088, 558, 1966, 2057, 49, 300, 1933, - /* 1580 */ 613, 1935, 1936, 608, 310, 603, 1932, 1931, 309, 289, - /* 1590 */ 1895, 1966, 1894, 69, 161, 1933, 613, 1935, 1936, 608, - /* 1600 */ 1893, 603, 1892, 1932, 70, 1889, 375, 376, 1352, 1353, - /* 1610 */ 180, 380, 1887, 382, 383, 384, 1950, 1886, 386, 1885, - /* 1620 */ 388, 346, 554, 1884, 610, 390, 1883, 1327, 392, 1901, - /* 1630 */ 1326, 609, 1860, 1950, 1859, 397, 398, 1858, 1857, 1824, - /* 1640 */ 1288, 607, 415, 136, 1820, 1819, 1901, 2109, 609, 1823, - /* 1650 */ 1821, 1822, 1818, 1817, 1815, 1931, 1814, 1932, 1813, 1966, - /* 1660 */ 185, 1812, 308, 1933, 613, 1935, 1936, 608, 417, 603, - /* 1670 */ 1811, 1810, 1931, 1932, 1809, 1808, 1966, 1807, 1806, 307, - /* 1680 */ 1933, 613, 1935, 1936, 608, 1805, 603, 1950, 1985, 1804, - /* 1690 */ 1803, 1802, 356, 1801, 1800, 610, 125, 138, 1796, 1795, - /* 1700 */ 1901, 1799, 609, 1950, 1798, 1797, 1794, 1793, 358, 1792, - /* 1710 */ 1290, 610, 169, 455, 1171, 1651, 1901, 1932, 609, 1791, - /* 1720 */ 1790, 1789, 1788, 192, 1650, 193, 1931, 1648, 1614, 195, - /* 1730 */ 1966, 1084, 1083, 308, 1933, 613, 1935, 1936, 608, 1613, - /* 1740 */ 603, 457, 1931, 196, 1932, 1873, 1966, 1950, 1867, 308, - /* 1750 */ 1933, 613, 1935, 1936, 608, 610, 603, 1856, 203, 1855, - /* 1760 */ 1901, 1841, 609, 1714, 126, 201, 1647, 1645, 472, 474, - /* 1770 */ 473, 1932, 1643, 1116, 1950, 476, 477, 478, 1641, 480, - /* 1780 */ 482, 481, 610, 485, 484, 486, 523, 1901, 1639, 609, - /* 1790 */ 1966, 1626, 1625, 303, 1933, 613, 1935, 1936, 608, 1610, - /* 1800 */ 603, 1950, 1716, 1239, 59, 1715, 1238, 1160, 1162, 610, - /* 1810 */ 213, 1161, 1159, 1931, 1901, 1932, 609, 1966, 668, 1153, - /* 1820 */ 293, 1933, 613, 1935, 1936, 608, 1637, 603, 1158, 670, - /* 1830 */ 1155, 1154, 1630, 1152, 336, 337, 511, 1628, 338, 514, - /* 1840 */ 1931, 1609, 516, 1608, 1966, 1950, 518, 294, 1933, 613, - /* 1850 */ 1935, 1936, 608, 610, 603, 1607, 520, 24, 1901, 1932, - /* 1860 */ 609, 1344, 101, 1872, 1333, 1866, 529, 154, 1854, 1852, - /* 1870 */ 2092, 17, 53, 14, 530, 26, 236, 232, 1547, 1932, - /* 1880 */ 61, 56, 243, 535, 1931, 238, 1531, 18, 1966, 1950, - /* 1890 */ 1524, 295, 1933, 613, 1935, 1936, 608, 610, 603, 244, - /* 1900 */ 28, 162, 1901, 339, 609, 1922, 15, 19, 1562, 1950, - /* 1910 */ 242, 1561, 27, 82, 343, 1567, 1568, 610, 1566, 1565, - /* 1920 */ 344, 1499, 1901, 1498, 609, 55, 256, 165, 1931, 1853, - /* 1930 */ 1851, 1850, 1966, 581, 1342, 299, 1933, 613, 1935, 1936, - /* 1940 */ 608, 20, 603, 261, 1932, 1529, 263, 1341, 1931, 1848, - /* 1950 */ 1840, 268, 1966, 84, 85, 304, 1933, 613, 1935, 1936, - /* 1960 */ 608, 87, 603, 1921, 1932, 584, 91, 273, 21, 10, - /* 1970 */ 270, 54, 1451, 1376, 1950, 1407, 1450, 8, 166, 178, - /* 1980 */ 614, 1969, 610, 1429, 602, 636, 1427, 1901, 34, 609, - /* 1990 */ 1426, 13, 22, 616, 1950, 359, 1399, 23, 620, 1225, - /* 2000 */ 618, 621, 610, 1461, 1222, 1219, 623, 1901, 612, 609, - /* 2010 */ 1213, 624, 626, 1931, 627, 629, 1211, 1966, 1932, 630, - /* 2020 */ 296, 1933, 613, 1935, 1936, 608, 1217, 603, 1202, 1216, - /* 2030 */ 1215, 92, 1214, 1931, 1932, 93, 1234, 1966, 68, 276, - /* 2040 */ 305, 1933, 613, 1935, 1936, 608, 1230, 603, 1950, 1114, - /* 2050 */ 645, 1149, 1148, 1147, 1146, 1145, 610, 1144, 1142, 1169, - /* 2060 */ 1140, 1901, 1139, 609, 1950, 1138, 657, 1136, 1135, 277, - /* 2070 */ 1134, 1133, 610, 1132, 1131, 1130, 1129, 1901, 1932, 609, - /* 2080 */ 1166, 1164, 1126, 1120, 1125, 1122, 1644, 1931, 1121, 1119, - /* 2090 */ 678, 1966, 679, 1642, 297, 1933, 613, 1935, 1936, 608, - /* 2100 */ 682, 603, 680, 1931, 1640, 1932, 683, 1966, 1950, 684, - /* 2110 */ 306, 1933, 613, 1935, 1936, 608, 610, 603, 686, 687, - /* 2120 */ 688, 1901, 1638, 609, 690, 691, 692, 1624, 1606, 694, - /* 2130 */ 1074, 280, 1932, 698, 701, 1950, 1362, 288, 702, 1581, - /* 2140 */ 1581, 1581, 1581, 610, 1581, 1581, 1581, 1931, 1901, 1581, - /* 2150 */ 609, 1966, 1581, 1581, 298, 1933, 613, 1935, 1936, 608, - /* 2160 */ 1581, 603, 1950, 1581, 1581, 1581, 1581, 1581, 1581, 1581, - /* 2170 */ 610, 1581, 1581, 1581, 1931, 1901, 1932, 609, 1966, 1581, - /* 2180 */ 1581, 313, 1933, 613, 1935, 1936, 608, 1581, 603, 1581, - /* 2190 */ 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, - /* 2200 */ 1581, 1931, 1581, 1581, 1581, 1966, 1950, 1581, 314, 1933, - /* 2210 */ 613, 1935, 1936, 608, 610, 603, 1581, 1581, 1581, 1901, - /* 2220 */ 1932, 609, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, - /* 2230 */ 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, - /* 2240 */ 1932, 1581, 1581, 1581, 1581, 1931, 1581, 1581, 1581, 1966, - /* 2250 */ 1950, 1581, 1944, 1933, 613, 1935, 1936, 608, 610, 603, - /* 2260 */ 1581, 1581, 1581, 1901, 1581, 609, 1581, 1581, 1581, 1581, - /* 2270 */ 1950, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 610, 1581, - /* 2280 */ 1581, 1581, 1581, 1901, 1581, 609, 1581, 1581, 1581, 1931, - /* 2290 */ 1581, 1581, 1581, 1966, 1581, 1581, 1943, 1933, 613, 1935, - /* 2300 */ 1936, 608, 1581, 603, 1581, 1932, 1581, 1581, 1581, 1931, - /* 2310 */ 1581, 1581, 1581, 1966, 1581, 1581, 1942, 1933, 613, 1935, - /* 2320 */ 1936, 608, 1581, 603, 1581, 1932, 1581, 1581, 1581, 1581, - /* 2330 */ 1581, 1581, 1581, 1581, 1581, 1950, 1581, 1581, 1581, 1581, - /* 2340 */ 1581, 1581, 1581, 610, 1581, 1581, 1581, 1581, 1901, 1581, - /* 2350 */ 609, 1581, 1581, 1581, 1581, 1950, 1581, 1581, 1581, 1581, - /* 2360 */ 1581, 1581, 1581, 610, 1581, 1581, 1581, 1581, 1901, 1581, - /* 2370 */ 609, 1581, 1581, 1581, 1931, 1581, 1581, 1581, 1966, 1932, - /* 2380 */ 1581, 323, 1933, 613, 1935, 1936, 608, 1581, 603, 1581, - /* 2390 */ 1581, 1581, 1581, 1581, 1931, 1932, 1581, 1581, 1966, 1581, - /* 2400 */ 1581, 324, 1933, 613, 1935, 1936, 608, 1581, 603, 1950, - /* 2410 */ 1581, 1581, 1581, 1581, 1581, 1581, 1581, 610, 1581, 1581, - /* 2420 */ 1581, 1581, 1901, 1581, 609, 1950, 1581, 1581, 1581, 1581, - /* 2430 */ 1581, 1581, 1581, 610, 1581, 1581, 1581, 1581, 1901, 1932, - /* 2440 */ 609, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1931, 1581, - /* 2450 */ 1581, 1581, 1966, 703, 1581, 320, 1933, 613, 1935, 1936, - /* 2460 */ 608, 1581, 603, 1581, 1931, 1581, 1932, 281, 1966, 1950, - /* 2470 */ 1581, 325, 1933, 613, 1935, 1936, 608, 610, 603, 1581, - /* 2480 */ 1581, 167, 1901, 1581, 609, 1581, 1581, 693, 689, 685, - /* 2490 */ 681, 279, 1581, 1581, 1581, 1581, 1950, 1581, 1581, 1581, - /* 2500 */ 1581, 1581, 1581, 1581, 610, 1581, 1581, 1581, 611, 1901, - /* 2510 */ 1581, 609, 1966, 1581, 1581, 303, 1933, 613, 1935, 1936, - /* 2520 */ 608, 1581, 603, 1581, 1581, 1581, 1581, 1581, 96, 1581, - /* 2530 */ 1581, 272, 1581, 1581, 1581, 1931, 1581, 1581, 1581, 1966, - /* 2540 */ 1581, 1581, 302, 1933, 613, 1935, 1936, 608, 1581, 603, - /* 2550 */ 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, - /* 2560 */ 1581, 1581, 1581, 1581, 589, 1581, 1581, 1581, 1581, 1581, - /* 2570 */ 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, - /* 2580 */ 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, - /* 2590 */ 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 260, - /* 2600 */ 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, - /* 2610 */ 1581, 1581, 1581, 1581, 1581, 1581, 1331, 1581, 229, + /* 0 */ 396, 2103, 349, 1858, 455, 2098, 456, 1626, 33, 274, + /* 10 */ 156, 578, 43, 41, 1517, 464, 168, 456, 1626, 1747, + /* 20 */ 357, 2102, 1368, 36, 35, 2099, 2101, 42, 40, 39, + /* 30 */ 38, 37, 595, 1447, 158, 1366, 1943, 329, 1844, 1698, + /* 40 */ 524, 540, 36, 35, 579, 2098, 42, 40, 39, 38, + /* 50 */ 37, 1394, 540, 522, 348, 520, 2098, 1855, 1442, 25, + /* 60 */ 2104, 174, 370, 16, 156, 2099, 561, 1961, 1791, 1792, + /* 70 */ 1374, 2104, 174, 1748, 2103, 575, 2099, 561, 2098, 572, + /* 80 */ 1912, 595, 612, 43, 41, 42, 40, 39, 38, 37, + /* 90 */ 159, 357, 1602, 1368, 2102, 1797, 12, 322, 2099, 2100, + /* 100 */ 11, 10, 350, 540, 1447, 1942, 1366, 2098, 62, 1977, + /* 110 */ 131, 1795, 100, 1944, 616, 1946, 1947, 611, 703, 606, + /* 120 */ 258, 603, 2104, 174, 171, 212, 2030, 2099, 561, 1442, + /* 130 */ 351, 2026, 1449, 1450, 16, 39, 38, 37, 473, 1476, + /* 140 */ 163, 1374, 2045, 402, 176, 1930, 490, 486, 482, 478, + /* 150 */ 209, 362, 2056, 80, 1790, 1792, 1926, 46, 58, 1797, + /* 160 */ 85, 1423, 1432, 1252, 1253, 1797, 326, 12, 2042, 255, + /* 170 */ 2038, 571, 361, 124, 570, 1795, 1741, 2098, 1393, 226, + /* 180 */ 1369, 1795, 1367, 317, 1922, 1928, 340, 81, 555, 703, + /* 190 */ 207, 1840, 559, 174, 1477, 606, 1490, 2099, 561, 1613, + /* 200 */ 58, 461, 182, 1449, 1450, 1372, 1373, 457, 1422, 1425, + /* 210 */ 1426, 1427, 1428, 1429, 1430, 1431, 608, 604, 1440, 1441, + /* 220 */ 1443, 1444, 1445, 1446, 1448, 1451, 2, 510, 509, 508, + /* 230 */ 560, 595, 1423, 1432, 2098, 128, 504, 1395, 82, 319, + /* 240 */ 503, 502, 585, 1912, 583, 1588, 501, 507, 1514, 559, + /* 250 */ 174, 1369, 500, 1367, 2099, 561, 206, 200, 1612, 205, + /* 260 */ 438, 550, 469, 1468, 1543, 32, 355, 1471, 1472, 1473, + /* 270 */ 1474, 1475, 1479, 1480, 1481, 1482, 1372, 1373, 198, 1422, + /* 280 */ 1425, 1426, 1427, 1428, 1429, 1430, 1431, 608, 604, 1440, + /* 290 */ 1441, 1443, 1444, 1445, 1446, 1448, 1451, 2, 170, 9, + /* 300 */ 43, 41, 1912, 506, 505, 177, 177, 46, 357, 372, + /* 310 */ 1368, 1784, 547, 1541, 1542, 1544, 1545, 190, 189, 1305, + /* 320 */ 1306, 1447, 1943, 1366, 1210, 638, 637, 636, 1214, 635, + /* 330 */ 1216, 1217, 634, 1219, 631, 1393, 1225, 628, 1227, 1228, + /* 340 */ 625, 622, 391, 97, 556, 551, 1442, 1101, 177, 1100, + /* 350 */ 540, 16, 454, 1961, 2098, 459, 1632, 132, 1374, 674, + /* 360 */ 672, 613, 211, 393, 389, 1737, 1912, 567, 612, 2104, + /* 370 */ 174, 43, 41, 1452, 2099, 561, 29, 1961, 1102, 357, + /* 380 */ 257, 1368, 36, 35, 12, 554, 42, 40, 39, 38, + /* 390 */ 37, 1942, 1447, 463, 1366, 1977, 459, 1632, 160, 1944, + /* 400 */ 616, 1946, 1947, 611, 596, 606, 703, 1943, 36, 35, + /* 410 */ 2045, 58, 42, 40, 39, 38, 37, 1442, 123, 264, + /* 420 */ 1449, 1450, 647, 50, 553, 494, 36, 35, 539, 1374, + /* 430 */ 42, 40, 39, 38, 37, 1745, 2041, 1170, 1961, 541, + /* 440 */ 2067, 147, 146, 644, 643, 642, 613, 91, 579, 1423, + /* 450 */ 1432, 1912, 58, 612, 560, 44, 2050, 1510, 2098, 36, + /* 460 */ 35, 1856, 1394, 42, 40, 39, 38, 37, 1369, 1738, + /* 470 */ 1367, 1396, 1172, 559, 174, 1611, 1942, 703, 2099, 561, + /* 480 */ 1977, 1345, 1346, 161, 1944, 616, 1946, 1947, 611, 1513, + /* 490 */ 606, 1449, 1450, 1372, 1373, 47, 1422, 1425, 1426, 1427, + /* 500 */ 1428, 1429, 1430, 1431, 608, 604, 1440, 1441, 1443, 1444, + /* 510 */ 1445, 1446, 1448, 1451, 2, 1553, 1082, 1610, 1609, 1912, + /* 520 */ 1423, 1432, 1591, 113, 1087, 1088, 112, 111, 110, 109, + /* 530 */ 108, 107, 106, 105, 104, 562, 2119, 265, 266, 1369, + /* 540 */ 9, 1367, 7, 113, 1722, 1608, 112, 111, 110, 109, + /* 550 */ 108, 107, 106, 105, 104, 1084, 1393, 1087, 1088, 177, + /* 560 */ 649, 1912, 1912, 155, 1372, 1373, 1478, 1422, 1425, 1426, + /* 570 */ 1427, 1428, 1429, 1430, 1431, 608, 604, 1440, 1441, 1443, + /* 580 */ 1444, 1445, 1446, 1448, 1451, 2, 43, 41, 568, 1912, + /* 590 */ 706, 515, 1392, 1101, 357, 1100, 1368, 1840, 319, 596, + /* 600 */ 177, 585, 596, 583, 281, 1521, 525, 1447, 184, 1366, + /* 610 */ 1943, 1393, 58, 52, 235, 641, 123, 596, 1607, 167, + /* 620 */ 225, 9, 572, 499, 1102, 696, 692, 688, 684, 279, + /* 630 */ 1745, 179, 1442, 1745, 360, 518, 80, 30, 168, 1374, + /* 640 */ 512, 1961, 156, 177, 1374, 224, 661, 1483, 1745, 613, + /* 650 */ 127, 1747, 647, 131, 1912, 1659, 612, 43, 41, 1740, + /* 660 */ 1845, 1723, 1912, 596, 1606, 357, 98, 1368, 1721, 272, + /* 670 */ 44, 147, 146, 644, 643, 642, 1734, 400, 1447, 1942, + /* 680 */ 1366, 1605, 64, 1977, 1730, 63, 100, 1944, 616, 1946, + /* 690 */ 1947, 611, 703, 606, 1745, 395, 134, 394, 143, 2001, + /* 700 */ 2030, 363, 592, 1442, 351, 2026, 1449, 1450, 1912, 156, + /* 710 */ 535, 574, 172, 2038, 2039, 1374, 129, 2043, 1747, 1732, + /* 720 */ 510, 509, 508, 473, 186, 1912, 1457, 572, 128, 504, + /* 730 */ 649, 1604, 1393, 503, 502, 1423, 1432, 1601, 260, 501, + /* 740 */ 507, 12, 1590, 36, 35, 500, 1396, 42, 40, 39, + /* 750 */ 38, 37, 1424, 1396, 1369, 1339, 1367, 229, 131, 227, + /* 760 */ 177, 77, 1775, 703, 76, 1736, 122, 121, 120, 119, + /* 770 */ 118, 117, 116, 115, 114, 1912, 1926, 1449, 1450, 1372, + /* 780 */ 1373, 1912, 1422, 1425, 1426, 1427, 1428, 1429, 1430, 1431, + /* 790 */ 608, 604, 1440, 1441, 1443, 1444, 1445, 1446, 1448, 1451, + /* 800 */ 2, 316, 498, 1391, 1922, 1928, 1423, 1432, 1600, 1840, + /* 810 */ 432, 2045, 598, 445, 2002, 606, 444, 173, 2038, 2039, + /* 820 */ 188, 129, 2043, 1797, 497, 1369, 1656, 1367, 1599, 1899, + /* 830 */ 1598, 416, 1533, 446, 31, 133, 418, 2040, 2001, 1796, + /* 840 */ 36, 35, 1597, 1596, 42, 40, 39, 38, 37, 1728, + /* 850 */ 1372, 1373, 1912, 1422, 1425, 1426, 1427, 1428, 1429, 1430, + /* 860 */ 1431, 608, 604, 1440, 1441, 1443, 1444, 1445, 1446, 1448, + /* 870 */ 1451, 2, 1912, 1424, 1912, 36, 35, 379, 330, 42, + /* 880 */ 40, 39, 38, 37, 1393, 645, 1912, 1912, 1788, 183, + /* 890 */ 406, 680, 679, 678, 677, 367, 234, 676, 675, 135, + /* 900 */ 670, 669, 668, 667, 666, 665, 664, 663, 149, 659, + /* 910 */ 658, 657, 366, 365, 654, 653, 652, 651, 650, 442, + /* 920 */ 1595, 1943, 437, 436, 435, 434, 431, 430, 429, 428, + /* 930 */ 427, 423, 422, 421, 420, 331, 413, 412, 411, 2102, + /* 940 */ 408, 407, 328, 157, 600, 596, 2002, 596, 292, 36, + /* 950 */ 35, 564, 1961, 42, 40, 39, 38, 37, 596, 401, + /* 960 */ 575, 410, 290, 66, 1912, 1912, 65, 612, 1854, 369, + /* 970 */ 312, 2103, 424, 145, 1943, 1594, 1745, 1853, 1745, 312, + /* 980 */ 1593, 596, 11, 10, 194, 451, 449, 1720, 1395, 1745, + /* 990 */ 1942, 572, 596, 646, 1977, 425, 1788, 100, 1944, 616, + /* 1000 */ 1946, 1947, 611, 6, 606, 1961, 139, 1827, 230, 171, + /* 1010 */ 540, 2030, 1745, 613, 2098, 351, 2026, 1699, 1912, 1912, + /* 1020 */ 612, 58, 131, 1745, 1912, 1424, 51, 596, 286, 2104, + /* 1030 */ 174, 1775, 596, 217, 2099, 561, 215, 2057, 1931, 1583, + /* 1040 */ 607, 471, 596, 1942, 233, 219, 472, 1977, 218, 1926, + /* 1050 */ 100, 1944, 616, 1946, 1947, 611, 364, 606, 1745, 99, + /* 1060 */ 596, 1943, 2118, 1745, 2030, 1576, 354, 353, 351, 2026, + /* 1070 */ 662, 640, 1715, 1745, 1742, 1377, 1382, 1922, 1928, 2064, + /* 1080 */ 596, 175, 2038, 2039, 83, 129, 2043, 1447, 606, 1375, + /* 1090 */ 1603, 1745, 1961, 403, 536, 647, 67, 74, 73, 399, + /* 1100 */ 613, 48, 181, 3, 1943, 1912, 404, 612, 137, 2070, + /* 1110 */ 125, 1745, 1442, 548, 147, 146, 644, 643, 642, 1376, + /* 1120 */ 315, 1930, 596, 387, 1374, 385, 381, 377, 374, 371, + /* 1130 */ 1942, 257, 1926, 1582, 1977, 1961, 576, 100, 1944, 616, + /* 1140 */ 1946, 1947, 611, 613, 606, 75, 1646, 96, 1912, 2118, + /* 1150 */ 612, 2030, 252, 1745, 1639, 351, 2026, 93, 419, 210, + /* 1160 */ 1922, 1928, 352, 528, 221, 596, 2092, 220, 511, 177, + /* 1170 */ 565, 606, 602, 1942, 596, 1943, 513, 1977, 60, 269, + /* 1180 */ 100, 1944, 616, 1946, 1947, 611, 596, 606, 591, 596, + /* 1190 */ 1637, 1933, 2118, 246, 2030, 1962, 1745, 563, 351, 2026, + /* 1200 */ 593, 596, 368, 594, 540, 1745, 1961, 1510, 2098, 2049, + /* 1210 */ 1585, 1586, 516, 223, 613, 275, 222, 1745, 1943, 1912, + /* 1220 */ 1745, 612, 1380, 2104, 174, 239, 45, 262, 2099, 561, + /* 1230 */ 140, 1540, 1745, 144, 1383, 145, 1378, 60, 1849, 1627, + /* 1240 */ 1935, 1785, 573, 2060, 1942, 254, 1130, 251, 1977, 1961, + /* 1250 */ 45, 100, 1944, 616, 1946, 1947, 611, 613, 606, 1386, + /* 1260 */ 1388, 1943, 1912, 2005, 612, 2030, 1379, 45, 620, 351, + /* 1270 */ 2026, 604, 1440, 1441, 1443, 1444, 1445, 1446, 241, 1316, + /* 1280 */ 267, 1131, 4, 588, 1633, 1943, 271, 1942, 1203, 655, + /* 1290 */ 1484, 1977, 1961, 144, 100, 1944, 616, 1946, 1947, 611, + /* 1300 */ 613, 606, 1, 1433, 145, 1912, 2003, 612, 2030, 373, + /* 1310 */ 378, 1150, 351, 2026, 656, 327, 1961, 126, 144, 1368, + /* 1320 */ 285, 1231, 282, 1332, 613, 187, 405, 1396, 1850, 1912, + /* 1330 */ 1942, 612, 1366, 698, 1977, 334, 1148, 100, 1944, 616, + /* 1340 */ 1946, 1947, 611, 1943, 606, 409, 1235, 440, 414, 599, + /* 1350 */ 1391, 2030, 426, 1842, 1942, 351, 2026, 1242, 1977, 433, + /* 1360 */ 447, 101, 1944, 616, 1946, 1947, 611, 1374, 606, 439, + /* 1370 */ 1240, 148, 441, 448, 1961, 2030, 191, 450, 452, 2029, + /* 1380 */ 2026, 1397, 613, 453, 462, 1399, 1943, 1912, 465, 612, + /* 1390 */ 197, 199, 466, 1398, 467, 1400, 468, 335, 202, 333, + /* 1400 */ 332, 470, 496, 204, 474, 78, 498, 79, 208, 1104, + /* 1410 */ 491, 492, 1942, 493, 1943, 703, 1977, 1961, 495, 101, + /* 1420 */ 1944, 616, 1946, 1947, 611, 613, 606, 102, 497, 1735, + /* 1430 */ 1912, 318, 612, 2030, 214, 1731, 216, 601, 2026, 527, + /* 1440 */ 150, 151, 529, 1733, 1729, 1961, 152, 153, 228, 530, + /* 1450 */ 1889, 231, 537, 610, 549, 614, 582, 5, 1912, 1977, + /* 1460 */ 612, 2061, 101, 1944, 616, 1946, 1947, 611, 283, 606, + /* 1470 */ 534, 2071, 544, 1943, 2076, 546, 2030, 1369, 237, 1367, + /* 1480 */ 321, 2026, 240, 1942, 531, 2075, 341, 1977, 558, 552, + /* 1490 */ 307, 1944, 616, 1946, 1947, 611, 609, 606, 597, 1995, + /* 1500 */ 545, 543, 1372, 1373, 1961, 542, 250, 569, 342, 566, + /* 1510 */ 2121, 245, 613, 1510, 130, 1395, 2046, 1912, 345, 612, + /* 1520 */ 577, 141, 142, 580, 581, 1888, 1860, 586, 259, 347, + /* 1530 */ 88, 1943, 589, 248, 164, 2052, 249, 247, 1746, 590, + /* 1540 */ 90, 57, 1942, 2011, 92, 1789, 1977, 284, 1716, 101, + /* 1550 */ 1944, 616, 1946, 1947, 611, 2097, 606, 253, 287, 1943, + /* 1560 */ 618, 278, 1961, 2030, 699, 700, 49, 301, 2027, 310, + /* 1570 */ 613, 309, 702, 289, 291, 1912, 1906, 612, 1905, 311, + /* 1580 */ 71, 1904, 1903, 72, 1900, 1943, 375, 376, 1360, 1361, + /* 1590 */ 1961, 180, 1898, 380, 382, 383, 384, 1897, 613, 386, + /* 1600 */ 1942, 1896, 388, 1912, 1977, 612, 1895, 160, 1944, 616, + /* 1610 */ 1946, 1947, 611, 1894, 606, 390, 1961, 1335, 392, 1334, + /* 1620 */ 1871, 1870, 397, 1869, 613, 398, 1868, 1296, 1942, 1912, + /* 1630 */ 1835, 612, 1977, 1834, 1832, 300, 1944, 616, 1946, 1947, + /* 1640 */ 611, 136, 606, 1831, 1830, 1833, 1829, 1828, 1826, 2068, + /* 1650 */ 1825, 1824, 185, 415, 1942, 1943, 1823, 417, 1977, 1822, + /* 1660 */ 1821, 161, 1944, 616, 1946, 1947, 611, 1820, 606, 1819, + /* 1670 */ 1818, 1817, 1816, 1815, 1943, 1298, 1802, 138, 1807, 557, + /* 1680 */ 1814, 1813, 1812, 1811, 1810, 1809, 1961, 1808, 1806, 1805, + /* 1690 */ 1804, 346, 443, 1799, 613, 1803, 1801, 1800, 1798, 1912, + /* 1700 */ 1178, 612, 1661, 1660, 1658, 1961, 1622, 192, 195, 1932, + /* 1710 */ 193, 458, 169, 610, 2120, 1090, 69, 1621, 1912, 1089, + /* 1720 */ 612, 460, 1884, 1878, 1942, 1867, 196, 1866, 1977, 203, + /* 1730 */ 70, 308, 1944, 616, 1946, 1947, 611, 1943, 606, 201, + /* 1740 */ 1852, 1724, 1657, 1942, 1655, 475, 477, 1977, 1653, 479, + /* 1750 */ 307, 1944, 616, 1946, 1947, 611, 476, 606, 1943, 1996, + /* 1760 */ 480, 1651, 1649, 1123, 483, 481, 484, 485, 1961, 487, + /* 1770 */ 489, 1636, 488, 356, 1635, 1618, 613, 1726, 1246, 1245, + /* 1780 */ 1943, 1912, 1725, 612, 59, 1169, 1168, 1167, 1166, 1961, + /* 1790 */ 1165, 671, 1160, 673, 358, 1162, 1647, 613, 1161, 1159, + /* 1800 */ 336, 1943, 1912, 1640, 612, 337, 1942, 1638, 514, 338, + /* 1810 */ 1977, 1961, 213, 308, 1944, 616, 1946, 1947, 611, 613, + /* 1820 */ 606, 517, 1617, 1943, 1912, 519, 612, 1942, 1616, 521, + /* 1830 */ 1615, 1977, 1961, 523, 308, 1944, 616, 1946, 1947, 611, + /* 1840 */ 613, 606, 1352, 103, 1943, 1912, 1883, 612, 24, 526, + /* 1850 */ 1341, 1877, 1865, 1977, 1961, 532, 303, 1944, 616, 1946, + /* 1860 */ 1947, 611, 613, 606, 1863, 17, 2103, 1912, 26, 612, + /* 1870 */ 1942, 56, 14, 1555, 1977, 1961, 53, 293, 1944, 616, + /* 1880 */ 1946, 1947, 611, 613, 606, 232, 238, 1943, 1912, 236, + /* 1890 */ 612, 162, 1942, 533, 154, 339, 1977, 1539, 1532, 294, + /* 1900 */ 1944, 616, 1946, 1947, 611, 538, 606, 244, 242, 27, + /* 1910 */ 243, 28, 1933, 1942, 84, 1943, 61, 1977, 1961, 19, + /* 1920 */ 295, 1944, 616, 1946, 1947, 611, 613, 606, 1575, 1576, + /* 1930 */ 1570, 1912, 1569, 612, 343, 1574, 1573, 344, 1507, 1506, + /* 1940 */ 256, 1943, 18, 165, 1864, 1862, 1961, 55, 1861, 20, + /* 1950 */ 1350, 261, 1537, 263, 613, 1349, 1942, 54, 584, 1912, + /* 1960 */ 1977, 612, 1859, 299, 1944, 616, 1946, 1947, 611, 15, + /* 1970 */ 606, 587, 1961, 268, 86, 1851, 87, 89, 270, 93, + /* 1980 */ 613, 273, 21, 1459, 1942, 1912, 10, 612, 1977, 1384, + /* 1990 */ 1469, 304, 1944, 616, 1946, 1947, 611, 8, 606, 1943, + /* 2000 */ 1458, 1437, 1980, 605, 166, 1435, 34, 178, 1434, 1407, + /* 2010 */ 1942, 615, 13, 22, 1977, 1415, 1943, 296, 1944, 616, + /* 2020 */ 1946, 1947, 611, 1232, 606, 23, 617, 619, 621, 359, + /* 2030 */ 1961, 623, 1229, 1226, 626, 624, 627, 629, 613, 1220, + /* 2040 */ 1218, 632, 630, 1912, 1224, 612, 633, 1961, 1223, 1209, + /* 2050 */ 1222, 1221, 94, 1241, 95, 613, 276, 639, 1237, 1943, + /* 2060 */ 1912, 68, 612, 1156, 1121, 1155, 648, 1154, 1942, 1153, + /* 2070 */ 1152, 1176, 1977, 1151, 1149, 305, 1944, 616, 1946, 1947, + /* 2080 */ 611, 1147, 606, 1943, 1146, 1942, 1145, 277, 660, 1977, + /* 2090 */ 1961, 1143, 297, 1944, 616, 1946, 1947, 611, 613, 606, + /* 2100 */ 1142, 1141, 1140, 1912, 1139, 612, 1138, 1137, 1127, 1136, + /* 2110 */ 1173, 1171, 1133, 1132, 1961, 1129, 1128, 1654, 1126, 681, + /* 2120 */ 1652, 1650, 613, 682, 683, 685, 1943, 1912, 1942, 612, + /* 2130 */ 687, 691, 1977, 689, 1648, 306, 1944, 616, 1946, 1947, + /* 2140 */ 611, 693, 606, 1943, 686, 690, 695, 694, 1634, 697, + /* 2150 */ 1079, 1614, 1942, 280, 701, 705, 1977, 1961, 704, 298, + /* 2160 */ 1944, 616, 1946, 1947, 611, 613, 606, 1370, 288, 1943, + /* 2170 */ 1912, 1589, 612, 1589, 1961, 1589, 1589, 1589, 1589, 1589, + /* 2180 */ 1589, 1589, 613, 1589, 1589, 1589, 1943, 1912, 1589, 612, + /* 2190 */ 1589, 1589, 1589, 1589, 1589, 1942, 1589, 1589, 1589, 1977, + /* 2200 */ 1961, 1589, 313, 1944, 616, 1946, 1947, 611, 613, 606, + /* 2210 */ 1589, 1589, 1942, 1912, 1589, 612, 1977, 1961, 1589, 314, + /* 2220 */ 1944, 616, 1946, 1947, 611, 613, 606, 1589, 1589, 1943, + /* 2230 */ 1912, 1589, 612, 1589, 1589, 1589, 1589, 1589, 1942, 1589, + /* 2240 */ 1589, 1589, 1977, 1589, 1589, 1955, 1944, 616, 1946, 1947, + /* 2250 */ 611, 1943, 606, 1589, 1589, 1942, 1589, 1589, 1589, 1977, + /* 2260 */ 1961, 1589, 1954, 1944, 616, 1946, 1947, 611, 613, 606, + /* 2270 */ 1589, 1589, 1589, 1912, 1589, 612, 1589, 1589, 1589, 1589, + /* 2280 */ 1589, 1589, 1961, 1589, 1589, 1589, 1589, 1589, 1589, 1589, + /* 2290 */ 613, 1589, 1589, 1589, 1589, 1912, 1589, 612, 1942, 1589, + /* 2300 */ 1589, 1589, 1977, 1589, 1589, 1953, 1944, 616, 1946, 1947, + /* 2310 */ 611, 1589, 606, 1943, 1589, 1589, 1589, 1589, 1589, 1589, + /* 2320 */ 1942, 1589, 1589, 1589, 1977, 1589, 1589, 323, 1944, 616, + /* 2330 */ 1946, 1947, 611, 1589, 606, 1943, 1589, 1589, 1589, 1589, + /* 2340 */ 1589, 1589, 1589, 1589, 1961, 1589, 1589, 1589, 1589, 1589, + /* 2350 */ 1589, 1589, 613, 1589, 1589, 1589, 1589, 1912, 1589, 612, + /* 2360 */ 1589, 1589, 1589, 1589, 1589, 1589, 1961, 1589, 1589, 1589, + /* 2370 */ 1589, 1589, 1589, 1589, 613, 1589, 1589, 1589, 1589, 1912, + /* 2380 */ 1589, 612, 1942, 1589, 1589, 1589, 1977, 1589, 1589, 324, + /* 2390 */ 1944, 616, 1946, 1947, 611, 1589, 606, 1943, 1589, 1589, + /* 2400 */ 1589, 1589, 1589, 1589, 1942, 1589, 1589, 1589, 1977, 1589, + /* 2410 */ 1589, 320, 1944, 616, 1946, 1947, 611, 1943, 606, 1589, + /* 2420 */ 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1961, 1589, + /* 2430 */ 1589, 1589, 1589, 1589, 1589, 1589, 613, 1589, 1589, 1589, + /* 2440 */ 1589, 1912, 1589, 612, 1589, 1589, 1589, 1589, 1961, 1589, + /* 2450 */ 1589, 1589, 1589, 1589, 1589, 1589, 613, 1589, 1589, 1589, + /* 2460 */ 1943, 1912, 1589, 612, 1589, 1589, 1942, 1589, 1589, 1589, + /* 2470 */ 1977, 1589, 1589, 325, 1944, 616, 1946, 1947, 611, 1589, + /* 2480 */ 606, 1589, 1589, 1589, 1589, 1589, 614, 1589, 1589, 1589, + /* 2490 */ 1977, 1961, 1589, 303, 1944, 616, 1946, 1947, 611, 613, + /* 2500 */ 606, 1589, 1589, 1589, 1912, 1589, 612, 1589, 1589, 1589, + /* 2510 */ 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, + /* 2520 */ 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1942, + /* 2530 */ 1589, 1589, 1589, 1977, 1589, 1589, 302, 1944, 616, 1946, + /* 2540 */ 1947, 611, 1589, 606, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 397, 326, 322, 328, 329, 367, 336, 326, 354, 328, - /* 10 */ 329, 341, 12, 13, 14, 377, 0, 424, 380, 365, - /* 20 */ 20, 428, 22, 8, 9, 322, 423, 12, 13, 14, - /* 30 */ 15, 16, 352, 33, 3, 35, 443, 444, 20, 333, - /* 40 */ 360, 448, 449, 20, 352, 365, 4, 367, 394, 395, - /* 50 */ 396, 20, 424, 347, 330, 352, 428, 57, 20, 405, - /* 60 */ 22, 355, 62, 360, 0, 373, 374, 343, 365, 69, - /* 70 */ 367, 391, 444, 35, 350, 395, 448, 449, 398, 399, - /* 80 */ 400, 401, 402, 403, 360, 405, 44, 45, 50, 20, - /* 90 */ 410, 20, 412, 4, 391, 95, 416, 417, 395, 344, - /* 100 */ 322, 398, 399, 400, 401, 402, 403, 352, 405, 95, - /* 110 */ 430, 408, 322, 410, 411, 412, 361, 117, 438, 416, - /* 120 */ 417, 12, 13, 14, 15, 16, 330, 96, 64, 65, - /* 130 */ 66, 131, 132, 14, 15, 16, 72, 73, 330, 343, - /* 140 */ 79, 77, 78, 365, 12, 13, 350, 83, 84, 131, - /* 150 */ 132, 343, 20, 89, 22, 365, 360, 322, 363, 159, - /* 160 */ 160, 366, 367, 3, 95, 33, 21, 35, 360, 24, - /* 170 */ 25, 26, 27, 28, 29, 30, 31, 32, 178, 321, - /* 180 */ 180, 323, 159, 160, 95, 170, 330, 352, 354, 57, - /* 190 */ 61, 177, 161, 179, 62, 360, 135, 136, 61, 365, - /* 200 */ 365, 69, 367, 203, 204, 322, 206, 207, 208, 209, + /* 0 */ 385, 426, 347, 0, 328, 430, 330, 331, 415, 416, + /* 10 */ 355, 385, 12, 13, 14, 328, 355, 330, 331, 364, + /* 20 */ 20, 446, 22, 8, 9, 450, 451, 12, 13, 14, + /* 30 */ 15, 16, 20, 33, 339, 35, 324, 376, 377, 344, + /* 40 */ 21, 426, 8, 9, 370, 430, 12, 13, 14, 15, + /* 50 */ 16, 20, 426, 34, 380, 36, 430, 383, 58, 44, + /* 60 */ 445, 446, 385, 63, 355, 450, 451, 355, 369, 370, + /* 70 */ 70, 445, 446, 364, 426, 363, 450, 451, 430, 332, + /* 80 */ 368, 20, 370, 12, 13, 12, 13, 14, 15, 16, + /* 90 */ 323, 20, 325, 22, 446, 355, 96, 63, 450, 451, + /* 100 */ 1, 2, 362, 426, 33, 393, 35, 430, 4, 397, + /* 110 */ 363, 371, 400, 401, 402, 403, 404, 405, 118, 407, + /* 120 */ 58, 63, 445, 446, 412, 33, 414, 450, 451, 58, + /* 130 */ 418, 419, 132, 133, 63, 14, 15, 16, 62, 105, + /* 140 */ 48, 70, 399, 332, 432, 357, 54, 55, 56, 57, + /* 150 */ 58, 366, 440, 338, 369, 370, 368, 96, 96, 355, + /* 160 */ 98, 161, 162, 132, 133, 355, 362, 96, 425, 422, + /* 170 */ 423, 424, 362, 426, 427, 371, 361, 430, 20, 128, + /* 180 */ 180, 371, 182, 372, 396, 397, 398, 95, 20, 118, + /* 190 */ 98, 363, 445, 446, 160, 407, 97, 450, 451, 324, + /* 200 */ 96, 14, 374, 132, 133, 205, 206, 20, 208, 209, /* 210 */ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - /* 220 */ 220, 221, 222, 223, 224, 369, 391, 95, 394, 395, - /* 230 */ 395, 413, 414, 398, 399, 400, 401, 402, 403, 405, - /* 240 */ 405, 18, 20, 20, 20, 410, 352, 412, 365, 117, - /* 250 */ 27, 416, 417, 30, 8, 9, 242, 335, 12, 13, - /* 260 */ 14, 15, 16, 131, 132, 57, 20, 354, 374, 20, - /* 270 */ 47, 349, 49, 438, 354, 52, 12, 13, 365, 264, - /* 280 */ 358, 64, 65, 66, 20, 365, 22, 0, 95, 72, - /* 290 */ 73, 159, 160, 330, 77, 78, 344, 33, 35, 35, - /* 300 */ 83, 84, 20, 95, 352, 97, 89, 394, 395, 396, - /* 310 */ 178, 242, 180, 361, 394, 395, 14, 94, 405, 95, - /* 320 */ 344, 57, 20, 360, 14, 405, 62, 20, 352, 106, - /* 330 */ 20, 242, 69, 69, 47, 203, 204, 361, 206, 207, - /* 340 */ 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - /* 350 */ 218, 219, 220, 221, 222, 223, 224, 134, 226, 95, - /* 360 */ 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - /* 370 */ 147, 148, 149, 150, 151, 152, 153, 95, 155, 156, - /* 380 */ 157, 117, 419, 420, 421, 422, 14, 424, 425, 20, - /* 390 */ 330, 33, 20, 8, 9, 131, 132, 12, 13, 14, - /* 400 */ 15, 16, 424, 343, 330, 47, 428, 161, 12, 13, - /* 410 */ 14, 53, 54, 55, 56, 57, 20, 343, 22, 259, - /* 420 */ 360, 397, 444, 159, 160, 164, 448, 449, 43, 33, - /* 430 */ 352, 35, 0, 352, 360, 242, 106, 359, 352, 0, - /* 440 */ 359, 226, 178, 228, 180, 359, 368, 423, 95, 368, - /* 450 */ 242, 226, 94, 57, 368, 97, 24, 25, 26, 27, - /* 460 */ 28, 29, 30, 31, 32, 69, 242, 203, 204, 159, - /* 470 */ 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - /* 480 */ 216, 217, 218, 219, 220, 221, 222, 223, 224, 1, - /* 490 */ 2, 95, 366, 367, 126, 127, 4, 8, 9, 352, - /* 500 */ 322, 12, 13, 14, 15, 16, 330, 360, 247, 248, - /* 510 */ 424, 19, 327, 117, 428, 330, 173, 126, 69, 343, - /* 520 */ 162, 163, 20, 165, 22, 33, 168, 131, 132, 443, - /* 530 */ 444, 159, 330, 69, 448, 449, 360, 194, 195, 47, - /* 540 */ 12, 13, 184, 365, 52, 343, 107, 400, 20, 57, - /* 550 */ 22, 62, 50, 322, 186, 159, 160, 189, 330, 191, - /* 560 */ 330, 33, 360, 35, 330, 126, 127, 128, 129, 130, - /* 570 */ 409, 330, 411, 343, 178, 158, 180, 343, 187, 188, - /* 580 */ 338, 339, 322, 352, 96, 57, 94, 57, 360, 97, - /* 590 */ 360, 360, 203, 104, 360, 242, 365, 69, 367, 203, - /* 600 */ 204, 360, 206, 207, 208, 209, 210, 211, 212, 213, - /* 610 */ 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - /* 620 */ 224, 330, 391, 95, 94, 365, 395, 97, 353, 398, - /* 630 */ 399, 400, 401, 402, 403, 404, 405, 406, 407, 20, - /* 640 */ 251, 252, 253, 254, 255, 117, 229, 158, 420, 421, - /* 650 */ 422, 360, 424, 425, 327, 408, 239, 330, 411, 131, - /* 660 */ 132, 420, 421, 422, 322, 424, 425, 322, 330, 428, - /* 670 */ 8, 9, 12, 13, 12, 13, 14, 15, 16, 330, - /* 680 */ 20, 343, 22, 333, 443, 444, 367, 159, 160, 448, - /* 690 */ 449, 345, 343, 33, 348, 35, 8, 9, 360, 380, - /* 700 */ 12, 13, 14, 15, 16, 355, 178, 365, 180, 360, - /* 710 */ 365, 420, 421, 422, 322, 424, 425, 57, 229, 230, - /* 720 */ 231, 232, 233, 234, 235, 236, 237, 238, 239, 69, - /* 730 */ 353, 203, 204, 322, 206, 207, 208, 209, 210, 211, - /* 740 */ 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - /* 750 */ 222, 223, 224, 322, 2, 95, 351, 365, 96, 330, - /* 760 */ 8, 9, 335, 352, 12, 13, 14, 15, 16, 364, - /* 770 */ 22, 360, 343, 330, 4, 330, 365, 117, 367, 360, - /* 780 */ 161, 322, 22, 35, 96, 358, 343, 2, 343, 360, - /* 790 */ 371, 131, 132, 8, 9, 35, 365, 12, 13, 14, - /* 800 */ 15, 16, 391, 360, 360, 360, 395, 338, 339, 398, - /* 810 */ 399, 400, 401, 402, 403, 371, 405, 69, 322, 159, - /* 820 */ 160, 0, 21, 412, 365, 8, 9, 416, 417, 12, - /* 830 */ 13, 14, 15, 16, 409, 34, 411, 36, 178, 353, - /* 840 */ 180, 108, 109, 110, 111, 112, 113, 114, 115, 116, - /* 850 */ 117, 118, 353, 120, 121, 122, 123, 124, 125, 353, - /* 860 */ 379, 365, 381, 203, 204, 117, 206, 207, 208, 209, - /* 870 */ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - /* 880 */ 220, 221, 222, 223, 224, 64, 65, 66, 67, 68, - /* 890 */ 20, 70, 71, 72, 73, 74, 75, 76, 77, 78, - /* 900 */ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - /* 910 */ 89, 90, 91, 18, 330, 0, 322, 353, 23, 383, - /* 920 */ 322, 20, 352, 322, 322, 322, 178, 343, 180, 322, - /* 930 */ 397, 322, 37, 38, 322, 379, 41, 381, 368, 322, - /* 940 */ 353, 8, 9, 322, 360, 12, 13, 14, 15, 16, - /* 950 */ 352, 203, 204, 58, 59, 60, 423, 330, 360, 365, - /* 960 */ 424, 39, 330, 365, 428, 367, 365, 365, 365, 0, - /* 970 */ 343, 20, 365, 352, 365, 343, 61, 365, 161, 443, - /* 980 */ 444, 360, 365, 360, 448, 449, 365, 360, 367, 391, - /* 990 */ 95, 37, 360, 395, 371, 43, 398, 399, 400, 401, - /* 1000 */ 402, 403, 352, 405, 330, 340, 362, 342, 410, 365, - /* 1010 */ 412, 361, 391, 243, 416, 417, 395, 343, 0, 398, - /* 1020 */ 399, 400, 401, 402, 403, 427, 405, 43, 133, 159, - /* 1030 */ 61, 410, 0, 412, 360, 12, 13, 416, 417, 362, - /* 1040 */ 127, 322, 365, 345, 387, 22, 348, 330, 427, 44, - /* 1050 */ 45, 330, 98, 107, 100, 101, 33, 103, 35, 106, - /* 1060 */ 343, 107, 161, 107, 343, 170, 171, 172, 240, 241, - /* 1070 */ 175, 352, 126, 127, 128, 129, 130, 360, 35, 360, - /* 1080 */ 57, 360, 341, 129, 365, 129, 367, 0, 193, 42, - /* 1090 */ 43, 196, 69, 198, 199, 200, 201, 202, 185, 186, - /* 1100 */ 322, 57, 189, 330, 191, 42, 43, 154, 62, 22, - /* 1110 */ 391, 43, 161, 43, 395, 323, 343, 398, 399, 400, - /* 1120 */ 401, 402, 403, 0, 405, 131, 132, 1, 2, 410, - /* 1130 */ 352, 412, 43, 360, 0, 416, 417, 242, 360, 107, - /* 1140 */ 117, 97, 35, 365, 21, 367, 427, 24, 25, 26, - /* 1150 */ 27, 28, 29, 30, 31, 32, 22, 43, 126, 127, - /* 1160 */ 128, 129, 130, 241, 96, 99, 96, 149, 102, 391, - /* 1170 */ 0, 99, 99, 395, 102, 102, 398, 399, 400, 401, - /* 1180 */ 402, 403, 43, 405, 99, 96, 322, 102, 410, 13, - /* 1190 */ 412, 161, 22, 43, 416, 417, 166, 43, 43, 43, - /* 1200 */ 35, 178, 375, 180, 43, 46, 13, 452, 319, 441, - /* 1210 */ 96, 35, 331, 261, 435, 322, 352, 43, 43, 352, - /* 1220 */ 43, 331, 43, 180, 360, 43, 203, 204, 35, 365, - /* 1230 */ 43, 367, 375, 329, 69, 96, 364, 375, 215, 216, - /* 1240 */ 217, 218, 219, 220, 221, 352, 96, 263, 426, 203, - /* 1250 */ 96, 96, 96, 360, 95, 391, 445, 96, 365, 395, - /* 1260 */ 367, 418, 398, 399, 400, 401, 402, 403, 0, 405, - /* 1270 */ 96, 96, 383, 96, 410, 96, 412, 322, 96, 95, - /* 1280 */ 416, 417, 429, 96, 391, 244, 47, 180, 395, 105, - /* 1290 */ 393, 398, 399, 400, 401, 402, 403, 392, 405, 385, - /* 1300 */ 176, 42, 372, 410, 322, 412, 20, 352, 370, 416, - /* 1310 */ 417, 375, 372, 424, 20, 360, 48, 428, 158, 330, - /* 1320 */ 365, 330, 367, 93, 337, 330, 330, 330, 370, 372, - /* 1330 */ 370, 322, 443, 444, 352, 20, 324, 448, 449, 324, - /* 1340 */ 20, 335, 360, 367, 20, 335, 391, 365, 322, 367, - /* 1350 */ 395, 389, 382, 398, 399, 400, 401, 402, 403, 20, - /* 1360 */ 405, 352, 384, 335, 335, 382, 335, 412, 335, 360, - /* 1370 */ 330, 416, 417, 391, 365, 324, 367, 395, 352, 51, - /* 1380 */ 398, 399, 400, 401, 402, 403, 360, 405, 335, 332, - /* 1390 */ 332, 365, 330, 367, 412, 192, 383, 352, 416, 417, - /* 1400 */ 391, 352, 322, 324, 395, 389, 352, 398, 399, 400, - /* 1410 */ 401, 402, 403, 352, 405, 365, 352, 391, 183, 250, - /* 1420 */ 330, 395, 388, 352, 398, 399, 400, 401, 402, 403, - /* 1430 */ 352, 405, 352, 333, 352, 352, 352, 424, 352, 333, - /* 1440 */ 360, 428, 390, 367, 375, 365, 249, 367, 439, 440, - /* 1450 */ 383, 434, 375, 365, 434, 256, 443, 444, 322, 365, - /* 1460 */ 365, 448, 449, 365, 383, 169, 258, 257, 432, 378, - /* 1470 */ 378, 391, 437, 436, 245, 395, 450, 451, 398, 399, - /* 1480 */ 400, 401, 402, 403, 265, 405, 393, 431, 352, 434, - /* 1490 */ 262, 424, 412, 433, 260, 428, 360, 417, 241, 20, - /* 1500 */ 360, 365, 322, 367, 382, 424, 397, 378, 383, 428, - /* 1510 */ 443, 444, 453, 330, 333, 448, 449, 365, 322, 378, - /* 1520 */ 163, 447, 365, 365, 443, 444, 360, 391, 365, 448, - /* 1530 */ 449, 395, 352, 365, 398, 399, 400, 401, 402, 403, - /* 1540 */ 360, 405, 446, 365, 333, 365, 348, 367, 352, 424, - /* 1550 */ 333, 95, 415, 428, 95, 365, 360, 356, 342, 333, - /* 1560 */ 36, 365, 376, 367, 346, 325, 330, 324, 443, 444, - /* 1570 */ 381, 391, 320, 448, 449, 395, 440, 386, 398, 399, - /* 1580 */ 400, 401, 402, 403, 346, 405, 322, 391, 346, 334, - /* 1590 */ 0, 395, 0, 185, 398, 399, 400, 401, 402, 403, - /* 1600 */ 0, 405, 0, 322, 42, 0, 35, 197, 35, 35, - /* 1610 */ 35, 197, 0, 35, 35, 197, 352, 0, 197, 0, - /* 1620 */ 35, 357, 442, 0, 360, 22, 0, 180, 35, 365, - /* 1630 */ 178, 367, 0, 352, 0, 174, 173, 0, 0, 0, - /* 1640 */ 46, 360, 35, 42, 0, 0, 365, 451, 367, 0, - /* 1650 */ 0, 0, 0, 0, 0, 391, 0, 322, 0, 395, - /* 1660 */ 149, 0, 398, 399, 400, 401, 402, 403, 149, 405, - /* 1670 */ 0, 0, 391, 322, 0, 0, 395, 0, 0, 398, - /* 1680 */ 399, 400, 401, 402, 403, 0, 405, 352, 407, 0, - /* 1690 */ 0, 0, 357, 0, 0, 360, 39, 42, 0, 0, - /* 1700 */ 365, 0, 367, 352, 0, 0, 0, 0, 357, 0, - /* 1710 */ 22, 360, 43, 46, 35, 0, 365, 322, 367, 0, - /* 1720 */ 0, 0, 0, 57, 0, 57, 391, 0, 0, 42, - /* 1730 */ 395, 14, 14, 398, 399, 400, 401, 402, 403, 0, - /* 1740 */ 405, 46, 391, 40, 322, 0, 395, 352, 0, 398, - /* 1750 */ 399, 400, 401, 402, 403, 360, 405, 0, 169, 0, - /* 1760 */ 365, 0, 367, 0, 39, 39, 0, 0, 35, 39, - /* 1770 */ 47, 322, 0, 63, 352, 35, 47, 39, 0, 35, - /* 1780 */ 39, 47, 360, 47, 35, 39, 391, 365, 0, 367, - /* 1790 */ 395, 0, 0, 398, 399, 400, 401, 402, 403, 0, - /* 1800 */ 405, 352, 0, 35, 104, 0, 22, 22, 35, 360, - /* 1810 */ 102, 35, 35, 391, 365, 322, 367, 395, 43, 22, - /* 1820 */ 398, 399, 400, 401, 402, 403, 0, 405, 35, 43, - /* 1830 */ 35, 35, 0, 35, 22, 22, 49, 0, 22, 35, - /* 1840 */ 391, 0, 35, 0, 395, 352, 35, 398, 399, 400, - /* 1850 */ 401, 402, 403, 360, 405, 0, 22, 95, 365, 322, - /* 1860 */ 367, 96, 20, 0, 35, 0, 22, 181, 0, 0, - /* 1870 */ 3, 43, 161, 246, 161, 95, 95, 163, 96, 322, - /* 1880 */ 3, 43, 43, 167, 391, 96, 96, 246, 395, 352, - /* 1890 */ 96, 398, 399, 400, 401, 402, 403, 360, 405, 46, - /* 1900 */ 43, 95, 365, 161, 367, 46, 246, 43, 35, 352, - /* 1910 */ 95, 35, 95, 95, 35, 96, 96, 360, 35, 35, - /* 1920 */ 35, 96, 365, 96, 367, 43, 46, 46, 391, 0, - /* 1930 */ 0, 0, 395, 190, 35, 398, 399, 400, 401, 402, - /* 1940 */ 403, 95, 405, 96, 322, 96, 95, 35, 391, 0, - /* 1950 */ 0, 95, 395, 95, 39, 398, 399, 400, 401, 402, - /* 1960 */ 403, 95, 405, 46, 322, 164, 105, 46, 43, 2, - /* 1970 */ 162, 240, 225, 22, 352, 22, 225, 227, 46, 46, - /* 1980 */ 106, 95, 360, 96, 95, 107, 96, 365, 95, 367, - /* 1990 */ 96, 95, 95, 35, 352, 35, 96, 95, 35, 96, - /* 2000 */ 95, 95, 360, 203, 96, 96, 35, 365, 205, 367, - /* 2010 */ 96, 95, 35, 391, 95, 35, 96, 395, 322, 95, - /* 2020 */ 398, 399, 400, 401, 402, 403, 119, 405, 22, 119, - /* 2030 */ 119, 95, 119, 391, 322, 95, 35, 395, 95, 43, - /* 2040 */ 398, 399, 400, 401, 402, 403, 22, 405, 352, 63, - /* 2050 */ 62, 35, 35, 35, 35, 35, 360, 35, 35, 69, - /* 2060 */ 35, 365, 35, 367, 352, 35, 92, 35, 35, 43, - /* 2070 */ 22, 35, 360, 22, 35, 35, 35, 365, 322, 367, - /* 2080 */ 69, 35, 35, 22, 35, 35, 0, 391, 35, 35, - /* 2090 */ 35, 395, 47, 0, 398, 399, 400, 401, 402, 403, - /* 2100 */ 35, 405, 39, 391, 0, 322, 47, 395, 352, 39, - /* 2110 */ 398, 399, 400, 401, 402, 403, 360, 405, 35, 47, - /* 2120 */ 39, 365, 0, 367, 35, 47, 39, 0, 0, 35, - /* 2130 */ 35, 22, 322, 21, 21, 352, 22, 22, 20, 454, - /* 2140 */ 454, 454, 454, 360, 454, 454, 454, 391, 365, 454, - /* 2150 */ 367, 395, 454, 454, 398, 399, 400, 401, 402, 403, - /* 2160 */ 454, 405, 352, 454, 454, 454, 454, 454, 454, 454, - /* 2170 */ 360, 454, 454, 454, 391, 365, 322, 367, 395, 454, - /* 2180 */ 454, 398, 399, 400, 401, 402, 403, 454, 405, 454, - /* 2190 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2200 */ 454, 391, 454, 454, 454, 395, 352, 454, 398, 399, - /* 2210 */ 400, 401, 402, 403, 360, 405, 454, 454, 454, 365, - /* 2220 */ 322, 367, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2230 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2240 */ 322, 454, 454, 454, 454, 391, 454, 454, 454, 395, - /* 2250 */ 352, 454, 398, 399, 400, 401, 402, 403, 360, 405, - /* 2260 */ 454, 454, 454, 365, 454, 367, 454, 454, 454, 454, - /* 2270 */ 352, 454, 454, 454, 454, 454, 454, 454, 360, 454, - /* 2280 */ 454, 454, 454, 365, 454, 367, 454, 454, 454, 391, - /* 2290 */ 454, 454, 454, 395, 454, 454, 398, 399, 400, 401, - /* 2300 */ 402, 403, 454, 405, 454, 322, 454, 454, 454, 391, - /* 2310 */ 454, 454, 454, 395, 454, 454, 398, 399, 400, 401, - /* 2320 */ 402, 403, 454, 405, 454, 322, 454, 454, 454, 454, - /* 2330 */ 454, 454, 454, 454, 454, 352, 454, 454, 454, 454, - /* 2340 */ 454, 454, 454, 360, 454, 454, 454, 454, 365, 454, - /* 2350 */ 367, 454, 454, 454, 454, 352, 454, 454, 454, 454, - /* 2360 */ 454, 454, 454, 360, 454, 454, 454, 454, 365, 454, - /* 2370 */ 367, 454, 454, 454, 391, 454, 454, 454, 395, 322, - /* 2380 */ 454, 398, 399, 400, 401, 402, 403, 454, 405, 454, - /* 2390 */ 454, 454, 454, 454, 391, 322, 454, 454, 395, 454, - /* 2400 */ 454, 398, 399, 400, 401, 402, 403, 454, 405, 352, - /* 2410 */ 454, 454, 454, 454, 454, 454, 454, 360, 454, 454, - /* 2420 */ 454, 454, 365, 454, 367, 352, 454, 454, 454, 454, - /* 2430 */ 454, 454, 454, 360, 454, 454, 454, 454, 365, 322, - /* 2440 */ 367, 454, 454, 454, 454, 454, 454, 454, 391, 454, - /* 2450 */ 454, 454, 395, 19, 454, 398, 399, 400, 401, 402, - /* 2460 */ 403, 454, 405, 454, 391, 454, 322, 33, 395, 352, - /* 2470 */ 454, 398, 399, 400, 401, 402, 403, 360, 405, 454, - /* 2480 */ 454, 47, 365, 454, 367, 454, 454, 53, 54, 55, - /* 2490 */ 56, 57, 454, 454, 454, 454, 352, 454, 454, 454, - /* 2500 */ 454, 454, 454, 454, 360, 454, 454, 454, 391, 365, - /* 2510 */ 454, 367, 395, 454, 454, 398, 399, 400, 401, 402, - /* 2520 */ 403, 454, 405, 454, 454, 454, 454, 454, 94, 454, - /* 2530 */ 454, 97, 454, 454, 454, 391, 454, 454, 454, 395, - /* 2540 */ 454, 454, 398, 399, 400, 401, 402, 403, 454, 405, - /* 2550 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2560 */ 454, 454, 454, 454, 130, 454, 454, 454, 454, 454, - /* 2570 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2580 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2590 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 165, - /* 2600 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2610 */ 454, 454, 454, 454, 454, 454, 182, 454, 184, 454, - /* 2620 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2630 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2640 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2650 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2660 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2670 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2680 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2690 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2700 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2710 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2720 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2730 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2740 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2750 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2760 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, - /* 2770 */ 454, 454, 454, + /* 220 */ 220, 221, 222, 223, 224, 225, 226, 65, 66, 67, + /* 230 */ 426, 20, 161, 162, 430, 73, 74, 20, 187, 188, + /* 240 */ 78, 79, 191, 368, 193, 321, 84, 85, 4, 445, + /* 250 */ 446, 180, 90, 182, 450, 451, 164, 165, 324, 167, + /* 260 */ 80, 166, 170, 205, 205, 231, 232, 233, 234, 235, + /* 270 */ 236, 237, 238, 239, 240, 241, 205, 206, 186, 208, + /* 280 */ 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + /* 290 */ 219, 220, 221, 222, 223, 224, 225, 226, 354, 228, + /* 300 */ 12, 13, 368, 341, 342, 244, 244, 96, 20, 385, + /* 310 */ 22, 367, 253, 254, 255, 256, 257, 137, 138, 161, + /* 320 */ 162, 33, 324, 35, 109, 110, 111, 112, 113, 114, + /* 330 */ 115, 116, 117, 118, 119, 20, 121, 122, 123, 124, + /* 340 */ 125, 126, 175, 336, 249, 250, 58, 20, 244, 22, + /* 350 */ 426, 63, 329, 355, 430, 332, 333, 350, 70, 341, + /* 360 */ 342, 363, 35, 196, 197, 358, 368, 44, 370, 445, + /* 370 */ 446, 12, 13, 14, 450, 451, 2, 355, 51, 20, + /* 380 */ 163, 22, 8, 9, 96, 363, 12, 13, 14, 15, + /* 390 */ 16, 393, 33, 329, 35, 397, 332, 333, 400, 401, + /* 400 */ 402, 403, 404, 405, 332, 407, 118, 324, 8, 9, + /* 410 */ 399, 96, 12, 13, 14, 15, 16, 58, 346, 127, + /* 420 */ 132, 133, 108, 163, 402, 353, 8, 9, 168, 70, + /* 430 */ 12, 13, 14, 15, 16, 363, 425, 35, 355, 441, + /* 440 */ 442, 127, 128, 129, 130, 131, 363, 336, 370, 161, + /* 450 */ 162, 368, 96, 370, 426, 96, 242, 243, 430, 8, + /* 460 */ 9, 383, 20, 12, 13, 14, 15, 16, 180, 358, + /* 470 */ 182, 20, 70, 445, 446, 324, 393, 118, 450, 451, + /* 480 */ 397, 189, 190, 400, 401, 402, 403, 404, 405, 245, + /* 490 */ 407, 132, 133, 205, 206, 96, 208, 209, 210, 211, + /* 500 */ 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + /* 510 */ 222, 223, 224, 225, 226, 97, 4, 324, 324, 368, + /* 520 */ 161, 162, 0, 21, 45, 46, 24, 25, 26, 27, + /* 530 */ 28, 29, 30, 31, 32, 452, 453, 127, 128, 180, + /* 540 */ 228, 182, 230, 21, 0, 324, 24, 25, 26, 27, + /* 550 */ 28, 29, 30, 31, 32, 43, 20, 45, 46, 244, + /* 560 */ 62, 368, 368, 163, 205, 206, 160, 208, 209, 210, + /* 570 */ 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + /* 580 */ 221, 222, 223, 224, 225, 226, 12, 13, 265, 368, + /* 590 */ 19, 4, 20, 20, 20, 22, 22, 363, 188, 332, + /* 600 */ 244, 191, 332, 193, 33, 14, 19, 33, 374, 35, + /* 610 */ 324, 20, 96, 346, 163, 107, 346, 332, 324, 48, + /* 620 */ 33, 228, 332, 353, 51, 54, 55, 56, 57, 58, + /* 630 */ 363, 346, 58, 363, 347, 48, 338, 231, 355, 70, + /* 640 */ 53, 355, 355, 244, 70, 58, 70, 241, 363, 363, + /* 650 */ 352, 364, 108, 363, 368, 0, 370, 12, 13, 361, + /* 660 */ 377, 0, 368, 332, 324, 20, 95, 22, 0, 98, + /* 670 */ 96, 127, 128, 129, 130, 131, 356, 346, 33, 393, + /* 680 */ 35, 324, 95, 397, 356, 98, 400, 401, 402, 403, + /* 690 */ 404, 405, 118, 407, 363, 179, 410, 181, 412, 413, + /* 700 */ 414, 347, 131, 58, 418, 419, 132, 133, 368, 355, + /* 710 */ 389, 421, 422, 423, 424, 70, 426, 427, 364, 356, + /* 720 */ 65, 66, 67, 62, 58, 368, 14, 332, 73, 74, + /* 730 */ 62, 324, 20, 78, 79, 161, 162, 324, 167, 84, + /* 740 */ 85, 96, 0, 8, 9, 90, 20, 12, 13, 14, + /* 750 */ 15, 16, 161, 20, 180, 184, 182, 186, 363, 348, + /* 760 */ 244, 95, 351, 118, 98, 357, 24, 25, 26, 27, + /* 770 */ 28, 29, 30, 31, 32, 368, 368, 132, 133, 205, + /* 780 */ 206, 368, 208, 209, 210, 211, 212, 213, 214, 215, + /* 790 */ 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + /* 800 */ 226, 18, 108, 20, 396, 397, 161, 162, 324, 363, + /* 810 */ 27, 399, 411, 30, 413, 407, 33, 422, 423, 424, + /* 820 */ 374, 426, 427, 355, 130, 180, 0, 182, 324, 0, + /* 830 */ 324, 48, 97, 50, 2, 410, 53, 425, 413, 371, + /* 840 */ 8, 9, 324, 324, 12, 13, 14, 15, 16, 356, + /* 850 */ 205, 206, 368, 208, 209, 210, 211, 212, 213, 214, + /* 860 */ 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + /* 870 */ 225, 226, 368, 161, 368, 8, 9, 48, 95, 12, + /* 880 */ 13, 14, 15, 16, 20, 365, 368, 368, 368, 163, + /* 890 */ 107, 65, 66, 67, 68, 69, 163, 71, 72, 73, + /* 900 */ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + /* 910 */ 84, 85, 86, 87, 88, 89, 90, 91, 92, 136, + /* 920 */ 324, 324, 139, 140, 141, 142, 143, 144, 145, 146, + /* 930 */ 147, 148, 149, 150, 151, 152, 153, 154, 155, 3, + /* 940 */ 157, 158, 159, 18, 411, 332, 413, 332, 23, 8, + /* 950 */ 9, 44, 355, 12, 13, 14, 15, 16, 332, 346, + /* 960 */ 363, 346, 37, 38, 368, 368, 41, 370, 382, 385, + /* 970 */ 384, 3, 346, 44, 324, 324, 363, 382, 363, 384, + /* 980 */ 324, 332, 1, 2, 59, 60, 61, 0, 20, 363, + /* 990 */ 393, 332, 332, 365, 397, 346, 368, 400, 401, 402, + /* 1000 */ 403, 404, 405, 39, 407, 355, 346, 0, 356, 412, + /* 1010 */ 426, 414, 363, 363, 430, 418, 419, 344, 368, 368, + /* 1020 */ 370, 96, 363, 363, 368, 161, 97, 332, 348, 445, + /* 1030 */ 446, 351, 332, 100, 450, 451, 103, 440, 357, 172, + /* 1040 */ 356, 346, 332, 393, 58, 100, 346, 397, 103, 368, + /* 1050 */ 400, 401, 402, 403, 404, 405, 346, 407, 363, 134, + /* 1060 */ 332, 324, 412, 363, 414, 97, 12, 13, 418, 419, + /* 1070 */ 343, 356, 345, 363, 346, 35, 22, 396, 397, 429, + /* 1080 */ 332, 422, 423, 424, 98, 426, 427, 33, 407, 35, + /* 1090 */ 325, 363, 355, 22, 346, 108, 107, 172, 173, 174, + /* 1100 */ 363, 42, 177, 44, 324, 368, 35, 370, 42, 378, + /* 1110 */ 44, 363, 58, 443, 127, 128, 129, 130, 131, 35, + /* 1120 */ 195, 357, 332, 198, 70, 200, 201, 202, 203, 204, + /* 1130 */ 393, 163, 368, 266, 397, 355, 346, 400, 401, 402, + /* 1140 */ 403, 404, 405, 363, 407, 156, 0, 96, 368, 412, + /* 1150 */ 370, 414, 454, 363, 0, 418, 419, 106, 151, 334, + /* 1160 */ 396, 397, 398, 385, 100, 332, 429, 103, 22, 244, + /* 1170 */ 263, 407, 118, 393, 332, 324, 22, 397, 44, 346, + /* 1180 */ 400, 401, 402, 403, 404, 405, 332, 407, 346, 332, + /* 1190 */ 0, 47, 412, 437, 414, 355, 363, 261, 418, 419, + /* 1200 */ 346, 332, 334, 346, 426, 363, 355, 243, 430, 429, + /* 1210 */ 132, 133, 22, 100, 363, 346, 103, 363, 324, 368, + /* 1220 */ 363, 370, 182, 445, 446, 44, 44, 44, 450, 451, + /* 1230 */ 44, 97, 363, 44, 180, 44, 182, 44, 378, 331, + /* 1240 */ 96, 367, 428, 378, 393, 447, 35, 420, 397, 355, + /* 1250 */ 44, 400, 401, 402, 403, 404, 405, 363, 407, 205, + /* 1260 */ 206, 324, 368, 412, 370, 414, 182, 44, 44, 418, + /* 1270 */ 419, 217, 218, 219, 220, 221, 222, 223, 97, 97, + /* 1280 */ 97, 70, 246, 97, 0, 324, 97, 393, 97, 13, + /* 1290 */ 97, 397, 355, 44, 400, 401, 402, 403, 404, 405, + /* 1300 */ 363, 407, 431, 97, 44, 368, 412, 370, 414, 395, + /* 1310 */ 48, 35, 418, 419, 13, 394, 355, 44, 44, 22, + /* 1320 */ 97, 97, 387, 178, 363, 42, 375, 20, 378, 368, + /* 1330 */ 393, 370, 35, 49, 397, 37, 35, 400, 401, 402, + /* 1340 */ 403, 404, 405, 324, 407, 375, 97, 160, 373, 412, + /* 1350 */ 20, 414, 332, 332, 393, 418, 419, 97, 397, 375, + /* 1360 */ 94, 400, 401, 402, 403, 404, 405, 70, 407, 373, + /* 1370 */ 97, 97, 373, 340, 355, 414, 332, 332, 332, 418, + /* 1380 */ 419, 20, 363, 326, 326, 20, 324, 368, 391, 370, + /* 1390 */ 338, 338, 370, 20, 333, 20, 386, 99, 338, 101, + /* 1400 */ 102, 333, 104, 338, 332, 338, 108, 338, 338, 52, + /* 1410 */ 335, 335, 393, 326, 324, 118, 397, 355, 355, 400, + /* 1420 */ 401, 402, 403, 404, 405, 363, 407, 332, 130, 355, + /* 1430 */ 368, 326, 370, 414, 355, 355, 355, 418, 419, 194, + /* 1440 */ 355, 355, 392, 355, 355, 355, 355, 355, 336, 185, + /* 1450 */ 368, 336, 332, 363, 252, 393, 251, 258, 368, 397, + /* 1460 */ 370, 378, 400, 401, 402, 403, 404, 405, 391, 407, + /* 1470 */ 370, 378, 368, 324, 436, 368, 414, 180, 381, 182, + /* 1480 */ 418, 419, 381, 393, 390, 436, 368, 397, 171, 368, + /* 1490 */ 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + /* 1500 */ 260, 259, 205, 206, 355, 247, 395, 264, 267, 262, + /* 1510 */ 455, 438, 363, 243, 363, 20, 399, 368, 333, 370, + /* 1520 */ 332, 381, 381, 368, 368, 368, 368, 368, 336, 368, + /* 1530 */ 336, 324, 165, 434, 436, 439, 433, 435, 363, 379, + /* 1540 */ 336, 96, 393, 417, 96, 368, 397, 351, 345, 400, + /* 1550 */ 401, 402, 403, 404, 405, 449, 407, 448, 332, 324, + /* 1560 */ 359, 336, 355, 414, 36, 327, 388, 349, 419, 349, + /* 1570 */ 363, 349, 326, 337, 322, 368, 0, 370, 0, 384, + /* 1580 */ 187, 0, 0, 42, 0, 324, 35, 199, 35, 35, + /* 1590 */ 355, 35, 0, 199, 35, 35, 199, 0, 363, 199, + /* 1600 */ 393, 0, 35, 368, 397, 370, 0, 400, 401, 402, + /* 1610 */ 403, 404, 405, 0, 407, 22, 355, 182, 35, 180, + /* 1620 */ 0, 0, 176, 0, 363, 175, 0, 47, 393, 368, + /* 1630 */ 0, 370, 397, 0, 0, 400, 401, 402, 403, 404, + /* 1640 */ 405, 42, 407, 0, 0, 0, 0, 0, 0, 442, + /* 1650 */ 0, 0, 151, 35, 393, 324, 0, 151, 397, 0, + /* 1660 */ 0, 400, 401, 402, 403, 404, 405, 0, 407, 0, + /* 1670 */ 0, 0, 0, 0, 324, 22, 0, 42, 0, 444, + /* 1680 */ 0, 0, 0, 0, 0, 0, 355, 0, 0, 0, + /* 1690 */ 0, 360, 135, 0, 363, 0, 0, 0, 0, 368, + /* 1700 */ 35, 370, 0, 0, 0, 355, 0, 58, 42, 47, + /* 1710 */ 58, 47, 44, 363, 453, 14, 39, 0, 368, 14, + /* 1720 */ 370, 47, 0, 0, 393, 0, 40, 0, 397, 171, + /* 1730 */ 39, 400, 401, 402, 403, 404, 405, 324, 407, 39, + /* 1740 */ 0, 0, 0, 393, 0, 35, 39, 397, 0, 35, + /* 1750 */ 400, 401, 402, 403, 404, 405, 48, 407, 324, 409, + /* 1760 */ 48, 0, 0, 64, 35, 39, 48, 39, 355, 35, + /* 1770 */ 39, 0, 48, 360, 0, 0, 363, 0, 35, 22, + /* 1780 */ 324, 368, 0, 370, 105, 35, 35, 22, 35, 355, + /* 1790 */ 35, 44, 22, 44, 360, 35, 0, 363, 35, 35, + /* 1800 */ 22, 324, 368, 0, 370, 22, 393, 0, 50, 22, + /* 1810 */ 397, 355, 103, 400, 401, 402, 403, 404, 405, 363, + /* 1820 */ 407, 35, 0, 324, 368, 35, 370, 393, 0, 35, + /* 1830 */ 0, 397, 355, 22, 400, 401, 402, 403, 404, 405, + /* 1840 */ 363, 407, 97, 20, 324, 368, 0, 370, 96, 393, + /* 1850 */ 35, 0, 0, 397, 355, 22, 400, 401, 402, 403, + /* 1860 */ 404, 405, 363, 407, 0, 44, 3, 368, 96, 370, + /* 1870 */ 393, 44, 248, 97, 397, 355, 163, 400, 401, 402, + /* 1880 */ 403, 404, 405, 363, 407, 165, 97, 324, 368, 96, + /* 1890 */ 370, 96, 393, 163, 183, 163, 397, 97, 97, 400, + /* 1900 */ 401, 402, 403, 404, 405, 169, 407, 47, 96, 96, + /* 1910 */ 44, 44, 47, 393, 96, 324, 3, 397, 355, 44, + /* 1920 */ 400, 401, 402, 403, 404, 405, 363, 407, 97, 97, + /* 1930 */ 35, 368, 35, 370, 35, 35, 35, 35, 97, 97, + /* 1940 */ 47, 324, 248, 47, 0, 0, 355, 44, 0, 96, + /* 1950 */ 35, 97, 97, 96, 363, 35, 393, 242, 192, 368, + /* 1960 */ 397, 370, 0, 400, 401, 402, 403, 404, 405, 248, + /* 1970 */ 407, 166, 355, 96, 96, 0, 39, 96, 164, 106, + /* 1980 */ 363, 47, 44, 227, 393, 368, 2, 370, 397, 22, + /* 1990 */ 205, 400, 401, 402, 403, 404, 405, 229, 407, 324, + /* 2000 */ 227, 97, 96, 96, 47, 97, 96, 47, 97, 97, + /* 2010 */ 393, 207, 96, 96, 397, 22, 324, 400, 401, 402, + /* 2020 */ 403, 404, 405, 97, 407, 96, 107, 35, 96, 35, + /* 2030 */ 355, 35, 97, 97, 35, 96, 96, 35, 363, 97, + /* 2040 */ 97, 35, 96, 368, 120, 370, 96, 355, 120, 22, + /* 2050 */ 120, 120, 96, 35, 96, 363, 44, 108, 22, 324, + /* 2060 */ 368, 96, 370, 35, 64, 35, 63, 35, 393, 35, + /* 2070 */ 35, 70, 397, 35, 35, 400, 401, 402, 403, 404, + /* 2080 */ 405, 35, 407, 324, 35, 393, 35, 44, 93, 397, + /* 2090 */ 355, 35, 400, 401, 402, 403, 404, 405, 363, 407, + /* 2100 */ 35, 22, 35, 368, 22, 370, 35, 35, 22, 35, + /* 2110 */ 70, 35, 35, 35, 355, 35, 35, 0, 35, 35, + /* 2120 */ 0, 0, 363, 48, 39, 35, 324, 368, 393, 370, + /* 2130 */ 39, 39, 397, 35, 0, 400, 401, 402, 403, 404, + /* 2140 */ 405, 35, 407, 324, 48, 48, 39, 48, 0, 35, + /* 2150 */ 35, 0, 393, 22, 21, 20, 397, 355, 21, 400, + /* 2160 */ 401, 402, 403, 404, 405, 363, 407, 22, 22, 324, + /* 2170 */ 368, 456, 370, 456, 355, 456, 456, 456, 456, 456, + /* 2180 */ 456, 456, 363, 456, 456, 456, 324, 368, 456, 370, + /* 2190 */ 456, 456, 456, 456, 456, 393, 456, 456, 456, 397, + /* 2200 */ 355, 456, 400, 401, 402, 403, 404, 405, 363, 407, + /* 2210 */ 456, 456, 393, 368, 456, 370, 397, 355, 456, 400, + /* 2220 */ 401, 402, 403, 404, 405, 363, 407, 456, 456, 324, + /* 2230 */ 368, 456, 370, 456, 456, 456, 456, 456, 393, 456, + /* 2240 */ 456, 456, 397, 456, 456, 400, 401, 402, 403, 404, + /* 2250 */ 405, 324, 407, 456, 456, 393, 456, 456, 456, 397, + /* 2260 */ 355, 456, 400, 401, 402, 403, 404, 405, 363, 407, + /* 2270 */ 456, 456, 456, 368, 456, 370, 456, 456, 456, 456, + /* 2280 */ 456, 456, 355, 456, 456, 456, 456, 456, 456, 456, + /* 2290 */ 363, 456, 456, 456, 456, 368, 456, 370, 393, 456, + /* 2300 */ 456, 456, 397, 456, 456, 400, 401, 402, 403, 404, + /* 2310 */ 405, 456, 407, 324, 456, 456, 456, 456, 456, 456, + /* 2320 */ 393, 456, 456, 456, 397, 456, 456, 400, 401, 402, + /* 2330 */ 403, 404, 405, 456, 407, 324, 456, 456, 456, 456, + /* 2340 */ 456, 456, 456, 456, 355, 456, 456, 456, 456, 456, + /* 2350 */ 456, 456, 363, 456, 456, 456, 456, 368, 456, 370, + /* 2360 */ 456, 456, 456, 456, 456, 456, 355, 456, 456, 456, + /* 2370 */ 456, 456, 456, 456, 363, 456, 456, 456, 456, 368, + /* 2380 */ 456, 370, 393, 456, 456, 456, 397, 456, 456, 400, + /* 2390 */ 401, 402, 403, 404, 405, 456, 407, 324, 456, 456, + /* 2400 */ 456, 456, 456, 456, 393, 456, 456, 456, 397, 456, + /* 2410 */ 456, 400, 401, 402, 403, 404, 405, 324, 407, 456, + /* 2420 */ 456, 456, 456, 456, 456, 456, 456, 456, 355, 456, + /* 2430 */ 456, 456, 456, 456, 456, 456, 363, 456, 456, 456, + /* 2440 */ 456, 368, 456, 370, 456, 456, 456, 456, 355, 456, + /* 2450 */ 456, 456, 456, 456, 456, 456, 363, 456, 456, 456, + /* 2460 */ 324, 368, 456, 370, 456, 456, 393, 456, 456, 456, + /* 2470 */ 397, 456, 456, 400, 401, 402, 403, 404, 405, 456, + /* 2480 */ 407, 456, 456, 456, 456, 456, 393, 456, 456, 456, + /* 2490 */ 397, 355, 456, 400, 401, 402, 403, 404, 405, 363, + /* 2500 */ 407, 456, 456, 456, 368, 456, 370, 456, 456, 456, + /* 2510 */ 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + /* 2520 */ 456, 456, 456, 456, 456, 456, 456, 456, 456, 393, + /* 2530 */ 456, 456, 456, 397, 456, 456, 400, 401, 402, 403, + /* 2540 */ 404, 405, 456, 407, }; -#define YY_SHIFT_COUNT (703) +#define YY_SHIFT_COUNT (706) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (2434) +#define YY_SHIFT_MAX (2151) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 895, 0, 132, 0, 264, 264, 264, 264, 264, 264, - /* 10 */ 264, 264, 264, 396, 528, 528, 660, 528, 528, 528, - /* 20 */ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, - /* 30 */ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, - /* 40 */ 528, 528, 528, 528, 528, 528, 69, 224, 282, 14, - /* 50 */ 208, 193, 353, 193, 282, 282, 1023, 1023, 193, 1023, - /* 60 */ 1023, 89, 193, 71, 71, 23, 42, 42, 18, 71, - /* 70 */ 71, 71, 71, 71, 71, 71, 71, 71, 71, 129, - /* 80 */ 71, 71, 222, 71, 249, 71, 71, 307, 71, 71, - /* 90 */ 307, 71, 307, 307, 307, 71, 137, 223, 489, 489, - /* 100 */ 217, 145, 748, 748, 748, 748, 748, 748, 748, 748, - /* 110 */ 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, - /* 120 */ 748, 954, 31, 23, 18, 302, 302, 915, 263, 619, - /* 130 */ 619, 619, 969, 215, 215, 263, 369, 369, 369, 330, - /* 140 */ 249, 16, 16, 225, 307, 307, 449, 449, 330, 464, - /* 150 */ 733, 733, 733, 733, 733, 733, 733, 2434, 64, 1123, - /* 160 */ 246, 15, 389, 38, 261, 310, 372, 502, 901, 1005, - /* 170 */ 956, 951, 828, 922, 160, 828, 1047, 770, 870, 1041, - /* 180 */ 1239, 1124, 1259, 1286, 1259, 1160, 1294, 1294, 1259, 1160, - /* 190 */ 1160, 1230, 1294, 1294, 1294, 1315, 1315, 1320, 129, 249, - /* 200 */ 129, 1324, 1339, 129, 1324, 129, 129, 129, 1294, 129, - /* 210 */ 1328, 1328, 1315, 307, 307, 307, 307, 307, 307, 307, - /* 220 */ 307, 307, 307, 307, 1294, 1315, 449, 1203, 1320, 137, - /* 230 */ 1235, 249, 137, 1294, 1286, 1286, 449, 1169, 1197, 449, - /* 240 */ 1169, 1197, 449, 449, 307, 1199, 1296, 1169, 1208, 1210, - /* 250 */ 1229, 1041, 1219, 1228, 1234, 1257, 369, 1479, 1294, 1324, - /* 260 */ 137, 1197, 449, 449, 449, 449, 449, 1197, 449, 1357, - /* 270 */ 137, 330, 137, 369, 1456, 1459, 449, 464, 1294, 137, - /* 280 */ 1524, 1315, 2619, 2619, 2619, 2619, 2619, 2619, 2619, 821, - /* 290 */ 358, 432, 492, 662, 385, 688, 752, 785, 817, 933, - /* 300 */ 933, 439, 933, 933, 933, 933, 933, 933, 933, 1032, - /* 310 */ 946, 913, 368, 109, 109, 343, 530, 61, 801, 391, - /* 320 */ 119, 488, 417, 119, 119, 119, 1068, 287, 760, 1063, - /* 330 */ 953, 1018, 1066, 1072, 1073, 1085, 1087, 1134, 1170, 1044, - /* 340 */ 1070, 1089, 994, 952, 984, 1030, 1114, 1139, 1150, 1154, - /* 350 */ 1155, 1126, 1156, 1043, 1107, 1046, 1161, 1159, 1174, 1175, - /* 360 */ 1177, 1179, 1182, 1187, 1184, 1176, 1193, 1165, 1268, 1590, - /* 370 */ 1592, 1408, 1600, 1602, 1562, 1605, 1571, 1410, 1573, 1574, - /* 380 */ 1575, 1414, 1612, 1578, 1579, 1418, 1617, 1421, 1619, 1585, - /* 390 */ 1623, 1603, 1626, 1593, 1447, 1452, 1632, 1634, 1461, 1463, - /* 400 */ 1637, 1638, 1594, 1639, 1649, 1650, 1601, 1644, 1645, 1651, - /* 410 */ 1652, 1653, 1654, 1656, 1658, 1511, 1607, 1661, 1519, 1670, - /* 420 */ 1671, 1674, 1675, 1677, 1678, 1685, 1689, 1690, 1691, 1693, - /* 430 */ 1694, 1701, 1704, 1705, 1655, 1698, 1699, 1706, 1707, 1709, - /* 440 */ 1688, 1719, 1720, 1721, 1722, 1679, 1715, 1666, 1724, 1668, - /* 450 */ 1727, 1728, 1687, 1657, 1669, 1717, 1667, 1718, 1695, 1739, - /* 460 */ 1703, 1725, 1745, 1748, 1757, 1726, 1589, 1759, 1761, 1763, - /* 470 */ 1710, 1766, 1767, 1733, 1723, 1730, 1772, 1740, 1729, 1738, - /* 480 */ 1778, 1744, 1734, 1741, 1788, 1749, 1736, 1746, 1791, 1792, - /* 490 */ 1799, 1802, 1700, 1708, 1768, 1784, 1805, 1773, 1776, 1785, - /* 500 */ 1777, 1793, 1775, 1786, 1795, 1796, 1797, 1798, 1826, 1812, - /* 510 */ 1832, 1813, 1787, 1837, 1816, 1804, 1841, 1807, 1843, 1811, - /* 520 */ 1855, 1834, 1842, 1765, 1762, 1863, 1711, 1829, 1865, 1686, - /* 530 */ 1844, 1713, 1714, 1868, 1869, 1742, 1716, 1867, 1828, 1627, - /* 540 */ 1780, 1782, 1781, 1789, 1838, 1790, 1806, 1815, 1817, 1794, - /* 550 */ 1839, 1853, 1859, 1818, 1857, 1641, 1819, 1820, 1877, 1864, - /* 560 */ 1660, 1873, 1876, 1879, 1883, 1884, 1885, 1825, 1827, 1880, - /* 570 */ 1731, 1882, 1881, 1929, 1930, 1931, 1846, 1847, 1849, 1851, - /* 580 */ 1899, 1912, 1743, 1949, 1856, 1801, 1858, 1950, 1915, 1808, - /* 590 */ 1866, 1861, 1917, 1921, 1925, 1747, 1750, 1751, 1967, 1951, - /* 600 */ 1800, 1886, 1887, 1889, 1890, 1893, 1894, 1932, 1896, 1897, - /* 610 */ 1933, 1900, 1953, 1803, 1902, 1874, 1903, 1958, 1960, 1905, - /* 620 */ 1908, 1963, 1906, 1909, 1971, 1916, 1914, 1977, 1919, 1920, - /* 630 */ 1980, 1924, 1907, 1910, 1911, 1913, 2006, 1878, 1936, 1940, - /* 640 */ 2001, 1943, 1996, 1996, 2024, 1986, 1988, 2016, 2017, 2018, - /* 650 */ 2019, 2020, 2022, 2023, 2025, 2027, 2030, 1990, 1974, 2026, - /* 660 */ 2032, 2033, 2048, 2036, 2051, 2039, 2040, 2041, 2011, 1775, - /* 670 */ 2046, 1786, 2047, 2049, 2050, 2053, 2061, 2054, 2086, 2055, - /* 680 */ 2045, 2063, 2093, 2065, 2059, 2070, 2104, 2083, 2072, 2081, - /* 690 */ 2122, 2089, 2078, 2087, 2127, 2094, 2095, 2128, 2109, 2112, - /* 700 */ 2114, 2115, 2113, 2118, + /* 0 */ 925, 0, 71, 0, 288, 288, 288, 288, 288, 288, + /* 10 */ 288, 288, 288, 359, 574, 574, 645, 574, 574, 574, + /* 20 */ 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, + /* 30 */ 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, + /* 40 */ 574, 574, 574, 574, 574, 574, 61, 315, 211, 516, + /* 50 */ 62, 356, 399, 356, 211, 211, 1054, 1054, 356, 1054, + /* 60 */ 1054, 104, 356, 12, 12, 512, 512, 158, 31, 187, + /* 70 */ 187, 12, 12, 12, 12, 12, 12, 12, 12, 12, + /* 80 */ 12, 76, 12, 12, 168, 12, 442, 12, 12, 536, + /* 90 */ 12, 12, 536, 12, 536, 536, 536, 12, 498, 783, + /* 100 */ 34, 34, 162, 502, 1297, 1297, 1297, 1297, 1297, 1297, + /* 110 */ 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + /* 120 */ 1297, 1297, 1297, 1298, 968, 158, 31, 661, 402, 217, + /* 130 */ 217, 217, 668, 312, 312, 402, 572, 572, 572, 508, + /* 140 */ 442, 3, 3, 393, 536, 536, 569, 569, 508, 576, + /* 150 */ 215, 215, 215, 215, 215, 215, 215, 571, 655, 522, + /* 160 */ 451, 867, 59, 327, 95, 591, 712, 573, 726, 479, + /* 170 */ 694, 733, 214, 964, 936, 214, 1059, 244, 864, 1036, + /* 180 */ 1262, 1145, 1283, 1307, 1283, 1187, 1330, 1330, 1283, 1187, + /* 190 */ 1187, 1266, 1330, 1330, 1330, 1361, 1361, 1365, 76, 442, + /* 200 */ 76, 1373, 1375, 76, 1373, 76, 76, 76, 1330, 76, + /* 210 */ 1357, 1357, 1361, 536, 536, 536, 536, 536, 536, 536, + /* 220 */ 536, 536, 536, 536, 1330, 1361, 569, 1245, 1365, 498, + /* 230 */ 1264, 442, 498, 1330, 1307, 1307, 569, 1202, 1205, 569, + /* 240 */ 1202, 1205, 569, 569, 536, 1199, 1317, 1202, 1240, 1242, + /* 250 */ 1258, 1036, 1241, 1243, 1247, 1270, 572, 1495, 1330, 1373, + /* 260 */ 498, 1205, 569, 569, 569, 569, 569, 1205, 569, 1367, + /* 270 */ 498, 508, 498, 572, 1445, 1448, 569, 576, 1330, 498, + /* 280 */ 1528, 1361, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 826, + /* 290 */ 92, 742, 587, 418, 15, 735, 374, 832, 400, 941, + /* 300 */ 941, 544, 941, 941, 941, 941, 941, 941, 941, 987, + /* 310 */ 314, 51, 410, 73, 73, 167, 666, 180, 19, 292, + /* 320 */ 121, 99, 406, 121, 121, 121, 929, 829, 1071, 1066, + /* 330 */ 989, 1007, 933, 945, 1064, 1113, 1146, 1154, 1190, 986, + /* 340 */ 1134, 1181, 1078, 907, 323, 260, 1182, 1183, 1186, 1189, + /* 350 */ 1191, 981, 1193, 1040, 1084, 58, 1206, 1144, 1223, 1224, + /* 360 */ 1249, 1260, 1273, 1274, 1051, 1276, 1301, 1211, 1284, 1576, + /* 370 */ 1578, 1393, 1581, 1582, 1541, 1584, 1551, 1388, 1553, 1554, + /* 380 */ 1556, 1394, 1592, 1559, 1560, 1397, 1597, 1400, 1601, 1567, + /* 390 */ 1606, 1593, 1613, 1583, 1435, 1439, 1620, 1621, 1446, 1450, + /* 400 */ 1623, 1626, 1580, 1630, 1633, 1634, 1599, 1643, 1644, 1645, + /* 410 */ 1646, 1647, 1648, 1650, 1651, 1501, 1618, 1656, 1506, 1659, + /* 420 */ 1660, 1667, 1669, 1670, 1671, 1672, 1673, 1680, 1681, 1682, + /* 430 */ 1683, 1684, 1685, 1687, 1635, 1678, 1688, 1689, 1690, 1695, + /* 440 */ 1653, 1676, 1696, 1697, 1557, 1693, 1698, 1665, 1702, 1649, + /* 450 */ 1703, 1652, 1704, 1706, 1666, 1677, 1668, 1662, 1701, 1664, + /* 460 */ 1705, 1674, 1717, 1686, 1691, 1722, 1723, 1725, 1700, 1558, + /* 470 */ 1727, 1740, 1741, 1699, 1742, 1744, 1710, 1708, 1707, 1748, + /* 480 */ 1714, 1712, 1726, 1761, 1729, 1718, 1728, 1762, 1734, 1724, + /* 490 */ 1731, 1771, 1774, 1775, 1777, 1679, 1709, 1743, 1757, 1782, + /* 500 */ 1750, 1751, 1765, 1753, 1755, 1747, 1749, 1760, 1763, 1770, + /* 510 */ 1764, 1796, 1778, 1803, 1783, 1758, 1807, 1787, 1786, 1822, + /* 520 */ 1790, 1828, 1794, 1830, 1811, 1823, 1745, 1752, 1846, 1713, + /* 530 */ 1815, 1851, 1711, 1833, 1730, 1720, 1852, 1864, 1732, 1736, + /* 540 */ 1863, 1821, 1624, 1772, 1776, 1793, 1789, 1827, 1800, 1795, + /* 550 */ 1812, 1813, 1801, 1866, 1860, 1865, 1818, 1867, 1694, 1831, + /* 560 */ 1832, 1913, 1875, 1721, 1895, 1897, 1899, 1900, 1901, 1902, + /* 570 */ 1841, 1842, 1893, 1715, 1903, 1896, 1944, 1945, 1948, 1853, + /* 580 */ 1854, 1855, 1857, 1915, 1920, 1766, 1962, 1877, 1805, 1878, + /* 590 */ 1975, 1937, 1814, 1881, 1873, 1662, 1934, 1938, 1756, 1768, + /* 600 */ 1773, 1984, 1967, 1785, 1906, 1904, 1907, 1908, 1910, 1911, + /* 610 */ 1957, 1916, 1917, 1960, 1912, 1993, 1804, 1929, 1919, 1926, + /* 620 */ 1992, 1994, 1932, 1935, 1996, 1939, 1936, 1999, 1940, 1942, + /* 630 */ 2002, 1946, 1943, 2006, 1950, 1924, 1928, 1930, 1931, 2027, + /* 640 */ 1949, 1956, 1958, 2018, 1965, 2012, 2012, 2036, 2000, 2003, + /* 650 */ 2028, 2030, 2032, 2034, 2035, 2038, 2039, 2046, 2049, 2051, + /* 660 */ 2001, 1995, 2043, 2056, 2065, 2079, 2067, 2082, 2071, 2072, + /* 670 */ 2074, 2040, 1747, 2076, 1749, 2077, 2078, 2080, 2081, 2086, + /* 680 */ 2083, 2117, 2084, 2075, 2085, 2120, 2090, 2096, 2091, 2121, + /* 690 */ 2098, 2097, 2092, 2134, 2106, 2099, 2107, 2148, 2114, 2115, + /* 700 */ 2151, 2131, 2133, 2145, 2146, 2137, 2135, }; #define YY_REDUCE_COUNT (288) -#define YY_REDUCE_MIN (-407) -#define YY_REDUCE_MAX (2144) +#define YY_REDUCE_MIN (-425) +#define YY_REDUCE_MAX (2136) static const short yy_reduce_ofst[] = { - /* 0 */ 889, -320, -297, -165, 598, 621, 719, 778, 864, 893, - /* 10 */ 411, 955, 982, 231, 1009, 1026, 1080, 1136, 1180, 1196, - /* 20 */ 1264, 1281, 1335, 1351, 1395, 1422, 1449, 1493, 1537, 1557, - /* 30 */ 1622, 1642, 1696, 1712, 1756, 1783, 1810, 1854, 1898, 1918, - /* 40 */ 1983, 2003, 2057, 2073, 2117, 2144, 241, 86, -37, 536, - /* 50 */ 1013, 1067, 1081, 1125, 228, 291, -346, -87, -407, -166, - /* 60 */ -80, -372, -22, -276, -204, -308, -325, -319, -205, -192, - /* 70 */ 60, 74, 176, 202, 230, 234, 349, 429, 443, -78, - /* 80 */ 445, 584, 147, 627, -362, 632, 674, -245, 717, 721, - /* 90 */ 78, 773, -48, 81, -24, 338, -294, -144, -182, -182, - /* 100 */ -330, -142, -222, -210, -117, 178, 260, 342, 345, 392, - /* 110 */ 431, 459, 496, 594, 601, 602, 603, 607, 609, 612, - /* 120 */ 617, 405, -397, -106, 126, 185, 327, 427, 242, -397, - /* 130 */ 24, 533, 350, 161, 425, 469, 419, 444, 623, 346, - /* 140 */ 319, 481, 556, 247, 650, 570, 644, 677, 698, 665, - /* 150 */ 275, 377, 486, 499, 506, 564, 587, 657, 741, 792, - /* 160 */ 827, 755, 768, 881, 779, 867, 867, 890, 857, 904, - /* 170 */ 872, 862, 822, 822, 811, 822, 843, 853, 867, 897, - /* 180 */ 905, 914, 930, 936, 940, 938, 989, 991, 957, 958, - /* 190 */ 960, 987, 995, 996, 997, 1012, 1015, 962, 1006, 976, - /* 200 */ 1010, 970, 978, 1028, 983, 1029, 1031, 1033, 1040, 1053, - /* 210 */ 1057, 1058, 1051, 1045, 1049, 1054, 1061, 1064, 1071, 1078, - /* 220 */ 1082, 1083, 1084, 1086, 1062, 1079, 1050, 1052, 1016, 1100, - /* 230 */ 1034, 1076, 1106, 1090, 1069, 1077, 1088, 1017, 1091, 1094, - /* 240 */ 1020, 1092, 1095, 1098, 867, 1035, 1037, 1055, 1060, 1036, - /* 250 */ 1056, 1093, 1059, 1074, 1096, 822, 1140, 1109, 1183, 1122, - /* 260 */ 1181, 1129, 1152, 1157, 1158, 1163, 1168, 1141, 1178, 1186, - /* 270 */ 1211, 1198, 1217, 1166, 1137, 1201, 1190, 1216, 1236, 1226, - /* 280 */ 1240, 1243, 1191, 1189, 1218, 1238, 1242, 1255, 1252, + /* 0 */ -76, -288, 286, 597, 650, 737, 780, 851, 894, 937, + /* 10 */ 961, 1019, 1062, 1090, -2, 83, 1149, 1207, 1235, 1261, + /* 20 */ 1331, 1350, 1413, 1434, 1456, 1477, 1499, 1520, 1563, 1591, + /* 30 */ 1617, 1675, 1692, 1735, 1759, 1802, 1819, 1845, 1862, 1905, + /* 40 */ 1927, 1989, 2011, 2073, 2093, 2136, -253, -196, 290, -385, + /* 50 */ -374, -323, 584, 778, 395, 659, -212, 764, 28, 408, + /* 60 */ 681, -425, -352, 72, 270, -324, -313, -339, -215, 23, + /* 70 */ 64, 267, 285, 331, 613, 615, 626, 649, 695, 700, + /* 80 */ 728, 298, 660, 748, 22, 790, -326, 833, 842, -345, + /* 90 */ 854, 857, -260, 869, 287, -190, 354, 710, 7, -189, + /* 100 */ -407, -407, -305, -233, -125, -66, 151, 193, 194, 221, + /* 110 */ 294, 340, 357, 407, 413, 484, 504, 506, 518, 519, + /* 120 */ 596, 651, 656, -56, -257, 283, -301, -185, -38, -257, + /* 130 */ 11, 412, 111, 401, 533, 18, -172, 234, 446, 411, + /* 140 */ 78, 586, 595, 425, -291, 468, 520, 628, 680, 727, + /* 150 */ 320, 328, 363, 493, 652, 684, 715, 321, 673, 765, + /* 160 */ 731, 698, 670, 825, 756, 840, 840, 868, 860, 908, + /* 170 */ 874, 865, 814, 814, 798, 814, 827, 871, 840, 914, + /* 180 */ 921, 935, 951, 950, 970, 975, 1020, 1021, 984, 996, + /* 190 */ 999, 1033, 1044, 1045, 1046, 1057, 1058, 997, 1052, 1022, + /* 200 */ 1053, 1061, 1010, 1060, 1068, 1065, 1067, 1069, 1072, 1070, + /* 210 */ 1075, 1076, 1087, 1063, 1074, 1079, 1080, 1081, 1085, 1086, + /* 220 */ 1088, 1089, 1091, 1092, 1095, 1105, 1082, 1050, 1077, 1112, + /* 230 */ 1094, 1100, 1115, 1120, 1083, 1093, 1104, 1038, 1097, 1107, + /* 240 */ 1049, 1101, 1118, 1121, 840, 1096, 1073, 1098, 1102, 1099, + /* 250 */ 1103, 1111, 1055, 1106, 1109, 814, 1151, 1117, 1188, 1185, + /* 260 */ 1192, 1140, 1155, 1156, 1157, 1158, 1159, 1141, 1161, 1160, + /* 270 */ 1194, 1196, 1204, 1175, 1126, 1201, 1177, 1203, 1226, 1225, + /* 280 */ 1238, 1246, 1178, 1195, 1218, 1220, 1222, 1236, 1252, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 10 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 20 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 30 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 40 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 50 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 60 */ 1579, 1579, 1579, 1579, 1579, 1832, 1579, 1579, 1579, 1579, - /* 70 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1655, - /* 80 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 90 */ 1579, 1579, 1579, 1579, 1579, 1579, 1653, 1825, 2021, 1579, - /* 100 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 110 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 120 */ 1579, 1579, 2033, 1579, 1579, 1579, 1579, 1655, 1579, 2033, - /* 130 */ 2033, 2033, 1653, 1993, 1993, 1579, 1579, 1579, 1579, 1764, - /* 140 */ 1579, 1874, 1874, 1579, 1579, 1579, 1579, 1579, 1764, 1579, - /* 150 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1868, 1579, 1579, - /* 160 */ 2058, 2111, 1579, 1579, 2061, 1579, 1579, 1579, 1837, 1579, - /* 170 */ 1717, 2048, 2025, 2039, 2095, 2026, 2023, 2042, 1579, 2052, - /* 180 */ 1579, 1861, 1830, 1579, 1830, 1827, 1579, 1579, 1830, 1827, - /* 190 */ 1827, 1708, 1579, 1579, 1579, 1579, 1579, 1579, 1655, 1579, - /* 200 */ 1655, 1579, 1579, 1655, 1579, 1655, 1655, 1655, 1579, 1655, - /* 210 */ 1634, 1634, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 220 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1881, 1579, 1653, - /* 230 */ 1870, 1579, 1653, 1579, 1579, 1579, 1579, 2068, 2066, 1579, - /* 240 */ 2068, 2066, 1579, 1579, 1579, 2080, 2076, 2068, 2084, 2082, - /* 250 */ 2054, 2052, 2114, 2101, 2097, 2039, 1579, 1579, 1579, 1579, - /* 260 */ 1653, 2066, 1579, 1579, 1579, 1579, 1579, 2066, 1579, 1579, - /* 270 */ 1653, 1579, 1653, 1579, 1579, 1733, 1579, 1579, 1579, 1653, - /* 280 */ 1611, 1579, 1863, 1874, 1767, 1767, 1767, 1656, 1584, 1579, - /* 290 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 2079, - /* 300 */ 2078, 1579, 1949, 1579, 1997, 1996, 1995, 1986, 1948, 1579, - /* 310 */ 1729, 1579, 1579, 1947, 1946, 1579, 1579, 1579, 1579, 1579, - /* 320 */ 1940, 1579, 1579, 1941, 1939, 1938, 1579, 1579, 1579, 1579, - /* 330 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 340 */ 1579, 1579, 1579, 2098, 2102, 1579, 1579, 1579, 1579, 1579, - /* 350 */ 1579, 2022, 1579, 1579, 1579, 1579, 1579, 1923, 1579, 1579, - /* 360 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 370 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 380 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 390 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 400 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 410 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 420 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 430 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 440 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 450 */ 1579, 1579, 1579, 1579, 1616, 1579, 1579, 1579, 1579, 1579, - /* 460 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 470 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 480 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 490 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 500 */ 1579, 1579, 1695, 1694, 1579, 1579, 1579, 1579, 1579, 1579, - /* 510 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 520 */ 1579, 1579, 1579, 1931, 1579, 1579, 1579, 1579, 1579, 1579, - /* 530 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 2094, 2055, 1579, - /* 540 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 550 */ 1579, 1579, 1923, 1579, 2077, 1579, 1579, 2092, 1579, 2096, - /* 560 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 2032, 2028, 1579, - /* 570 */ 1579, 2024, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 580 */ 1579, 1579, 1579, 1878, 1579, 1579, 1579, 1579, 1579, 1579, - /* 590 */ 1579, 1579, 1922, 1579, 1983, 1579, 1579, 1579, 2017, 1579, - /* 600 */ 1579, 1968, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 610 */ 1579, 1931, 1579, 1934, 1579, 1579, 1579, 1579, 1579, 1761, - /* 620 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 630 */ 1579, 1579, 1746, 1744, 1743, 1742, 1579, 1739, 1579, 1579, - /* 640 */ 1579, 1579, 1770, 1769, 1579, 1579, 1579, 1579, 1579, 1579, - /* 650 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1675, - /* 660 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1666, - /* 670 */ 1579, 1665, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 680 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 690 */ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - /* 700 */ 1579, 1579, 1579, 1579, + /* 0 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 10 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 20 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 30 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 40 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 50 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 60 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1843, 1587, 1587, + /* 70 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 80 */ 1587, 1665, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 90 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1663, 1836, + /* 100 */ 2032, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 110 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 120 */ 1587, 1587, 1587, 1587, 2044, 1587, 1587, 1665, 1587, 2044, + /* 130 */ 2044, 2044, 1663, 2004, 2004, 1587, 1587, 1587, 1587, 1774, + /* 140 */ 1587, 1885, 1885, 1587, 1587, 1587, 1587, 1587, 1774, 1587, + /* 150 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1879, 1587, 1587, + /* 160 */ 2069, 2122, 1587, 1587, 2072, 1587, 1587, 1587, 1848, 1587, + /* 170 */ 1727, 2059, 2036, 2050, 2106, 2037, 2034, 2053, 1587, 2063, + /* 180 */ 1587, 1872, 1841, 1587, 1841, 1838, 1587, 1587, 1841, 1838, + /* 190 */ 1838, 1718, 1587, 1587, 1587, 1587, 1587, 1587, 1665, 1587, + /* 200 */ 1665, 1587, 1587, 1665, 1587, 1665, 1665, 1665, 1587, 1665, + /* 210 */ 1644, 1644, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 220 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1892, 1587, 1663, + /* 230 */ 1881, 1587, 1663, 1587, 1587, 1587, 1587, 2079, 2077, 1587, + /* 240 */ 2079, 2077, 1587, 1587, 1587, 2091, 2087, 2079, 2095, 2093, + /* 250 */ 2065, 2063, 2125, 2112, 2108, 2050, 1587, 1587, 1587, 1587, + /* 260 */ 1663, 2077, 1587, 1587, 1587, 1587, 1587, 2077, 1587, 1587, + /* 270 */ 1663, 1587, 1663, 1587, 1587, 1743, 1587, 1587, 1587, 1663, + /* 280 */ 1619, 1587, 1874, 1885, 1777, 1777, 1777, 1666, 1592, 1587, + /* 290 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 2090, + /* 300 */ 2089, 1587, 1960, 1587, 2008, 2007, 2006, 1997, 1959, 1587, + /* 310 */ 1739, 1587, 1587, 1958, 1957, 1587, 1587, 1587, 1587, 1587, + /* 320 */ 1951, 1587, 1587, 1952, 1950, 1949, 1587, 1587, 1587, 1587, + /* 330 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 340 */ 1587, 1587, 1587, 2109, 2113, 1587, 1587, 1587, 1587, 1587, + /* 350 */ 1587, 2033, 1587, 1587, 1587, 1587, 1587, 1934, 1587, 1587, + /* 360 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 370 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 380 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 390 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 400 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 410 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 420 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 430 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 440 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 450 */ 1587, 1587, 1587, 1587, 1587, 1587, 1624, 1939, 1587, 1587, + /* 460 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 470 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 480 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 490 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 500 */ 1587, 1587, 1587, 1587, 1587, 1705, 1704, 1587, 1587, 1587, + /* 510 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 520 */ 1587, 1587, 1587, 1587, 1587, 1587, 1942, 1587, 1587, 1587, + /* 530 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 540 */ 2105, 2066, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 550 */ 1587, 1587, 1587, 1587, 1587, 1934, 1587, 2088, 1587, 1587, + /* 560 */ 2103, 1587, 2107, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 570 */ 2043, 2039, 1587, 1587, 2035, 1587, 1587, 1587, 1587, 1587, + /* 580 */ 1587, 1587, 1587, 1587, 1587, 1587, 1889, 1587, 1587, 1587, + /* 590 */ 1587, 1587, 1587, 1587, 1587, 1933, 1587, 1994, 1587, 1587, + /* 600 */ 1587, 2028, 1587, 1587, 1979, 1587, 1587, 1587, 1587, 1587, + /* 610 */ 1587, 1587, 1587, 1587, 1942, 1587, 1945, 1587, 1587, 1587, + /* 620 */ 1587, 1587, 1771, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 630 */ 1587, 1587, 1587, 1587, 1587, 1756, 1754, 1753, 1752, 1587, + /* 640 */ 1749, 1587, 1587, 1587, 1587, 1780, 1779, 1587, 1587, 1587, + /* 650 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 660 */ 1587, 1587, 1685, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 670 */ 1587, 1587, 1676, 1587, 1675, 1587, 1587, 1587, 1587, 1587, + /* 680 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 690 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + /* 700 */ 1587, 1587, 1587, 1587, 1587, 1587, 1587, }; /********** End of lemon-generated parsing tables *****************************/ @@ -1005,6 +975,7 @@ static const YYCODETYPE yyFallback[] = { 0, /* TO => nothing */ 0, /* REVOKE => nothing */ 0, /* FROM => nothing */ + 0, /* SUBSCRIBE => nothing */ 0, /* NK_COMMA => nothing */ 0, /* READ => nothing */ 0, /* WRITE => nothing */ @@ -1096,6 +1067,7 @@ static const YYCODETYPE yyFallback[] = { 0, /* FIRST => nothing */ 0, /* LAST => nothing */ 0, /* SHOW => nothing */ + 0, /* PRIVILEGES => nothing */ 0, /* DATABASES => nothing */ 0, /* TABLES => nothing */ 0, /* STABLES => nothing */ @@ -1187,7 +1159,7 @@ static const YYCODETYPE yyFallback[] = { 0, /* COUNT => nothing */ 0, /* LAST_ROW => nothing */ 0, /* CASE => nothing */ - 266, /* END => ABORT */ + 268, /* END => ABORT */ 0, /* WHEN => nothing */ 0, /* THEN => nothing */ 0, /* ELSE => nothing */ @@ -1229,58 +1201,58 @@ static const YYCODETYPE yyFallback[] = { 0, /* ASC => nothing */ 0, /* NULLS => nothing */ 0, /* ABORT => nothing */ - 266, /* AFTER => ABORT */ - 266, /* ATTACH => ABORT */ - 266, /* BEFORE => ABORT */ - 266, /* BEGIN => ABORT */ - 266, /* BITAND => ABORT */ - 266, /* BITNOT => ABORT */ - 266, /* BITOR => ABORT */ - 266, /* BLOCKS => ABORT */ - 266, /* CHANGE => ABORT */ - 266, /* COMMA => ABORT */ - 266, /* COMPACT => ABORT */ - 266, /* CONCAT => ABORT */ - 266, /* CONFLICT => ABORT */ - 266, /* COPY => ABORT */ - 266, /* DEFERRED => ABORT */ - 266, /* DELIMITERS => ABORT */ - 266, /* DETACH => ABORT */ - 266, /* DIVIDE => ABORT */ - 266, /* DOT => ABORT */ - 266, /* EACH => ABORT */ - 266, /* FAIL => ABORT */ - 266, /* FILE => ABORT */ - 266, /* FOR => ABORT */ - 266, /* GLOB => ABORT */ - 266, /* ID => ABORT */ - 266, /* IMMEDIATE => ABORT */ - 266, /* IMPORT => ABORT */ - 266, /* INITIALLY => ABORT */ - 266, /* INSTEAD => ABORT */ - 266, /* ISNULL => ABORT */ - 266, /* KEY => ABORT */ - 266, /* MODULES => ABORT */ - 266, /* NK_BITNOT => ABORT */ - 266, /* NK_SEMI => ABORT */ - 266, /* NOTNULL => ABORT */ - 266, /* OF => ABORT */ - 266, /* PLUS => ABORT */ - 266, /* PRIVILEGE => ABORT */ - 266, /* RAISE => ABORT */ - 266, /* REPLACE => ABORT */ - 266, /* RESTRICT => ABORT */ - 266, /* ROW => ABORT */ - 266, /* SEMI => ABORT */ - 266, /* STAR => ABORT */ - 266, /* STATEMENT => ABORT */ - 266, /* STRING => ABORT */ - 266, /* TIMES => ABORT */ - 266, /* UPDATE => ABORT */ - 266, /* VALUES => ABORT */ - 266, /* VARIABLE => ABORT */ - 266, /* VIEW => ABORT */ - 266, /* WAL => ABORT */ + 268, /* AFTER => ABORT */ + 268, /* ATTACH => ABORT */ + 268, /* BEFORE => ABORT */ + 268, /* BEGIN => ABORT */ + 268, /* BITAND => ABORT */ + 268, /* BITNOT => ABORT */ + 268, /* BITOR => ABORT */ + 268, /* BLOCKS => ABORT */ + 268, /* CHANGE => ABORT */ + 268, /* COMMA => ABORT */ + 268, /* COMPACT => ABORT */ + 268, /* CONCAT => ABORT */ + 268, /* CONFLICT => ABORT */ + 268, /* COPY => ABORT */ + 268, /* DEFERRED => ABORT */ + 268, /* DELIMITERS => ABORT */ + 268, /* DETACH => ABORT */ + 268, /* DIVIDE => ABORT */ + 268, /* DOT => ABORT */ + 268, /* EACH => ABORT */ + 268, /* FAIL => ABORT */ + 268, /* FILE => ABORT */ + 268, /* FOR => ABORT */ + 268, /* GLOB => ABORT */ + 268, /* ID => ABORT */ + 268, /* IMMEDIATE => ABORT */ + 268, /* IMPORT => ABORT */ + 268, /* INITIALLY => ABORT */ + 268, /* INSTEAD => ABORT */ + 268, /* ISNULL => ABORT */ + 268, /* KEY => ABORT */ + 268, /* MODULES => ABORT */ + 268, /* NK_BITNOT => ABORT */ + 268, /* NK_SEMI => ABORT */ + 268, /* NOTNULL => ABORT */ + 268, /* OF => ABORT */ + 268, /* PLUS => ABORT */ + 268, /* PRIVILEGE => ABORT */ + 268, /* RAISE => ABORT */ + 268, /* REPLACE => ABORT */ + 268, /* RESTRICT => ABORT */ + 268, /* ROW => ABORT */ + 268, /* SEMI => ABORT */ + 268, /* STAR => ABORT */ + 268, /* STATEMENT => ABORT */ + 268, /* STRING => ABORT */ + 268, /* TIMES => ABORT */ + 268, /* UPDATE => ABORT */ + 268, /* VALUES => ABORT */ + 268, /* VARIABLE => ABORT */ + 268, /* VIEW => ABORT */ + 268, /* WAL => ABORT */ }; #endif /* YYFALLBACK */ @@ -1411,417 +1383,419 @@ static const char *const yyTokenName[] = { /* 40 */ "TO", /* 41 */ "REVOKE", /* 42 */ "FROM", - /* 43 */ "NK_COMMA", - /* 44 */ "READ", - /* 45 */ "WRITE", - /* 46 */ "NK_DOT", - /* 47 */ "DNODE", - /* 48 */ "PORT", - /* 49 */ "DNODES", - /* 50 */ "NK_IPTOKEN", - /* 51 */ "FORCE", - /* 52 */ "LOCAL", - /* 53 */ "QNODE", - /* 54 */ "BNODE", - /* 55 */ "SNODE", - /* 56 */ "MNODE", - /* 57 */ "DATABASE", - /* 58 */ "USE", - /* 59 */ "FLUSH", - /* 60 */ "TRIM", - /* 61 */ "IF", - /* 62 */ "NOT", - /* 63 */ "EXISTS", - /* 64 */ "BUFFER", - /* 65 */ "CACHEMODEL", - /* 66 */ "CACHESIZE", - /* 67 */ "COMP", - /* 68 */ "DURATION", - /* 69 */ "NK_VARIABLE", - /* 70 */ "MAXROWS", - /* 71 */ "MINROWS", - /* 72 */ "KEEP", - /* 73 */ "PAGES", - /* 74 */ "PAGESIZE", - /* 75 */ "TSDB_PAGESIZE", - /* 76 */ "PRECISION", - /* 77 */ "REPLICA", - /* 78 */ "STRICT", - /* 79 */ "VGROUPS", - /* 80 */ "SINGLE_STABLE", - /* 81 */ "RETENTIONS", - /* 82 */ "SCHEMALESS", - /* 83 */ "WAL_LEVEL", - /* 84 */ "WAL_FSYNC_PERIOD", - /* 85 */ "WAL_RETENTION_PERIOD", - /* 86 */ "WAL_RETENTION_SIZE", - /* 87 */ "WAL_ROLL_PERIOD", - /* 88 */ "WAL_SEGMENT_SIZE", - /* 89 */ "STT_TRIGGER", - /* 90 */ "TABLE_PREFIX", - /* 91 */ "TABLE_SUFFIX", - /* 92 */ "NK_COLON", - /* 93 */ "MAX_SPEED", - /* 94 */ "TABLE", - /* 95 */ "NK_LP", - /* 96 */ "NK_RP", - /* 97 */ "STABLE", - /* 98 */ "ADD", - /* 99 */ "COLUMN", - /* 100 */ "MODIFY", - /* 101 */ "RENAME", - /* 102 */ "TAG", - /* 103 */ "SET", - /* 104 */ "NK_EQ", - /* 105 */ "USING", - /* 106 */ "TAGS", - /* 107 */ "COMMENT", - /* 108 */ "BOOL", - /* 109 */ "TINYINT", - /* 110 */ "SMALLINT", - /* 111 */ "INT", - /* 112 */ "INTEGER", - /* 113 */ "BIGINT", - /* 114 */ "FLOAT", - /* 115 */ "DOUBLE", - /* 116 */ "BINARY", - /* 117 */ "TIMESTAMP", - /* 118 */ "NCHAR", - /* 119 */ "UNSIGNED", - /* 120 */ "JSON", - /* 121 */ "VARCHAR", - /* 122 */ "MEDIUMBLOB", - /* 123 */ "BLOB", - /* 124 */ "VARBINARY", - /* 125 */ "DECIMAL", - /* 126 */ "MAX_DELAY", - /* 127 */ "WATERMARK", - /* 128 */ "ROLLUP", - /* 129 */ "TTL", - /* 130 */ "SMA", - /* 131 */ "FIRST", - /* 132 */ "LAST", - /* 133 */ "SHOW", - /* 134 */ "DATABASES", - /* 135 */ "TABLES", - /* 136 */ "STABLES", - /* 137 */ "MNODES", - /* 138 */ "QNODES", - /* 139 */ "FUNCTIONS", - /* 140 */ "INDEXES", - /* 141 */ "ACCOUNTS", - /* 142 */ "APPS", - /* 143 */ "CONNECTIONS", - /* 144 */ "LICENCES", - /* 145 */ "GRANTS", - /* 146 */ "QUERIES", - /* 147 */ "SCORES", - /* 148 */ "TOPICS", - /* 149 */ "VARIABLES", - /* 150 */ "CLUSTER", - /* 151 */ "BNODES", - /* 152 */ "SNODES", - /* 153 */ "TRANSACTIONS", - /* 154 */ "DISTRIBUTED", - /* 155 */ "CONSUMERS", - /* 156 */ "SUBSCRIPTIONS", - /* 157 */ "VNODES", - /* 158 */ "LIKE", - /* 159 */ "TBNAME", - /* 160 */ "QTAGS", - /* 161 */ "AS", - /* 162 */ "INDEX", - /* 163 */ "FUNCTION", - /* 164 */ "INTERVAL", - /* 165 */ "TOPIC", - /* 166 */ "WITH", - /* 167 */ "META", - /* 168 */ "CONSUMER", - /* 169 */ "GROUP", - /* 170 */ "DESC", - /* 171 */ "DESCRIBE", - /* 172 */ "RESET", - /* 173 */ "QUERY", - /* 174 */ "CACHE", - /* 175 */ "EXPLAIN", - /* 176 */ "ANALYZE", - /* 177 */ "VERBOSE", - /* 178 */ "NK_BOOL", - /* 179 */ "RATIO", - /* 180 */ "NK_FLOAT", - /* 181 */ "OUTPUTTYPE", - /* 182 */ "AGGREGATE", - /* 183 */ "BUFSIZE", - /* 184 */ "STREAM", - /* 185 */ "INTO", - /* 186 */ "TRIGGER", - /* 187 */ "AT_ONCE", - /* 188 */ "WINDOW_CLOSE", - /* 189 */ "IGNORE", - /* 190 */ "EXPIRED", - /* 191 */ "FILL_HISTORY", - /* 192 */ "SUBTABLE", - /* 193 */ "KILL", - /* 194 */ "CONNECTION", - /* 195 */ "TRANSACTION", - /* 196 */ "BALANCE", - /* 197 */ "VGROUP", - /* 198 */ "MERGE", - /* 199 */ "REDISTRIBUTE", - /* 200 */ "SPLIT", - /* 201 */ "DELETE", - /* 202 */ "INSERT", - /* 203 */ "NULL", - /* 204 */ "NK_QUESTION", - /* 205 */ "NK_ARROW", - /* 206 */ "ROWTS", - /* 207 */ "QSTART", - /* 208 */ "QEND", - /* 209 */ "QDURATION", - /* 210 */ "WSTART", - /* 211 */ "WEND", - /* 212 */ "WDURATION", - /* 213 */ "IROWTS", - /* 214 */ "CAST", - /* 215 */ "NOW", - /* 216 */ "TODAY", - /* 217 */ "TIMEZONE", - /* 218 */ "CLIENT_VERSION", - /* 219 */ "SERVER_VERSION", - /* 220 */ "SERVER_STATUS", - /* 221 */ "CURRENT_USER", - /* 222 */ "COUNT", - /* 223 */ "LAST_ROW", - /* 224 */ "CASE", - /* 225 */ "END", - /* 226 */ "WHEN", - /* 227 */ "THEN", - /* 228 */ "ELSE", - /* 229 */ "BETWEEN", - /* 230 */ "IS", - /* 231 */ "NK_LT", - /* 232 */ "NK_GT", - /* 233 */ "NK_LE", - /* 234 */ "NK_GE", - /* 235 */ "NK_NE", - /* 236 */ "MATCH", - /* 237 */ "NMATCH", - /* 238 */ "CONTAINS", - /* 239 */ "IN", - /* 240 */ "JOIN", - /* 241 */ "INNER", - /* 242 */ "SELECT", - /* 243 */ "DISTINCT", - /* 244 */ "WHERE", - /* 245 */ "PARTITION", - /* 246 */ "BY", - /* 247 */ "SESSION", - /* 248 */ "STATE_WINDOW", - /* 249 */ "SLIDING", - /* 250 */ "FILL", - /* 251 */ "VALUE", - /* 252 */ "NONE", - /* 253 */ "PREV", - /* 254 */ "LINEAR", - /* 255 */ "NEXT", - /* 256 */ "HAVING", - /* 257 */ "RANGE", - /* 258 */ "EVERY", - /* 259 */ "ORDER", - /* 260 */ "SLIMIT", - /* 261 */ "SOFFSET", - /* 262 */ "LIMIT", - /* 263 */ "OFFSET", - /* 264 */ "ASC", - /* 265 */ "NULLS", - /* 266 */ "ABORT", - /* 267 */ "AFTER", - /* 268 */ "ATTACH", - /* 269 */ "BEFORE", - /* 270 */ "BEGIN", - /* 271 */ "BITAND", - /* 272 */ "BITNOT", - /* 273 */ "BITOR", - /* 274 */ "BLOCKS", - /* 275 */ "CHANGE", - /* 276 */ "COMMA", - /* 277 */ "COMPACT", - /* 278 */ "CONCAT", - /* 279 */ "CONFLICT", - /* 280 */ "COPY", - /* 281 */ "DEFERRED", - /* 282 */ "DELIMITERS", - /* 283 */ "DETACH", - /* 284 */ "DIVIDE", - /* 285 */ "DOT", - /* 286 */ "EACH", - /* 287 */ "FAIL", - /* 288 */ "FILE", - /* 289 */ "FOR", - /* 290 */ "GLOB", - /* 291 */ "ID", - /* 292 */ "IMMEDIATE", - /* 293 */ "IMPORT", - /* 294 */ "INITIALLY", - /* 295 */ "INSTEAD", - /* 296 */ "ISNULL", - /* 297 */ "KEY", - /* 298 */ "MODULES", - /* 299 */ "NK_BITNOT", - /* 300 */ "NK_SEMI", - /* 301 */ "NOTNULL", - /* 302 */ "OF", - /* 303 */ "PLUS", - /* 304 */ "PRIVILEGE", - /* 305 */ "RAISE", - /* 306 */ "REPLACE", - /* 307 */ "RESTRICT", - /* 308 */ "ROW", - /* 309 */ "SEMI", - /* 310 */ "STAR", - /* 311 */ "STATEMENT", - /* 312 */ "STRING", - /* 313 */ "TIMES", - /* 314 */ "UPDATE", - /* 315 */ "VALUES", - /* 316 */ "VARIABLE", - /* 317 */ "VIEW", - /* 318 */ "WAL", - /* 319 */ "cmd", - /* 320 */ "account_options", - /* 321 */ "alter_account_options", - /* 322 */ "literal", - /* 323 */ "alter_account_option", - /* 324 */ "user_name", - /* 325 */ "sysinfo_opt", - /* 326 */ "privileges", - /* 327 */ "priv_level", - /* 328 */ "priv_type_list", - /* 329 */ "priv_type", - /* 330 */ "db_name", - /* 331 */ "dnode_endpoint", - /* 332 */ "force_opt", - /* 333 */ "not_exists_opt", - /* 334 */ "db_options", - /* 335 */ "exists_opt", - /* 336 */ "alter_db_options", - /* 337 */ "speed_opt", - /* 338 */ "integer_list", - /* 339 */ "variable_list", - /* 340 */ "retention_list", - /* 341 */ "alter_db_option", - /* 342 */ "retention", - /* 343 */ "full_table_name", - /* 344 */ "column_def_list", - /* 345 */ "tags_def_opt", - /* 346 */ "table_options", - /* 347 */ "multi_create_clause", - /* 348 */ "tags_def", - /* 349 */ "multi_drop_clause", - /* 350 */ "alter_table_clause", - /* 351 */ "alter_table_options", - /* 352 */ "column_name", - /* 353 */ "type_name", - /* 354 */ "signed_literal", - /* 355 */ "create_subtable_clause", - /* 356 */ "specific_cols_opt", - /* 357 */ "expression_list", - /* 358 */ "drop_table_clause", - /* 359 */ "col_name_list", - /* 360 */ "table_name", - /* 361 */ "column_def", - /* 362 */ "duration_list", - /* 363 */ "rollup_func_list", - /* 364 */ "alter_table_option", - /* 365 */ "duration_literal", - /* 366 */ "rollup_func_name", - /* 367 */ "function_name", - /* 368 */ "col_name", - /* 369 */ "db_name_cond_opt", - /* 370 */ "like_pattern_opt", - /* 371 */ "table_name_cond", - /* 372 */ "from_db_opt", - /* 373 */ "tag_list_opt", - /* 374 */ "tag_item", - /* 375 */ "column_alias", - /* 376 */ "index_options", - /* 377 */ "func_list", - /* 378 */ "sliding_opt", - /* 379 */ "sma_stream_opt", - /* 380 */ "func", - /* 381 */ "stream_options", - /* 382 */ "topic_name", - /* 383 */ "query_or_subquery", - /* 384 */ "cgroup_name", - /* 385 */ "analyze_opt", - /* 386 */ "explain_options", - /* 387 */ "agg_func_opt", - /* 388 */ "bufsize_opt", - /* 389 */ "stream_name", - /* 390 */ "subtable_opt", - /* 391 */ "expression", - /* 392 */ "dnode_list", - /* 393 */ "where_clause_opt", - /* 394 */ "signed", - /* 395 */ "literal_func", - /* 396 */ "literal_list", - /* 397 */ "table_alias", - /* 398 */ "expr_or_subquery", - /* 399 */ "pseudo_column", - /* 400 */ "column_reference", - /* 401 */ "function_expression", - /* 402 */ "case_when_expression", - /* 403 */ "star_func", - /* 404 */ "star_func_para_list", - /* 405 */ "noarg_func", - /* 406 */ "other_para_list", - /* 407 */ "star_func_para", - /* 408 */ "when_then_list", - /* 409 */ "case_when_else_opt", - /* 410 */ "common_expression", - /* 411 */ "when_then_expr", - /* 412 */ "predicate", - /* 413 */ "compare_op", - /* 414 */ "in_op", - /* 415 */ "in_predicate_value", - /* 416 */ "boolean_value_expression", - /* 417 */ "boolean_primary", - /* 418 */ "from_clause_opt", - /* 419 */ "table_reference_list", - /* 420 */ "table_reference", - /* 421 */ "table_primary", - /* 422 */ "joined_table", - /* 423 */ "alias_opt", - /* 424 */ "subquery", - /* 425 */ "parenthesized_joined_table", - /* 426 */ "join_type", - /* 427 */ "search_condition", - /* 428 */ "query_specification", - /* 429 */ "set_quantifier_opt", - /* 430 */ "select_list", - /* 431 */ "partition_by_clause_opt", - /* 432 */ "range_opt", - /* 433 */ "every_opt", - /* 434 */ "fill_opt", - /* 435 */ "twindow_clause_opt", - /* 436 */ "group_by_clause_opt", - /* 437 */ "having_clause_opt", - /* 438 */ "select_item", - /* 439 */ "partition_list", - /* 440 */ "partition_item", - /* 441 */ "fill_mode", - /* 442 */ "group_by_list", - /* 443 */ "query_expression", - /* 444 */ "query_simple", - /* 445 */ "order_by_clause_opt", - /* 446 */ "slimit_clause_opt", - /* 447 */ "limit_clause_opt", - /* 448 */ "union_query_expression", - /* 449 */ "query_simple_or_subquery", - /* 450 */ "sort_specification_list", - /* 451 */ "sort_specification", - /* 452 */ "ordering_specification_opt", - /* 453 */ "null_ordering_opt", + /* 43 */ "SUBSCRIBE", + /* 44 */ "NK_COMMA", + /* 45 */ "READ", + /* 46 */ "WRITE", + /* 47 */ "NK_DOT", + /* 48 */ "DNODE", + /* 49 */ "PORT", + /* 50 */ "DNODES", + /* 51 */ "NK_IPTOKEN", + /* 52 */ "FORCE", + /* 53 */ "LOCAL", + /* 54 */ "QNODE", + /* 55 */ "BNODE", + /* 56 */ "SNODE", + /* 57 */ "MNODE", + /* 58 */ "DATABASE", + /* 59 */ "USE", + /* 60 */ "FLUSH", + /* 61 */ "TRIM", + /* 62 */ "IF", + /* 63 */ "NOT", + /* 64 */ "EXISTS", + /* 65 */ "BUFFER", + /* 66 */ "CACHEMODEL", + /* 67 */ "CACHESIZE", + /* 68 */ "COMP", + /* 69 */ "DURATION", + /* 70 */ "NK_VARIABLE", + /* 71 */ "MAXROWS", + /* 72 */ "MINROWS", + /* 73 */ "KEEP", + /* 74 */ "PAGES", + /* 75 */ "PAGESIZE", + /* 76 */ "TSDB_PAGESIZE", + /* 77 */ "PRECISION", + /* 78 */ "REPLICA", + /* 79 */ "STRICT", + /* 80 */ "VGROUPS", + /* 81 */ "SINGLE_STABLE", + /* 82 */ "RETENTIONS", + /* 83 */ "SCHEMALESS", + /* 84 */ "WAL_LEVEL", + /* 85 */ "WAL_FSYNC_PERIOD", + /* 86 */ "WAL_RETENTION_PERIOD", + /* 87 */ "WAL_RETENTION_SIZE", + /* 88 */ "WAL_ROLL_PERIOD", + /* 89 */ "WAL_SEGMENT_SIZE", + /* 90 */ "STT_TRIGGER", + /* 91 */ "TABLE_PREFIX", + /* 92 */ "TABLE_SUFFIX", + /* 93 */ "NK_COLON", + /* 94 */ "MAX_SPEED", + /* 95 */ "TABLE", + /* 96 */ "NK_LP", + /* 97 */ "NK_RP", + /* 98 */ "STABLE", + /* 99 */ "ADD", + /* 100 */ "COLUMN", + /* 101 */ "MODIFY", + /* 102 */ "RENAME", + /* 103 */ "TAG", + /* 104 */ "SET", + /* 105 */ "NK_EQ", + /* 106 */ "USING", + /* 107 */ "TAGS", + /* 108 */ "COMMENT", + /* 109 */ "BOOL", + /* 110 */ "TINYINT", + /* 111 */ "SMALLINT", + /* 112 */ "INT", + /* 113 */ "INTEGER", + /* 114 */ "BIGINT", + /* 115 */ "FLOAT", + /* 116 */ "DOUBLE", + /* 117 */ "BINARY", + /* 118 */ "TIMESTAMP", + /* 119 */ "NCHAR", + /* 120 */ "UNSIGNED", + /* 121 */ "JSON", + /* 122 */ "VARCHAR", + /* 123 */ "MEDIUMBLOB", + /* 124 */ "BLOB", + /* 125 */ "VARBINARY", + /* 126 */ "DECIMAL", + /* 127 */ "MAX_DELAY", + /* 128 */ "WATERMARK", + /* 129 */ "ROLLUP", + /* 130 */ "TTL", + /* 131 */ "SMA", + /* 132 */ "FIRST", + /* 133 */ "LAST", + /* 134 */ "SHOW", + /* 135 */ "PRIVILEGES", + /* 136 */ "DATABASES", + /* 137 */ "TABLES", + /* 138 */ "STABLES", + /* 139 */ "MNODES", + /* 140 */ "QNODES", + /* 141 */ "FUNCTIONS", + /* 142 */ "INDEXES", + /* 143 */ "ACCOUNTS", + /* 144 */ "APPS", + /* 145 */ "CONNECTIONS", + /* 146 */ "LICENCES", + /* 147 */ "GRANTS", + /* 148 */ "QUERIES", + /* 149 */ "SCORES", + /* 150 */ "TOPICS", + /* 151 */ "VARIABLES", + /* 152 */ "CLUSTER", + /* 153 */ "BNODES", + /* 154 */ "SNODES", + /* 155 */ "TRANSACTIONS", + /* 156 */ "DISTRIBUTED", + /* 157 */ "CONSUMERS", + /* 158 */ "SUBSCRIPTIONS", + /* 159 */ "VNODES", + /* 160 */ "LIKE", + /* 161 */ "TBNAME", + /* 162 */ "QTAGS", + /* 163 */ "AS", + /* 164 */ "INDEX", + /* 165 */ "FUNCTION", + /* 166 */ "INTERVAL", + /* 167 */ "TOPIC", + /* 168 */ "WITH", + /* 169 */ "META", + /* 170 */ "CONSUMER", + /* 171 */ "GROUP", + /* 172 */ "DESC", + /* 173 */ "DESCRIBE", + /* 174 */ "RESET", + /* 175 */ "QUERY", + /* 176 */ "CACHE", + /* 177 */ "EXPLAIN", + /* 178 */ "ANALYZE", + /* 179 */ "VERBOSE", + /* 180 */ "NK_BOOL", + /* 181 */ "RATIO", + /* 182 */ "NK_FLOAT", + /* 183 */ "OUTPUTTYPE", + /* 184 */ "AGGREGATE", + /* 185 */ "BUFSIZE", + /* 186 */ "STREAM", + /* 187 */ "INTO", + /* 188 */ "TRIGGER", + /* 189 */ "AT_ONCE", + /* 190 */ "WINDOW_CLOSE", + /* 191 */ "IGNORE", + /* 192 */ "EXPIRED", + /* 193 */ "FILL_HISTORY", + /* 194 */ "SUBTABLE", + /* 195 */ "KILL", + /* 196 */ "CONNECTION", + /* 197 */ "TRANSACTION", + /* 198 */ "BALANCE", + /* 199 */ "VGROUP", + /* 200 */ "MERGE", + /* 201 */ "REDISTRIBUTE", + /* 202 */ "SPLIT", + /* 203 */ "DELETE", + /* 204 */ "INSERT", + /* 205 */ "NULL", + /* 206 */ "NK_QUESTION", + /* 207 */ "NK_ARROW", + /* 208 */ "ROWTS", + /* 209 */ "QSTART", + /* 210 */ "QEND", + /* 211 */ "QDURATION", + /* 212 */ "WSTART", + /* 213 */ "WEND", + /* 214 */ "WDURATION", + /* 215 */ "IROWTS", + /* 216 */ "CAST", + /* 217 */ "NOW", + /* 218 */ "TODAY", + /* 219 */ "TIMEZONE", + /* 220 */ "CLIENT_VERSION", + /* 221 */ "SERVER_VERSION", + /* 222 */ "SERVER_STATUS", + /* 223 */ "CURRENT_USER", + /* 224 */ "COUNT", + /* 225 */ "LAST_ROW", + /* 226 */ "CASE", + /* 227 */ "END", + /* 228 */ "WHEN", + /* 229 */ "THEN", + /* 230 */ "ELSE", + /* 231 */ "BETWEEN", + /* 232 */ "IS", + /* 233 */ "NK_LT", + /* 234 */ "NK_GT", + /* 235 */ "NK_LE", + /* 236 */ "NK_GE", + /* 237 */ "NK_NE", + /* 238 */ "MATCH", + /* 239 */ "NMATCH", + /* 240 */ "CONTAINS", + /* 241 */ "IN", + /* 242 */ "JOIN", + /* 243 */ "INNER", + /* 244 */ "SELECT", + /* 245 */ "DISTINCT", + /* 246 */ "WHERE", + /* 247 */ "PARTITION", + /* 248 */ "BY", + /* 249 */ "SESSION", + /* 250 */ "STATE_WINDOW", + /* 251 */ "SLIDING", + /* 252 */ "FILL", + /* 253 */ "VALUE", + /* 254 */ "NONE", + /* 255 */ "PREV", + /* 256 */ "LINEAR", + /* 257 */ "NEXT", + /* 258 */ "HAVING", + /* 259 */ "RANGE", + /* 260 */ "EVERY", + /* 261 */ "ORDER", + /* 262 */ "SLIMIT", + /* 263 */ "SOFFSET", + /* 264 */ "LIMIT", + /* 265 */ "OFFSET", + /* 266 */ "ASC", + /* 267 */ "NULLS", + /* 268 */ "ABORT", + /* 269 */ "AFTER", + /* 270 */ "ATTACH", + /* 271 */ "BEFORE", + /* 272 */ "BEGIN", + /* 273 */ "BITAND", + /* 274 */ "BITNOT", + /* 275 */ "BITOR", + /* 276 */ "BLOCKS", + /* 277 */ "CHANGE", + /* 278 */ "COMMA", + /* 279 */ "COMPACT", + /* 280 */ "CONCAT", + /* 281 */ "CONFLICT", + /* 282 */ "COPY", + /* 283 */ "DEFERRED", + /* 284 */ "DELIMITERS", + /* 285 */ "DETACH", + /* 286 */ "DIVIDE", + /* 287 */ "DOT", + /* 288 */ "EACH", + /* 289 */ "FAIL", + /* 290 */ "FILE", + /* 291 */ "FOR", + /* 292 */ "GLOB", + /* 293 */ "ID", + /* 294 */ "IMMEDIATE", + /* 295 */ "IMPORT", + /* 296 */ "INITIALLY", + /* 297 */ "INSTEAD", + /* 298 */ "ISNULL", + /* 299 */ "KEY", + /* 300 */ "MODULES", + /* 301 */ "NK_BITNOT", + /* 302 */ "NK_SEMI", + /* 303 */ "NOTNULL", + /* 304 */ "OF", + /* 305 */ "PLUS", + /* 306 */ "PRIVILEGE", + /* 307 */ "RAISE", + /* 308 */ "REPLACE", + /* 309 */ "RESTRICT", + /* 310 */ "ROW", + /* 311 */ "SEMI", + /* 312 */ "STAR", + /* 313 */ "STATEMENT", + /* 314 */ "STRING", + /* 315 */ "TIMES", + /* 316 */ "UPDATE", + /* 317 */ "VALUES", + /* 318 */ "VARIABLE", + /* 319 */ "VIEW", + /* 320 */ "WAL", + /* 321 */ "cmd", + /* 322 */ "account_options", + /* 323 */ "alter_account_options", + /* 324 */ "literal", + /* 325 */ "alter_account_option", + /* 326 */ "user_name", + /* 327 */ "sysinfo_opt", + /* 328 */ "privileges", + /* 329 */ "priv_level", + /* 330 */ "priv_type_list", + /* 331 */ "priv_type", + /* 332 */ "db_name", + /* 333 */ "topic_name", + /* 334 */ "dnode_endpoint", + /* 335 */ "force_opt", + /* 336 */ "not_exists_opt", + /* 337 */ "db_options", + /* 338 */ "exists_opt", + /* 339 */ "alter_db_options", + /* 340 */ "speed_opt", + /* 341 */ "integer_list", + /* 342 */ "variable_list", + /* 343 */ "retention_list", + /* 344 */ "alter_db_option", + /* 345 */ "retention", + /* 346 */ "full_table_name", + /* 347 */ "column_def_list", + /* 348 */ "tags_def_opt", + /* 349 */ "table_options", + /* 350 */ "multi_create_clause", + /* 351 */ "tags_def", + /* 352 */ "multi_drop_clause", + /* 353 */ "alter_table_clause", + /* 354 */ "alter_table_options", + /* 355 */ "column_name", + /* 356 */ "type_name", + /* 357 */ "signed_literal", + /* 358 */ "create_subtable_clause", + /* 359 */ "specific_cols_opt", + /* 360 */ "expression_list", + /* 361 */ "drop_table_clause", + /* 362 */ "col_name_list", + /* 363 */ "table_name", + /* 364 */ "column_def", + /* 365 */ "duration_list", + /* 366 */ "rollup_func_list", + /* 367 */ "alter_table_option", + /* 368 */ "duration_literal", + /* 369 */ "rollup_func_name", + /* 370 */ "function_name", + /* 371 */ "col_name", + /* 372 */ "db_name_cond_opt", + /* 373 */ "like_pattern_opt", + /* 374 */ "table_name_cond", + /* 375 */ "from_db_opt", + /* 376 */ "tag_list_opt", + /* 377 */ "tag_item", + /* 378 */ "column_alias", + /* 379 */ "index_options", + /* 380 */ "func_list", + /* 381 */ "sliding_opt", + /* 382 */ "sma_stream_opt", + /* 383 */ "func", + /* 384 */ "stream_options", + /* 385 */ "query_or_subquery", + /* 386 */ "cgroup_name", + /* 387 */ "analyze_opt", + /* 388 */ "explain_options", + /* 389 */ "agg_func_opt", + /* 390 */ "bufsize_opt", + /* 391 */ "stream_name", + /* 392 */ "subtable_opt", + /* 393 */ "expression", + /* 394 */ "dnode_list", + /* 395 */ "where_clause_opt", + /* 396 */ "signed", + /* 397 */ "literal_func", + /* 398 */ "literal_list", + /* 399 */ "table_alias", + /* 400 */ "expr_or_subquery", + /* 401 */ "pseudo_column", + /* 402 */ "column_reference", + /* 403 */ "function_expression", + /* 404 */ "case_when_expression", + /* 405 */ "star_func", + /* 406 */ "star_func_para_list", + /* 407 */ "noarg_func", + /* 408 */ "other_para_list", + /* 409 */ "star_func_para", + /* 410 */ "when_then_list", + /* 411 */ "case_when_else_opt", + /* 412 */ "common_expression", + /* 413 */ "when_then_expr", + /* 414 */ "predicate", + /* 415 */ "compare_op", + /* 416 */ "in_op", + /* 417 */ "in_predicate_value", + /* 418 */ "boolean_value_expression", + /* 419 */ "boolean_primary", + /* 420 */ "from_clause_opt", + /* 421 */ "table_reference_list", + /* 422 */ "table_reference", + /* 423 */ "table_primary", + /* 424 */ "joined_table", + /* 425 */ "alias_opt", + /* 426 */ "subquery", + /* 427 */ "parenthesized_joined_table", + /* 428 */ "join_type", + /* 429 */ "search_condition", + /* 430 */ "query_specification", + /* 431 */ "set_quantifier_opt", + /* 432 */ "select_list", + /* 433 */ "partition_by_clause_opt", + /* 434 */ "range_opt", + /* 435 */ "every_opt", + /* 436 */ "fill_opt", + /* 437 */ "twindow_clause_opt", + /* 438 */ "group_by_clause_opt", + /* 439 */ "having_clause_opt", + /* 440 */ "select_item", + /* 441 */ "partition_list", + /* 442 */ "partition_item", + /* 443 */ "fill_mode", + /* 444 */ "group_by_list", + /* 445 */ "query_expression", + /* 446 */ "query_simple", + /* 447 */ "order_by_clause_opt", + /* 448 */ "slimit_clause_opt", + /* 449 */ "limit_clause_opt", + /* 450 */ "union_query_expression", + /* 451 */ "query_simple_or_subquery", + /* 452 */ "sort_specification_list", + /* 453 */ "sort_specification", + /* 454 */ "ordering_specification_opt", + /* 455 */ "null_ordering_opt", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -1864,506 +1838,509 @@ static const char *const yyRuleName[] = { /* 32 */ "cmd ::= REVOKE privileges ON priv_level FROM user_name", /* 33 */ "privileges ::= ALL", /* 34 */ "privileges ::= priv_type_list", - /* 35 */ "priv_type_list ::= priv_type", - /* 36 */ "priv_type_list ::= priv_type_list NK_COMMA priv_type", - /* 37 */ "priv_type ::= READ", - /* 38 */ "priv_type ::= WRITE", - /* 39 */ "priv_level ::= NK_STAR NK_DOT NK_STAR", - /* 40 */ "priv_level ::= db_name NK_DOT NK_STAR", - /* 41 */ "cmd ::= CREATE DNODE dnode_endpoint", - /* 42 */ "cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER", - /* 43 */ "cmd ::= DROP DNODE NK_INTEGER force_opt", - /* 44 */ "cmd ::= DROP DNODE dnode_endpoint force_opt", - /* 45 */ "cmd ::= ALTER DNODE NK_INTEGER NK_STRING", - /* 46 */ "cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING", - /* 47 */ "cmd ::= ALTER ALL DNODES NK_STRING", - /* 48 */ "cmd ::= ALTER ALL DNODES NK_STRING NK_STRING", - /* 49 */ "dnode_endpoint ::= NK_STRING", - /* 50 */ "dnode_endpoint ::= NK_ID", - /* 51 */ "dnode_endpoint ::= NK_IPTOKEN", - /* 52 */ "force_opt ::=", - /* 53 */ "force_opt ::= FORCE", - /* 54 */ "cmd ::= ALTER LOCAL NK_STRING", - /* 55 */ "cmd ::= ALTER LOCAL NK_STRING NK_STRING", - /* 56 */ "cmd ::= CREATE QNODE ON DNODE NK_INTEGER", - /* 57 */ "cmd ::= DROP QNODE ON DNODE NK_INTEGER", - /* 58 */ "cmd ::= CREATE BNODE ON DNODE NK_INTEGER", - /* 59 */ "cmd ::= DROP BNODE ON DNODE NK_INTEGER", - /* 60 */ "cmd ::= CREATE SNODE ON DNODE NK_INTEGER", - /* 61 */ "cmd ::= DROP SNODE ON DNODE NK_INTEGER", - /* 62 */ "cmd ::= CREATE MNODE ON DNODE NK_INTEGER", - /* 63 */ "cmd ::= DROP MNODE ON DNODE NK_INTEGER", - /* 64 */ "cmd ::= CREATE DATABASE not_exists_opt db_name db_options", - /* 65 */ "cmd ::= DROP DATABASE exists_opt db_name", - /* 66 */ "cmd ::= USE db_name", - /* 67 */ "cmd ::= ALTER DATABASE db_name alter_db_options", - /* 68 */ "cmd ::= FLUSH DATABASE db_name", - /* 69 */ "cmd ::= TRIM DATABASE db_name speed_opt", - /* 70 */ "not_exists_opt ::= IF NOT EXISTS", - /* 71 */ "not_exists_opt ::=", - /* 72 */ "exists_opt ::= IF EXISTS", - /* 73 */ "exists_opt ::=", - /* 74 */ "db_options ::=", - /* 75 */ "db_options ::= db_options BUFFER NK_INTEGER", - /* 76 */ "db_options ::= db_options CACHEMODEL NK_STRING", - /* 77 */ "db_options ::= db_options CACHESIZE NK_INTEGER", - /* 78 */ "db_options ::= db_options COMP NK_INTEGER", - /* 79 */ "db_options ::= db_options DURATION NK_INTEGER", - /* 80 */ "db_options ::= db_options DURATION NK_VARIABLE", - /* 81 */ "db_options ::= db_options MAXROWS NK_INTEGER", - /* 82 */ "db_options ::= db_options MINROWS NK_INTEGER", - /* 83 */ "db_options ::= db_options KEEP integer_list", - /* 84 */ "db_options ::= db_options KEEP variable_list", - /* 85 */ "db_options ::= db_options PAGES NK_INTEGER", - /* 86 */ "db_options ::= db_options PAGESIZE NK_INTEGER", - /* 87 */ "db_options ::= db_options TSDB_PAGESIZE NK_INTEGER", - /* 88 */ "db_options ::= db_options PRECISION NK_STRING", - /* 89 */ "db_options ::= db_options REPLICA NK_INTEGER", - /* 90 */ "db_options ::= db_options STRICT NK_STRING", - /* 91 */ "db_options ::= db_options VGROUPS NK_INTEGER", - /* 92 */ "db_options ::= db_options SINGLE_STABLE NK_INTEGER", - /* 93 */ "db_options ::= db_options RETENTIONS retention_list", - /* 94 */ "db_options ::= db_options SCHEMALESS NK_INTEGER", - /* 95 */ "db_options ::= db_options WAL_LEVEL NK_INTEGER", - /* 96 */ "db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER", - /* 97 */ "db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER", - /* 98 */ "db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER", - /* 99 */ "db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER", - /* 100 */ "db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER", - /* 101 */ "db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER", - /* 102 */ "db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER", - /* 103 */ "db_options ::= db_options STT_TRIGGER NK_INTEGER", - /* 104 */ "db_options ::= db_options TABLE_PREFIX NK_INTEGER", - /* 105 */ "db_options ::= db_options TABLE_SUFFIX NK_INTEGER", - /* 106 */ "alter_db_options ::= alter_db_option", - /* 107 */ "alter_db_options ::= alter_db_options alter_db_option", - /* 108 */ "alter_db_option ::= BUFFER NK_INTEGER", - /* 109 */ "alter_db_option ::= CACHEMODEL NK_STRING", - /* 110 */ "alter_db_option ::= CACHESIZE NK_INTEGER", - /* 111 */ "alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER", - /* 112 */ "alter_db_option ::= KEEP integer_list", - /* 113 */ "alter_db_option ::= KEEP variable_list", - /* 114 */ "alter_db_option ::= PAGES NK_INTEGER", - /* 115 */ "alter_db_option ::= REPLICA NK_INTEGER", - /* 116 */ "alter_db_option ::= STRICT NK_STRING", - /* 117 */ "alter_db_option ::= WAL_LEVEL NK_INTEGER", - /* 118 */ "alter_db_option ::= STT_TRIGGER NK_INTEGER", - /* 119 */ "integer_list ::= NK_INTEGER", - /* 120 */ "integer_list ::= integer_list NK_COMMA NK_INTEGER", - /* 121 */ "variable_list ::= NK_VARIABLE", - /* 122 */ "variable_list ::= variable_list NK_COMMA NK_VARIABLE", - /* 123 */ "retention_list ::= retention", - /* 124 */ "retention_list ::= retention_list NK_COMMA retention", - /* 125 */ "retention ::= NK_VARIABLE NK_COLON NK_VARIABLE", - /* 126 */ "speed_opt ::=", - /* 127 */ "speed_opt ::= MAX_SPEED NK_INTEGER", - /* 128 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", - /* 129 */ "cmd ::= CREATE TABLE multi_create_clause", - /* 130 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", - /* 131 */ "cmd ::= DROP TABLE multi_drop_clause", - /* 132 */ "cmd ::= DROP STABLE exists_opt full_table_name", - /* 133 */ "cmd ::= ALTER TABLE alter_table_clause", - /* 134 */ "cmd ::= ALTER STABLE alter_table_clause", - /* 135 */ "alter_table_clause ::= full_table_name alter_table_options", - /* 136 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name", - /* 137 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name", - /* 138 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name", - /* 139 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name", - /* 140 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name", - /* 141 */ "alter_table_clause ::= full_table_name DROP TAG column_name", - /* 142 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name", - /* 143 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name", - /* 144 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal", - /* 145 */ "multi_create_clause ::= create_subtable_clause", - /* 146 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", - /* 147 */ "create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options", - /* 148 */ "multi_drop_clause ::= drop_table_clause", - /* 149 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause", - /* 150 */ "drop_table_clause ::= exists_opt full_table_name", - /* 151 */ "specific_cols_opt ::=", - /* 152 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP", - /* 153 */ "full_table_name ::= table_name", - /* 154 */ "full_table_name ::= db_name NK_DOT table_name", - /* 155 */ "column_def_list ::= column_def", - /* 156 */ "column_def_list ::= column_def_list NK_COMMA column_def", - /* 157 */ "column_def ::= column_name type_name", - /* 158 */ "column_def ::= column_name type_name COMMENT NK_STRING", - /* 159 */ "type_name ::= BOOL", - /* 160 */ "type_name ::= TINYINT", - /* 161 */ "type_name ::= SMALLINT", - /* 162 */ "type_name ::= INT", - /* 163 */ "type_name ::= INTEGER", - /* 164 */ "type_name ::= BIGINT", - /* 165 */ "type_name ::= FLOAT", - /* 166 */ "type_name ::= DOUBLE", - /* 167 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", - /* 168 */ "type_name ::= TIMESTAMP", - /* 169 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", - /* 170 */ "type_name ::= TINYINT UNSIGNED", - /* 171 */ "type_name ::= SMALLINT UNSIGNED", - /* 172 */ "type_name ::= INT UNSIGNED", - /* 173 */ "type_name ::= BIGINT UNSIGNED", - /* 174 */ "type_name ::= JSON", - /* 175 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", - /* 176 */ "type_name ::= MEDIUMBLOB", - /* 177 */ "type_name ::= BLOB", - /* 178 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", - /* 179 */ "type_name ::= DECIMAL", - /* 180 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", - /* 181 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", - /* 182 */ "tags_def_opt ::=", - /* 183 */ "tags_def_opt ::= tags_def", - /* 184 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", - /* 185 */ "table_options ::=", - /* 186 */ "table_options ::= table_options COMMENT NK_STRING", - /* 187 */ "table_options ::= table_options MAX_DELAY duration_list", - /* 188 */ "table_options ::= table_options WATERMARK duration_list", - /* 189 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP", - /* 190 */ "table_options ::= table_options TTL NK_INTEGER", - /* 191 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", - /* 192 */ "alter_table_options ::= alter_table_option", - /* 193 */ "alter_table_options ::= alter_table_options alter_table_option", - /* 194 */ "alter_table_option ::= COMMENT NK_STRING", - /* 195 */ "alter_table_option ::= TTL NK_INTEGER", - /* 196 */ "duration_list ::= duration_literal", - /* 197 */ "duration_list ::= duration_list NK_COMMA duration_literal", - /* 198 */ "rollup_func_list ::= rollup_func_name", - /* 199 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name", - /* 200 */ "rollup_func_name ::= function_name", - /* 201 */ "rollup_func_name ::= FIRST", - /* 202 */ "rollup_func_name ::= LAST", - /* 203 */ "col_name_list ::= col_name", - /* 204 */ "col_name_list ::= col_name_list NK_COMMA col_name", - /* 205 */ "col_name ::= column_name", - /* 206 */ "cmd ::= SHOW DNODES", - /* 207 */ "cmd ::= SHOW USERS", - /* 208 */ "cmd ::= SHOW DATABASES", - /* 209 */ "cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt", - /* 210 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt", - /* 211 */ "cmd ::= SHOW db_name_cond_opt VGROUPS", - /* 212 */ "cmd ::= SHOW MNODES", - /* 213 */ "cmd ::= SHOW QNODES", - /* 214 */ "cmd ::= SHOW FUNCTIONS", - /* 215 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt", - /* 216 */ "cmd ::= SHOW STREAMS", - /* 217 */ "cmd ::= SHOW ACCOUNTS", - /* 218 */ "cmd ::= SHOW APPS", - /* 219 */ "cmd ::= SHOW CONNECTIONS", - /* 220 */ "cmd ::= SHOW LICENCES", - /* 221 */ "cmd ::= SHOW GRANTS", - /* 222 */ "cmd ::= SHOW CREATE DATABASE db_name", - /* 223 */ "cmd ::= SHOW CREATE TABLE full_table_name", - /* 224 */ "cmd ::= SHOW CREATE STABLE full_table_name", - /* 225 */ "cmd ::= SHOW QUERIES", - /* 226 */ "cmd ::= SHOW SCORES", - /* 227 */ "cmd ::= SHOW TOPICS", - /* 228 */ "cmd ::= SHOW VARIABLES", - /* 229 */ "cmd ::= SHOW CLUSTER VARIABLES", - /* 230 */ "cmd ::= SHOW LOCAL VARIABLES", - /* 231 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt", - /* 232 */ "cmd ::= SHOW BNODES", - /* 233 */ "cmd ::= SHOW SNODES", - /* 234 */ "cmd ::= SHOW CLUSTER", - /* 235 */ "cmd ::= SHOW TRANSACTIONS", - /* 236 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name", - /* 237 */ "cmd ::= SHOW CONSUMERS", - /* 238 */ "cmd ::= SHOW SUBSCRIPTIONS", - /* 239 */ "cmd ::= SHOW TAGS FROM table_name_cond from_db_opt", - /* 240 */ "cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt", - /* 241 */ "cmd ::= SHOW VNODES NK_INTEGER", - /* 242 */ "cmd ::= SHOW VNODES NK_STRING", - /* 243 */ "db_name_cond_opt ::=", - /* 244 */ "db_name_cond_opt ::= db_name NK_DOT", - /* 245 */ "like_pattern_opt ::=", - /* 246 */ "like_pattern_opt ::= LIKE NK_STRING", - /* 247 */ "table_name_cond ::= table_name", - /* 248 */ "from_db_opt ::=", - /* 249 */ "from_db_opt ::= FROM db_name", - /* 250 */ "tag_list_opt ::=", - /* 251 */ "tag_list_opt ::= tag_item", - /* 252 */ "tag_list_opt ::= tag_list_opt NK_COMMA tag_item", - /* 253 */ "tag_item ::= TBNAME", - /* 254 */ "tag_item ::= QTAGS", - /* 255 */ "tag_item ::= column_name", - /* 256 */ "tag_item ::= column_name column_alias", - /* 257 */ "tag_item ::= column_name AS column_alias", - /* 258 */ "cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options", - /* 259 */ "cmd ::= DROP INDEX exists_opt full_table_name", - /* 260 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", - /* 261 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt", - /* 262 */ "func_list ::= func", - /* 263 */ "func_list ::= func_list NK_COMMA func", - /* 264 */ "func ::= function_name NK_LP expression_list NK_RP", - /* 265 */ "sma_stream_opt ::=", - /* 266 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal", - /* 267 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal", - /* 268 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery", - /* 269 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name", - /* 270 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name", - /* 271 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name", - /* 272 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name", - /* 273 */ "cmd ::= DROP TOPIC exists_opt topic_name", - /* 274 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", - /* 275 */ "cmd ::= DESC full_table_name", - /* 276 */ "cmd ::= DESCRIBE full_table_name", - /* 277 */ "cmd ::= RESET QUERY CACHE", - /* 278 */ "cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery", - /* 279 */ "analyze_opt ::=", - /* 280 */ "analyze_opt ::= ANALYZE", - /* 281 */ "explain_options ::=", - /* 282 */ "explain_options ::= explain_options VERBOSE NK_BOOL", - /* 283 */ "explain_options ::= explain_options RATIO NK_FLOAT", - /* 284 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt", - /* 285 */ "cmd ::= DROP FUNCTION exists_opt function_name", - /* 286 */ "agg_func_opt ::=", - /* 287 */ "agg_func_opt ::= AGGREGATE", - /* 288 */ "bufsize_opt ::=", - /* 289 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", - /* 290 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery", - /* 291 */ "cmd ::= DROP STREAM exists_opt stream_name", - /* 292 */ "stream_options ::=", - /* 293 */ "stream_options ::= stream_options TRIGGER AT_ONCE", - /* 294 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", - /* 295 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", - /* 296 */ "stream_options ::= stream_options WATERMARK duration_literal", - /* 297 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER", - /* 298 */ "stream_options ::= stream_options FILL_HISTORY NK_INTEGER", - /* 299 */ "subtable_opt ::=", - /* 300 */ "subtable_opt ::= SUBTABLE NK_LP expression NK_RP", - /* 301 */ "cmd ::= KILL CONNECTION NK_INTEGER", - /* 302 */ "cmd ::= KILL QUERY NK_STRING", - /* 303 */ "cmd ::= KILL TRANSACTION NK_INTEGER", - /* 304 */ "cmd ::= BALANCE VGROUP", - /* 305 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", - /* 306 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", - /* 307 */ "cmd ::= SPLIT VGROUP NK_INTEGER", - /* 308 */ "dnode_list ::= DNODE NK_INTEGER", - /* 309 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", - /* 310 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", - /* 311 */ "cmd ::= query_or_subquery", - /* 312 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery", - /* 313 */ "cmd ::= INSERT INTO full_table_name query_or_subquery", - /* 314 */ "literal ::= NK_INTEGER", - /* 315 */ "literal ::= NK_FLOAT", - /* 316 */ "literal ::= NK_STRING", - /* 317 */ "literal ::= NK_BOOL", - /* 318 */ "literal ::= TIMESTAMP NK_STRING", - /* 319 */ "literal ::= duration_literal", - /* 320 */ "literal ::= NULL", - /* 321 */ "literal ::= NK_QUESTION", - /* 322 */ "duration_literal ::= NK_VARIABLE", - /* 323 */ "signed ::= NK_INTEGER", - /* 324 */ "signed ::= NK_PLUS NK_INTEGER", - /* 325 */ "signed ::= NK_MINUS NK_INTEGER", - /* 326 */ "signed ::= NK_FLOAT", - /* 327 */ "signed ::= NK_PLUS NK_FLOAT", - /* 328 */ "signed ::= NK_MINUS NK_FLOAT", - /* 329 */ "signed_literal ::= signed", - /* 330 */ "signed_literal ::= NK_STRING", - /* 331 */ "signed_literal ::= NK_BOOL", - /* 332 */ "signed_literal ::= TIMESTAMP NK_STRING", - /* 333 */ "signed_literal ::= duration_literal", - /* 334 */ "signed_literal ::= NULL", - /* 335 */ "signed_literal ::= literal_func", - /* 336 */ "signed_literal ::= NK_QUESTION", - /* 337 */ "literal_list ::= signed_literal", - /* 338 */ "literal_list ::= literal_list NK_COMMA signed_literal", - /* 339 */ "db_name ::= NK_ID", - /* 340 */ "table_name ::= NK_ID", - /* 341 */ "column_name ::= NK_ID", - /* 342 */ "function_name ::= NK_ID", - /* 343 */ "table_alias ::= NK_ID", - /* 344 */ "column_alias ::= NK_ID", - /* 345 */ "user_name ::= NK_ID", - /* 346 */ "topic_name ::= NK_ID", - /* 347 */ "stream_name ::= NK_ID", - /* 348 */ "cgroup_name ::= NK_ID", - /* 349 */ "expr_or_subquery ::= expression", - /* 350 */ "expression ::= literal", - /* 351 */ "expression ::= pseudo_column", - /* 352 */ "expression ::= column_reference", - /* 353 */ "expression ::= function_expression", - /* 354 */ "expression ::= case_when_expression", - /* 355 */ "expression ::= NK_LP expression NK_RP", - /* 356 */ "expression ::= NK_PLUS expr_or_subquery", - /* 357 */ "expression ::= NK_MINUS expr_or_subquery", - /* 358 */ "expression ::= expr_or_subquery NK_PLUS expr_or_subquery", - /* 359 */ "expression ::= expr_or_subquery NK_MINUS expr_or_subquery", - /* 360 */ "expression ::= expr_or_subquery NK_STAR expr_or_subquery", - /* 361 */ "expression ::= expr_or_subquery NK_SLASH expr_or_subquery", - /* 362 */ "expression ::= expr_or_subquery NK_REM expr_or_subquery", - /* 363 */ "expression ::= column_reference NK_ARROW NK_STRING", - /* 364 */ "expression ::= expr_or_subquery NK_BITAND expr_or_subquery", - /* 365 */ "expression ::= expr_or_subquery NK_BITOR expr_or_subquery", - /* 366 */ "expression_list ::= expr_or_subquery", - /* 367 */ "expression_list ::= expression_list NK_COMMA expr_or_subquery", - /* 368 */ "column_reference ::= column_name", - /* 369 */ "column_reference ::= table_name NK_DOT column_name", - /* 370 */ "pseudo_column ::= ROWTS", - /* 371 */ "pseudo_column ::= TBNAME", - /* 372 */ "pseudo_column ::= table_name NK_DOT TBNAME", - /* 373 */ "pseudo_column ::= QSTART", - /* 374 */ "pseudo_column ::= QEND", - /* 375 */ "pseudo_column ::= QDURATION", - /* 376 */ "pseudo_column ::= WSTART", - /* 377 */ "pseudo_column ::= WEND", - /* 378 */ "pseudo_column ::= WDURATION", - /* 379 */ "pseudo_column ::= IROWTS", - /* 380 */ "pseudo_column ::= QTAGS", - /* 381 */ "function_expression ::= function_name NK_LP expression_list NK_RP", - /* 382 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", - /* 383 */ "function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP", - /* 384 */ "function_expression ::= literal_func", - /* 385 */ "literal_func ::= noarg_func NK_LP NK_RP", - /* 386 */ "literal_func ::= NOW", - /* 387 */ "noarg_func ::= NOW", - /* 388 */ "noarg_func ::= TODAY", - /* 389 */ "noarg_func ::= TIMEZONE", - /* 390 */ "noarg_func ::= DATABASE", - /* 391 */ "noarg_func ::= CLIENT_VERSION", - /* 392 */ "noarg_func ::= SERVER_VERSION", - /* 393 */ "noarg_func ::= SERVER_STATUS", - /* 394 */ "noarg_func ::= CURRENT_USER", - /* 395 */ "noarg_func ::= USER", - /* 396 */ "star_func ::= COUNT", - /* 397 */ "star_func ::= FIRST", - /* 398 */ "star_func ::= LAST", - /* 399 */ "star_func ::= LAST_ROW", - /* 400 */ "star_func_para_list ::= NK_STAR", - /* 401 */ "star_func_para_list ::= other_para_list", - /* 402 */ "other_para_list ::= star_func_para", - /* 403 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", - /* 404 */ "star_func_para ::= expr_or_subquery", - /* 405 */ "star_func_para ::= table_name NK_DOT NK_STAR", - /* 406 */ "case_when_expression ::= CASE when_then_list case_when_else_opt END", - /* 407 */ "case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END", - /* 408 */ "when_then_list ::= when_then_expr", - /* 409 */ "when_then_list ::= when_then_list when_then_expr", - /* 410 */ "when_then_expr ::= WHEN common_expression THEN common_expression", - /* 411 */ "case_when_else_opt ::=", - /* 412 */ "case_when_else_opt ::= ELSE common_expression", - /* 413 */ "predicate ::= expr_or_subquery compare_op expr_or_subquery", - /* 414 */ "predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery", - /* 415 */ "predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery", - /* 416 */ "predicate ::= expr_or_subquery IS NULL", - /* 417 */ "predicate ::= expr_or_subquery IS NOT NULL", - /* 418 */ "predicate ::= expr_or_subquery in_op in_predicate_value", - /* 419 */ "compare_op ::= NK_LT", - /* 420 */ "compare_op ::= NK_GT", - /* 421 */ "compare_op ::= NK_LE", - /* 422 */ "compare_op ::= NK_GE", - /* 423 */ "compare_op ::= NK_NE", - /* 424 */ "compare_op ::= NK_EQ", - /* 425 */ "compare_op ::= LIKE", - /* 426 */ "compare_op ::= NOT LIKE", - /* 427 */ "compare_op ::= MATCH", - /* 428 */ "compare_op ::= NMATCH", - /* 429 */ "compare_op ::= CONTAINS", - /* 430 */ "in_op ::= IN", - /* 431 */ "in_op ::= NOT IN", - /* 432 */ "in_predicate_value ::= NK_LP literal_list NK_RP", - /* 433 */ "boolean_value_expression ::= boolean_primary", - /* 434 */ "boolean_value_expression ::= NOT boolean_primary", - /* 435 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", - /* 436 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", - /* 437 */ "boolean_primary ::= predicate", - /* 438 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", - /* 439 */ "common_expression ::= expr_or_subquery", - /* 440 */ "common_expression ::= boolean_value_expression", - /* 441 */ "from_clause_opt ::=", - /* 442 */ "from_clause_opt ::= FROM table_reference_list", - /* 443 */ "table_reference_list ::= table_reference", - /* 444 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", - /* 445 */ "table_reference ::= table_primary", - /* 446 */ "table_reference ::= joined_table", - /* 447 */ "table_primary ::= table_name alias_opt", - /* 448 */ "table_primary ::= db_name NK_DOT table_name alias_opt", - /* 449 */ "table_primary ::= subquery alias_opt", - /* 450 */ "table_primary ::= parenthesized_joined_table", - /* 451 */ "alias_opt ::=", - /* 452 */ "alias_opt ::= table_alias", - /* 453 */ "alias_opt ::= AS table_alias", - /* 454 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", - /* 455 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", - /* 456 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", - /* 457 */ "join_type ::=", - /* 458 */ "join_type ::= INNER", - /* 459 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt", - /* 460 */ "set_quantifier_opt ::=", - /* 461 */ "set_quantifier_opt ::= DISTINCT", - /* 462 */ "set_quantifier_opt ::= ALL", - /* 463 */ "select_list ::= select_item", - /* 464 */ "select_list ::= select_list NK_COMMA select_item", - /* 465 */ "select_item ::= NK_STAR", - /* 466 */ "select_item ::= common_expression", - /* 467 */ "select_item ::= common_expression column_alias", - /* 468 */ "select_item ::= common_expression AS column_alias", - /* 469 */ "select_item ::= table_name NK_DOT NK_STAR", - /* 470 */ "where_clause_opt ::=", - /* 471 */ "where_clause_opt ::= WHERE search_condition", - /* 472 */ "partition_by_clause_opt ::=", - /* 473 */ "partition_by_clause_opt ::= PARTITION BY partition_list", - /* 474 */ "partition_list ::= partition_item", - /* 475 */ "partition_list ::= partition_list NK_COMMA partition_item", - /* 476 */ "partition_item ::= expr_or_subquery", - /* 477 */ "partition_item ::= expr_or_subquery column_alias", - /* 478 */ "partition_item ::= expr_or_subquery AS column_alias", - /* 479 */ "twindow_clause_opt ::=", - /* 480 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", - /* 481 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP", - /* 482 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", - /* 483 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", - /* 484 */ "sliding_opt ::=", - /* 485 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", - /* 486 */ "fill_opt ::=", - /* 487 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", - /* 488 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", - /* 489 */ "fill_mode ::= NONE", - /* 490 */ "fill_mode ::= PREV", - /* 491 */ "fill_mode ::= NULL", - /* 492 */ "fill_mode ::= LINEAR", - /* 493 */ "fill_mode ::= NEXT", - /* 494 */ "group_by_clause_opt ::=", - /* 495 */ "group_by_clause_opt ::= GROUP BY group_by_list", - /* 496 */ "group_by_list ::= expr_or_subquery", - /* 497 */ "group_by_list ::= group_by_list NK_COMMA expr_or_subquery", - /* 498 */ "having_clause_opt ::=", - /* 499 */ "having_clause_opt ::= HAVING search_condition", - /* 500 */ "range_opt ::=", - /* 501 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP", - /* 502 */ "every_opt ::=", - /* 503 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", - /* 504 */ "query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt", - /* 505 */ "query_simple ::= query_specification", - /* 506 */ "query_simple ::= union_query_expression", - /* 507 */ "union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery", - /* 508 */ "union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery", - /* 509 */ "query_simple_or_subquery ::= query_simple", - /* 510 */ "query_simple_or_subquery ::= subquery", - /* 511 */ "query_or_subquery ::= query_expression", - /* 512 */ "query_or_subquery ::= subquery", - /* 513 */ "order_by_clause_opt ::=", - /* 514 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", - /* 515 */ "slimit_clause_opt ::=", - /* 516 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", - /* 517 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", - /* 518 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 519 */ "limit_clause_opt ::=", - /* 520 */ "limit_clause_opt ::= LIMIT NK_INTEGER", - /* 521 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", - /* 522 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 523 */ "subquery ::= NK_LP query_expression NK_RP", - /* 524 */ "subquery ::= NK_LP subquery NK_RP", - /* 525 */ "search_condition ::= common_expression", - /* 526 */ "sort_specification_list ::= sort_specification", - /* 527 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", - /* 528 */ "sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt", - /* 529 */ "ordering_specification_opt ::=", - /* 530 */ "ordering_specification_opt ::= ASC", - /* 531 */ "ordering_specification_opt ::= DESC", - /* 532 */ "null_ordering_opt ::=", - /* 533 */ "null_ordering_opt ::= NULLS FIRST", - /* 534 */ "null_ordering_opt ::= NULLS LAST", + /* 35 */ "privileges ::= SUBSCRIBE", + /* 36 */ "priv_type_list ::= priv_type", + /* 37 */ "priv_type_list ::= priv_type_list NK_COMMA priv_type", + /* 38 */ "priv_type ::= READ", + /* 39 */ "priv_type ::= WRITE", + /* 40 */ "priv_level ::= NK_STAR NK_DOT NK_STAR", + /* 41 */ "priv_level ::= db_name NK_DOT NK_STAR", + /* 42 */ "priv_level ::= topic_name", + /* 43 */ "cmd ::= CREATE DNODE dnode_endpoint", + /* 44 */ "cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER", + /* 45 */ "cmd ::= DROP DNODE NK_INTEGER force_opt", + /* 46 */ "cmd ::= DROP DNODE dnode_endpoint force_opt", + /* 47 */ "cmd ::= ALTER DNODE NK_INTEGER NK_STRING", + /* 48 */ "cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING", + /* 49 */ "cmd ::= ALTER ALL DNODES NK_STRING", + /* 50 */ "cmd ::= ALTER ALL DNODES NK_STRING NK_STRING", + /* 51 */ "dnode_endpoint ::= NK_STRING", + /* 52 */ "dnode_endpoint ::= NK_ID", + /* 53 */ "dnode_endpoint ::= NK_IPTOKEN", + /* 54 */ "force_opt ::=", + /* 55 */ "force_opt ::= FORCE", + /* 56 */ "cmd ::= ALTER LOCAL NK_STRING", + /* 57 */ "cmd ::= ALTER LOCAL NK_STRING NK_STRING", + /* 58 */ "cmd ::= CREATE QNODE ON DNODE NK_INTEGER", + /* 59 */ "cmd ::= DROP QNODE ON DNODE NK_INTEGER", + /* 60 */ "cmd ::= CREATE BNODE ON DNODE NK_INTEGER", + /* 61 */ "cmd ::= DROP BNODE ON DNODE NK_INTEGER", + /* 62 */ "cmd ::= CREATE SNODE ON DNODE NK_INTEGER", + /* 63 */ "cmd ::= DROP SNODE ON DNODE NK_INTEGER", + /* 64 */ "cmd ::= CREATE MNODE ON DNODE NK_INTEGER", + /* 65 */ "cmd ::= DROP MNODE ON DNODE NK_INTEGER", + /* 66 */ "cmd ::= CREATE DATABASE not_exists_opt db_name db_options", + /* 67 */ "cmd ::= DROP DATABASE exists_opt db_name", + /* 68 */ "cmd ::= USE db_name", + /* 69 */ "cmd ::= ALTER DATABASE db_name alter_db_options", + /* 70 */ "cmd ::= FLUSH DATABASE db_name", + /* 71 */ "cmd ::= TRIM DATABASE db_name speed_opt", + /* 72 */ "not_exists_opt ::= IF NOT EXISTS", + /* 73 */ "not_exists_opt ::=", + /* 74 */ "exists_opt ::= IF EXISTS", + /* 75 */ "exists_opt ::=", + /* 76 */ "db_options ::=", + /* 77 */ "db_options ::= db_options BUFFER NK_INTEGER", + /* 78 */ "db_options ::= db_options CACHEMODEL NK_STRING", + /* 79 */ "db_options ::= db_options CACHESIZE NK_INTEGER", + /* 80 */ "db_options ::= db_options COMP NK_INTEGER", + /* 81 */ "db_options ::= db_options DURATION NK_INTEGER", + /* 82 */ "db_options ::= db_options DURATION NK_VARIABLE", + /* 83 */ "db_options ::= db_options MAXROWS NK_INTEGER", + /* 84 */ "db_options ::= db_options MINROWS NK_INTEGER", + /* 85 */ "db_options ::= db_options KEEP integer_list", + /* 86 */ "db_options ::= db_options KEEP variable_list", + /* 87 */ "db_options ::= db_options PAGES NK_INTEGER", + /* 88 */ "db_options ::= db_options PAGESIZE NK_INTEGER", + /* 89 */ "db_options ::= db_options TSDB_PAGESIZE NK_INTEGER", + /* 90 */ "db_options ::= db_options PRECISION NK_STRING", + /* 91 */ "db_options ::= db_options REPLICA NK_INTEGER", + /* 92 */ "db_options ::= db_options STRICT NK_STRING", + /* 93 */ "db_options ::= db_options VGROUPS NK_INTEGER", + /* 94 */ "db_options ::= db_options SINGLE_STABLE NK_INTEGER", + /* 95 */ "db_options ::= db_options RETENTIONS retention_list", + /* 96 */ "db_options ::= db_options SCHEMALESS NK_INTEGER", + /* 97 */ "db_options ::= db_options WAL_LEVEL NK_INTEGER", + /* 98 */ "db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER", + /* 99 */ "db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER", + /* 100 */ "db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER", + /* 101 */ "db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER", + /* 102 */ "db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER", + /* 103 */ "db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER", + /* 104 */ "db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER", + /* 105 */ "db_options ::= db_options STT_TRIGGER NK_INTEGER", + /* 106 */ "db_options ::= db_options TABLE_PREFIX NK_INTEGER", + /* 107 */ "db_options ::= db_options TABLE_SUFFIX NK_INTEGER", + /* 108 */ "alter_db_options ::= alter_db_option", + /* 109 */ "alter_db_options ::= alter_db_options alter_db_option", + /* 110 */ "alter_db_option ::= BUFFER NK_INTEGER", + /* 111 */ "alter_db_option ::= CACHEMODEL NK_STRING", + /* 112 */ "alter_db_option ::= CACHESIZE NK_INTEGER", + /* 113 */ "alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER", + /* 114 */ "alter_db_option ::= KEEP integer_list", + /* 115 */ "alter_db_option ::= KEEP variable_list", + /* 116 */ "alter_db_option ::= PAGES NK_INTEGER", + /* 117 */ "alter_db_option ::= REPLICA NK_INTEGER", + /* 118 */ "alter_db_option ::= STRICT NK_STRING", + /* 119 */ "alter_db_option ::= WAL_LEVEL NK_INTEGER", + /* 120 */ "alter_db_option ::= STT_TRIGGER NK_INTEGER", + /* 121 */ "integer_list ::= NK_INTEGER", + /* 122 */ "integer_list ::= integer_list NK_COMMA NK_INTEGER", + /* 123 */ "variable_list ::= NK_VARIABLE", + /* 124 */ "variable_list ::= variable_list NK_COMMA NK_VARIABLE", + /* 125 */ "retention_list ::= retention", + /* 126 */ "retention_list ::= retention_list NK_COMMA retention", + /* 127 */ "retention ::= NK_VARIABLE NK_COLON NK_VARIABLE", + /* 128 */ "speed_opt ::=", + /* 129 */ "speed_opt ::= MAX_SPEED NK_INTEGER", + /* 130 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", + /* 131 */ "cmd ::= CREATE TABLE multi_create_clause", + /* 132 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", + /* 133 */ "cmd ::= DROP TABLE multi_drop_clause", + /* 134 */ "cmd ::= DROP STABLE exists_opt full_table_name", + /* 135 */ "cmd ::= ALTER TABLE alter_table_clause", + /* 136 */ "cmd ::= ALTER STABLE alter_table_clause", + /* 137 */ "alter_table_clause ::= full_table_name alter_table_options", + /* 138 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name", + /* 139 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name", + /* 140 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name", + /* 141 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name", + /* 142 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name", + /* 143 */ "alter_table_clause ::= full_table_name DROP TAG column_name", + /* 144 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name", + /* 145 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name", + /* 146 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal", + /* 147 */ "multi_create_clause ::= create_subtable_clause", + /* 148 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", + /* 149 */ "create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options", + /* 150 */ "multi_drop_clause ::= drop_table_clause", + /* 151 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause", + /* 152 */ "drop_table_clause ::= exists_opt full_table_name", + /* 153 */ "specific_cols_opt ::=", + /* 154 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP", + /* 155 */ "full_table_name ::= table_name", + /* 156 */ "full_table_name ::= db_name NK_DOT table_name", + /* 157 */ "column_def_list ::= column_def", + /* 158 */ "column_def_list ::= column_def_list NK_COMMA column_def", + /* 159 */ "column_def ::= column_name type_name", + /* 160 */ "column_def ::= column_name type_name COMMENT NK_STRING", + /* 161 */ "type_name ::= BOOL", + /* 162 */ "type_name ::= TINYINT", + /* 163 */ "type_name ::= SMALLINT", + /* 164 */ "type_name ::= INT", + /* 165 */ "type_name ::= INTEGER", + /* 166 */ "type_name ::= BIGINT", + /* 167 */ "type_name ::= FLOAT", + /* 168 */ "type_name ::= DOUBLE", + /* 169 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", + /* 170 */ "type_name ::= TIMESTAMP", + /* 171 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", + /* 172 */ "type_name ::= TINYINT UNSIGNED", + /* 173 */ "type_name ::= SMALLINT UNSIGNED", + /* 174 */ "type_name ::= INT UNSIGNED", + /* 175 */ "type_name ::= BIGINT UNSIGNED", + /* 176 */ "type_name ::= JSON", + /* 177 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", + /* 178 */ "type_name ::= MEDIUMBLOB", + /* 179 */ "type_name ::= BLOB", + /* 180 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", + /* 181 */ "type_name ::= DECIMAL", + /* 182 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", + /* 183 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", + /* 184 */ "tags_def_opt ::=", + /* 185 */ "tags_def_opt ::= tags_def", + /* 186 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", + /* 187 */ "table_options ::=", + /* 188 */ "table_options ::= table_options COMMENT NK_STRING", + /* 189 */ "table_options ::= table_options MAX_DELAY duration_list", + /* 190 */ "table_options ::= table_options WATERMARK duration_list", + /* 191 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP", + /* 192 */ "table_options ::= table_options TTL NK_INTEGER", + /* 193 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", + /* 194 */ "alter_table_options ::= alter_table_option", + /* 195 */ "alter_table_options ::= alter_table_options alter_table_option", + /* 196 */ "alter_table_option ::= COMMENT NK_STRING", + /* 197 */ "alter_table_option ::= TTL NK_INTEGER", + /* 198 */ "duration_list ::= duration_literal", + /* 199 */ "duration_list ::= duration_list NK_COMMA duration_literal", + /* 200 */ "rollup_func_list ::= rollup_func_name", + /* 201 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name", + /* 202 */ "rollup_func_name ::= function_name", + /* 203 */ "rollup_func_name ::= FIRST", + /* 204 */ "rollup_func_name ::= LAST", + /* 205 */ "col_name_list ::= col_name", + /* 206 */ "col_name_list ::= col_name_list NK_COMMA col_name", + /* 207 */ "col_name ::= column_name", + /* 208 */ "cmd ::= SHOW DNODES", + /* 209 */ "cmd ::= SHOW USERS", + /* 210 */ "cmd ::= SHOW USER PRIVILEGES", + /* 211 */ "cmd ::= SHOW DATABASES", + /* 212 */ "cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt", + /* 213 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt", + /* 214 */ "cmd ::= SHOW db_name_cond_opt VGROUPS", + /* 215 */ "cmd ::= SHOW MNODES", + /* 216 */ "cmd ::= SHOW QNODES", + /* 217 */ "cmd ::= SHOW FUNCTIONS", + /* 218 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt", + /* 219 */ "cmd ::= SHOW STREAMS", + /* 220 */ "cmd ::= SHOW ACCOUNTS", + /* 221 */ "cmd ::= SHOW APPS", + /* 222 */ "cmd ::= SHOW CONNECTIONS", + /* 223 */ "cmd ::= SHOW LICENCES", + /* 224 */ "cmd ::= SHOW GRANTS", + /* 225 */ "cmd ::= SHOW CREATE DATABASE db_name", + /* 226 */ "cmd ::= SHOW CREATE TABLE full_table_name", + /* 227 */ "cmd ::= SHOW CREATE STABLE full_table_name", + /* 228 */ "cmd ::= SHOW QUERIES", + /* 229 */ "cmd ::= SHOW SCORES", + /* 230 */ "cmd ::= SHOW TOPICS", + /* 231 */ "cmd ::= SHOW VARIABLES", + /* 232 */ "cmd ::= SHOW CLUSTER VARIABLES", + /* 233 */ "cmd ::= SHOW LOCAL VARIABLES", + /* 234 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt", + /* 235 */ "cmd ::= SHOW BNODES", + /* 236 */ "cmd ::= SHOW SNODES", + /* 237 */ "cmd ::= SHOW CLUSTER", + /* 238 */ "cmd ::= SHOW TRANSACTIONS", + /* 239 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name", + /* 240 */ "cmd ::= SHOW CONSUMERS", + /* 241 */ "cmd ::= SHOW SUBSCRIPTIONS", + /* 242 */ "cmd ::= SHOW TAGS FROM table_name_cond from_db_opt", + /* 243 */ "cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt", + /* 244 */ "cmd ::= SHOW VNODES NK_INTEGER", + /* 245 */ "cmd ::= SHOW VNODES NK_STRING", + /* 246 */ "db_name_cond_opt ::=", + /* 247 */ "db_name_cond_opt ::= db_name NK_DOT", + /* 248 */ "like_pattern_opt ::=", + /* 249 */ "like_pattern_opt ::= LIKE NK_STRING", + /* 250 */ "table_name_cond ::= table_name", + /* 251 */ "from_db_opt ::=", + /* 252 */ "from_db_opt ::= FROM db_name", + /* 253 */ "tag_list_opt ::=", + /* 254 */ "tag_list_opt ::= tag_item", + /* 255 */ "tag_list_opt ::= tag_list_opt NK_COMMA tag_item", + /* 256 */ "tag_item ::= TBNAME", + /* 257 */ "tag_item ::= QTAGS", + /* 258 */ "tag_item ::= column_name", + /* 259 */ "tag_item ::= column_name column_alias", + /* 260 */ "tag_item ::= column_name AS column_alias", + /* 261 */ "cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options", + /* 262 */ "cmd ::= DROP INDEX exists_opt full_table_name", + /* 263 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", + /* 264 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt", + /* 265 */ "func_list ::= func", + /* 266 */ "func_list ::= func_list NK_COMMA func", + /* 267 */ "func ::= function_name NK_LP expression_list NK_RP", + /* 268 */ "sma_stream_opt ::=", + /* 269 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal", + /* 270 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal", + /* 271 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery", + /* 272 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name", + /* 273 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name", + /* 274 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name", + /* 275 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name", + /* 276 */ "cmd ::= DROP TOPIC exists_opt topic_name", + /* 277 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", + /* 278 */ "cmd ::= DESC full_table_name", + /* 279 */ "cmd ::= DESCRIBE full_table_name", + /* 280 */ "cmd ::= RESET QUERY CACHE", + /* 281 */ "cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery", + /* 282 */ "analyze_opt ::=", + /* 283 */ "analyze_opt ::= ANALYZE", + /* 284 */ "explain_options ::=", + /* 285 */ "explain_options ::= explain_options VERBOSE NK_BOOL", + /* 286 */ "explain_options ::= explain_options RATIO NK_FLOAT", + /* 287 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt", + /* 288 */ "cmd ::= DROP FUNCTION exists_opt function_name", + /* 289 */ "agg_func_opt ::=", + /* 290 */ "agg_func_opt ::= AGGREGATE", + /* 291 */ "bufsize_opt ::=", + /* 292 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", + /* 293 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery", + /* 294 */ "cmd ::= DROP STREAM exists_opt stream_name", + /* 295 */ "stream_options ::=", + /* 296 */ "stream_options ::= stream_options TRIGGER AT_ONCE", + /* 297 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", + /* 298 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", + /* 299 */ "stream_options ::= stream_options WATERMARK duration_literal", + /* 300 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER", + /* 301 */ "stream_options ::= stream_options FILL_HISTORY NK_INTEGER", + /* 302 */ "subtable_opt ::=", + /* 303 */ "subtable_opt ::= SUBTABLE NK_LP expression NK_RP", + /* 304 */ "cmd ::= KILL CONNECTION NK_INTEGER", + /* 305 */ "cmd ::= KILL QUERY NK_STRING", + /* 306 */ "cmd ::= KILL TRANSACTION NK_INTEGER", + /* 307 */ "cmd ::= BALANCE VGROUP", + /* 308 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", + /* 309 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", + /* 310 */ "cmd ::= SPLIT VGROUP NK_INTEGER", + /* 311 */ "dnode_list ::= DNODE NK_INTEGER", + /* 312 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", + /* 313 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", + /* 314 */ "cmd ::= query_or_subquery", + /* 315 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery", + /* 316 */ "cmd ::= INSERT INTO full_table_name query_or_subquery", + /* 317 */ "literal ::= NK_INTEGER", + /* 318 */ "literal ::= NK_FLOAT", + /* 319 */ "literal ::= NK_STRING", + /* 320 */ "literal ::= NK_BOOL", + /* 321 */ "literal ::= TIMESTAMP NK_STRING", + /* 322 */ "literal ::= duration_literal", + /* 323 */ "literal ::= NULL", + /* 324 */ "literal ::= NK_QUESTION", + /* 325 */ "duration_literal ::= NK_VARIABLE", + /* 326 */ "signed ::= NK_INTEGER", + /* 327 */ "signed ::= NK_PLUS NK_INTEGER", + /* 328 */ "signed ::= NK_MINUS NK_INTEGER", + /* 329 */ "signed ::= NK_FLOAT", + /* 330 */ "signed ::= NK_PLUS NK_FLOAT", + /* 331 */ "signed ::= NK_MINUS NK_FLOAT", + /* 332 */ "signed_literal ::= signed", + /* 333 */ "signed_literal ::= NK_STRING", + /* 334 */ "signed_literal ::= NK_BOOL", + /* 335 */ "signed_literal ::= TIMESTAMP NK_STRING", + /* 336 */ "signed_literal ::= duration_literal", + /* 337 */ "signed_literal ::= NULL", + /* 338 */ "signed_literal ::= literal_func", + /* 339 */ "signed_literal ::= NK_QUESTION", + /* 340 */ "literal_list ::= signed_literal", + /* 341 */ "literal_list ::= literal_list NK_COMMA signed_literal", + /* 342 */ "db_name ::= NK_ID", + /* 343 */ "table_name ::= NK_ID", + /* 344 */ "column_name ::= NK_ID", + /* 345 */ "function_name ::= NK_ID", + /* 346 */ "table_alias ::= NK_ID", + /* 347 */ "column_alias ::= NK_ID", + /* 348 */ "user_name ::= NK_ID", + /* 349 */ "topic_name ::= NK_ID", + /* 350 */ "stream_name ::= NK_ID", + /* 351 */ "cgroup_name ::= NK_ID", + /* 352 */ "expr_or_subquery ::= expression", + /* 353 */ "expression ::= literal", + /* 354 */ "expression ::= pseudo_column", + /* 355 */ "expression ::= column_reference", + /* 356 */ "expression ::= function_expression", + /* 357 */ "expression ::= case_when_expression", + /* 358 */ "expression ::= NK_LP expression NK_RP", + /* 359 */ "expression ::= NK_PLUS expr_or_subquery", + /* 360 */ "expression ::= NK_MINUS expr_or_subquery", + /* 361 */ "expression ::= expr_or_subquery NK_PLUS expr_or_subquery", + /* 362 */ "expression ::= expr_or_subquery NK_MINUS expr_or_subquery", + /* 363 */ "expression ::= expr_or_subquery NK_STAR expr_or_subquery", + /* 364 */ "expression ::= expr_or_subquery NK_SLASH expr_or_subquery", + /* 365 */ "expression ::= expr_or_subquery NK_REM expr_or_subquery", + /* 366 */ "expression ::= column_reference NK_ARROW NK_STRING", + /* 367 */ "expression ::= expr_or_subquery NK_BITAND expr_or_subquery", + /* 368 */ "expression ::= expr_or_subquery NK_BITOR expr_or_subquery", + /* 369 */ "expression_list ::= expr_or_subquery", + /* 370 */ "expression_list ::= expression_list NK_COMMA expr_or_subquery", + /* 371 */ "column_reference ::= column_name", + /* 372 */ "column_reference ::= table_name NK_DOT column_name", + /* 373 */ "pseudo_column ::= ROWTS", + /* 374 */ "pseudo_column ::= TBNAME", + /* 375 */ "pseudo_column ::= table_name NK_DOT TBNAME", + /* 376 */ "pseudo_column ::= QSTART", + /* 377 */ "pseudo_column ::= QEND", + /* 378 */ "pseudo_column ::= QDURATION", + /* 379 */ "pseudo_column ::= WSTART", + /* 380 */ "pseudo_column ::= WEND", + /* 381 */ "pseudo_column ::= WDURATION", + /* 382 */ "pseudo_column ::= IROWTS", + /* 383 */ "pseudo_column ::= QTAGS", + /* 384 */ "function_expression ::= function_name NK_LP expression_list NK_RP", + /* 385 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", + /* 386 */ "function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP", + /* 387 */ "function_expression ::= literal_func", + /* 388 */ "literal_func ::= noarg_func NK_LP NK_RP", + /* 389 */ "literal_func ::= NOW", + /* 390 */ "noarg_func ::= NOW", + /* 391 */ "noarg_func ::= TODAY", + /* 392 */ "noarg_func ::= TIMEZONE", + /* 393 */ "noarg_func ::= DATABASE", + /* 394 */ "noarg_func ::= CLIENT_VERSION", + /* 395 */ "noarg_func ::= SERVER_VERSION", + /* 396 */ "noarg_func ::= SERVER_STATUS", + /* 397 */ "noarg_func ::= CURRENT_USER", + /* 398 */ "noarg_func ::= USER", + /* 399 */ "star_func ::= COUNT", + /* 400 */ "star_func ::= FIRST", + /* 401 */ "star_func ::= LAST", + /* 402 */ "star_func ::= LAST_ROW", + /* 403 */ "star_func_para_list ::= NK_STAR", + /* 404 */ "star_func_para_list ::= other_para_list", + /* 405 */ "other_para_list ::= star_func_para", + /* 406 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", + /* 407 */ "star_func_para ::= expr_or_subquery", + /* 408 */ "star_func_para ::= table_name NK_DOT NK_STAR", + /* 409 */ "case_when_expression ::= CASE when_then_list case_when_else_opt END", + /* 410 */ "case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END", + /* 411 */ "when_then_list ::= when_then_expr", + /* 412 */ "when_then_list ::= when_then_list when_then_expr", + /* 413 */ "when_then_expr ::= WHEN common_expression THEN common_expression", + /* 414 */ "case_when_else_opt ::=", + /* 415 */ "case_when_else_opt ::= ELSE common_expression", + /* 416 */ "predicate ::= expr_or_subquery compare_op expr_or_subquery", + /* 417 */ "predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery", + /* 418 */ "predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery", + /* 419 */ "predicate ::= expr_or_subquery IS NULL", + /* 420 */ "predicate ::= expr_or_subquery IS NOT NULL", + /* 421 */ "predicate ::= expr_or_subquery in_op in_predicate_value", + /* 422 */ "compare_op ::= NK_LT", + /* 423 */ "compare_op ::= NK_GT", + /* 424 */ "compare_op ::= NK_LE", + /* 425 */ "compare_op ::= NK_GE", + /* 426 */ "compare_op ::= NK_NE", + /* 427 */ "compare_op ::= NK_EQ", + /* 428 */ "compare_op ::= LIKE", + /* 429 */ "compare_op ::= NOT LIKE", + /* 430 */ "compare_op ::= MATCH", + /* 431 */ "compare_op ::= NMATCH", + /* 432 */ "compare_op ::= CONTAINS", + /* 433 */ "in_op ::= IN", + /* 434 */ "in_op ::= NOT IN", + /* 435 */ "in_predicate_value ::= NK_LP literal_list NK_RP", + /* 436 */ "boolean_value_expression ::= boolean_primary", + /* 437 */ "boolean_value_expression ::= NOT boolean_primary", + /* 438 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", + /* 439 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", + /* 440 */ "boolean_primary ::= predicate", + /* 441 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", + /* 442 */ "common_expression ::= expr_or_subquery", + /* 443 */ "common_expression ::= boolean_value_expression", + /* 444 */ "from_clause_opt ::=", + /* 445 */ "from_clause_opt ::= FROM table_reference_list", + /* 446 */ "table_reference_list ::= table_reference", + /* 447 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", + /* 448 */ "table_reference ::= table_primary", + /* 449 */ "table_reference ::= joined_table", + /* 450 */ "table_primary ::= table_name alias_opt", + /* 451 */ "table_primary ::= db_name NK_DOT table_name alias_opt", + /* 452 */ "table_primary ::= subquery alias_opt", + /* 453 */ "table_primary ::= parenthesized_joined_table", + /* 454 */ "alias_opt ::=", + /* 455 */ "alias_opt ::= table_alias", + /* 456 */ "alias_opt ::= AS table_alias", + /* 457 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", + /* 458 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", + /* 459 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", + /* 460 */ "join_type ::=", + /* 461 */ "join_type ::= INNER", + /* 462 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt", + /* 463 */ "set_quantifier_opt ::=", + /* 464 */ "set_quantifier_opt ::= DISTINCT", + /* 465 */ "set_quantifier_opt ::= ALL", + /* 466 */ "select_list ::= select_item", + /* 467 */ "select_list ::= select_list NK_COMMA select_item", + /* 468 */ "select_item ::= NK_STAR", + /* 469 */ "select_item ::= common_expression", + /* 470 */ "select_item ::= common_expression column_alias", + /* 471 */ "select_item ::= common_expression AS column_alias", + /* 472 */ "select_item ::= table_name NK_DOT NK_STAR", + /* 473 */ "where_clause_opt ::=", + /* 474 */ "where_clause_opt ::= WHERE search_condition", + /* 475 */ "partition_by_clause_opt ::=", + /* 476 */ "partition_by_clause_opt ::= PARTITION BY partition_list", + /* 477 */ "partition_list ::= partition_item", + /* 478 */ "partition_list ::= partition_list NK_COMMA partition_item", + /* 479 */ "partition_item ::= expr_or_subquery", + /* 480 */ "partition_item ::= expr_or_subquery column_alias", + /* 481 */ "partition_item ::= expr_or_subquery AS column_alias", + /* 482 */ "twindow_clause_opt ::=", + /* 483 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", + /* 484 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP", + /* 485 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", + /* 486 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", + /* 487 */ "sliding_opt ::=", + /* 488 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", + /* 489 */ "fill_opt ::=", + /* 490 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", + /* 491 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", + /* 492 */ "fill_mode ::= NONE", + /* 493 */ "fill_mode ::= PREV", + /* 494 */ "fill_mode ::= NULL", + /* 495 */ "fill_mode ::= LINEAR", + /* 496 */ "fill_mode ::= NEXT", + /* 497 */ "group_by_clause_opt ::=", + /* 498 */ "group_by_clause_opt ::= GROUP BY group_by_list", + /* 499 */ "group_by_list ::= expr_or_subquery", + /* 500 */ "group_by_list ::= group_by_list NK_COMMA expr_or_subquery", + /* 501 */ "having_clause_opt ::=", + /* 502 */ "having_clause_opt ::= HAVING search_condition", + /* 503 */ "range_opt ::=", + /* 504 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP", + /* 505 */ "every_opt ::=", + /* 506 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", + /* 507 */ "query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt", + /* 508 */ "query_simple ::= query_specification", + /* 509 */ "query_simple ::= union_query_expression", + /* 510 */ "union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery", + /* 511 */ "union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery", + /* 512 */ "query_simple_or_subquery ::= query_simple", + /* 513 */ "query_simple_or_subquery ::= subquery", + /* 514 */ "query_or_subquery ::= query_expression", + /* 515 */ "query_or_subquery ::= subquery", + /* 516 */ "order_by_clause_opt ::=", + /* 517 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 518 */ "slimit_clause_opt ::=", + /* 519 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", + /* 520 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", + /* 521 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 522 */ "limit_clause_opt ::=", + /* 523 */ "limit_clause_opt ::= LIMIT NK_INTEGER", + /* 524 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", + /* 525 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 526 */ "subquery ::= NK_LP query_expression NK_RP", + /* 527 */ "subquery ::= NK_LP subquery NK_RP", + /* 528 */ "search_condition ::= common_expression", + /* 529 */ "sort_specification_list ::= sort_specification", + /* 530 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", + /* 531 */ "sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt", + /* 532 */ "ordering_specification_opt ::=", + /* 533 */ "ordering_specification_opt ::= ASC", + /* 534 */ "ordering_specification_opt ::= DESC", + /* 535 */ "null_ordering_opt ::=", + /* 536 */ "null_ordering_opt ::= NULLS FIRST", + /* 537 */ "null_ordering_opt ::= NULLS LAST", }; #endif /* NDEBUG */ @@ -2490,193 +2467,193 @@ static void yy_destructor( */ /********* Begin destructor definitions ***************************************/ /* Default NON-TERMINAL Destructor */ - case 319: /* cmd */ - case 322: /* literal */ - case 334: /* db_options */ - case 336: /* alter_db_options */ - case 342: /* retention */ - case 343: /* full_table_name */ - case 346: /* table_options */ - case 350: /* alter_table_clause */ - case 351: /* alter_table_options */ - case 354: /* signed_literal */ - case 355: /* create_subtable_clause */ - case 358: /* drop_table_clause */ - case 361: /* column_def */ - case 365: /* duration_literal */ - case 366: /* rollup_func_name */ - case 368: /* col_name */ - case 369: /* db_name_cond_opt */ - case 370: /* like_pattern_opt */ - case 371: /* table_name_cond */ - case 372: /* from_db_opt */ - case 374: /* tag_item */ - case 376: /* index_options */ - case 378: /* sliding_opt */ - case 379: /* sma_stream_opt */ - case 380: /* func */ - case 381: /* stream_options */ - case 383: /* query_or_subquery */ - case 386: /* explain_options */ - case 390: /* subtable_opt */ - case 391: /* expression */ - case 393: /* where_clause_opt */ - case 394: /* signed */ - case 395: /* literal_func */ - case 398: /* expr_or_subquery */ - case 399: /* pseudo_column */ - case 400: /* column_reference */ - case 401: /* function_expression */ - case 402: /* case_when_expression */ - case 407: /* star_func_para */ - case 409: /* case_when_else_opt */ - case 410: /* common_expression */ - case 411: /* when_then_expr */ - case 412: /* predicate */ - case 415: /* in_predicate_value */ - case 416: /* boolean_value_expression */ - case 417: /* boolean_primary */ - case 418: /* from_clause_opt */ - case 419: /* table_reference_list */ - case 420: /* table_reference */ - case 421: /* table_primary */ - case 422: /* joined_table */ - case 424: /* subquery */ - case 425: /* parenthesized_joined_table */ - case 427: /* search_condition */ - case 428: /* query_specification */ - case 432: /* range_opt */ - case 433: /* every_opt */ - case 434: /* fill_opt */ - case 435: /* twindow_clause_opt */ - case 437: /* having_clause_opt */ - case 438: /* select_item */ - case 440: /* partition_item */ - case 443: /* query_expression */ - case 444: /* query_simple */ - case 446: /* slimit_clause_opt */ - case 447: /* limit_clause_opt */ - case 448: /* union_query_expression */ - case 449: /* query_simple_or_subquery */ - case 451: /* sort_specification */ + case 321: /* cmd */ + case 324: /* literal */ + case 337: /* db_options */ + case 339: /* alter_db_options */ + case 345: /* retention */ + case 346: /* full_table_name */ + case 349: /* table_options */ + case 353: /* alter_table_clause */ + case 354: /* alter_table_options */ + case 357: /* signed_literal */ + case 358: /* create_subtable_clause */ + case 361: /* drop_table_clause */ + case 364: /* column_def */ + case 368: /* duration_literal */ + case 369: /* rollup_func_name */ + case 371: /* col_name */ + case 372: /* db_name_cond_opt */ + case 373: /* like_pattern_opt */ + case 374: /* table_name_cond */ + case 375: /* from_db_opt */ + case 377: /* tag_item */ + case 379: /* index_options */ + case 381: /* sliding_opt */ + case 382: /* sma_stream_opt */ + case 383: /* func */ + case 384: /* stream_options */ + case 385: /* query_or_subquery */ + case 388: /* explain_options */ + case 392: /* subtable_opt */ + case 393: /* expression */ + case 395: /* where_clause_opt */ + case 396: /* signed */ + case 397: /* literal_func */ + case 400: /* expr_or_subquery */ + case 401: /* pseudo_column */ + case 402: /* column_reference */ + case 403: /* function_expression */ + case 404: /* case_when_expression */ + case 409: /* star_func_para */ + case 411: /* case_when_else_opt */ + case 412: /* common_expression */ + case 413: /* when_then_expr */ + case 414: /* predicate */ + case 417: /* in_predicate_value */ + case 418: /* boolean_value_expression */ + case 419: /* boolean_primary */ + case 420: /* from_clause_opt */ + case 421: /* table_reference_list */ + case 422: /* table_reference */ + case 423: /* table_primary */ + case 424: /* joined_table */ + case 426: /* subquery */ + case 427: /* parenthesized_joined_table */ + case 429: /* search_condition */ + case 430: /* query_specification */ + case 434: /* range_opt */ + case 435: /* every_opt */ + case 436: /* fill_opt */ + case 437: /* twindow_clause_opt */ + case 439: /* having_clause_opt */ + case 440: /* select_item */ + case 442: /* partition_item */ + case 445: /* query_expression */ + case 446: /* query_simple */ + case 448: /* slimit_clause_opt */ + case 449: /* limit_clause_opt */ + case 450: /* union_query_expression */ + case 451: /* query_simple_or_subquery */ + case 453: /* sort_specification */ { - nodesDestroyNode((yypminor->yy164)); + nodesDestroyNode((yypminor->yy104)); } break; - case 320: /* account_options */ - case 321: /* alter_account_options */ - case 323: /* alter_account_option */ - case 337: /* speed_opt */ - case 388: /* bufsize_opt */ + case 322: /* account_options */ + case 323: /* alter_account_options */ + case 325: /* alter_account_option */ + case 340: /* speed_opt */ + case 390: /* bufsize_opt */ { } break; - case 324: /* user_name */ - case 327: /* priv_level */ - case 330: /* db_name */ - case 331: /* dnode_endpoint */ - case 352: /* column_name */ - case 360: /* table_name */ - case 367: /* function_name */ - case 375: /* column_alias */ - case 382: /* topic_name */ - case 384: /* cgroup_name */ - case 389: /* stream_name */ - case 397: /* table_alias */ - case 403: /* star_func */ - case 405: /* noarg_func */ - case 423: /* alias_opt */ + case 326: /* user_name */ + case 329: /* priv_level */ + case 332: /* db_name */ + case 333: /* topic_name */ + case 334: /* dnode_endpoint */ + case 355: /* column_name */ + case 363: /* table_name */ + case 370: /* function_name */ + case 378: /* column_alias */ + case 386: /* cgroup_name */ + case 391: /* stream_name */ + case 399: /* table_alias */ + case 405: /* star_func */ + case 407: /* noarg_func */ + case 425: /* alias_opt */ { } break; - case 325: /* sysinfo_opt */ + case 327: /* sysinfo_opt */ { } break; - case 326: /* privileges */ - case 328: /* priv_type_list */ - case 329: /* priv_type */ + case 328: /* privileges */ + case 330: /* priv_type_list */ + case 331: /* priv_type */ { } break; - case 332: /* force_opt */ - case 333: /* not_exists_opt */ - case 335: /* exists_opt */ - case 385: /* analyze_opt */ - case 387: /* agg_func_opt */ - case 429: /* set_quantifier_opt */ + case 335: /* force_opt */ + case 336: /* not_exists_opt */ + case 338: /* exists_opt */ + case 387: /* analyze_opt */ + case 389: /* agg_func_opt */ + case 431: /* set_quantifier_opt */ { } break; - case 338: /* integer_list */ - case 339: /* variable_list */ - case 340: /* retention_list */ - case 344: /* column_def_list */ - case 345: /* tags_def_opt */ - case 347: /* multi_create_clause */ - case 348: /* tags_def */ - case 349: /* multi_drop_clause */ - case 356: /* specific_cols_opt */ - case 357: /* expression_list */ - case 359: /* col_name_list */ - case 362: /* duration_list */ - case 363: /* rollup_func_list */ - case 373: /* tag_list_opt */ - case 377: /* func_list */ - case 392: /* dnode_list */ - case 396: /* literal_list */ - case 404: /* star_func_para_list */ - case 406: /* other_para_list */ - case 408: /* when_then_list */ - case 430: /* select_list */ - case 431: /* partition_by_clause_opt */ - case 436: /* group_by_clause_opt */ - case 439: /* partition_list */ - case 442: /* group_by_list */ - case 445: /* order_by_clause_opt */ - case 450: /* sort_specification_list */ + case 341: /* integer_list */ + case 342: /* variable_list */ + case 343: /* retention_list */ + case 347: /* column_def_list */ + case 348: /* tags_def_opt */ + case 350: /* multi_create_clause */ + case 351: /* tags_def */ + case 352: /* multi_drop_clause */ + case 359: /* specific_cols_opt */ + case 360: /* expression_list */ + case 362: /* col_name_list */ + case 365: /* duration_list */ + case 366: /* rollup_func_list */ + case 376: /* tag_list_opt */ + case 380: /* func_list */ + case 394: /* dnode_list */ + case 398: /* literal_list */ + case 406: /* star_func_para_list */ + case 408: /* other_para_list */ + case 410: /* when_then_list */ + case 432: /* select_list */ + case 433: /* partition_by_clause_opt */ + case 438: /* group_by_clause_opt */ + case 441: /* partition_list */ + case 444: /* group_by_list */ + case 447: /* order_by_clause_opt */ + case 452: /* sort_specification_list */ { - nodesDestroyList((yypminor->yy648)); + nodesDestroyList((yypminor->yy616)); } break; - case 341: /* alter_db_option */ - case 364: /* alter_table_option */ + case 344: /* alter_db_option */ + case 367: /* alter_table_option */ { } break; - case 353: /* type_name */ + case 356: /* type_name */ { } break; - case 413: /* compare_op */ - case 414: /* in_op */ + case 415: /* compare_op */ + case 416: /* in_op */ { } break; - case 426: /* join_type */ + case 428: /* join_type */ { } break; - case 441: /* fill_mode */ + case 443: /* fill_mode */ { } break; - case 452: /* ordering_specification_opt */ + case 454: /* ordering_specification_opt */ { } break; - case 453: /* null_ordering_opt */ + case 455: /* null_ordering_opt */ { } @@ -2975,541 +2952,544 @@ static const struct { YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ signed char nrhs; /* Negative of the number of RHS symbols in the rule */ } yyRuleInfo[] = { - { 319, -6 }, /* (0) cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ - { 319, -4 }, /* (1) cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ - { 320, 0 }, /* (2) account_options ::= */ - { 320, -3 }, /* (3) account_options ::= account_options PPS literal */ - { 320, -3 }, /* (4) account_options ::= account_options TSERIES literal */ - { 320, -3 }, /* (5) account_options ::= account_options STORAGE literal */ - { 320, -3 }, /* (6) account_options ::= account_options STREAMS literal */ - { 320, -3 }, /* (7) account_options ::= account_options QTIME literal */ - { 320, -3 }, /* (8) account_options ::= account_options DBS literal */ - { 320, -3 }, /* (9) account_options ::= account_options USERS literal */ - { 320, -3 }, /* (10) account_options ::= account_options CONNS literal */ - { 320, -3 }, /* (11) account_options ::= account_options STATE literal */ - { 321, -1 }, /* (12) alter_account_options ::= alter_account_option */ - { 321, -2 }, /* (13) alter_account_options ::= alter_account_options alter_account_option */ - { 323, -2 }, /* (14) alter_account_option ::= PASS literal */ - { 323, -2 }, /* (15) alter_account_option ::= PPS literal */ - { 323, -2 }, /* (16) alter_account_option ::= TSERIES literal */ - { 323, -2 }, /* (17) alter_account_option ::= STORAGE literal */ - { 323, -2 }, /* (18) alter_account_option ::= STREAMS literal */ - { 323, -2 }, /* (19) alter_account_option ::= QTIME literal */ - { 323, -2 }, /* (20) alter_account_option ::= DBS literal */ - { 323, -2 }, /* (21) alter_account_option ::= USERS literal */ - { 323, -2 }, /* (22) alter_account_option ::= CONNS literal */ - { 323, -2 }, /* (23) alter_account_option ::= STATE literal */ - { 319, -6 }, /* (24) cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ - { 319, -5 }, /* (25) cmd ::= ALTER USER user_name PASS NK_STRING */ - { 319, -5 }, /* (26) cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ - { 319, -5 }, /* (27) cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ - { 319, -3 }, /* (28) cmd ::= DROP USER user_name */ - { 325, 0 }, /* (29) sysinfo_opt ::= */ - { 325, -2 }, /* (30) sysinfo_opt ::= SYSINFO NK_INTEGER */ - { 319, -6 }, /* (31) cmd ::= GRANT privileges ON priv_level TO user_name */ - { 319, -6 }, /* (32) cmd ::= REVOKE privileges ON priv_level FROM user_name */ - { 326, -1 }, /* (33) privileges ::= ALL */ - { 326, -1 }, /* (34) privileges ::= priv_type_list */ - { 328, -1 }, /* (35) priv_type_list ::= priv_type */ - { 328, -3 }, /* (36) priv_type_list ::= priv_type_list NK_COMMA priv_type */ - { 329, -1 }, /* (37) priv_type ::= READ */ - { 329, -1 }, /* (38) priv_type ::= WRITE */ - { 327, -3 }, /* (39) priv_level ::= NK_STAR NK_DOT NK_STAR */ - { 327, -3 }, /* (40) priv_level ::= db_name NK_DOT NK_STAR */ - { 319, -3 }, /* (41) cmd ::= CREATE DNODE dnode_endpoint */ - { 319, -5 }, /* (42) cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ - { 319, -4 }, /* (43) cmd ::= DROP DNODE NK_INTEGER force_opt */ - { 319, -4 }, /* (44) cmd ::= DROP DNODE dnode_endpoint force_opt */ - { 319, -4 }, /* (45) cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ - { 319, -5 }, /* (46) cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ - { 319, -4 }, /* (47) cmd ::= ALTER ALL DNODES NK_STRING */ - { 319, -5 }, /* (48) cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ - { 331, -1 }, /* (49) dnode_endpoint ::= NK_STRING */ - { 331, -1 }, /* (50) dnode_endpoint ::= NK_ID */ - { 331, -1 }, /* (51) dnode_endpoint ::= NK_IPTOKEN */ - { 332, 0 }, /* (52) force_opt ::= */ - { 332, -1 }, /* (53) force_opt ::= FORCE */ - { 319, -3 }, /* (54) cmd ::= ALTER LOCAL NK_STRING */ - { 319, -4 }, /* (55) cmd ::= ALTER LOCAL NK_STRING NK_STRING */ - { 319, -5 }, /* (56) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ - { 319, -5 }, /* (57) cmd ::= DROP QNODE ON DNODE NK_INTEGER */ - { 319, -5 }, /* (58) cmd ::= CREATE BNODE ON DNODE NK_INTEGER */ - { 319, -5 }, /* (59) cmd ::= DROP BNODE ON DNODE NK_INTEGER */ - { 319, -5 }, /* (60) cmd ::= CREATE SNODE ON DNODE NK_INTEGER */ - { 319, -5 }, /* (61) cmd ::= DROP SNODE ON DNODE NK_INTEGER */ - { 319, -5 }, /* (62) cmd ::= CREATE MNODE ON DNODE NK_INTEGER */ - { 319, -5 }, /* (63) cmd ::= DROP MNODE ON DNODE NK_INTEGER */ - { 319, -5 }, /* (64) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ - { 319, -4 }, /* (65) cmd ::= DROP DATABASE exists_opt db_name */ - { 319, -2 }, /* (66) cmd ::= USE db_name */ - { 319, -4 }, /* (67) cmd ::= ALTER DATABASE db_name alter_db_options */ - { 319, -3 }, /* (68) cmd ::= FLUSH DATABASE db_name */ - { 319, -4 }, /* (69) cmd ::= TRIM DATABASE db_name speed_opt */ - { 333, -3 }, /* (70) not_exists_opt ::= IF NOT EXISTS */ - { 333, 0 }, /* (71) not_exists_opt ::= */ - { 335, -2 }, /* (72) exists_opt ::= IF EXISTS */ - { 335, 0 }, /* (73) exists_opt ::= */ - { 334, 0 }, /* (74) db_options ::= */ - { 334, -3 }, /* (75) db_options ::= db_options BUFFER NK_INTEGER */ - { 334, -3 }, /* (76) db_options ::= db_options CACHEMODEL NK_STRING */ - { 334, -3 }, /* (77) db_options ::= db_options CACHESIZE NK_INTEGER */ - { 334, -3 }, /* (78) db_options ::= db_options COMP NK_INTEGER */ - { 334, -3 }, /* (79) db_options ::= db_options DURATION NK_INTEGER */ - { 334, -3 }, /* (80) db_options ::= db_options DURATION NK_VARIABLE */ - { 334, -3 }, /* (81) db_options ::= db_options MAXROWS NK_INTEGER */ - { 334, -3 }, /* (82) db_options ::= db_options MINROWS NK_INTEGER */ - { 334, -3 }, /* (83) db_options ::= db_options KEEP integer_list */ - { 334, -3 }, /* (84) db_options ::= db_options KEEP variable_list */ - { 334, -3 }, /* (85) db_options ::= db_options PAGES NK_INTEGER */ - { 334, -3 }, /* (86) db_options ::= db_options PAGESIZE NK_INTEGER */ - { 334, -3 }, /* (87) db_options ::= db_options TSDB_PAGESIZE NK_INTEGER */ - { 334, -3 }, /* (88) db_options ::= db_options PRECISION NK_STRING */ - { 334, -3 }, /* (89) db_options ::= db_options REPLICA NK_INTEGER */ - { 334, -3 }, /* (90) db_options ::= db_options STRICT NK_STRING */ - { 334, -3 }, /* (91) db_options ::= db_options VGROUPS NK_INTEGER */ - { 334, -3 }, /* (92) db_options ::= db_options SINGLE_STABLE NK_INTEGER */ - { 334, -3 }, /* (93) db_options ::= db_options RETENTIONS retention_list */ - { 334, -3 }, /* (94) db_options ::= db_options SCHEMALESS NK_INTEGER */ - { 334, -3 }, /* (95) db_options ::= db_options WAL_LEVEL NK_INTEGER */ - { 334, -3 }, /* (96) db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */ - { 334, -3 }, /* (97) db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */ - { 334, -4 }, /* (98) db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */ - { 334, -3 }, /* (99) db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */ - { 334, -4 }, /* (100) db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */ - { 334, -3 }, /* (101) db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */ - { 334, -3 }, /* (102) db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */ - { 334, -3 }, /* (103) db_options ::= db_options STT_TRIGGER NK_INTEGER */ - { 334, -3 }, /* (104) db_options ::= db_options TABLE_PREFIX NK_INTEGER */ - { 334, -3 }, /* (105) db_options ::= db_options TABLE_SUFFIX NK_INTEGER */ - { 336, -1 }, /* (106) alter_db_options ::= alter_db_option */ - { 336, -2 }, /* (107) alter_db_options ::= alter_db_options alter_db_option */ - { 341, -2 }, /* (108) alter_db_option ::= BUFFER NK_INTEGER */ - { 341, -2 }, /* (109) alter_db_option ::= CACHEMODEL NK_STRING */ - { 341, -2 }, /* (110) alter_db_option ::= CACHESIZE NK_INTEGER */ - { 341, -2 }, /* (111) alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ - { 341, -2 }, /* (112) alter_db_option ::= KEEP integer_list */ - { 341, -2 }, /* (113) alter_db_option ::= KEEP variable_list */ - { 341, -2 }, /* (114) alter_db_option ::= PAGES NK_INTEGER */ - { 341, -2 }, /* (115) alter_db_option ::= REPLICA NK_INTEGER */ - { 341, -2 }, /* (116) alter_db_option ::= STRICT NK_STRING */ - { 341, -2 }, /* (117) alter_db_option ::= WAL_LEVEL NK_INTEGER */ - { 341, -2 }, /* (118) alter_db_option ::= STT_TRIGGER NK_INTEGER */ - { 338, -1 }, /* (119) integer_list ::= NK_INTEGER */ - { 338, -3 }, /* (120) integer_list ::= integer_list NK_COMMA NK_INTEGER */ - { 339, -1 }, /* (121) variable_list ::= NK_VARIABLE */ - { 339, -3 }, /* (122) variable_list ::= variable_list NK_COMMA NK_VARIABLE */ - { 340, -1 }, /* (123) retention_list ::= retention */ - { 340, -3 }, /* (124) retention_list ::= retention_list NK_COMMA retention */ - { 342, -3 }, /* (125) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ - { 337, 0 }, /* (126) speed_opt ::= */ - { 337, -2 }, /* (127) speed_opt ::= MAX_SPEED NK_INTEGER */ - { 319, -9 }, /* (128) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - { 319, -3 }, /* (129) cmd ::= CREATE TABLE multi_create_clause */ - { 319, -9 }, /* (130) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ - { 319, -3 }, /* (131) cmd ::= DROP TABLE multi_drop_clause */ - { 319, -4 }, /* (132) cmd ::= DROP STABLE exists_opt full_table_name */ - { 319, -3 }, /* (133) cmd ::= ALTER TABLE alter_table_clause */ - { 319, -3 }, /* (134) cmd ::= ALTER STABLE alter_table_clause */ - { 350, -2 }, /* (135) alter_table_clause ::= full_table_name alter_table_options */ - { 350, -5 }, /* (136) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ - { 350, -4 }, /* (137) alter_table_clause ::= full_table_name DROP COLUMN column_name */ - { 350, -5 }, /* (138) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ - { 350, -5 }, /* (139) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ - { 350, -5 }, /* (140) alter_table_clause ::= full_table_name ADD TAG column_name type_name */ - { 350, -4 }, /* (141) alter_table_clause ::= full_table_name DROP TAG column_name */ - { 350, -5 }, /* (142) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ - { 350, -5 }, /* (143) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ - { 350, -6 }, /* (144) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ - { 347, -1 }, /* (145) multi_create_clause ::= create_subtable_clause */ - { 347, -2 }, /* (146) multi_create_clause ::= multi_create_clause create_subtable_clause */ - { 355, -10 }, /* (147) create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ - { 349, -1 }, /* (148) multi_drop_clause ::= drop_table_clause */ - { 349, -2 }, /* (149) multi_drop_clause ::= multi_drop_clause drop_table_clause */ - { 358, -2 }, /* (150) drop_table_clause ::= exists_opt full_table_name */ - { 356, 0 }, /* (151) specific_cols_opt ::= */ - { 356, -3 }, /* (152) specific_cols_opt ::= NK_LP col_name_list NK_RP */ - { 343, -1 }, /* (153) full_table_name ::= table_name */ - { 343, -3 }, /* (154) full_table_name ::= db_name NK_DOT table_name */ - { 344, -1 }, /* (155) column_def_list ::= column_def */ - { 344, -3 }, /* (156) column_def_list ::= column_def_list NK_COMMA column_def */ - { 361, -2 }, /* (157) column_def ::= column_name type_name */ - { 361, -4 }, /* (158) column_def ::= column_name type_name COMMENT NK_STRING */ - { 353, -1 }, /* (159) type_name ::= BOOL */ - { 353, -1 }, /* (160) type_name ::= TINYINT */ - { 353, -1 }, /* (161) type_name ::= SMALLINT */ - { 353, -1 }, /* (162) type_name ::= INT */ - { 353, -1 }, /* (163) type_name ::= INTEGER */ - { 353, -1 }, /* (164) type_name ::= BIGINT */ - { 353, -1 }, /* (165) type_name ::= FLOAT */ - { 353, -1 }, /* (166) type_name ::= DOUBLE */ - { 353, -4 }, /* (167) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ - { 353, -1 }, /* (168) type_name ::= TIMESTAMP */ - { 353, -4 }, /* (169) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ - { 353, -2 }, /* (170) type_name ::= TINYINT UNSIGNED */ - { 353, -2 }, /* (171) type_name ::= SMALLINT UNSIGNED */ - { 353, -2 }, /* (172) type_name ::= INT UNSIGNED */ - { 353, -2 }, /* (173) type_name ::= BIGINT UNSIGNED */ - { 353, -1 }, /* (174) type_name ::= JSON */ - { 353, -4 }, /* (175) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ - { 353, -1 }, /* (176) type_name ::= MEDIUMBLOB */ - { 353, -1 }, /* (177) type_name ::= BLOB */ - { 353, -4 }, /* (178) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ - { 353, -1 }, /* (179) type_name ::= DECIMAL */ - { 353, -4 }, /* (180) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ - { 353, -6 }, /* (181) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ - { 345, 0 }, /* (182) tags_def_opt ::= */ - { 345, -1 }, /* (183) tags_def_opt ::= tags_def */ - { 348, -4 }, /* (184) tags_def ::= TAGS NK_LP column_def_list NK_RP */ - { 346, 0 }, /* (185) table_options ::= */ - { 346, -3 }, /* (186) table_options ::= table_options COMMENT NK_STRING */ - { 346, -3 }, /* (187) table_options ::= table_options MAX_DELAY duration_list */ - { 346, -3 }, /* (188) table_options ::= table_options WATERMARK duration_list */ - { 346, -5 }, /* (189) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ - { 346, -3 }, /* (190) table_options ::= table_options TTL NK_INTEGER */ - { 346, -5 }, /* (191) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ - { 351, -1 }, /* (192) alter_table_options ::= alter_table_option */ - { 351, -2 }, /* (193) alter_table_options ::= alter_table_options alter_table_option */ - { 364, -2 }, /* (194) alter_table_option ::= COMMENT NK_STRING */ - { 364, -2 }, /* (195) alter_table_option ::= TTL NK_INTEGER */ - { 362, -1 }, /* (196) duration_list ::= duration_literal */ - { 362, -3 }, /* (197) duration_list ::= duration_list NK_COMMA duration_literal */ - { 363, -1 }, /* (198) rollup_func_list ::= rollup_func_name */ - { 363, -3 }, /* (199) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ - { 366, -1 }, /* (200) rollup_func_name ::= function_name */ - { 366, -1 }, /* (201) rollup_func_name ::= FIRST */ - { 366, -1 }, /* (202) rollup_func_name ::= LAST */ - { 359, -1 }, /* (203) col_name_list ::= col_name */ - { 359, -3 }, /* (204) col_name_list ::= col_name_list NK_COMMA col_name */ - { 368, -1 }, /* (205) col_name ::= column_name */ - { 319, -2 }, /* (206) cmd ::= SHOW DNODES */ - { 319, -2 }, /* (207) cmd ::= SHOW USERS */ - { 319, -2 }, /* (208) cmd ::= SHOW DATABASES */ - { 319, -4 }, /* (209) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ - { 319, -4 }, /* (210) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ - { 319, -3 }, /* (211) cmd ::= SHOW db_name_cond_opt VGROUPS */ - { 319, -2 }, /* (212) cmd ::= SHOW MNODES */ - { 319, -2 }, /* (213) cmd ::= SHOW QNODES */ - { 319, -2 }, /* (214) cmd ::= SHOW FUNCTIONS */ - { 319, -5 }, /* (215) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ - { 319, -2 }, /* (216) cmd ::= SHOW STREAMS */ - { 319, -2 }, /* (217) cmd ::= SHOW ACCOUNTS */ - { 319, -2 }, /* (218) cmd ::= SHOW APPS */ - { 319, -2 }, /* (219) cmd ::= SHOW CONNECTIONS */ - { 319, -2 }, /* (220) cmd ::= SHOW LICENCES */ - { 319, -2 }, /* (221) cmd ::= SHOW GRANTS */ - { 319, -4 }, /* (222) cmd ::= SHOW CREATE DATABASE db_name */ - { 319, -4 }, /* (223) cmd ::= SHOW CREATE TABLE full_table_name */ - { 319, -4 }, /* (224) cmd ::= SHOW CREATE STABLE full_table_name */ - { 319, -2 }, /* (225) cmd ::= SHOW QUERIES */ - { 319, -2 }, /* (226) cmd ::= SHOW SCORES */ - { 319, -2 }, /* (227) cmd ::= SHOW TOPICS */ - { 319, -2 }, /* (228) cmd ::= SHOW VARIABLES */ - { 319, -3 }, /* (229) cmd ::= SHOW CLUSTER VARIABLES */ - { 319, -3 }, /* (230) cmd ::= SHOW LOCAL VARIABLES */ - { 319, -5 }, /* (231) cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt */ - { 319, -2 }, /* (232) cmd ::= SHOW BNODES */ - { 319, -2 }, /* (233) cmd ::= SHOW SNODES */ - { 319, -2 }, /* (234) cmd ::= SHOW CLUSTER */ - { 319, -2 }, /* (235) cmd ::= SHOW TRANSACTIONS */ - { 319, -4 }, /* (236) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ - { 319, -2 }, /* (237) cmd ::= SHOW CONSUMERS */ - { 319, -2 }, /* (238) cmd ::= SHOW SUBSCRIPTIONS */ - { 319, -5 }, /* (239) cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ - { 319, -7 }, /* (240) cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt */ - { 319, -3 }, /* (241) cmd ::= SHOW VNODES NK_INTEGER */ - { 319, -3 }, /* (242) cmd ::= SHOW VNODES NK_STRING */ - { 369, 0 }, /* (243) db_name_cond_opt ::= */ - { 369, -2 }, /* (244) db_name_cond_opt ::= db_name NK_DOT */ - { 370, 0 }, /* (245) like_pattern_opt ::= */ - { 370, -2 }, /* (246) like_pattern_opt ::= LIKE NK_STRING */ - { 371, -1 }, /* (247) table_name_cond ::= table_name */ - { 372, 0 }, /* (248) from_db_opt ::= */ - { 372, -2 }, /* (249) from_db_opt ::= FROM db_name */ - { 373, 0 }, /* (250) tag_list_opt ::= */ - { 373, -1 }, /* (251) tag_list_opt ::= tag_item */ - { 373, -3 }, /* (252) tag_list_opt ::= tag_list_opt NK_COMMA tag_item */ - { 374, -1 }, /* (253) tag_item ::= TBNAME */ - { 374, -1 }, /* (254) tag_item ::= QTAGS */ - { 374, -1 }, /* (255) tag_item ::= column_name */ - { 374, -2 }, /* (256) tag_item ::= column_name column_alias */ - { 374, -3 }, /* (257) tag_item ::= column_name AS column_alias */ - { 319, -8 }, /* (258) cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ - { 319, -4 }, /* (259) cmd ::= DROP INDEX exists_opt full_table_name */ - { 376, -10 }, /* (260) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ - { 376, -12 }, /* (261) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ - { 377, -1 }, /* (262) func_list ::= func */ - { 377, -3 }, /* (263) func_list ::= func_list NK_COMMA func */ - { 380, -4 }, /* (264) func ::= function_name NK_LP expression_list NK_RP */ - { 379, 0 }, /* (265) sma_stream_opt ::= */ - { 379, -3 }, /* (266) sma_stream_opt ::= stream_options WATERMARK duration_literal */ - { 379, -3 }, /* (267) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ - { 319, -6 }, /* (268) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ - { 319, -7 }, /* (269) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ - { 319, -9 }, /* (270) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ - { 319, -7 }, /* (271) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ - { 319, -9 }, /* (272) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ - { 319, -4 }, /* (273) cmd ::= DROP TOPIC exists_opt topic_name */ - { 319, -7 }, /* (274) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ - { 319, -2 }, /* (275) cmd ::= DESC full_table_name */ - { 319, -2 }, /* (276) cmd ::= DESCRIBE full_table_name */ - { 319, -3 }, /* (277) cmd ::= RESET QUERY CACHE */ - { 319, -4 }, /* (278) cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ - { 385, 0 }, /* (279) analyze_opt ::= */ - { 385, -1 }, /* (280) analyze_opt ::= ANALYZE */ - { 386, 0 }, /* (281) explain_options ::= */ - { 386, -3 }, /* (282) explain_options ::= explain_options VERBOSE NK_BOOL */ - { 386, -3 }, /* (283) explain_options ::= explain_options RATIO NK_FLOAT */ - { 319, -10 }, /* (284) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ - { 319, -4 }, /* (285) cmd ::= DROP FUNCTION exists_opt function_name */ - { 387, 0 }, /* (286) agg_func_opt ::= */ - { 387, -1 }, /* (287) agg_func_opt ::= AGGREGATE */ - { 388, 0 }, /* (288) bufsize_opt ::= */ - { 388, -2 }, /* (289) bufsize_opt ::= BUFSIZE NK_INTEGER */ - { 319, -11 }, /* (290) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */ - { 319, -4 }, /* (291) cmd ::= DROP STREAM exists_opt stream_name */ - { 381, 0 }, /* (292) stream_options ::= */ - { 381, -3 }, /* (293) stream_options ::= stream_options TRIGGER AT_ONCE */ - { 381, -3 }, /* (294) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ - { 381, -4 }, /* (295) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ - { 381, -3 }, /* (296) stream_options ::= stream_options WATERMARK duration_literal */ - { 381, -4 }, /* (297) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ - { 381, -3 }, /* (298) stream_options ::= stream_options FILL_HISTORY NK_INTEGER */ - { 390, 0 }, /* (299) subtable_opt ::= */ - { 390, -4 }, /* (300) subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ - { 319, -3 }, /* (301) cmd ::= KILL CONNECTION NK_INTEGER */ - { 319, -3 }, /* (302) cmd ::= KILL QUERY NK_STRING */ - { 319, -3 }, /* (303) cmd ::= KILL TRANSACTION NK_INTEGER */ - { 319, -2 }, /* (304) cmd ::= BALANCE VGROUP */ - { 319, -4 }, /* (305) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ - { 319, -4 }, /* (306) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ - { 319, -3 }, /* (307) cmd ::= SPLIT VGROUP NK_INTEGER */ - { 392, -2 }, /* (308) dnode_list ::= DNODE NK_INTEGER */ - { 392, -3 }, /* (309) dnode_list ::= dnode_list DNODE NK_INTEGER */ - { 319, -4 }, /* (310) cmd ::= DELETE FROM full_table_name where_clause_opt */ - { 319, -1 }, /* (311) cmd ::= query_or_subquery */ - { 319, -7 }, /* (312) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ - { 319, -4 }, /* (313) cmd ::= INSERT INTO full_table_name query_or_subquery */ - { 322, -1 }, /* (314) literal ::= NK_INTEGER */ - { 322, -1 }, /* (315) literal ::= NK_FLOAT */ - { 322, -1 }, /* (316) literal ::= NK_STRING */ - { 322, -1 }, /* (317) literal ::= NK_BOOL */ - { 322, -2 }, /* (318) literal ::= TIMESTAMP NK_STRING */ - { 322, -1 }, /* (319) literal ::= duration_literal */ - { 322, -1 }, /* (320) literal ::= NULL */ - { 322, -1 }, /* (321) literal ::= NK_QUESTION */ - { 365, -1 }, /* (322) duration_literal ::= NK_VARIABLE */ - { 394, -1 }, /* (323) signed ::= NK_INTEGER */ - { 394, -2 }, /* (324) signed ::= NK_PLUS NK_INTEGER */ - { 394, -2 }, /* (325) signed ::= NK_MINUS NK_INTEGER */ - { 394, -1 }, /* (326) signed ::= NK_FLOAT */ - { 394, -2 }, /* (327) signed ::= NK_PLUS NK_FLOAT */ - { 394, -2 }, /* (328) signed ::= NK_MINUS NK_FLOAT */ - { 354, -1 }, /* (329) signed_literal ::= signed */ - { 354, -1 }, /* (330) signed_literal ::= NK_STRING */ - { 354, -1 }, /* (331) signed_literal ::= NK_BOOL */ - { 354, -2 }, /* (332) signed_literal ::= TIMESTAMP NK_STRING */ - { 354, -1 }, /* (333) signed_literal ::= duration_literal */ - { 354, -1 }, /* (334) signed_literal ::= NULL */ - { 354, -1 }, /* (335) signed_literal ::= literal_func */ - { 354, -1 }, /* (336) signed_literal ::= NK_QUESTION */ - { 396, -1 }, /* (337) literal_list ::= signed_literal */ - { 396, -3 }, /* (338) literal_list ::= literal_list NK_COMMA signed_literal */ - { 330, -1 }, /* (339) db_name ::= NK_ID */ - { 360, -1 }, /* (340) table_name ::= NK_ID */ - { 352, -1 }, /* (341) column_name ::= NK_ID */ - { 367, -1 }, /* (342) function_name ::= NK_ID */ - { 397, -1 }, /* (343) table_alias ::= NK_ID */ - { 375, -1 }, /* (344) column_alias ::= NK_ID */ - { 324, -1 }, /* (345) user_name ::= NK_ID */ - { 382, -1 }, /* (346) topic_name ::= NK_ID */ - { 389, -1 }, /* (347) stream_name ::= NK_ID */ - { 384, -1 }, /* (348) cgroup_name ::= NK_ID */ - { 398, -1 }, /* (349) expr_or_subquery ::= expression */ - { 391, -1 }, /* (350) expression ::= literal */ - { 391, -1 }, /* (351) expression ::= pseudo_column */ - { 391, -1 }, /* (352) expression ::= column_reference */ - { 391, -1 }, /* (353) expression ::= function_expression */ - { 391, -1 }, /* (354) expression ::= case_when_expression */ - { 391, -3 }, /* (355) expression ::= NK_LP expression NK_RP */ - { 391, -2 }, /* (356) expression ::= NK_PLUS expr_or_subquery */ - { 391, -2 }, /* (357) expression ::= NK_MINUS expr_or_subquery */ - { 391, -3 }, /* (358) expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ - { 391, -3 }, /* (359) expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ - { 391, -3 }, /* (360) expression ::= expr_or_subquery NK_STAR expr_or_subquery */ - { 391, -3 }, /* (361) expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ - { 391, -3 }, /* (362) expression ::= expr_or_subquery NK_REM expr_or_subquery */ - { 391, -3 }, /* (363) expression ::= column_reference NK_ARROW NK_STRING */ - { 391, -3 }, /* (364) expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ - { 391, -3 }, /* (365) expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ - { 357, -1 }, /* (366) expression_list ::= expr_or_subquery */ - { 357, -3 }, /* (367) expression_list ::= expression_list NK_COMMA expr_or_subquery */ - { 400, -1 }, /* (368) column_reference ::= column_name */ - { 400, -3 }, /* (369) column_reference ::= table_name NK_DOT column_name */ - { 399, -1 }, /* (370) pseudo_column ::= ROWTS */ - { 399, -1 }, /* (371) pseudo_column ::= TBNAME */ - { 399, -3 }, /* (372) pseudo_column ::= table_name NK_DOT TBNAME */ - { 399, -1 }, /* (373) pseudo_column ::= QSTART */ - { 399, -1 }, /* (374) pseudo_column ::= QEND */ - { 399, -1 }, /* (375) pseudo_column ::= QDURATION */ - { 399, -1 }, /* (376) pseudo_column ::= WSTART */ - { 399, -1 }, /* (377) pseudo_column ::= WEND */ - { 399, -1 }, /* (378) pseudo_column ::= WDURATION */ - { 399, -1 }, /* (379) pseudo_column ::= IROWTS */ - { 399, -1 }, /* (380) pseudo_column ::= QTAGS */ - { 401, -4 }, /* (381) function_expression ::= function_name NK_LP expression_list NK_RP */ - { 401, -4 }, /* (382) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ - { 401, -6 }, /* (383) function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ - { 401, -1 }, /* (384) function_expression ::= literal_func */ - { 395, -3 }, /* (385) literal_func ::= noarg_func NK_LP NK_RP */ - { 395, -1 }, /* (386) literal_func ::= NOW */ - { 405, -1 }, /* (387) noarg_func ::= NOW */ - { 405, -1 }, /* (388) noarg_func ::= TODAY */ - { 405, -1 }, /* (389) noarg_func ::= TIMEZONE */ - { 405, -1 }, /* (390) noarg_func ::= DATABASE */ - { 405, -1 }, /* (391) noarg_func ::= CLIENT_VERSION */ - { 405, -1 }, /* (392) noarg_func ::= SERVER_VERSION */ - { 405, -1 }, /* (393) noarg_func ::= SERVER_STATUS */ - { 405, -1 }, /* (394) noarg_func ::= CURRENT_USER */ - { 405, -1 }, /* (395) noarg_func ::= USER */ - { 403, -1 }, /* (396) star_func ::= COUNT */ - { 403, -1 }, /* (397) star_func ::= FIRST */ - { 403, -1 }, /* (398) star_func ::= LAST */ - { 403, -1 }, /* (399) star_func ::= LAST_ROW */ - { 404, -1 }, /* (400) star_func_para_list ::= NK_STAR */ - { 404, -1 }, /* (401) star_func_para_list ::= other_para_list */ - { 406, -1 }, /* (402) other_para_list ::= star_func_para */ - { 406, -3 }, /* (403) other_para_list ::= other_para_list NK_COMMA star_func_para */ - { 407, -1 }, /* (404) star_func_para ::= expr_or_subquery */ - { 407, -3 }, /* (405) star_func_para ::= table_name NK_DOT NK_STAR */ - { 402, -4 }, /* (406) case_when_expression ::= CASE when_then_list case_when_else_opt END */ - { 402, -5 }, /* (407) case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ - { 408, -1 }, /* (408) when_then_list ::= when_then_expr */ - { 408, -2 }, /* (409) when_then_list ::= when_then_list when_then_expr */ - { 411, -4 }, /* (410) when_then_expr ::= WHEN common_expression THEN common_expression */ - { 409, 0 }, /* (411) case_when_else_opt ::= */ - { 409, -2 }, /* (412) case_when_else_opt ::= ELSE common_expression */ - { 412, -3 }, /* (413) predicate ::= expr_or_subquery compare_op expr_or_subquery */ - { 412, -5 }, /* (414) predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ - { 412, -6 }, /* (415) predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ - { 412, -3 }, /* (416) predicate ::= expr_or_subquery IS NULL */ - { 412, -4 }, /* (417) predicate ::= expr_or_subquery IS NOT NULL */ - { 412, -3 }, /* (418) predicate ::= expr_or_subquery in_op in_predicate_value */ - { 413, -1 }, /* (419) compare_op ::= NK_LT */ - { 413, -1 }, /* (420) compare_op ::= NK_GT */ - { 413, -1 }, /* (421) compare_op ::= NK_LE */ - { 413, -1 }, /* (422) compare_op ::= NK_GE */ - { 413, -1 }, /* (423) compare_op ::= NK_NE */ - { 413, -1 }, /* (424) compare_op ::= NK_EQ */ - { 413, -1 }, /* (425) compare_op ::= LIKE */ - { 413, -2 }, /* (426) compare_op ::= NOT LIKE */ - { 413, -1 }, /* (427) compare_op ::= MATCH */ - { 413, -1 }, /* (428) compare_op ::= NMATCH */ - { 413, -1 }, /* (429) compare_op ::= CONTAINS */ - { 414, -1 }, /* (430) in_op ::= IN */ - { 414, -2 }, /* (431) in_op ::= NOT IN */ - { 415, -3 }, /* (432) in_predicate_value ::= NK_LP literal_list NK_RP */ - { 416, -1 }, /* (433) boolean_value_expression ::= boolean_primary */ - { 416, -2 }, /* (434) boolean_value_expression ::= NOT boolean_primary */ - { 416, -3 }, /* (435) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ - { 416, -3 }, /* (436) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ - { 417, -1 }, /* (437) boolean_primary ::= predicate */ - { 417, -3 }, /* (438) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ - { 410, -1 }, /* (439) common_expression ::= expr_or_subquery */ - { 410, -1 }, /* (440) common_expression ::= boolean_value_expression */ - { 418, 0 }, /* (441) from_clause_opt ::= */ - { 418, -2 }, /* (442) from_clause_opt ::= FROM table_reference_list */ - { 419, -1 }, /* (443) table_reference_list ::= table_reference */ - { 419, -3 }, /* (444) table_reference_list ::= table_reference_list NK_COMMA table_reference */ - { 420, -1 }, /* (445) table_reference ::= table_primary */ - { 420, -1 }, /* (446) table_reference ::= joined_table */ - { 421, -2 }, /* (447) table_primary ::= table_name alias_opt */ - { 421, -4 }, /* (448) table_primary ::= db_name NK_DOT table_name alias_opt */ - { 421, -2 }, /* (449) table_primary ::= subquery alias_opt */ - { 421, -1 }, /* (450) table_primary ::= parenthesized_joined_table */ - { 423, 0 }, /* (451) alias_opt ::= */ - { 423, -1 }, /* (452) alias_opt ::= table_alias */ - { 423, -2 }, /* (453) alias_opt ::= AS table_alias */ - { 425, -3 }, /* (454) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - { 425, -3 }, /* (455) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ - { 422, -6 }, /* (456) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ - { 426, 0 }, /* (457) join_type ::= */ - { 426, -1 }, /* (458) join_type ::= INNER */ - { 428, -12 }, /* (459) query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ - { 429, 0 }, /* (460) set_quantifier_opt ::= */ - { 429, -1 }, /* (461) set_quantifier_opt ::= DISTINCT */ - { 429, -1 }, /* (462) set_quantifier_opt ::= ALL */ - { 430, -1 }, /* (463) select_list ::= select_item */ - { 430, -3 }, /* (464) select_list ::= select_list NK_COMMA select_item */ - { 438, -1 }, /* (465) select_item ::= NK_STAR */ - { 438, -1 }, /* (466) select_item ::= common_expression */ - { 438, -2 }, /* (467) select_item ::= common_expression column_alias */ - { 438, -3 }, /* (468) select_item ::= common_expression AS column_alias */ - { 438, -3 }, /* (469) select_item ::= table_name NK_DOT NK_STAR */ - { 393, 0 }, /* (470) where_clause_opt ::= */ - { 393, -2 }, /* (471) where_clause_opt ::= WHERE search_condition */ - { 431, 0 }, /* (472) partition_by_clause_opt ::= */ - { 431, -3 }, /* (473) partition_by_clause_opt ::= PARTITION BY partition_list */ - { 439, -1 }, /* (474) partition_list ::= partition_item */ - { 439, -3 }, /* (475) partition_list ::= partition_list NK_COMMA partition_item */ - { 440, -1 }, /* (476) partition_item ::= expr_or_subquery */ - { 440, -2 }, /* (477) partition_item ::= expr_or_subquery column_alias */ - { 440, -3 }, /* (478) partition_item ::= expr_or_subquery AS column_alias */ - { 435, 0 }, /* (479) twindow_clause_opt ::= */ - { 435, -6 }, /* (480) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ - { 435, -4 }, /* (481) twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ - { 435, -6 }, /* (482) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ - { 435, -8 }, /* (483) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ - { 378, 0 }, /* (484) sliding_opt ::= */ - { 378, -4 }, /* (485) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - { 434, 0 }, /* (486) fill_opt ::= */ - { 434, -4 }, /* (487) fill_opt ::= FILL NK_LP fill_mode NK_RP */ - { 434, -6 }, /* (488) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ - { 441, -1 }, /* (489) fill_mode ::= NONE */ - { 441, -1 }, /* (490) fill_mode ::= PREV */ - { 441, -1 }, /* (491) fill_mode ::= NULL */ - { 441, -1 }, /* (492) fill_mode ::= LINEAR */ - { 441, -1 }, /* (493) fill_mode ::= NEXT */ - { 436, 0 }, /* (494) group_by_clause_opt ::= */ - { 436, -3 }, /* (495) group_by_clause_opt ::= GROUP BY group_by_list */ - { 442, -1 }, /* (496) group_by_list ::= expr_or_subquery */ - { 442, -3 }, /* (497) group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ - { 437, 0 }, /* (498) having_clause_opt ::= */ - { 437, -2 }, /* (499) having_clause_opt ::= HAVING search_condition */ - { 432, 0 }, /* (500) range_opt ::= */ - { 432, -6 }, /* (501) range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ - { 433, 0 }, /* (502) every_opt ::= */ - { 433, -4 }, /* (503) every_opt ::= EVERY NK_LP duration_literal NK_RP */ - { 443, -4 }, /* (504) query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ - { 444, -1 }, /* (505) query_simple ::= query_specification */ - { 444, -1 }, /* (506) query_simple ::= union_query_expression */ - { 448, -4 }, /* (507) union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ - { 448, -3 }, /* (508) union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ - { 449, -1 }, /* (509) query_simple_or_subquery ::= query_simple */ - { 449, -1 }, /* (510) query_simple_or_subquery ::= subquery */ - { 383, -1 }, /* (511) query_or_subquery ::= query_expression */ - { 383, -1 }, /* (512) query_or_subquery ::= subquery */ - { 445, 0 }, /* (513) order_by_clause_opt ::= */ - { 445, -3 }, /* (514) order_by_clause_opt ::= ORDER BY sort_specification_list */ - { 446, 0 }, /* (515) slimit_clause_opt ::= */ - { 446, -2 }, /* (516) slimit_clause_opt ::= SLIMIT NK_INTEGER */ - { 446, -4 }, /* (517) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - { 446, -4 }, /* (518) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 447, 0 }, /* (519) limit_clause_opt ::= */ - { 447, -2 }, /* (520) limit_clause_opt ::= LIMIT NK_INTEGER */ - { 447, -4 }, /* (521) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ - { 447, -4 }, /* (522) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 424, -3 }, /* (523) subquery ::= NK_LP query_expression NK_RP */ - { 424, -3 }, /* (524) subquery ::= NK_LP subquery NK_RP */ - { 427, -1 }, /* (525) search_condition ::= common_expression */ - { 450, -1 }, /* (526) sort_specification_list ::= sort_specification */ - { 450, -3 }, /* (527) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ - { 451, -3 }, /* (528) sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ - { 452, 0 }, /* (529) ordering_specification_opt ::= */ - { 452, -1 }, /* (530) ordering_specification_opt ::= ASC */ - { 452, -1 }, /* (531) ordering_specification_opt ::= DESC */ - { 453, 0 }, /* (532) null_ordering_opt ::= */ - { 453, -2 }, /* (533) null_ordering_opt ::= NULLS FIRST */ - { 453, -2 }, /* (534) null_ordering_opt ::= NULLS LAST */ + { 321, -6 }, /* (0) cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ + { 321, -4 }, /* (1) cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ + { 322, 0 }, /* (2) account_options ::= */ + { 322, -3 }, /* (3) account_options ::= account_options PPS literal */ + { 322, -3 }, /* (4) account_options ::= account_options TSERIES literal */ + { 322, -3 }, /* (5) account_options ::= account_options STORAGE literal */ + { 322, -3 }, /* (6) account_options ::= account_options STREAMS literal */ + { 322, -3 }, /* (7) account_options ::= account_options QTIME literal */ + { 322, -3 }, /* (8) account_options ::= account_options DBS literal */ + { 322, -3 }, /* (9) account_options ::= account_options USERS literal */ + { 322, -3 }, /* (10) account_options ::= account_options CONNS literal */ + { 322, -3 }, /* (11) account_options ::= account_options STATE literal */ + { 323, -1 }, /* (12) alter_account_options ::= alter_account_option */ + { 323, -2 }, /* (13) alter_account_options ::= alter_account_options alter_account_option */ + { 325, -2 }, /* (14) alter_account_option ::= PASS literal */ + { 325, -2 }, /* (15) alter_account_option ::= PPS literal */ + { 325, -2 }, /* (16) alter_account_option ::= TSERIES literal */ + { 325, -2 }, /* (17) alter_account_option ::= STORAGE literal */ + { 325, -2 }, /* (18) alter_account_option ::= STREAMS literal */ + { 325, -2 }, /* (19) alter_account_option ::= QTIME literal */ + { 325, -2 }, /* (20) alter_account_option ::= DBS literal */ + { 325, -2 }, /* (21) alter_account_option ::= USERS literal */ + { 325, -2 }, /* (22) alter_account_option ::= CONNS literal */ + { 325, -2 }, /* (23) alter_account_option ::= STATE literal */ + { 321, -6 }, /* (24) cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ + { 321, -5 }, /* (25) cmd ::= ALTER USER user_name PASS NK_STRING */ + { 321, -5 }, /* (26) cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ + { 321, -5 }, /* (27) cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ + { 321, -3 }, /* (28) cmd ::= DROP USER user_name */ + { 327, 0 }, /* (29) sysinfo_opt ::= */ + { 327, -2 }, /* (30) sysinfo_opt ::= SYSINFO NK_INTEGER */ + { 321, -6 }, /* (31) cmd ::= GRANT privileges ON priv_level TO user_name */ + { 321, -6 }, /* (32) cmd ::= REVOKE privileges ON priv_level FROM user_name */ + { 328, -1 }, /* (33) privileges ::= ALL */ + { 328, -1 }, /* (34) privileges ::= priv_type_list */ + { 328, -1 }, /* (35) privileges ::= SUBSCRIBE */ + { 330, -1 }, /* (36) priv_type_list ::= priv_type */ + { 330, -3 }, /* (37) priv_type_list ::= priv_type_list NK_COMMA priv_type */ + { 331, -1 }, /* (38) priv_type ::= READ */ + { 331, -1 }, /* (39) priv_type ::= WRITE */ + { 329, -3 }, /* (40) priv_level ::= NK_STAR NK_DOT NK_STAR */ + { 329, -3 }, /* (41) priv_level ::= db_name NK_DOT NK_STAR */ + { 329, -1 }, /* (42) priv_level ::= topic_name */ + { 321, -3 }, /* (43) cmd ::= CREATE DNODE dnode_endpoint */ + { 321, -5 }, /* (44) cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ + { 321, -4 }, /* (45) cmd ::= DROP DNODE NK_INTEGER force_opt */ + { 321, -4 }, /* (46) cmd ::= DROP DNODE dnode_endpoint force_opt */ + { 321, -4 }, /* (47) cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ + { 321, -5 }, /* (48) cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ + { 321, -4 }, /* (49) cmd ::= ALTER ALL DNODES NK_STRING */ + { 321, -5 }, /* (50) cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ + { 334, -1 }, /* (51) dnode_endpoint ::= NK_STRING */ + { 334, -1 }, /* (52) dnode_endpoint ::= NK_ID */ + { 334, -1 }, /* (53) dnode_endpoint ::= NK_IPTOKEN */ + { 335, 0 }, /* (54) force_opt ::= */ + { 335, -1 }, /* (55) force_opt ::= FORCE */ + { 321, -3 }, /* (56) cmd ::= ALTER LOCAL NK_STRING */ + { 321, -4 }, /* (57) cmd ::= ALTER LOCAL NK_STRING NK_STRING */ + { 321, -5 }, /* (58) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ + { 321, -5 }, /* (59) cmd ::= DROP QNODE ON DNODE NK_INTEGER */ + { 321, -5 }, /* (60) cmd ::= CREATE BNODE ON DNODE NK_INTEGER */ + { 321, -5 }, /* (61) cmd ::= DROP BNODE ON DNODE NK_INTEGER */ + { 321, -5 }, /* (62) cmd ::= CREATE SNODE ON DNODE NK_INTEGER */ + { 321, -5 }, /* (63) cmd ::= DROP SNODE ON DNODE NK_INTEGER */ + { 321, -5 }, /* (64) cmd ::= CREATE MNODE ON DNODE NK_INTEGER */ + { 321, -5 }, /* (65) cmd ::= DROP MNODE ON DNODE NK_INTEGER */ + { 321, -5 }, /* (66) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ + { 321, -4 }, /* (67) cmd ::= DROP DATABASE exists_opt db_name */ + { 321, -2 }, /* (68) cmd ::= USE db_name */ + { 321, -4 }, /* (69) cmd ::= ALTER DATABASE db_name alter_db_options */ + { 321, -3 }, /* (70) cmd ::= FLUSH DATABASE db_name */ + { 321, -4 }, /* (71) cmd ::= TRIM DATABASE db_name speed_opt */ + { 336, -3 }, /* (72) not_exists_opt ::= IF NOT EXISTS */ + { 336, 0 }, /* (73) not_exists_opt ::= */ + { 338, -2 }, /* (74) exists_opt ::= IF EXISTS */ + { 338, 0 }, /* (75) exists_opt ::= */ + { 337, 0 }, /* (76) db_options ::= */ + { 337, -3 }, /* (77) db_options ::= db_options BUFFER NK_INTEGER */ + { 337, -3 }, /* (78) db_options ::= db_options CACHEMODEL NK_STRING */ + { 337, -3 }, /* (79) db_options ::= db_options CACHESIZE NK_INTEGER */ + { 337, -3 }, /* (80) db_options ::= db_options COMP NK_INTEGER */ + { 337, -3 }, /* (81) db_options ::= db_options DURATION NK_INTEGER */ + { 337, -3 }, /* (82) db_options ::= db_options DURATION NK_VARIABLE */ + { 337, -3 }, /* (83) db_options ::= db_options MAXROWS NK_INTEGER */ + { 337, -3 }, /* (84) db_options ::= db_options MINROWS NK_INTEGER */ + { 337, -3 }, /* (85) db_options ::= db_options KEEP integer_list */ + { 337, -3 }, /* (86) db_options ::= db_options KEEP variable_list */ + { 337, -3 }, /* (87) db_options ::= db_options PAGES NK_INTEGER */ + { 337, -3 }, /* (88) db_options ::= db_options PAGESIZE NK_INTEGER */ + { 337, -3 }, /* (89) db_options ::= db_options TSDB_PAGESIZE NK_INTEGER */ + { 337, -3 }, /* (90) db_options ::= db_options PRECISION NK_STRING */ + { 337, -3 }, /* (91) db_options ::= db_options REPLICA NK_INTEGER */ + { 337, -3 }, /* (92) db_options ::= db_options STRICT NK_STRING */ + { 337, -3 }, /* (93) db_options ::= db_options VGROUPS NK_INTEGER */ + { 337, -3 }, /* (94) db_options ::= db_options SINGLE_STABLE NK_INTEGER */ + { 337, -3 }, /* (95) db_options ::= db_options RETENTIONS retention_list */ + { 337, -3 }, /* (96) db_options ::= db_options SCHEMALESS NK_INTEGER */ + { 337, -3 }, /* (97) db_options ::= db_options WAL_LEVEL NK_INTEGER */ + { 337, -3 }, /* (98) db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */ + { 337, -3 }, /* (99) db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */ + { 337, -4 }, /* (100) db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */ + { 337, -3 }, /* (101) db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */ + { 337, -4 }, /* (102) db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */ + { 337, -3 }, /* (103) db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */ + { 337, -3 }, /* (104) db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */ + { 337, -3 }, /* (105) db_options ::= db_options STT_TRIGGER NK_INTEGER */ + { 337, -3 }, /* (106) db_options ::= db_options TABLE_PREFIX NK_INTEGER */ + { 337, -3 }, /* (107) db_options ::= db_options TABLE_SUFFIX NK_INTEGER */ + { 339, -1 }, /* (108) alter_db_options ::= alter_db_option */ + { 339, -2 }, /* (109) alter_db_options ::= alter_db_options alter_db_option */ + { 344, -2 }, /* (110) alter_db_option ::= BUFFER NK_INTEGER */ + { 344, -2 }, /* (111) alter_db_option ::= CACHEMODEL NK_STRING */ + { 344, -2 }, /* (112) alter_db_option ::= CACHESIZE NK_INTEGER */ + { 344, -2 }, /* (113) alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ + { 344, -2 }, /* (114) alter_db_option ::= KEEP integer_list */ + { 344, -2 }, /* (115) alter_db_option ::= KEEP variable_list */ + { 344, -2 }, /* (116) alter_db_option ::= PAGES NK_INTEGER */ + { 344, -2 }, /* (117) alter_db_option ::= REPLICA NK_INTEGER */ + { 344, -2 }, /* (118) alter_db_option ::= STRICT NK_STRING */ + { 344, -2 }, /* (119) alter_db_option ::= WAL_LEVEL NK_INTEGER */ + { 344, -2 }, /* (120) alter_db_option ::= STT_TRIGGER NK_INTEGER */ + { 341, -1 }, /* (121) integer_list ::= NK_INTEGER */ + { 341, -3 }, /* (122) integer_list ::= integer_list NK_COMMA NK_INTEGER */ + { 342, -1 }, /* (123) variable_list ::= NK_VARIABLE */ + { 342, -3 }, /* (124) variable_list ::= variable_list NK_COMMA NK_VARIABLE */ + { 343, -1 }, /* (125) retention_list ::= retention */ + { 343, -3 }, /* (126) retention_list ::= retention_list NK_COMMA retention */ + { 345, -3 }, /* (127) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ + { 340, 0 }, /* (128) speed_opt ::= */ + { 340, -2 }, /* (129) speed_opt ::= MAX_SPEED NK_INTEGER */ + { 321, -9 }, /* (130) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + { 321, -3 }, /* (131) cmd ::= CREATE TABLE multi_create_clause */ + { 321, -9 }, /* (132) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ + { 321, -3 }, /* (133) cmd ::= DROP TABLE multi_drop_clause */ + { 321, -4 }, /* (134) cmd ::= DROP STABLE exists_opt full_table_name */ + { 321, -3 }, /* (135) cmd ::= ALTER TABLE alter_table_clause */ + { 321, -3 }, /* (136) cmd ::= ALTER STABLE alter_table_clause */ + { 353, -2 }, /* (137) alter_table_clause ::= full_table_name alter_table_options */ + { 353, -5 }, /* (138) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ + { 353, -4 }, /* (139) alter_table_clause ::= full_table_name DROP COLUMN column_name */ + { 353, -5 }, /* (140) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ + { 353, -5 }, /* (141) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ + { 353, -5 }, /* (142) alter_table_clause ::= full_table_name ADD TAG column_name type_name */ + { 353, -4 }, /* (143) alter_table_clause ::= full_table_name DROP TAG column_name */ + { 353, -5 }, /* (144) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ + { 353, -5 }, /* (145) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ + { 353, -6 }, /* (146) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ + { 350, -1 }, /* (147) multi_create_clause ::= create_subtable_clause */ + { 350, -2 }, /* (148) multi_create_clause ::= multi_create_clause create_subtable_clause */ + { 358, -10 }, /* (149) create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ + { 352, -1 }, /* (150) multi_drop_clause ::= drop_table_clause */ + { 352, -2 }, /* (151) multi_drop_clause ::= multi_drop_clause drop_table_clause */ + { 361, -2 }, /* (152) drop_table_clause ::= exists_opt full_table_name */ + { 359, 0 }, /* (153) specific_cols_opt ::= */ + { 359, -3 }, /* (154) specific_cols_opt ::= NK_LP col_name_list NK_RP */ + { 346, -1 }, /* (155) full_table_name ::= table_name */ + { 346, -3 }, /* (156) full_table_name ::= db_name NK_DOT table_name */ + { 347, -1 }, /* (157) column_def_list ::= column_def */ + { 347, -3 }, /* (158) column_def_list ::= column_def_list NK_COMMA column_def */ + { 364, -2 }, /* (159) column_def ::= column_name type_name */ + { 364, -4 }, /* (160) column_def ::= column_name type_name COMMENT NK_STRING */ + { 356, -1 }, /* (161) type_name ::= BOOL */ + { 356, -1 }, /* (162) type_name ::= TINYINT */ + { 356, -1 }, /* (163) type_name ::= SMALLINT */ + { 356, -1 }, /* (164) type_name ::= INT */ + { 356, -1 }, /* (165) type_name ::= INTEGER */ + { 356, -1 }, /* (166) type_name ::= BIGINT */ + { 356, -1 }, /* (167) type_name ::= FLOAT */ + { 356, -1 }, /* (168) type_name ::= DOUBLE */ + { 356, -4 }, /* (169) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ + { 356, -1 }, /* (170) type_name ::= TIMESTAMP */ + { 356, -4 }, /* (171) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ + { 356, -2 }, /* (172) type_name ::= TINYINT UNSIGNED */ + { 356, -2 }, /* (173) type_name ::= SMALLINT UNSIGNED */ + { 356, -2 }, /* (174) type_name ::= INT UNSIGNED */ + { 356, -2 }, /* (175) type_name ::= BIGINT UNSIGNED */ + { 356, -1 }, /* (176) type_name ::= JSON */ + { 356, -4 }, /* (177) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ + { 356, -1 }, /* (178) type_name ::= MEDIUMBLOB */ + { 356, -1 }, /* (179) type_name ::= BLOB */ + { 356, -4 }, /* (180) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ + { 356, -1 }, /* (181) type_name ::= DECIMAL */ + { 356, -4 }, /* (182) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ + { 356, -6 }, /* (183) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ + { 348, 0 }, /* (184) tags_def_opt ::= */ + { 348, -1 }, /* (185) tags_def_opt ::= tags_def */ + { 351, -4 }, /* (186) tags_def ::= TAGS NK_LP column_def_list NK_RP */ + { 349, 0 }, /* (187) table_options ::= */ + { 349, -3 }, /* (188) table_options ::= table_options COMMENT NK_STRING */ + { 349, -3 }, /* (189) table_options ::= table_options MAX_DELAY duration_list */ + { 349, -3 }, /* (190) table_options ::= table_options WATERMARK duration_list */ + { 349, -5 }, /* (191) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ + { 349, -3 }, /* (192) table_options ::= table_options TTL NK_INTEGER */ + { 349, -5 }, /* (193) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ + { 354, -1 }, /* (194) alter_table_options ::= alter_table_option */ + { 354, -2 }, /* (195) alter_table_options ::= alter_table_options alter_table_option */ + { 367, -2 }, /* (196) alter_table_option ::= COMMENT NK_STRING */ + { 367, -2 }, /* (197) alter_table_option ::= TTL NK_INTEGER */ + { 365, -1 }, /* (198) duration_list ::= duration_literal */ + { 365, -3 }, /* (199) duration_list ::= duration_list NK_COMMA duration_literal */ + { 366, -1 }, /* (200) rollup_func_list ::= rollup_func_name */ + { 366, -3 }, /* (201) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ + { 369, -1 }, /* (202) rollup_func_name ::= function_name */ + { 369, -1 }, /* (203) rollup_func_name ::= FIRST */ + { 369, -1 }, /* (204) rollup_func_name ::= LAST */ + { 362, -1 }, /* (205) col_name_list ::= col_name */ + { 362, -3 }, /* (206) col_name_list ::= col_name_list NK_COMMA col_name */ + { 371, -1 }, /* (207) col_name ::= column_name */ + { 321, -2 }, /* (208) cmd ::= SHOW DNODES */ + { 321, -2 }, /* (209) cmd ::= SHOW USERS */ + { 321, -3 }, /* (210) cmd ::= SHOW USER PRIVILEGES */ + { 321, -2 }, /* (211) cmd ::= SHOW DATABASES */ + { 321, -4 }, /* (212) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ + { 321, -4 }, /* (213) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ + { 321, -3 }, /* (214) cmd ::= SHOW db_name_cond_opt VGROUPS */ + { 321, -2 }, /* (215) cmd ::= SHOW MNODES */ + { 321, -2 }, /* (216) cmd ::= SHOW QNODES */ + { 321, -2 }, /* (217) cmd ::= SHOW FUNCTIONS */ + { 321, -5 }, /* (218) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ + { 321, -2 }, /* (219) cmd ::= SHOW STREAMS */ + { 321, -2 }, /* (220) cmd ::= SHOW ACCOUNTS */ + { 321, -2 }, /* (221) cmd ::= SHOW APPS */ + { 321, -2 }, /* (222) cmd ::= SHOW CONNECTIONS */ + { 321, -2 }, /* (223) cmd ::= SHOW LICENCES */ + { 321, -2 }, /* (224) cmd ::= SHOW GRANTS */ + { 321, -4 }, /* (225) cmd ::= SHOW CREATE DATABASE db_name */ + { 321, -4 }, /* (226) cmd ::= SHOW CREATE TABLE full_table_name */ + { 321, -4 }, /* (227) cmd ::= SHOW CREATE STABLE full_table_name */ + { 321, -2 }, /* (228) cmd ::= SHOW QUERIES */ + { 321, -2 }, /* (229) cmd ::= SHOW SCORES */ + { 321, -2 }, /* (230) cmd ::= SHOW TOPICS */ + { 321, -2 }, /* (231) cmd ::= SHOW VARIABLES */ + { 321, -3 }, /* (232) cmd ::= SHOW CLUSTER VARIABLES */ + { 321, -3 }, /* (233) cmd ::= SHOW LOCAL VARIABLES */ + { 321, -5 }, /* (234) cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt */ + { 321, -2 }, /* (235) cmd ::= SHOW BNODES */ + { 321, -2 }, /* (236) cmd ::= SHOW SNODES */ + { 321, -2 }, /* (237) cmd ::= SHOW CLUSTER */ + { 321, -2 }, /* (238) cmd ::= SHOW TRANSACTIONS */ + { 321, -4 }, /* (239) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ + { 321, -2 }, /* (240) cmd ::= SHOW CONSUMERS */ + { 321, -2 }, /* (241) cmd ::= SHOW SUBSCRIPTIONS */ + { 321, -5 }, /* (242) cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ + { 321, -7 }, /* (243) cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt */ + { 321, -3 }, /* (244) cmd ::= SHOW VNODES NK_INTEGER */ + { 321, -3 }, /* (245) cmd ::= SHOW VNODES NK_STRING */ + { 372, 0 }, /* (246) db_name_cond_opt ::= */ + { 372, -2 }, /* (247) db_name_cond_opt ::= db_name NK_DOT */ + { 373, 0 }, /* (248) like_pattern_opt ::= */ + { 373, -2 }, /* (249) like_pattern_opt ::= LIKE NK_STRING */ + { 374, -1 }, /* (250) table_name_cond ::= table_name */ + { 375, 0 }, /* (251) from_db_opt ::= */ + { 375, -2 }, /* (252) from_db_opt ::= FROM db_name */ + { 376, 0 }, /* (253) tag_list_opt ::= */ + { 376, -1 }, /* (254) tag_list_opt ::= tag_item */ + { 376, -3 }, /* (255) tag_list_opt ::= tag_list_opt NK_COMMA tag_item */ + { 377, -1 }, /* (256) tag_item ::= TBNAME */ + { 377, -1 }, /* (257) tag_item ::= QTAGS */ + { 377, -1 }, /* (258) tag_item ::= column_name */ + { 377, -2 }, /* (259) tag_item ::= column_name column_alias */ + { 377, -3 }, /* (260) tag_item ::= column_name AS column_alias */ + { 321, -8 }, /* (261) cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ + { 321, -4 }, /* (262) cmd ::= DROP INDEX exists_opt full_table_name */ + { 379, -10 }, /* (263) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ + { 379, -12 }, /* (264) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ + { 380, -1 }, /* (265) func_list ::= func */ + { 380, -3 }, /* (266) func_list ::= func_list NK_COMMA func */ + { 383, -4 }, /* (267) func ::= function_name NK_LP expression_list NK_RP */ + { 382, 0 }, /* (268) sma_stream_opt ::= */ + { 382, -3 }, /* (269) sma_stream_opt ::= stream_options WATERMARK duration_literal */ + { 382, -3 }, /* (270) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ + { 321, -6 }, /* (271) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ + { 321, -7 }, /* (272) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ + { 321, -9 }, /* (273) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ + { 321, -7 }, /* (274) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ + { 321, -9 }, /* (275) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ + { 321, -4 }, /* (276) cmd ::= DROP TOPIC exists_opt topic_name */ + { 321, -7 }, /* (277) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ + { 321, -2 }, /* (278) cmd ::= DESC full_table_name */ + { 321, -2 }, /* (279) cmd ::= DESCRIBE full_table_name */ + { 321, -3 }, /* (280) cmd ::= RESET QUERY CACHE */ + { 321, -4 }, /* (281) cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ + { 387, 0 }, /* (282) analyze_opt ::= */ + { 387, -1 }, /* (283) analyze_opt ::= ANALYZE */ + { 388, 0 }, /* (284) explain_options ::= */ + { 388, -3 }, /* (285) explain_options ::= explain_options VERBOSE NK_BOOL */ + { 388, -3 }, /* (286) explain_options ::= explain_options RATIO NK_FLOAT */ + { 321, -10 }, /* (287) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ + { 321, -4 }, /* (288) cmd ::= DROP FUNCTION exists_opt function_name */ + { 389, 0 }, /* (289) agg_func_opt ::= */ + { 389, -1 }, /* (290) agg_func_opt ::= AGGREGATE */ + { 390, 0 }, /* (291) bufsize_opt ::= */ + { 390, -2 }, /* (292) bufsize_opt ::= BUFSIZE NK_INTEGER */ + { 321, -11 }, /* (293) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */ + { 321, -4 }, /* (294) cmd ::= DROP STREAM exists_opt stream_name */ + { 384, 0 }, /* (295) stream_options ::= */ + { 384, -3 }, /* (296) stream_options ::= stream_options TRIGGER AT_ONCE */ + { 384, -3 }, /* (297) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ + { 384, -4 }, /* (298) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ + { 384, -3 }, /* (299) stream_options ::= stream_options WATERMARK duration_literal */ + { 384, -4 }, /* (300) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ + { 384, -3 }, /* (301) stream_options ::= stream_options FILL_HISTORY NK_INTEGER */ + { 392, 0 }, /* (302) subtable_opt ::= */ + { 392, -4 }, /* (303) subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ + { 321, -3 }, /* (304) cmd ::= KILL CONNECTION NK_INTEGER */ + { 321, -3 }, /* (305) cmd ::= KILL QUERY NK_STRING */ + { 321, -3 }, /* (306) cmd ::= KILL TRANSACTION NK_INTEGER */ + { 321, -2 }, /* (307) cmd ::= BALANCE VGROUP */ + { 321, -4 }, /* (308) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + { 321, -4 }, /* (309) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ + { 321, -3 }, /* (310) cmd ::= SPLIT VGROUP NK_INTEGER */ + { 394, -2 }, /* (311) dnode_list ::= DNODE NK_INTEGER */ + { 394, -3 }, /* (312) dnode_list ::= dnode_list DNODE NK_INTEGER */ + { 321, -4 }, /* (313) cmd ::= DELETE FROM full_table_name where_clause_opt */ + { 321, -1 }, /* (314) cmd ::= query_or_subquery */ + { 321, -7 }, /* (315) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ + { 321, -4 }, /* (316) cmd ::= INSERT INTO full_table_name query_or_subquery */ + { 324, -1 }, /* (317) literal ::= NK_INTEGER */ + { 324, -1 }, /* (318) literal ::= NK_FLOAT */ + { 324, -1 }, /* (319) literal ::= NK_STRING */ + { 324, -1 }, /* (320) literal ::= NK_BOOL */ + { 324, -2 }, /* (321) literal ::= TIMESTAMP NK_STRING */ + { 324, -1 }, /* (322) literal ::= duration_literal */ + { 324, -1 }, /* (323) literal ::= NULL */ + { 324, -1 }, /* (324) literal ::= NK_QUESTION */ + { 368, -1 }, /* (325) duration_literal ::= NK_VARIABLE */ + { 396, -1 }, /* (326) signed ::= NK_INTEGER */ + { 396, -2 }, /* (327) signed ::= NK_PLUS NK_INTEGER */ + { 396, -2 }, /* (328) signed ::= NK_MINUS NK_INTEGER */ + { 396, -1 }, /* (329) signed ::= NK_FLOAT */ + { 396, -2 }, /* (330) signed ::= NK_PLUS NK_FLOAT */ + { 396, -2 }, /* (331) signed ::= NK_MINUS NK_FLOAT */ + { 357, -1 }, /* (332) signed_literal ::= signed */ + { 357, -1 }, /* (333) signed_literal ::= NK_STRING */ + { 357, -1 }, /* (334) signed_literal ::= NK_BOOL */ + { 357, -2 }, /* (335) signed_literal ::= TIMESTAMP NK_STRING */ + { 357, -1 }, /* (336) signed_literal ::= duration_literal */ + { 357, -1 }, /* (337) signed_literal ::= NULL */ + { 357, -1 }, /* (338) signed_literal ::= literal_func */ + { 357, -1 }, /* (339) signed_literal ::= NK_QUESTION */ + { 398, -1 }, /* (340) literal_list ::= signed_literal */ + { 398, -3 }, /* (341) literal_list ::= literal_list NK_COMMA signed_literal */ + { 332, -1 }, /* (342) db_name ::= NK_ID */ + { 363, -1 }, /* (343) table_name ::= NK_ID */ + { 355, -1 }, /* (344) column_name ::= NK_ID */ + { 370, -1 }, /* (345) function_name ::= NK_ID */ + { 399, -1 }, /* (346) table_alias ::= NK_ID */ + { 378, -1 }, /* (347) column_alias ::= NK_ID */ + { 326, -1 }, /* (348) user_name ::= NK_ID */ + { 333, -1 }, /* (349) topic_name ::= NK_ID */ + { 391, -1 }, /* (350) stream_name ::= NK_ID */ + { 386, -1 }, /* (351) cgroup_name ::= NK_ID */ + { 400, -1 }, /* (352) expr_or_subquery ::= expression */ + { 393, -1 }, /* (353) expression ::= literal */ + { 393, -1 }, /* (354) expression ::= pseudo_column */ + { 393, -1 }, /* (355) expression ::= column_reference */ + { 393, -1 }, /* (356) expression ::= function_expression */ + { 393, -1 }, /* (357) expression ::= case_when_expression */ + { 393, -3 }, /* (358) expression ::= NK_LP expression NK_RP */ + { 393, -2 }, /* (359) expression ::= NK_PLUS expr_or_subquery */ + { 393, -2 }, /* (360) expression ::= NK_MINUS expr_or_subquery */ + { 393, -3 }, /* (361) expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ + { 393, -3 }, /* (362) expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ + { 393, -3 }, /* (363) expression ::= expr_or_subquery NK_STAR expr_or_subquery */ + { 393, -3 }, /* (364) expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ + { 393, -3 }, /* (365) expression ::= expr_or_subquery NK_REM expr_or_subquery */ + { 393, -3 }, /* (366) expression ::= column_reference NK_ARROW NK_STRING */ + { 393, -3 }, /* (367) expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ + { 393, -3 }, /* (368) expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ + { 360, -1 }, /* (369) expression_list ::= expr_or_subquery */ + { 360, -3 }, /* (370) expression_list ::= expression_list NK_COMMA expr_or_subquery */ + { 402, -1 }, /* (371) column_reference ::= column_name */ + { 402, -3 }, /* (372) column_reference ::= table_name NK_DOT column_name */ + { 401, -1 }, /* (373) pseudo_column ::= ROWTS */ + { 401, -1 }, /* (374) pseudo_column ::= TBNAME */ + { 401, -3 }, /* (375) pseudo_column ::= table_name NK_DOT TBNAME */ + { 401, -1 }, /* (376) pseudo_column ::= QSTART */ + { 401, -1 }, /* (377) pseudo_column ::= QEND */ + { 401, -1 }, /* (378) pseudo_column ::= QDURATION */ + { 401, -1 }, /* (379) pseudo_column ::= WSTART */ + { 401, -1 }, /* (380) pseudo_column ::= WEND */ + { 401, -1 }, /* (381) pseudo_column ::= WDURATION */ + { 401, -1 }, /* (382) pseudo_column ::= IROWTS */ + { 401, -1 }, /* (383) pseudo_column ::= QTAGS */ + { 403, -4 }, /* (384) function_expression ::= function_name NK_LP expression_list NK_RP */ + { 403, -4 }, /* (385) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ + { 403, -6 }, /* (386) function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ + { 403, -1 }, /* (387) function_expression ::= literal_func */ + { 397, -3 }, /* (388) literal_func ::= noarg_func NK_LP NK_RP */ + { 397, -1 }, /* (389) literal_func ::= NOW */ + { 407, -1 }, /* (390) noarg_func ::= NOW */ + { 407, -1 }, /* (391) noarg_func ::= TODAY */ + { 407, -1 }, /* (392) noarg_func ::= TIMEZONE */ + { 407, -1 }, /* (393) noarg_func ::= DATABASE */ + { 407, -1 }, /* (394) noarg_func ::= CLIENT_VERSION */ + { 407, -1 }, /* (395) noarg_func ::= SERVER_VERSION */ + { 407, -1 }, /* (396) noarg_func ::= SERVER_STATUS */ + { 407, -1 }, /* (397) noarg_func ::= CURRENT_USER */ + { 407, -1 }, /* (398) noarg_func ::= USER */ + { 405, -1 }, /* (399) star_func ::= COUNT */ + { 405, -1 }, /* (400) star_func ::= FIRST */ + { 405, -1 }, /* (401) star_func ::= LAST */ + { 405, -1 }, /* (402) star_func ::= LAST_ROW */ + { 406, -1 }, /* (403) star_func_para_list ::= NK_STAR */ + { 406, -1 }, /* (404) star_func_para_list ::= other_para_list */ + { 408, -1 }, /* (405) other_para_list ::= star_func_para */ + { 408, -3 }, /* (406) other_para_list ::= other_para_list NK_COMMA star_func_para */ + { 409, -1 }, /* (407) star_func_para ::= expr_or_subquery */ + { 409, -3 }, /* (408) star_func_para ::= table_name NK_DOT NK_STAR */ + { 404, -4 }, /* (409) case_when_expression ::= CASE when_then_list case_when_else_opt END */ + { 404, -5 }, /* (410) case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ + { 410, -1 }, /* (411) when_then_list ::= when_then_expr */ + { 410, -2 }, /* (412) when_then_list ::= when_then_list when_then_expr */ + { 413, -4 }, /* (413) when_then_expr ::= WHEN common_expression THEN common_expression */ + { 411, 0 }, /* (414) case_when_else_opt ::= */ + { 411, -2 }, /* (415) case_when_else_opt ::= ELSE common_expression */ + { 414, -3 }, /* (416) predicate ::= expr_or_subquery compare_op expr_or_subquery */ + { 414, -5 }, /* (417) predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ + { 414, -6 }, /* (418) predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ + { 414, -3 }, /* (419) predicate ::= expr_or_subquery IS NULL */ + { 414, -4 }, /* (420) predicate ::= expr_or_subquery IS NOT NULL */ + { 414, -3 }, /* (421) predicate ::= expr_or_subquery in_op in_predicate_value */ + { 415, -1 }, /* (422) compare_op ::= NK_LT */ + { 415, -1 }, /* (423) compare_op ::= NK_GT */ + { 415, -1 }, /* (424) compare_op ::= NK_LE */ + { 415, -1 }, /* (425) compare_op ::= NK_GE */ + { 415, -1 }, /* (426) compare_op ::= NK_NE */ + { 415, -1 }, /* (427) compare_op ::= NK_EQ */ + { 415, -1 }, /* (428) compare_op ::= LIKE */ + { 415, -2 }, /* (429) compare_op ::= NOT LIKE */ + { 415, -1 }, /* (430) compare_op ::= MATCH */ + { 415, -1 }, /* (431) compare_op ::= NMATCH */ + { 415, -1 }, /* (432) compare_op ::= CONTAINS */ + { 416, -1 }, /* (433) in_op ::= IN */ + { 416, -2 }, /* (434) in_op ::= NOT IN */ + { 417, -3 }, /* (435) in_predicate_value ::= NK_LP literal_list NK_RP */ + { 418, -1 }, /* (436) boolean_value_expression ::= boolean_primary */ + { 418, -2 }, /* (437) boolean_value_expression ::= NOT boolean_primary */ + { 418, -3 }, /* (438) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + { 418, -3 }, /* (439) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + { 419, -1 }, /* (440) boolean_primary ::= predicate */ + { 419, -3 }, /* (441) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ + { 412, -1 }, /* (442) common_expression ::= expr_or_subquery */ + { 412, -1 }, /* (443) common_expression ::= boolean_value_expression */ + { 420, 0 }, /* (444) from_clause_opt ::= */ + { 420, -2 }, /* (445) from_clause_opt ::= FROM table_reference_list */ + { 421, -1 }, /* (446) table_reference_list ::= table_reference */ + { 421, -3 }, /* (447) table_reference_list ::= table_reference_list NK_COMMA table_reference */ + { 422, -1 }, /* (448) table_reference ::= table_primary */ + { 422, -1 }, /* (449) table_reference ::= joined_table */ + { 423, -2 }, /* (450) table_primary ::= table_name alias_opt */ + { 423, -4 }, /* (451) table_primary ::= db_name NK_DOT table_name alias_opt */ + { 423, -2 }, /* (452) table_primary ::= subquery alias_opt */ + { 423, -1 }, /* (453) table_primary ::= parenthesized_joined_table */ + { 425, 0 }, /* (454) alias_opt ::= */ + { 425, -1 }, /* (455) alias_opt ::= table_alias */ + { 425, -2 }, /* (456) alias_opt ::= AS table_alias */ + { 427, -3 }, /* (457) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + { 427, -3 }, /* (458) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ + { 424, -6 }, /* (459) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ + { 428, 0 }, /* (460) join_type ::= */ + { 428, -1 }, /* (461) join_type ::= INNER */ + { 430, -12 }, /* (462) query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ + { 431, 0 }, /* (463) set_quantifier_opt ::= */ + { 431, -1 }, /* (464) set_quantifier_opt ::= DISTINCT */ + { 431, -1 }, /* (465) set_quantifier_opt ::= ALL */ + { 432, -1 }, /* (466) select_list ::= select_item */ + { 432, -3 }, /* (467) select_list ::= select_list NK_COMMA select_item */ + { 440, -1 }, /* (468) select_item ::= NK_STAR */ + { 440, -1 }, /* (469) select_item ::= common_expression */ + { 440, -2 }, /* (470) select_item ::= common_expression column_alias */ + { 440, -3 }, /* (471) select_item ::= common_expression AS column_alias */ + { 440, -3 }, /* (472) select_item ::= table_name NK_DOT NK_STAR */ + { 395, 0 }, /* (473) where_clause_opt ::= */ + { 395, -2 }, /* (474) where_clause_opt ::= WHERE search_condition */ + { 433, 0 }, /* (475) partition_by_clause_opt ::= */ + { 433, -3 }, /* (476) partition_by_clause_opt ::= PARTITION BY partition_list */ + { 441, -1 }, /* (477) partition_list ::= partition_item */ + { 441, -3 }, /* (478) partition_list ::= partition_list NK_COMMA partition_item */ + { 442, -1 }, /* (479) partition_item ::= expr_or_subquery */ + { 442, -2 }, /* (480) partition_item ::= expr_or_subquery column_alias */ + { 442, -3 }, /* (481) partition_item ::= expr_or_subquery AS column_alias */ + { 437, 0 }, /* (482) twindow_clause_opt ::= */ + { 437, -6 }, /* (483) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ + { 437, -4 }, /* (484) twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ + { 437, -6 }, /* (485) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ + { 437, -8 }, /* (486) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ + { 381, 0 }, /* (487) sliding_opt ::= */ + { 381, -4 }, /* (488) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + { 436, 0 }, /* (489) fill_opt ::= */ + { 436, -4 }, /* (490) fill_opt ::= FILL NK_LP fill_mode NK_RP */ + { 436, -6 }, /* (491) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ + { 443, -1 }, /* (492) fill_mode ::= NONE */ + { 443, -1 }, /* (493) fill_mode ::= PREV */ + { 443, -1 }, /* (494) fill_mode ::= NULL */ + { 443, -1 }, /* (495) fill_mode ::= LINEAR */ + { 443, -1 }, /* (496) fill_mode ::= NEXT */ + { 438, 0 }, /* (497) group_by_clause_opt ::= */ + { 438, -3 }, /* (498) group_by_clause_opt ::= GROUP BY group_by_list */ + { 444, -1 }, /* (499) group_by_list ::= expr_or_subquery */ + { 444, -3 }, /* (500) group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ + { 439, 0 }, /* (501) having_clause_opt ::= */ + { 439, -2 }, /* (502) having_clause_opt ::= HAVING search_condition */ + { 434, 0 }, /* (503) range_opt ::= */ + { 434, -6 }, /* (504) range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ + { 435, 0 }, /* (505) every_opt ::= */ + { 435, -4 }, /* (506) every_opt ::= EVERY NK_LP duration_literal NK_RP */ + { 445, -4 }, /* (507) query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ + { 446, -1 }, /* (508) query_simple ::= query_specification */ + { 446, -1 }, /* (509) query_simple ::= union_query_expression */ + { 450, -4 }, /* (510) union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ + { 450, -3 }, /* (511) union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ + { 451, -1 }, /* (512) query_simple_or_subquery ::= query_simple */ + { 451, -1 }, /* (513) query_simple_or_subquery ::= subquery */ + { 385, -1 }, /* (514) query_or_subquery ::= query_expression */ + { 385, -1 }, /* (515) query_or_subquery ::= subquery */ + { 447, 0 }, /* (516) order_by_clause_opt ::= */ + { 447, -3 }, /* (517) order_by_clause_opt ::= ORDER BY sort_specification_list */ + { 448, 0 }, /* (518) slimit_clause_opt ::= */ + { 448, -2 }, /* (519) slimit_clause_opt ::= SLIMIT NK_INTEGER */ + { 448, -4 }, /* (520) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + { 448, -4 }, /* (521) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 449, 0 }, /* (522) limit_clause_opt ::= */ + { 449, -2 }, /* (523) limit_clause_opt ::= LIMIT NK_INTEGER */ + { 449, -4 }, /* (524) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ + { 449, -4 }, /* (525) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 426, -3 }, /* (526) subquery ::= NK_LP query_expression NK_RP */ + { 426, -3 }, /* (527) subquery ::= NK_LP subquery NK_RP */ + { 429, -1 }, /* (528) search_condition ::= common_expression */ + { 452, -1 }, /* (529) sort_specification_list ::= sort_specification */ + { 452, -3 }, /* (530) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ + { 453, -3 }, /* (531) sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ + { 454, 0 }, /* (532) ordering_specification_opt ::= */ + { 454, -1 }, /* (533) ordering_specification_opt ::= ASC */ + { 454, -1 }, /* (534) ordering_specification_opt ::= DESC */ + { 455, 0 }, /* (535) null_ordering_opt ::= */ + { 455, -2 }, /* (536) null_ordering_opt ::= NULLS FIRST */ + { 455, -2 }, /* (537) null_ordering_opt ::= NULLS LAST */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -3598,11 +3578,11 @@ static YYACTIONTYPE yy_reduce( YYMINORTYPE yylhsminor; case 0: /* cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } - yy_destructor(yypParser,320,&yymsp[0].minor); + yy_destructor(yypParser,322,&yymsp[0].minor); break; case 1: /* cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } - yy_destructor(yypParser,321,&yymsp[0].minor); + yy_destructor(yypParser,323,&yymsp[0].minor); break; case 2: /* account_options ::= */ { } @@ -3616,20 +3596,20 @@ static YYACTIONTYPE yy_reduce( case 9: /* account_options ::= account_options USERS literal */ yytestcase(yyruleno==9); case 10: /* account_options ::= account_options CONNS literal */ yytestcase(yyruleno==10); case 11: /* account_options ::= account_options STATE literal */ yytestcase(yyruleno==11); -{ yy_destructor(yypParser,320,&yymsp[-2].minor); +{ yy_destructor(yypParser,322,&yymsp[-2].minor); { } - yy_destructor(yypParser,322,&yymsp[0].minor); + yy_destructor(yypParser,324,&yymsp[0].minor); } break; case 12: /* alter_account_options ::= alter_account_option */ -{ yy_destructor(yypParser,323,&yymsp[0].minor); +{ yy_destructor(yypParser,325,&yymsp[0].minor); { } } break; case 13: /* alter_account_options ::= alter_account_options alter_account_option */ -{ yy_destructor(yypParser,321,&yymsp[-1].minor); +{ yy_destructor(yypParser,323,&yymsp[-1].minor); { } - yy_destructor(yypParser,323,&yymsp[0].minor); + yy_destructor(yypParser,325,&yymsp[0].minor); } break; case 14: /* alter_account_option ::= PASS literal */ @@ -3643,1488 +3623,1495 @@ static YYACTIONTYPE yy_reduce( case 22: /* alter_account_option ::= CONNS literal */ yytestcase(yyruleno==22); case 23: /* alter_account_option ::= STATE literal */ yytestcase(yyruleno==23); { } - yy_destructor(yypParser,322,&yymsp[0].minor); + yy_destructor(yypParser,324,&yymsp[0].minor); break; case 24: /* cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ -{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy593, &yymsp[-1].minor.yy0, yymsp[0].minor.yy687); } +{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy737, &yymsp[-1].minor.yy0, yymsp[0].minor.yy695); } break; case 25: /* cmd ::= ALTER USER user_name PASS NK_STRING */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy593, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy737, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } break; case 26: /* cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy593, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy737, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); } break; case 27: /* cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy593, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy737, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } break; case 28: /* cmd ::= DROP USER user_name */ -{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy593); } +{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy737); } break; case 29: /* sysinfo_opt ::= */ -{ yymsp[1].minor.yy687 = 1; } +{ yymsp[1].minor.yy695 = 1; } break; case 30: /* sysinfo_opt ::= SYSINFO NK_INTEGER */ -{ yymsp[-1].minor.yy687 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); } +{ yymsp[-1].minor.yy695 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); } break; case 31: /* cmd ::= GRANT privileges ON priv_level TO user_name */ -{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy577, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593); } +{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy93, &yymsp[-2].minor.yy737, &yymsp[0].minor.yy737); } break; case 32: /* cmd ::= REVOKE privileges ON priv_level FROM user_name */ -{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy577, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593); } +{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy93, &yymsp[-2].minor.yy737, &yymsp[0].minor.yy737); } break; case 33: /* privileges ::= ALL */ -{ yymsp[0].minor.yy577 = PRIVILEGE_TYPE_ALL; } +{ yymsp[0].minor.yy93 = PRIVILEGE_TYPE_ALL; } break; case 34: /* privileges ::= priv_type_list */ - case 35: /* priv_type_list ::= priv_type */ yytestcase(yyruleno==35); -{ yylhsminor.yy577 = yymsp[0].minor.yy577; } - yymsp[0].minor.yy577 = yylhsminor.yy577; + case 36: /* priv_type_list ::= priv_type */ yytestcase(yyruleno==36); +{ yylhsminor.yy93 = yymsp[0].minor.yy93; } + yymsp[0].minor.yy93 = yylhsminor.yy93; break; - case 36: /* priv_type_list ::= priv_type_list NK_COMMA priv_type */ -{ yylhsminor.yy577 = yymsp[-2].minor.yy577 | yymsp[0].minor.yy577; } - yymsp[-2].minor.yy577 = yylhsminor.yy577; + case 35: /* privileges ::= SUBSCRIBE */ +{ yymsp[0].minor.yy93 = PRIVILEGE_TYPE_SUBSCRIBE; } break; - case 37: /* priv_type ::= READ */ -{ yymsp[0].minor.yy577 = PRIVILEGE_TYPE_READ; } + case 37: /* priv_type_list ::= priv_type_list NK_COMMA priv_type */ +{ yylhsminor.yy93 = yymsp[-2].minor.yy93 | yymsp[0].minor.yy93; } + yymsp[-2].minor.yy93 = yylhsminor.yy93; break; - case 38: /* priv_type ::= WRITE */ -{ yymsp[0].minor.yy577 = PRIVILEGE_TYPE_WRITE; } + case 38: /* priv_type ::= READ */ +{ yymsp[0].minor.yy93 = PRIVILEGE_TYPE_READ; } break; - case 39: /* priv_level ::= NK_STAR NK_DOT NK_STAR */ -{ yylhsminor.yy593 = yymsp[-2].minor.yy0; } - yymsp[-2].minor.yy593 = yylhsminor.yy593; + case 39: /* priv_type ::= WRITE */ +{ yymsp[0].minor.yy93 = PRIVILEGE_TYPE_WRITE; } break; - case 40: /* priv_level ::= db_name NK_DOT NK_STAR */ -{ yylhsminor.yy593 = yymsp[-2].minor.yy593; } - yymsp[-2].minor.yy593 = yylhsminor.yy593; + case 40: /* priv_level ::= NK_STAR NK_DOT NK_STAR */ +{ yylhsminor.yy737 = yymsp[-2].minor.yy0; } + yymsp[-2].minor.yy737 = yylhsminor.yy737; break; - case 41: /* cmd ::= CREATE DNODE dnode_endpoint */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy593, NULL); } + case 41: /* priv_level ::= db_name NK_DOT NK_STAR */ +{ yylhsminor.yy737 = yymsp[-2].minor.yy737; } + yymsp[-2].minor.yy737 = yylhsminor.yy737; break; - case 42: /* cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy0); } + case 42: /* priv_level ::= topic_name */ + case 455: /* alias_opt ::= table_alias */ yytestcase(yyruleno==455); +{ yylhsminor.yy737 = yymsp[0].minor.yy737; } + yymsp[0].minor.yy737 = yylhsminor.yy737; break; - case 43: /* cmd ::= DROP DNODE NK_INTEGER force_opt */ -{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy193); } + case 43: /* cmd ::= CREATE DNODE dnode_endpoint */ +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy737, NULL); } break; - case 44: /* cmd ::= DROP DNODE dnode_endpoint force_opt */ -{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy593, yymsp[0].minor.yy193); } + case 44: /* cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy737, &yymsp[0].minor.yy0); } break; - case 45: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ + case 45: /* cmd ::= DROP DNODE NK_INTEGER force_opt */ +{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy185); } + break; + case 46: /* cmd ::= DROP DNODE dnode_endpoint force_opt */ +{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy737, yymsp[0].minor.yy185); } + break; + case 47: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, NULL); } break; - case 46: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ + case 48: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-2].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } break; - case 47: /* cmd ::= ALTER ALL DNODES NK_STRING */ + case 49: /* cmd ::= ALTER ALL DNODES NK_STRING */ { pCxt->pRootNode = createAlterDnodeStmt(pCxt, NULL, &yymsp[0].minor.yy0, NULL); } break; - case 48: /* cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ + case 50: /* cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ { pCxt->pRootNode = createAlterDnodeStmt(pCxt, NULL, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } break; - case 49: /* dnode_endpoint ::= NK_STRING */ - case 50: /* dnode_endpoint ::= NK_ID */ yytestcase(yyruleno==50); - case 51: /* dnode_endpoint ::= NK_IPTOKEN */ yytestcase(yyruleno==51); - case 339: /* db_name ::= NK_ID */ yytestcase(yyruleno==339); - case 340: /* table_name ::= NK_ID */ yytestcase(yyruleno==340); - case 341: /* column_name ::= NK_ID */ yytestcase(yyruleno==341); - case 342: /* function_name ::= NK_ID */ yytestcase(yyruleno==342); - case 343: /* table_alias ::= NK_ID */ yytestcase(yyruleno==343); - case 344: /* column_alias ::= NK_ID */ yytestcase(yyruleno==344); - case 345: /* user_name ::= NK_ID */ yytestcase(yyruleno==345); - case 346: /* topic_name ::= NK_ID */ yytestcase(yyruleno==346); - case 347: /* stream_name ::= NK_ID */ yytestcase(yyruleno==347); - case 348: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==348); - case 387: /* noarg_func ::= NOW */ yytestcase(yyruleno==387); - case 388: /* noarg_func ::= TODAY */ yytestcase(yyruleno==388); - case 389: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==389); - case 390: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==390); - case 391: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==391); - case 392: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==392); - case 393: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==393); - case 394: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==394); - case 395: /* noarg_func ::= USER */ yytestcase(yyruleno==395); - case 396: /* star_func ::= COUNT */ yytestcase(yyruleno==396); - case 397: /* star_func ::= FIRST */ yytestcase(yyruleno==397); - case 398: /* star_func ::= LAST */ yytestcase(yyruleno==398); - case 399: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==399); -{ yylhsminor.yy593 = yymsp[0].minor.yy0; } - yymsp[0].minor.yy593 = yylhsminor.yy593; + case 51: /* dnode_endpoint ::= NK_STRING */ + case 52: /* dnode_endpoint ::= NK_ID */ yytestcase(yyruleno==52); + case 53: /* dnode_endpoint ::= NK_IPTOKEN */ yytestcase(yyruleno==53); + case 342: /* db_name ::= NK_ID */ yytestcase(yyruleno==342); + case 343: /* table_name ::= NK_ID */ yytestcase(yyruleno==343); + case 344: /* column_name ::= NK_ID */ yytestcase(yyruleno==344); + case 345: /* function_name ::= NK_ID */ yytestcase(yyruleno==345); + case 346: /* table_alias ::= NK_ID */ yytestcase(yyruleno==346); + case 347: /* column_alias ::= NK_ID */ yytestcase(yyruleno==347); + case 348: /* user_name ::= NK_ID */ yytestcase(yyruleno==348); + case 349: /* topic_name ::= NK_ID */ yytestcase(yyruleno==349); + case 350: /* stream_name ::= NK_ID */ yytestcase(yyruleno==350); + case 351: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==351); + case 390: /* noarg_func ::= NOW */ yytestcase(yyruleno==390); + case 391: /* noarg_func ::= TODAY */ yytestcase(yyruleno==391); + case 392: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==392); + case 393: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==393); + case 394: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==394); + case 395: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==395); + case 396: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==396); + case 397: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==397); + case 398: /* noarg_func ::= USER */ yytestcase(yyruleno==398); + case 399: /* star_func ::= COUNT */ yytestcase(yyruleno==399); + case 400: /* star_func ::= FIRST */ yytestcase(yyruleno==400); + case 401: /* star_func ::= LAST */ yytestcase(yyruleno==401); + case 402: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==402); +{ yylhsminor.yy737 = yymsp[0].minor.yy0; } + yymsp[0].minor.yy737 = yylhsminor.yy737; break; - case 52: /* force_opt ::= */ - case 71: /* not_exists_opt ::= */ yytestcase(yyruleno==71); - case 73: /* exists_opt ::= */ yytestcase(yyruleno==73); - case 279: /* analyze_opt ::= */ yytestcase(yyruleno==279); - case 286: /* agg_func_opt ::= */ yytestcase(yyruleno==286); - case 460: /* set_quantifier_opt ::= */ yytestcase(yyruleno==460); -{ yymsp[1].minor.yy193 = false; } + case 54: /* force_opt ::= */ + case 73: /* not_exists_opt ::= */ yytestcase(yyruleno==73); + case 75: /* exists_opt ::= */ yytestcase(yyruleno==75); + case 282: /* analyze_opt ::= */ yytestcase(yyruleno==282); + case 289: /* agg_func_opt ::= */ yytestcase(yyruleno==289); + case 463: /* set_quantifier_opt ::= */ yytestcase(yyruleno==463); +{ yymsp[1].minor.yy185 = false; } break; - case 53: /* force_opt ::= FORCE */ - case 280: /* analyze_opt ::= ANALYZE */ yytestcase(yyruleno==280); - case 287: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==287); - case 461: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==461); -{ yymsp[0].minor.yy193 = true; } + case 55: /* force_opt ::= FORCE */ + case 283: /* analyze_opt ::= ANALYZE */ yytestcase(yyruleno==283); + case 290: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==290); + case 464: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==464); +{ yymsp[0].minor.yy185 = true; } break; - case 54: /* cmd ::= ALTER LOCAL NK_STRING */ + case 56: /* cmd ::= ALTER LOCAL NK_STRING */ { pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[0].minor.yy0, NULL); } break; - case 55: /* cmd ::= ALTER LOCAL NK_STRING NK_STRING */ + case 57: /* cmd ::= ALTER LOCAL NK_STRING NK_STRING */ { pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } break; - case 56: /* cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ + case 58: /* cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ { pCxt->pRootNode = createCreateComponentNodeStmt(pCxt, QUERY_NODE_CREATE_QNODE_STMT, &yymsp[0].minor.yy0); } break; - case 57: /* cmd ::= DROP QNODE ON DNODE NK_INTEGER */ + case 59: /* cmd ::= DROP QNODE ON DNODE NK_INTEGER */ { pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_QNODE_STMT, &yymsp[0].minor.yy0); } break; - case 58: /* cmd ::= CREATE BNODE ON DNODE NK_INTEGER */ + case 60: /* cmd ::= CREATE BNODE ON DNODE NK_INTEGER */ { pCxt->pRootNode = createCreateComponentNodeStmt(pCxt, QUERY_NODE_CREATE_BNODE_STMT, &yymsp[0].minor.yy0); } break; - case 59: /* cmd ::= DROP BNODE ON DNODE NK_INTEGER */ + case 61: /* cmd ::= DROP BNODE ON DNODE NK_INTEGER */ { pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_BNODE_STMT, &yymsp[0].minor.yy0); } break; - case 60: /* cmd ::= CREATE SNODE ON DNODE NK_INTEGER */ + case 62: /* cmd ::= CREATE SNODE ON DNODE NK_INTEGER */ { pCxt->pRootNode = createCreateComponentNodeStmt(pCxt, QUERY_NODE_CREATE_SNODE_STMT, &yymsp[0].minor.yy0); } break; - case 61: /* cmd ::= DROP SNODE ON DNODE NK_INTEGER */ + case 63: /* cmd ::= DROP SNODE ON DNODE NK_INTEGER */ { pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_SNODE_STMT, &yymsp[0].minor.yy0); } break; - case 62: /* cmd ::= CREATE MNODE ON DNODE NK_INTEGER */ + case 64: /* cmd ::= CREATE MNODE ON DNODE NK_INTEGER */ { pCxt->pRootNode = createCreateComponentNodeStmt(pCxt, QUERY_NODE_CREATE_MNODE_STMT, &yymsp[0].minor.yy0); } break; - case 63: /* cmd ::= DROP MNODE ON DNODE NK_INTEGER */ + case 65: /* cmd ::= DROP MNODE ON DNODE NK_INTEGER */ { pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_MNODE_STMT, &yymsp[0].minor.yy0); } break; - case 64: /* cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ -{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy193, &yymsp[-1].minor.yy593, yymsp[0].minor.yy164); } + case 66: /* cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ +{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy185, &yymsp[-1].minor.yy737, yymsp[0].minor.yy104); } break; - case 65: /* cmd ::= DROP DATABASE exists_opt db_name */ -{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy193, &yymsp[0].minor.yy593); } + case 67: /* cmd ::= DROP DATABASE exists_opt db_name */ +{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy185, &yymsp[0].minor.yy737); } break; - case 66: /* cmd ::= USE db_name */ -{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy593); } + case 68: /* cmd ::= USE db_name */ +{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy737); } break; - case 67: /* cmd ::= ALTER DATABASE db_name alter_db_options */ -{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy593, yymsp[0].minor.yy164); } + case 69: /* cmd ::= ALTER DATABASE db_name alter_db_options */ +{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy737, yymsp[0].minor.yy104); } break; - case 68: /* cmd ::= FLUSH DATABASE db_name */ -{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy593); } + case 70: /* cmd ::= FLUSH DATABASE db_name */ +{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy737); } break; - case 69: /* cmd ::= TRIM DATABASE db_name speed_opt */ -{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[-1].minor.yy593, yymsp[0].minor.yy512); } + case 71: /* cmd ::= TRIM DATABASE db_name speed_opt */ +{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[-1].minor.yy737, yymsp[0].minor.yy196); } break; - case 70: /* not_exists_opt ::= IF NOT EXISTS */ -{ yymsp[-2].minor.yy193 = true; } + case 72: /* not_exists_opt ::= IF NOT EXISTS */ +{ yymsp[-2].minor.yy185 = true; } break; - case 72: /* exists_opt ::= IF EXISTS */ -{ yymsp[-1].minor.yy193 = true; } + case 74: /* exists_opt ::= IF EXISTS */ +{ yymsp[-1].minor.yy185 = true; } break; - case 74: /* db_options ::= */ -{ yymsp[1].minor.yy164 = createDefaultDatabaseOptions(pCxt); } + case 76: /* db_options ::= */ +{ yymsp[1].minor.yy104 = createDefaultDatabaseOptions(pCxt); } break; - case 75: /* db_options ::= db_options BUFFER NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 77: /* db_options ::= db_options BUFFER NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 76: /* db_options ::= db_options CACHEMODEL NK_STRING */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 78: /* db_options ::= db_options CACHEMODEL NK_STRING */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 77: /* db_options ::= db_options CACHESIZE NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 79: /* db_options ::= db_options CACHESIZE NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 78: /* db_options ::= db_options COMP NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_COMP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 80: /* db_options ::= db_options COMP NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_COMP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 79: /* db_options ::= db_options DURATION NK_INTEGER */ - case 80: /* db_options ::= db_options DURATION NK_VARIABLE */ yytestcase(yyruleno==80); -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 81: /* db_options ::= db_options DURATION NK_INTEGER */ + case 82: /* db_options ::= db_options DURATION NK_VARIABLE */ yytestcase(yyruleno==82); +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 81: /* db_options ::= db_options MAXROWS NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 83: /* db_options ::= db_options MAXROWS NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 82: /* db_options ::= db_options MINROWS NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 84: /* db_options ::= db_options MINROWS NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 83: /* db_options ::= db_options KEEP integer_list */ - case 84: /* db_options ::= db_options KEEP variable_list */ yytestcase(yyruleno==84); -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_KEEP, yymsp[0].minor.yy648); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 85: /* db_options ::= db_options KEEP integer_list */ + case 86: /* db_options ::= db_options KEEP variable_list */ yytestcase(yyruleno==86); +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_KEEP, yymsp[0].minor.yy616); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 85: /* db_options ::= db_options PAGES NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 87: /* db_options ::= db_options PAGES NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 86: /* db_options ::= db_options PAGESIZE NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 88: /* db_options ::= db_options PAGESIZE NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 87: /* db_options ::= db_options TSDB_PAGESIZE NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_TSDB_PAGESIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 89: /* db_options ::= db_options TSDB_PAGESIZE NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_TSDB_PAGESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 88: /* db_options ::= db_options PRECISION NK_STRING */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 90: /* db_options ::= db_options PRECISION NK_STRING */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 89: /* db_options ::= db_options REPLICA NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 91: /* db_options ::= db_options REPLICA NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 90: /* db_options ::= db_options STRICT NK_STRING */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_STRICT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 92: /* db_options ::= db_options STRICT NK_STRING */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_STRICT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 91: /* db_options ::= db_options VGROUPS NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 93: /* db_options ::= db_options VGROUPS NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 92: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 94: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 93: /* db_options ::= db_options RETENTIONS retention_list */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_RETENTIONS, yymsp[0].minor.yy648); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 95: /* db_options ::= db_options RETENTIONS retention_list */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_RETENTIONS, yymsp[0].minor.yy616); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 94: /* db_options ::= db_options SCHEMALESS NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 96: /* db_options ::= db_options SCHEMALESS NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 95: /* db_options ::= db_options WAL_LEVEL NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 97: /* db_options ::= db_options WAL_LEVEL NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_WAL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 96: /* db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 98: /* db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 97: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 99: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 98: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */ + case 100: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-3].minor.yy164, DB_OPTION_WAL_RETENTION_PERIOD, &t); + yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-3].minor.yy104, DB_OPTION_WAL_RETENTION_PERIOD, &t); } - yymsp[-3].minor.yy164 = yylhsminor.yy164; + yymsp[-3].minor.yy104 = yylhsminor.yy104; break; - case 99: /* db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 101: /* db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 100: /* db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */ + case 102: /* db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-3].minor.yy164, DB_OPTION_WAL_RETENTION_SIZE, &t); + yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-3].minor.yy104, DB_OPTION_WAL_RETENTION_SIZE, &t); } - yymsp[-3].minor.yy164 = yylhsminor.yy164; - break; - case 101: /* db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; - break; - case 102: /* db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; - break; - case 103: /* db_options ::= db_options STT_TRIGGER NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_STT_TRIGGER, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; - break; - case 104: /* db_options ::= db_options TABLE_PREFIX NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_TABLE_PREFIX, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; - break; - case 105: /* db_options ::= db_options TABLE_SUFFIX NK_INTEGER */ -{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_TABLE_SUFFIX, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; - break; - case 106: /* alter_db_options ::= alter_db_option */ -{ yylhsminor.yy164 = createAlterDatabaseOptions(pCxt); yylhsminor.yy164 = setAlterDatabaseOption(pCxt, yylhsminor.yy164, &yymsp[0].minor.yy213); } - yymsp[0].minor.yy164 = yylhsminor.yy164; - break; - case 107: /* alter_db_options ::= alter_db_options alter_db_option */ -{ yylhsminor.yy164 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy164, &yymsp[0].minor.yy213); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; - break; - case 108: /* alter_db_option ::= BUFFER NK_INTEGER */ -{ yymsp[-1].minor.yy213.type = DB_OPTION_BUFFER; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; } - break; - case 109: /* alter_db_option ::= CACHEMODEL NK_STRING */ -{ yymsp[-1].minor.yy213.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; } - break; - case 110: /* alter_db_option ::= CACHESIZE NK_INTEGER */ -{ yymsp[-1].minor.yy213.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; } - break; - case 111: /* alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ -{ yymsp[-1].minor.yy213.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; } - break; - case 112: /* alter_db_option ::= KEEP integer_list */ - case 113: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==113); -{ yymsp[-1].minor.yy213.type = DB_OPTION_KEEP; yymsp[-1].minor.yy213.pList = yymsp[0].minor.yy648; } - break; - case 114: /* alter_db_option ::= PAGES NK_INTEGER */ -{ yymsp[-1].minor.yy213.type = DB_OPTION_PAGES; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; } - break; - case 115: /* alter_db_option ::= REPLICA NK_INTEGER */ -{ yymsp[-1].minor.yy213.type = DB_OPTION_REPLICA; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; } - break; - case 116: /* alter_db_option ::= STRICT NK_STRING */ -{ yymsp[-1].minor.yy213.type = DB_OPTION_STRICT; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; } - break; - case 117: /* alter_db_option ::= WAL_LEVEL NK_INTEGER */ -{ yymsp[-1].minor.yy213.type = DB_OPTION_WAL; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; } - break; - case 118: /* alter_db_option ::= STT_TRIGGER NK_INTEGER */ -{ yymsp[-1].minor.yy213.type = DB_OPTION_STT_TRIGGER; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; } - break; - case 119: /* integer_list ::= NK_INTEGER */ -{ yylhsminor.yy648 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy648 = yylhsminor.yy648; - break; - case 120: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */ - case 309: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==309); -{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy648 = yylhsminor.yy648; - break; - case 121: /* variable_list ::= NK_VARIABLE */ -{ yylhsminor.yy648 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy648 = yylhsminor.yy648; - break; - case 122: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */ -{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy648 = yylhsminor.yy648; - break; - case 123: /* retention_list ::= retention */ - case 145: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==145); - case 148: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==148); - case 155: /* column_def_list ::= column_def */ yytestcase(yyruleno==155); - case 198: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==198); - case 203: /* col_name_list ::= col_name */ yytestcase(yyruleno==203); - case 251: /* tag_list_opt ::= tag_item */ yytestcase(yyruleno==251); - case 262: /* func_list ::= func */ yytestcase(yyruleno==262); - case 337: /* literal_list ::= signed_literal */ yytestcase(yyruleno==337); - case 402: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==402); - case 408: /* when_then_list ::= when_then_expr */ yytestcase(yyruleno==408); - case 463: /* select_list ::= select_item */ yytestcase(yyruleno==463); - case 474: /* partition_list ::= partition_item */ yytestcase(yyruleno==474); - case 526: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==526); -{ yylhsminor.yy648 = createNodeList(pCxt, yymsp[0].minor.yy164); } - yymsp[0].minor.yy648 = yylhsminor.yy648; - break; - case 124: /* retention_list ::= retention_list NK_COMMA retention */ - case 156: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==156); - case 199: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==199); - case 204: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==204); - case 252: /* tag_list_opt ::= tag_list_opt NK_COMMA tag_item */ yytestcase(yyruleno==252); - case 263: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==263); - case 338: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==338); - case 403: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==403); - case 464: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==464); - case 475: /* partition_list ::= partition_list NK_COMMA partition_item */ yytestcase(yyruleno==475); - case 527: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==527); -{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, yymsp[0].minor.yy164); } - yymsp[-2].minor.yy648 = yylhsminor.yy648; - break; - case 125: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ -{ yylhsminor.yy164 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; - break; - case 126: /* speed_opt ::= */ - case 288: /* bufsize_opt ::= */ yytestcase(yyruleno==288); -{ yymsp[1].minor.yy512 = 0; } - break; - case 127: /* speed_opt ::= MAX_SPEED NK_INTEGER */ - case 289: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ yytestcase(yyruleno==289); -{ yymsp[-1].minor.yy512 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } - break; - case 128: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - case 130: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==130); -{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy193, yymsp[-5].minor.yy164, yymsp[-3].minor.yy648, yymsp[-1].minor.yy648, yymsp[0].minor.yy164); } - break; - case 129: /* cmd ::= CREATE TABLE multi_create_clause */ -{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy648); } - break; - case 131: /* cmd ::= DROP TABLE multi_drop_clause */ -{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy648); } - break; - case 132: /* cmd ::= DROP STABLE exists_opt full_table_name */ -{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy193, yymsp[0].minor.yy164); } - break; - case 133: /* cmd ::= ALTER TABLE alter_table_clause */ - case 311: /* cmd ::= query_or_subquery */ yytestcase(yyruleno==311); -{ pCxt->pRootNode = yymsp[0].minor.yy164; } - break; - case 134: /* cmd ::= ALTER STABLE alter_table_clause */ -{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy164); } - break; - case 135: /* alter_table_clause ::= full_table_name alter_table_options */ -{ yylhsminor.yy164 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; - break; - case 136: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ -{ yylhsminor.yy164 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720); } - yymsp[-4].minor.yy164 = yylhsminor.yy164; - break; - case 137: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ -{ yylhsminor.yy164 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy164, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy593); } - yymsp[-3].minor.yy164 = yylhsminor.yy164; - break; - case 138: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ -{ yylhsminor.yy164 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720); } - yymsp[-4].minor.yy164 = yylhsminor.yy164; - break; - case 139: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ -{ yylhsminor.yy164 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy593, &yymsp[0].minor.yy593); } - yymsp[-4].minor.yy164 = yylhsminor.yy164; - break; - case 140: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ -{ yylhsminor.yy164 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720); } - yymsp[-4].minor.yy164 = yylhsminor.yy164; - break; - case 141: /* alter_table_clause ::= full_table_name DROP TAG column_name */ -{ yylhsminor.yy164 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy164, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy593); } - yymsp[-3].minor.yy164 = yylhsminor.yy164; - break; - case 142: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ -{ yylhsminor.yy164 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720); } - yymsp[-4].minor.yy164 = yylhsminor.yy164; - break; - case 143: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ -{ yylhsminor.yy164 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy593, &yymsp[0].minor.yy593); } - yymsp[-4].minor.yy164 = yylhsminor.yy164; - break; - case 144: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ -{ yylhsminor.yy164 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy164, &yymsp[-2].minor.yy593, yymsp[0].minor.yy164); } - yymsp[-5].minor.yy164 = yylhsminor.yy164; - break; - case 146: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ - case 149: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==149); - case 409: /* when_then_list ::= when_then_list when_then_expr */ yytestcase(yyruleno==409); -{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-1].minor.yy648, yymsp[0].minor.yy164); } - yymsp[-1].minor.yy648 = yylhsminor.yy648; + yymsp[-3].minor.yy104 = yylhsminor.yy104; + break; + case 103: /* db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; + break; + case 104: /* db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; + break; + case 105: /* db_options ::= db_options STT_TRIGGER NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_STT_TRIGGER, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; + break; + case 106: /* db_options ::= db_options TABLE_PREFIX NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_TABLE_PREFIX, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; + break; + case 107: /* db_options ::= db_options TABLE_SUFFIX NK_INTEGER */ +{ yylhsminor.yy104 = setDatabaseOption(pCxt, yymsp[-2].minor.yy104, DB_OPTION_TABLE_SUFFIX, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; + break; + case 108: /* alter_db_options ::= alter_db_option */ +{ yylhsminor.yy104 = createAlterDatabaseOptions(pCxt); yylhsminor.yy104 = setAlterDatabaseOption(pCxt, yylhsminor.yy104, &yymsp[0].minor.yy557); } + yymsp[0].minor.yy104 = yylhsminor.yy104; + break; + case 109: /* alter_db_options ::= alter_db_options alter_db_option */ +{ yylhsminor.yy104 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy104, &yymsp[0].minor.yy557); } + yymsp[-1].minor.yy104 = yylhsminor.yy104; + break; + case 110: /* alter_db_option ::= BUFFER NK_INTEGER */ +{ yymsp[-1].minor.yy557.type = DB_OPTION_BUFFER; yymsp[-1].minor.yy557.val = yymsp[0].minor.yy0; } + break; + case 111: /* alter_db_option ::= CACHEMODEL NK_STRING */ +{ yymsp[-1].minor.yy557.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy557.val = yymsp[0].minor.yy0; } + break; + case 112: /* alter_db_option ::= CACHESIZE NK_INTEGER */ +{ yymsp[-1].minor.yy557.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy557.val = yymsp[0].minor.yy0; } + break; + case 113: /* alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ +{ yymsp[-1].minor.yy557.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy557.val = yymsp[0].minor.yy0; } + break; + case 114: /* alter_db_option ::= KEEP integer_list */ + case 115: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==115); +{ yymsp[-1].minor.yy557.type = DB_OPTION_KEEP; yymsp[-1].minor.yy557.pList = yymsp[0].minor.yy616; } + break; + case 116: /* alter_db_option ::= PAGES NK_INTEGER */ +{ yymsp[-1].minor.yy557.type = DB_OPTION_PAGES; yymsp[-1].minor.yy557.val = yymsp[0].minor.yy0; } + break; + case 117: /* alter_db_option ::= REPLICA NK_INTEGER */ +{ yymsp[-1].minor.yy557.type = DB_OPTION_REPLICA; yymsp[-1].minor.yy557.val = yymsp[0].minor.yy0; } + break; + case 118: /* alter_db_option ::= STRICT NK_STRING */ +{ yymsp[-1].minor.yy557.type = DB_OPTION_STRICT; yymsp[-1].minor.yy557.val = yymsp[0].minor.yy0; } + break; + case 119: /* alter_db_option ::= WAL_LEVEL NK_INTEGER */ +{ yymsp[-1].minor.yy557.type = DB_OPTION_WAL; yymsp[-1].minor.yy557.val = yymsp[0].minor.yy0; } + break; + case 120: /* alter_db_option ::= STT_TRIGGER NK_INTEGER */ +{ yymsp[-1].minor.yy557.type = DB_OPTION_STT_TRIGGER; yymsp[-1].minor.yy557.val = yymsp[0].minor.yy0; } + break; + case 121: /* integer_list ::= NK_INTEGER */ +{ yylhsminor.yy616 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy616 = yylhsminor.yy616; + break; + case 122: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */ + case 312: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==312); +{ yylhsminor.yy616 = addNodeToList(pCxt, yymsp[-2].minor.yy616, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy616 = yylhsminor.yy616; + break; + case 123: /* variable_list ::= NK_VARIABLE */ +{ yylhsminor.yy616 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy616 = yylhsminor.yy616; + break; + case 124: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */ +{ yylhsminor.yy616 = addNodeToList(pCxt, yymsp[-2].minor.yy616, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy616 = yylhsminor.yy616; + break; + case 125: /* retention_list ::= retention */ + case 147: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==147); + case 150: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==150); + case 157: /* column_def_list ::= column_def */ yytestcase(yyruleno==157); + case 200: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==200); + case 205: /* col_name_list ::= col_name */ yytestcase(yyruleno==205); + case 254: /* tag_list_opt ::= tag_item */ yytestcase(yyruleno==254); + case 265: /* func_list ::= func */ yytestcase(yyruleno==265); + case 340: /* literal_list ::= signed_literal */ yytestcase(yyruleno==340); + case 405: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==405); + case 411: /* when_then_list ::= when_then_expr */ yytestcase(yyruleno==411); + case 466: /* select_list ::= select_item */ yytestcase(yyruleno==466); + case 477: /* partition_list ::= partition_item */ yytestcase(yyruleno==477); + case 529: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==529); +{ yylhsminor.yy616 = createNodeList(pCxt, yymsp[0].minor.yy104); } + yymsp[0].minor.yy616 = yylhsminor.yy616; + break; + case 126: /* retention_list ::= retention_list NK_COMMA retention */ + case 158: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==158); + case 201: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==201); + case 206: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==206); + case 255: /* tag_list_opt ::= tag_list_opt NK_COMMA tag_item */ yytestcase(yyruleno==255); + case 266: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==266); + case 341: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==341); + case 406: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==406); + case 467: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==467); + case 478: /* partition_list ::= partition_list NK_COMMA partition_item */ yytestcase(yyruleno==478); + case 530: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==530); +{ yylhsminor.yy616 = addNodeToList(pCxt, yymsp[-2].minor.yy616, yymsp[0].minor.yy104); } + yymsp[-2].minor.yy616 = yylhsminor.yy616; + break; + case 127: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ +{ yylhsminor.yy104 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; + break; + case 128: /* speed_opt ::= */ + case 291: /* bufsize_opt ::= */ yytestcase(yyruleno==291); +{ yymsp[1].minor.yy196 = 0; } + break; + case 129: /* speed_opt ::= MAX_SPEED NK_INTEGER */ + case 292: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ yytestcase(yyruleno==292); +{ yymsp[-1].minor.yy196 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } + break; + case 130: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + case 132: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==132); +{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy185, yymsp[-5].minor.yy104, yymsp[-3].minor.yy616, yymsp[-1].minor.yy616, yymsp[0].minor.yy104); } + break; + case 131: /* cmd ::= CREATE TABLE multi_create_clause */ +{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy616); } + break; + case 133: /* cmd ::= DROP TABLE multi_drop_clause */ +{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy616); } + break; + case 134: /* cmd ::= DROP STABLE exists_opt full_table_name */ +{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy185, yymsp[0].minor.yy104); } + break; + case 135: /* cmd ::= ALTER TABLE alter_table_clause */ + case 314: /* cmd ::= query_or_subquery */ yytestcase(yyruleno==314); +{ pCxt->pRootNode = yymsp[0].minor.yy104; } + break; + case 136: /* cmd ::= ALTER STABLE alter_table_clause */ +{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy104); } + break; + case 137: /* alter_table_clause ::= full_table_name alter_table_options */ +{ yylhsminor.yy104 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy104, yymsp[0].minor.yy104); } + yymsp[-1].minor.yy104 = yylhsminor.yy104; + break; + case 138: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ +{ yylhsminor.yy104 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy104, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy737, yymsp[0].minor.yy640); } + yymsp[-4].minor.yy104 = yylhsminor.yy104; + break; + case 139: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ +{ yylhsminor.yy104 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy104, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy737); } + yymsp[-3].minor.yy104 = yylhsminor.yy104; + break; + case 140: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ +{ yylhsminor.yy104 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy104, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy737, yymsp[0].minor.yy640); } + yymsp[-4].minor.yy104 = yylhsminor.yy104; + break; + case 141: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ +{ yylhsminor.yy104 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy104, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy737, &yymsp[0].minor.yy737); } + yymsp[-4].minor.yy104 = yylhsminor.yy104; + break; + case 142: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ +{ yylhsminor.yy104 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy104, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy737, yymsp[0].minor.yy640); } + yymsp[-4].minor.yy104 = yylhsminor.yy104; + break; + case 143: /* alter_table_clause ::= full_table_name DROP TAG column_name */ +{ yylhsminor.yy104 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy104, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy737); } + yymsp[-3].minor.yy104 = yylhsminor.yy104; + break; + case 144: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ +{ yylhsminor.yy104 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy104, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy737, yymsp[0].minor.yy640); } + yymsp[-4].minor.yy104 = yylhsminor.yy104; + break; + case 145: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ +{ yylhsminor.yy104 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy104, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy737, &yymsp[0].minor.yy737); } + yymsp[-4].minor.yy104 = yylhsminor.yy104; + break; + case 146: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ +{ yylhsminor.yy104 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy104, &yymsp[-2].minor.yy737, yymsp[0].minor.yy104); } + yymsp[-5].minor.yy104 = yylhsminor.yy104; + break; + case 148: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ + case 151: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==151); + case 412: /* when_then_list ::= when_then_list when_then_expr */ yytestcase(yyruleno==412); +{ yylhsminor.yy616 = addNodeToList(pCxt, yymsp[-1].minor.yy616, yymsp[0].minor.yy104); } + yymsp[-1].minor.yy616 = yylhsminor.yy616; break; - case 147: /* create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ -{ yylhsminor.yy164 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy193, yymsp[-8].minor.yy164, yymsp[-6].minor.yy164, yymsp[-5].minor.yy648, yymsp[-2].minor.yy648, yymsp[0].minor.yy164); } - yymsp[-9].minor.yy164 = yylhsminor.yy164; + case 149: /* create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ +{ yylhsminor.yy104 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy185, yymsp[-8].minor.yy104, yymsp[-6].minor.yy104, yymsp[-5].minor.yy616, yymsp[-2].minor.yy616, yymsp[0].minor.yy104); } + yymsp[-9].minor.yy104 = yylhsminor.yy104; break; - case 150: /* drop_table_clause ::= exists_opt full_table_name */ -{ yylhsminor.yy164 = createDropTableClause(pCxt, yymsp[-1].minor.yy193, yymsp[0].minor.yy164); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + case 152: /* drop_table_clause ::= exists_opt full_table_name */ +{ yylhsminor.yy104 = createDropTableClause(pCxt, yymsp[-1].minor.yy185, yymsp[0].minor.yy104); } + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 151: /* specific_cols_opt ::= */ - case 182: /* tags_def_opt ::= */ yytestcase(yyruleno==182); - case 250: /* tag_list_opt ::= */ yytestcase(yyruleno==250); - case 472: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==472); - case 494: /* group_by_clause_opt ::= */ yytestcase(yyruleno==494); - case 513: /* order_by_clause_opt ::= */ yytestcase(yyruleno==513); -{ yymsp[1].minor.yy648 = NULL; } + case 153: /* specific_cols_opt ::= */ + case 184: /* tags_def_opt ::= */ yytestcase(yyruleno==184); + case 253: /* tag_list_opt ::= */ yytestcase(yyruleno==253); + case 475: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==475); + case 497: /* group_by_clause_opt ::= */ yytestcase(yyruleno==497); + case 516: /* order_by_clause_opt ::= */ yytestcase(yyruleno==516); +{ yymsp[1].minor.yy616 = NULL; } break; - case 152: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ -{ yymsp[-2].minor.yy648 = yymsp[-1].minor.yy648; } + case 154: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ +{ yymsp[-2].minor.yy616 = yymsp[-1].minor.yy616; } break; - case 153: /* full_table_name ::= table_name */ -{ yylhsminor.yy164 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy593, NULL); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 155: /* full_table_name ::= table_name */ +{ yylhsminor.yy104 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy737, NULL); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 154: /* full_table_name ::= db_name NK_DOT table_name */ -{ yylhsminor.yy164 = createRealTableNode(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593, NULL); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 156: /* full_table_name ::= db_name NK_DOT table_name */ +{ yylhsminor.yy104 = createRealTableNode(pCxt, &yymsp[-2].minor.yy737, &yymsp[0].minor.yy737, NULL); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 157: /* column_def ::= column_name type_name */ -{ yylhsminor.yy164 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720, NULL); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + case 159: /* column_def ::= column_name type_name */ +{ yylhsminor.yy104 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy737, yymsp[0].minor.yy640, NULL); } + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 158: /* column_def ::= column_name type_name COMMENT NK_STRING */ -{ yylhsminor.yy164 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy593, yymsp[-2].minor.yy720, &yymsp[0].minor.yy0); } - yymsp[-3].minor.yy164 = yylhsminor.yy164; + case 160: /* column_def ::= column_name type_name COMMENT NK_STRING */ +{ yylhsminor.yy104 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy737, yymsp[-2].minor.yy640, &yymsp[0].minor.yy0); } + yymsp[-3].minor.yy104 = yylhsminor.yy104; break; - case 159: /* type_name ::= BOOL */ -{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_BOOL); } + case 161: /* type_name ::= BOOL */ +{ yymsp[0].minor.yy640 = createDataType(TSDB_DATA_TYPE_BOOL); } break; - case 160: /* type_name ::= TINYINT */ -{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_TINYINT); } + case 162: /* type_name ::= TINYINT */ +{ yymsp[0].minor.yy640 = createDataType(TSDB_DATA_TYPE_TINYINT); } break; - case 161: /* type_name ::= SMALLINT */ -{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_SMALLINT); } + case 163: /* type_name ::= SMALLINT */ +{ yymsp[0].minor.yy640 = createDataType(TSDB_DATA_TYPE_SMALLINT); } break; - case 162: /* type_name ::= INT */ - case 163: /* type_name ::= INTEGER */ yytestcase(yyruleno==163); -{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_INT); } + case 164: /* type_name ::= INT */ + case 165: /* type_name ::= INTEGER */ yytestcase(yyruleno==165); +{ yymsp[0].minor.yy640 = createDataType(TSDB_DATA_TYPE_INT); } break; - case 164: /* type_name ::= BIGINT */ -{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_BIGINT); } + case 166: /* type_name ::= BIGINT */ +{ yymsp[0].minor.yy640 = createDataType(TSDB_DATA_TYPE_BIGINT); } break; - case 165: /* type_name ::= FLOAT */ -{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_FLOAT); } + case 167: /* type_name ::= FLOAT */ +{ yymsp[0].minor.yy640 = createDataType(TSDB_DATA_TYPE_FLOAT); } break; - case 166: /* type_name ::= DOUBLE */ -{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_DOUBLE); } + case 168: /* type_name ::= DOUBLE */ +{ yymsp[0].minor.yy640 = createDataType(TSDB_DATA_TYPE_DOUBLE); } break; - case 167: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy720 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } + case 169: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy640 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } break; - case 168: /* type_name ::= TIMESTAMP */ -{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } + case 170: /* type_name ::= TIMESTAMP */ +{ yymsp[0].minor.yy640 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } break; - case 169: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy720 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } + case 171: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy640 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } break; - case 170: /* type_name ::= TINYINT UNSIGNED */ -{ yymsp[-1].minor.yy720 = createDataType(TSDB_DATA_TYPE_UTINYINT); } + case 172: /* type_name ::= TINYINT UNSIGNED */ +{ yymsp[-1].minor.yy640 = createDataType(TSDB_DATA_TYPE_UTINYINT); } break; - case 171: /* type_name ::= SMALLINT UNSIGNED */ -{ yymsp[-1].minor.yy720 = createDataType(TSDB_DATA_TYPE_USMALLINT); } + case 173: /* type_name ::= SMALLINT UNSIGNED */ +{ yymsp[-1].minor.yy640 = createDataType(TSDB_DATA_TYPE_USMALLINT); } break; - case 172: /* type_name ::= INT UNSIGNED */ -{ yymsp[-1].minor.yy720 = createDataType(TSDB_DATA_TYPE_UINT); } + case 174: /* type_name ::= INT UNSIGNED */ +{ yymsp[-1].minor.yy640 = createDataType(TSDB_DATA_TYPE_UINT); } break; - case 173: /* type_name ::= BIGINT UNSIGNED */ -{ yymsp[-1].minor.yy720 = createDataType(TSDB_DATA_TYPE_UBIGINT); } + case 175: /* type_name ::= BIGINT UNSIGNED */ +{ yymsp[-1].minor.yy640 = createDataType(TSDB_DATA_TYPE_UBIGINT); } break; - case 174: /* type_name ::= JSON */ -{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_JSON); } + case 176: /* type_name ::= JSON */ +{ yymsp[0].minor.yy640 = createDataType(TSDB_DATA_TYPE_JSON); } break; - case 175: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy720 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } + case 177: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy640 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } break; - case 176: /* type_name ::= MEDIUMBLOB */ -{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } + case 178: /* type_name ::= MEDIUMBLOB */ +{ yymsp[0].minor.yy640 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } break; - case 177: /* type_name ::= BLOB */ -{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_BLOB); } + case 179: /* type_name ::= BLOB */ +{ yymsp[0].minor.yy640 = createDataType(TSDB_DATA_TYPE_BLOB); } break; - case 178: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy720 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } + case 180: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy640 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } break; - case 179: /* type_name ::= DECIMAL */ -{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 181: /* type_name ::= DECIMAL */ +{ yymsp[0].minor.yy640 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 180: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy720 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 182: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ +{ yymsp[-3].minor.yy640 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 181: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ -{ yymsp[-5].minor.yy720 = createDataType(TSDB_DATA_TYPE_DECIMAL); } + case 183: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ +{ yymsp[-5].minor.yy640 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 183: /* tags_def_opt ::= tags_def */ - case 401: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==401); -{ yylhsminor.yy648 = yymsp[0].minor.yy648; } - yymsp[0].minor.yy648 = yylhsminor.yy648; + case 185: /* tags_def_opt ::= tags_def */ + case 404: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==404); +{ yylhsminor.yy616 = yymsp[0].minor.yy616; } + yymsp[0].minor.yy616 = yylhsminor.yy616; break; - case 184: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ -{ yymsp[-3].minor.yy648 = yymsp[-1].minor.yy648; } + case 186: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ +{ yymsp[-3].minor.yy616 = yymsp[-1].minor.yy616; } break; - case 185: /* table_options ::= */ -{ yymsp[1].minor.yy164 = createDefaultTableOptions(pCxt); } + case 187: /* table_options ::= */ +{ yymsp[1].minor.yy104 = createDefaultTableOptions(pCxt); } break; - case 186: /* table_options ::= table_options COMMENT NK_STRING */ -{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-2].minor.yy164, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 188: /* table_options ::= table_options COMMENT NK_STRING */ +{ yylhsminor.yy104 = setTableOption(pCxt, yymsp[-2].minor.yy104, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 187: /* table_options ::= table_options MAX_DELAY duration_list */ -{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-2].minor.yy164, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy648); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 189: /* table_options ::= table_options MAX_DELAY duration_list */ +{ yylhsminor.yy104 = setTableOption(pCxt, yymsp[-2].minor.yy104, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy616); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 188: /* table_options ::= table_options WATERMARK duration_list */ -{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-2].minor.yy164, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy648); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 190: /* table_options ::= table_options WATERMARK duration_list */ +{ yylhsminor.yy104 = setTableOption(pCxt, yymsp[-2].minor.yy104, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy616); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 189: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ -{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-4].minor.yy164, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy648); } - yymsp[-4].minor.yy164 = yylhsminor.yy164; + case 191: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ +{ yylhsminor.yy104 = setTableOption(pCxt, yymsp[-4].minor.yy104, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy616); } + yymsp[-4].minor.yy104 = yylhsminor.yy104; break; - case 190: /* table_options ::= table_options TTL NK_INTEGER */ -{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-2].minor.yy164, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 192: /* table_options ::= table_options TTL NK_INTEGER */ +{ yylhsminor.yy104 = setTableOption(pCxt, yymsp[-2].minor.yy104, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 191: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ -{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-4].minor.yy164, TABLE_OPTION_SMA, yymsp[-1].minor.yy648); } - yymsp[-4].minor.yy164 = yylhsminor.yy164; + case 193: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ +{ yylhsminor.yy104 = setTableOption(pCxt, yymsp[-4].minor.yy104, TABLE_OPTION_SMA, yymsp[-1].minor.yy616); } + yymsp[-4].minor.yy104 = yylhsminor.yy104; break; - case 192: /* alter_table_options ::= alter_table_option */ -{ yylhsminor.yy164 = createAlterTableOptions(pCxt); yylhsminor.yy164 = setTableOption(pCxt, yylhsminor.yy164, yymsp[0].minor.yy213.type, &yymsp[0].minor.yy213.val); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 194: /* alter_table_options ::= alter_table_option */ +{ yylhsminor.yy104 = createAlterTableOptions(pCxt); yylhsminor.yy104 = setTableOption(pCxt, yylhsminor.yy104, yymsp[0].minor.yy557.type, &yymsp[0].minor.yy557.val); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 193: /* alter_table_options ::= alter_table_options alter_table_option */ -{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-1].minor.yy164, yymsp[0].minor.yy213.type, &yymsp[0].minor.yy213.val); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + case 195: /* alter_table_options ::= alter_table_options alter_table_option */ +{ yylhsminor.yy104 = setTableOption(pCxt, yymsp[-1].minor.yy104, yymsp[0].minor.yy557.type, &yymsp[0].minor.yy557.val); } + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 194: /* alter_table_option ::= COMMENT NK_STRING */ -{ yymsp[-1].minor.yy213.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; } + case 196: /* alter_table_option ::= COMMENT NK_STRING */ +{ yymsp[-1].minor.yy557.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy557.val = yymsp[0].minor.yy0; } break; - case 195: /* alter_table_option ::= TTL NK_INTEGER */ -{ yymsp[-1].minor.yy213.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; } + case 197: /* alter_table_option ::= TTL NK_INTEGER */ +{ yymsp[-1].minor.yy557.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy557.val = yymsp[0].minor.yy0; } break; - case 196: /* duration_list ::= duration_literal */ - case 366: /* expression_list ::= expr_or_subquery */ yytestcase(yyruleno==366); -{ yylhsminor.yy648 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy164)); } - yymsp[0].minor.yy648 = yylhsminor.yy648; + case 198: /* duration_list ::= duration_literal */ + case 369: /* expression_list ::= expr_or_subquery */ yytestcase(yyruleno==369); +{ yylhsminor.yy616 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy104)); } + yymsp[0].minor.yy616 = yylhsminor.yy616; break; - case 197: /* duration_list ::= duration_list NK_COMMA duration_literal */ - case 367: /* expression_list ::= expression_list NK_COMMA expr_or_subquery */ yytestcase(yyruleno==367); -{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, releaseRawExprNode(pCxt, yymsp[0].minor.yy164)); } - yymsp[-2].minor.yy648 = yylhsminor.yy648; + case 199: /* duration_list ::= duration_list NK_COMMA duration_literal */ + case 370: /* expression_list ::= expression_list NK_COMMA expr_or_subquery */ yytestcase(yyruleno==370); +{ yylhsminor.yy616 = addNodeToList(pCxt, yymsp[-2].minor.yy616, releaseRawExprNode(pCxt, yymsp[0].minor.yy104)); } + yymsp[-2].minor.yy616 = yylhsminor.yy616; break; - case 200: /* rollup_func_name ::= function_name */ -{ yylhsminor.yy164 = createFunctionNode(pCxt, &yymsp[0].minor.yy593, NULL); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 202: /* rollup_func_name ::= function_name */ +{ yylhsminor.yy104 = createFunctionNode(pCxt, &yymsp[0].minor.yy737, NULL); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 201: /* rollup_func_name ::= FIRST */ - case 202: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==202); - case 254: /* tag_item ::= QTAGS */ yytestcase(yyruleno==254); -{ yylhsminor.yy164 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 203: /* rollup_func_name ::= FIRST */ + case 204: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==204); + case 257: /* tag_item ::= QTAGS */ yytestcase(yyruleno==257); +{ yylhsminor.yy104 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 205: /* col_name ::= column_name */ - case 255: /* tag_item ::= column_name */ yytestcase(yyruleno==255); -{ yylhsminor.yy164 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy593); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 207: /* col_name ::= column_name */ + case 258: /* tag_item ::= column_name */ yytestcase(yyruleno==258); +{ yylhsminor.yy104 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy737); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 206: /* cmd ::= SHOW DNODES */ + case 208: /* cmd ::= SHOW DNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT); } break; - case 207: /* cmd ::= SHOW USERS */ + case 209: /* cmd ::= SHOW USERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT); } break; - case 208: /* cmd ::= SHOW DATABASES */ + case 210: /* cmd ::= SHOW USER PRIVILEGES */ +{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USER_PRIVILEGES_STMT); } + break; + case 211: /* cmd ::= SHOW DATABASES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); } break; - case 209: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy164, yymsp[0].minor.yy164, OP_TYPE_LIKE); } + case 212: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy104, yymsp[0].minor.yy104, OP_TYPE_LIKE); } break; - case 210: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy164, yymsp[0].minor.yy164, OP_TYPE_LIKE); } + case 213: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy104, yymsp[0].minor.yy104, OP_TYPE_LIKE); } break; - case 211: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy164, NULL, OP_TYPE_LIKE); } + case 214: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy104, NULL, OP_TYPE_LIKE); } break; - case 212: /* cmd ::= SHOW MNODES */ + case 215: /* cmd ::= SHOW MNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT); } break; - case 213: /* cmd ::= SHOW QNODES */ + case 216: /* cmd ::= SHOW QNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QNODES_STMT); } break; - case 214: /* cmd ::= SHOW FUNCTIONS */ + case 217: /* cmd ::= SHOW FUNCTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT); } break; - case 215: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy164, yymsp[-1].minor.yy164, OP_TYPE_EQUAL); } + case 218: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy104, yymsp[-1].minor.yy104, OP_TYPE_EQUAL); } break; - case 216: /* cmd ::= SHOW STREAMS */ + case 219: /* cmd ::= SHOW STREAMS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT); } break; - case 217: /* cmd ::= SHOW ACCOUNTS */ + case 220: /* cmd ::= SHOW ACCOUNTS */ { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } break; - case 218: /* cmd ::= SHOW APPS */ + case 221: /* cmd ::= SHOW APPS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_APPS_STMT); } break; - case 219: /* cmd ::= SHOW CONNECTIONS */ + case 222: /* cmd ::= SHOW CONNECTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONNECTIONS_STMT); } break; - case 220: /* cmd ::= SHOW LICENCES */ - case 221: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==221); + case 223: /* cmd ::= SHOW LICENCES */ + case 224: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==224); { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LICENCES_STMT); } break; - case 222: /* cmd ::= SHOW CREATE DATABASE db_name */ -{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy593); } + case 225: /* cmd ::= SHOW CREATE DATABASE db_name */ +{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy737); } break; - case 223: /* cmd ::= SHOW CREATE TABLE full_table_name */ -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy164); } + case 226: /* cmd ::= SHOW CREATE TABLE full_table_name */ +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy104); } break; - case 224: /* cmd ::= SHOW CREATE STABLE full_table_name */ -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy164); } + case 227: /* cmd ::= SHOW CREATE STABLE full_table_name */ +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy104); } break; - case 225: /* cmd ::= SHOW QUERIES */ + case 228: /* cmd ::= SHOW QUERIES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QUERIES_STMT); } break; - case 226: /* cmd ::= SHOW SCORES */ + case 229: /* cmd ::= SHOW SCORES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SCORES_STMT); } break; - case 227: /* cmd ::= SHOW TOPICS */ + case 230: /* cmd ::= SHOW TOPICS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TOPICS_STMT); } break; - case 228: /* cmd ::= SHOW VARIABLES */ - case 229: /* cmd ::= SHOW CLUSTER VARIABLES */ yytestcase(yyruleno==229); + case 231: /* cmd ::= SHOW VARIABLES */ + case 232: /* cmd ::= SHOW CLUSTER VARIABLES */ yytestcase(yyruleno==232); { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VARIABLES_STMT); } break; - case 230: /* cmd ::= SHOW LOCAL VARIABLES */ + case 233: /* cmd ::= SHOW LOCAL VARIABLES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT); } break; - case 231: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt */ -{ pCxt->pRootNode = createShowDnodeVariablesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[-2].minor.yy0), yymsp[0].minor.yy164); } + case 234: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt */ +{ pCxt->pRootNode = createShowDnodeVariablesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[-2].minor.yy0), yymsp[0].minor.yy104); } break; - case 232: /* cmd ::= SHOW BNODES */ + case 235: /* cmd ::= SHOW BNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_BNODES_STMT); } break; - case 233: /* cmd ::= SHOW SNODES */ + case 236: /* cmd ::= SHOW SNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SNODES_STMT); } break; - case 234: /* cmd ::= SHOW CLUSTER */ + case 237: /* cmd ::= SHOW CLUSTER */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CLUSTER_STMT); } break; - case 235: /* cmd ::= SHOW TRANSACTIONS */ + case 238: /* cmd ::= SHOW TRANSACTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TRANSACTIONS_STMT); } break; - case 236: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ -{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy164); } + case 239: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ +{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy104); } break; - case 237: /* cmd ::= SHOW CONSUMERS */ + case 240: /* cmd ::= SHOW CONSUMERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); } break; - case 238: /* cmd ::= SHOW SUBSCRIPTIONS */ + case 241: /* cmd ::= SHOW SUBSCRIPTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); } break; - case 239: /* cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy164, yymsp[-1].minor.yy164, OP_TYPE_EQUAL); } + case 242: /* cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy104, yymsp[-1].minor.yy104, OP_TYPE_EQUAL); } break; - case 240: /* cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt */ -{ pCxt->pRootNode = createShowTableTagsStmt(pCxt, yymsp[-1].minor.yy164, yymsp[0].minor.yy164, yymsp[-3].minor.yy648); } + case 243: /* cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt */ +{ pCxt->pRootNode = createShowTableTagsStmt(pCxt, yymsp[-1].minor.yy104, yymsp[0].minor.yy104, yymsp[-3].minor.yy616); } break; - case 241: /* cmd ::= SHOW VNODES NK_INTEGER */ + case 244: /* cmd ::= SHOW VNODES NK_INTEGER */ { pCxt->pRootNode = createShowVnodesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0), NULL); } break; - case 242: /* cmd ::= SHOW VNODES NK_STRING */ + case 245: /* cmd ::= SHOW VNODES NK_STRING */ { pCxt->pRootNode = createShowVnodesStmt(pCxt, NULL, createValueNode(pCxt, TSDB_DATA_TYPE_VARCHAR, &yymsp[0].minor.yy0)); } break; - case 243: /* db_name_cond_opt ::= */ - case 248: /* from_db_opt ::= */ yytestcase(yyruleno==248); -{ yymsp[1].minor.yy164 = createDefaultDatabaseCondValue(pCxt); } + case 246: /* db_name_cond_opt ::= */ + case 251: /* from_db_opt ::= */ yytestcase(yyruleno==251); +{ yymsp[1].minor.yy104 = createDefaultDatabaseCondValue(pCxt); } break; - case 244: /* db_name_cond_opt ::= db_name NK_DOT */ -{ yylhsminor.yy164 = createIdentifierValueNode(pCxt, &yymsp[-1].minor.yy593); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + case 247: /* db_name_cond_opt ::= db_name NK_DOT */ +{ yylhsminor.yy104 = createIdentifierValueNode(pCxt, &yymsp[-1].minor.yy737); } + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 245: /* like_pattern_opt ::= */ - case 299: /* subtable_opt ::= */ yytestcase(yyruleno==299); - case 411: /* case_when_else_opt ::= */ yytestcase(yyruleno==411); - case 441: /* from_clause_opt ::= */ yytestcase(yyruleno==441); - case 470: /* where_clause_opt ::= */ yytestcase(yyruleno==470); - case 479: /* twindow_clause_opt ::= */ yytestcase(yyruleno==479); - case 484: /* sliding_opt ::= */ yytestcase(yyruleno==484); - case 486: /* fill_opt ::= */ yytestcase(yyruleno==486); - case 498: /* having_clause_opt ::= */ yytestcase(yyruleno==498); - case 500: /* range_opt ::= */ yytestcase(yyruleno==500); - case 502: /* every_opt ::= */ yytestcase(yyruleno==502); - case 515: /* slimit_clause_opt ::= */ yytestcase(yyruleno==515); - case 519: /* limit_clause_opt ::= */ yytestcase(yyruleno==519); -{ yymsp[1].minor.yy164 = NULL; } + case 248: /* like_pattern_opt ::= */ + case 302: /* subtable_opt ::= */ yytestcase(yyruleno==302); + case 414: /* case_when_else_opt ::= */ yytestcase(yyruleno==414); + case 444: /* from_clause_opt ::= */ yytestcase(yyruleno==444); + case 473: /* where_clause_opt ::= */ yytestcase(yyruleno==473); + case 482: /* twindow_clause_opt ::= */ yytestcase(yyruleno==482); + case 487: /* sliding_opt ::= */ yytestcase(yyruleno==487); + case 489: /* fill_opt ::= */ yytestcase(yyruleno==489); + case 501: /* having_clause_opt ::= */ yytestcase(yyruleno==501); + case 503: /* range_opt ::= */ yytestcase(yyruleno==503); + case 505: /* every_opt ::= */ yytestcase(yyruleno==505); + case 518: /* slimit_clause_opt ::= */ yytestcase(yyruleno==518); + case 522: /* limit_clause_opt ::= */ yytestcase(yyruleno==522); +{ yymsp[1].minor.yy104 = NULL; } break; - case 246: /* like_pattern_opt ::= LIKE NK_STRING */ -{ yymsp[-1].minor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } + case 249: /* like_pattern_opt ::= LIKE NK_STRING */ +{ yymsp[-1].minor.yy104 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } break; - case 247: /* table_name_cond ::= table_name */ -{ yylhsminor.yy164 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy593); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 250: /* table_name_cond ::= table_name */ +{ yylhsminor.yy104 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy737); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 249: /* from_db_opt ::= FROM db_name */ -{ yymsp[-1].minor.yy164 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy593); } + case 252: /* from_db_opt ::= FROM db_name */ +{ yymsp[-1].minor.yy104 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy737); } break; - case 253: /* tag_item ::= TBNAME */ -{ yylhsminor.yy164 = setProjectionAlias(pCxt, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL), &yymsp[0].minor.yy0); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 256: /* tag_item ::= TBNAME */ +{ yylhsminor.yy104 = setProjectionAlias(pCxt, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL), &yymsp[0].minor.yy0); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 256: /* tag_item ::= column_name column_alias */ -{ yylhsminor.yy164 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-1].minor.yy593), &yymsp[0].minor.yy593); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + case 259: /* tag_item ::= column_name column_alias */ +{ yylhsminor.yy104 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-1].minor.yy737), &yymsp[0].minor.yy737); } + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 257: /* tag_item ::= column_name AS column_alias */ -{ yylhsminor.yy164 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-2].minor.yy593), &yymsp[0].minor.yy593); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 260: /* tag_item ::= column_name AS column_alias */ +{ yylhsminor.yy104 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-2].minor.yy737), &yymsp[0].minor.yy737); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 258: /* cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ -{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy193, yymsp[-3].minor.yy164, yymsp[-1].minor.yy164, NULL, yymsp[0].minor.yy164); } + case 261: /* cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ +{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy185, yymsp[-3].minor.yy104, yymsp[-1].minor.yy104, NULL, yymsp[0].minor.yy104); } break; - case 259: /* cmd ::= DROP INDEX exists_opt full_table_name */ -{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy193, yymsp[0].minor.yy164); } + case 262: /* cmd ::= DROP INDEX exists_opt full_table_name */ +{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy185, yymsp[0].minor.yy104); } break; - case 260: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ -{ yymsp[-9].minor.yy164 = createIndexOption(pCxt, yymsp[-7].minor.yy648, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), NULL, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); } + case 263: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ +{ yymsp[-9].minor.yy104 = createIndexOption(pCxt, yymsp[-7].minor.yy616, releaseRawExprNode(pCxt, yymsp[-3].minor.yy104), NULL, yymsp[-1].minor.yy104, yymsp[0].minor.yy104); } break; - case 261: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ -{ yymsp[-11].minor.yy164 = createIndexOption(pCxt, yymsp[-9].minor.yy648, releaseRawExprNode(pCxt, yymsp[-5].minor.yy164), releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), yymsp[-1].minor.yy164, yymsp[0].minor.yy164); } + case 264: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ +{ yymsp[-11].minor.yy104 = createIndexOption(pCxt, yymsp[-9].minor.yy616, releaseRawExprNode(pCxt, yymsp[-5].minor.yy104), releaseRawExprNode(pCxt, yymsp[-3].minor.yy104), yymsp[-1].minor.yy104, yymsp[0].minor.yy104); } break; - case 264: /* func ::= function_name NK_LP expression_list NK_RP */ -{ yylhsminor.yy164 = createFunctionNode(pCxt, &yymsp[-3].minor.yy593, yymsp[-1].minor.yy648); } - yymsp[-3].minor.yy164 = yylhsminor.yy164; + case 267: /* func ::= function_name NK_LP expression_list NK_RP */ +{ yylhsminor.yy104 = createFunctionNode(pCxt, &yymsp[-3].minor.yy737, yymsp[-1].minor.yy616); } + yymsp[-3].minor.yy104 = yylhsminor.yy104; break; - case 265: /* sma_stream_opt ::= */ - case 292: /* stream_options ::= */ yytestcase(yyruleno==292); -{ yymsp[1].minor.yy164 = createStreamOptions(pCxt); } + case 268: /* sma_stream_opt ::= */ + case 295: /* stream_options ::= */ yytestcase(yyruleno==295); +{ yymsp[1].minor.yy104 = createStreamOptions(pCxt); } break; - case 266: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */ - case 296: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==296); -{ ((SStreamOptions*)yymsp[-2].minor.yy164)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); yylhsminor.yy164 = yymsp[-2].minor.yy164; } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 269: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */ + case 299: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==299); +{ ((SStreamOptions*)yymsp[-2].minor.yy104)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy104); yylhsminor.yy104 = yymsp[-2].minor.yy104; } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 267: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ -{ ((SStreamOptions*)yymsp[-2].minor.yy164)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); yylhsminor.yy164 = yymsp[-2].minor.yy164; } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 270: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ +{ ((SStreamOptions*)yymsp[-2].minor.yy104)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy104); yylhsminor.yy104 = yymsp[-2].minor.yy104; } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 268: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ -{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy193, &yymsp[-2].minor.yy593, yymsp[0].minor.yy164); } + case 271: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ +{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy185, &yymsp[-2].minor.yy737, yymsp[0].minor.yy104); } break; - case 269: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy193, &yymsp[-3].minor.yy593, &yymsp[0].minor.yy593, false); } + case 272: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy185, &yymsp[-3].minor.yy737, &yymsp[0].minor.yy737, false); } break; - case 270: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy193, &yymsp[-5].minor.yy593, &yymsp[0].minor.yy593, true); } + case 273: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy185, &yymsp[-5].minor.yy737, &yymsp[0].minor.yy737, true); } break; - case 271: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy193, &yymsp[-3].minor.yy593, yymsp[0].minor.yy164, false); } + case 274: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy185, &yymsp[-3].minor.yy737, yymsp[0].minor.yy104, false); } break; - case 272: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy193, &yymsp[-5].minor.yy593, yymsp[0].minor.yy164, true); } + case 275: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy185, &yymsp[-5].minor.yy737, yymsp[0].minor.yy104, true); } break; - case 273: /* cmd ::= DROP TOPIC exists_opt topic_name */ -{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy193, &yymsp[0].minor.yy593); } + case 276: /* cmd ::= DROP TOPIC exists_opt topic_name */ +{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy185, &yymsp[0].minor.yy737); } break; - case 274: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ -{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy193, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593); } + case 277: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ +{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy185, &yymsp[-2].minor.yy737, &yymsp[0].minor.yy737); } break; - case 275: /* cmd ::= DESC full_table_name */ - case 276: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==276); -{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy164); } + case 278: /* cmd ::= DESC full_table_name */ + case 279: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==279); +{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy104); } break; - case 277: /* cmd ::= RESET QUERY CACHE */ + case 280: /* cmd ::= RESET QUERY CACHE */ { pCxt->pRootNode = createResetQueryCacheStmt(pCxt); } break; - case 278: /* cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ -{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy193, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); } + case 281: /* cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ +{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy185, yymsp[-1].minor.yy104, yymsp[0].minor.yy104); } break; - case 281: /* explain_options ::= */ -{ yymsp[1].minor.yy164 = createDefaultExplainOptions(pCxt); } + case 284: /* explain_options ::= */ +{ yymsp[1].minor.yy104 = createDefaultExplainOptions(pCxt); } break; - case 282: /* explain_options ::= explain_options VERBOSE NK_BOOL */ -{ yylhsminor.yy164 = setExplainVerbose(pCxt, yymsp[-2].minor.yy164, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 285: /* explain_options ::= explain_options VERBOSE NK_BOOL */ +{ yylhsminor.yy104 = setExplainVerbose(pCxt, yymsp[-2].minor.yy104, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 283: /* explain_options ::= explain_options RATIO NK_FLOAT */ -{ yylhsminor.yy164 = setExplainRatio(pCxt, yymsp[-2].minor.yy164, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 286: /* explain_options ::= explain_options RATIO NK_FLOAT */ +{ yylhsminor.yy104 = setExplainRatio(pCxt, yymsp[-2].minor.yy104, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 284: /* cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ -{ pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-6].minor.yy193, yymsp[-8].minor.yy193, &yymsp[-5].minor.yy593, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy720, yymsp[0].minor.yy512); } + case 287: /* cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ +{ pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-6].minor.yy185, yymsp[-8].minor.yy185, &yymsp[-5].minor.yy737, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy640, yymsp[0].minor.yy196); } break; - case 285: /* cmd ::= DROP FUNCTION exists_opt function_name */ -{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy193, &yymsp[0].minor.yy593); } + case 288: /* cmd ::= DROP FUNCTION exists_opt function_name */ +{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy185, &yymsp[0].minor.yy737); } break; - case 290: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */ -{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-8].minor.yy193, &yymsp[-7].minor.yy593, yymsp[-4].minor.yy164, yymsp[-6].minor.yy164, yymsp[-3].minor.yy648, yymsp[-2].minor.yy164, yymsp[0].minor.yy164); } + case 293: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */ +{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-8].minor.yy185, &yymsp[-7].minor.yy737, yymsp[-4].minor.yy104, yymsp[-6].minor.yy104, yymsp[-3].minor.yy616, yymsp[-2].minor.yy104, yymsp[0].minor.yy104); } break; - case 291: /* cmd ::= DROP STREAM exists_opt stream_name */ -{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy193, &yymsp[0].minor.yy593); } + case 294: /* cmd ::= DROP STREAM exists_opt stream_name */ +{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy185, &yymsp[0].minor.yy737); } break; - case 293: /* stream_options ::= stream_options TRIGGER AT_ONCE */ -{ ((SStreamOptions*)yymsp[-2].minor.yy164)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy164 = yymsp[-2].minor.yy164; } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 296: /* stream_options ::= stream_options TRIGGER AT_ONCE */ +{ ((SStreamOptions*)yymsp[-2].minor.yy104)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy104 = yymsp[-2].minor.yy104; } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 294: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ -{ ((SStreamOptions*)yymsp[-2].minor.yy164)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy164 = yymsp[-2].minor.yy164; } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 297: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ +{ ((SStreamOptions*)yymsp[-2].minor.yy104)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy104 = yymsp[-2].minor.yy104; } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 295: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ -{ ((SStreamOptions*)yymsp[-3].minor.yy164)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy164)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); yylhsminor.yy164 = yymsp[-3].minor.yy164; } - yymsp[-3].minor.yy164 = yylhsminor.yy164; + case 298: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ +{ ((SStreamOptions*)yymsp[-3].minor.yy104)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy104)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy104); yylhsminor.yy104 = yymsp[-3].minor.yy104; } + yymsp[-3].minor.yy104 = yylhsminor.yy104; break; - case 297: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ -{ ((SStreamOptions*)yymsp[-3].minor.yy164)->ignoreExpired = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy164 = yymsp[-3].minor.yy164; } - yymsp[-3].minor.yy164 = yylhsminor.yy164; + case 300: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ +{ ((SStreamOptions*)yymsp[-3].minor.yy104)->ignoreExpired = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy104 = yymsp[-3].minor.yy104; } + yymsp[-3].minor.yy104 = yylhsminor.yy104; break; - case 298: /* stream_options ::= stream_options FILL_HISTORY NK_INTEGER */ -{ ((SStreamOptions*)yymsp[-2].minor.yy164)->fillHistory = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy164 = yymsp[-2].minor.yy164; } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 301: /* stream_options ::= stream_options FILL_HISTORY NK_INTEGER */ +{ ((SStreamOptions*)yymsp[-2].minor.yy104)->fillHistory = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy104 = yymsp[-2].minor.yy104; } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 300: /* subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ - case 485: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ yytestcase(yyruleno==485); - case 503: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==503); -{ yymsp[-3].minor.yy164 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy164); } + case 303: /* subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ + case 488: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ yytestcase(yyruleno==488); + case 506: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==506); +{ yymsp[-3].minor.yy104 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy104); } break; - case 301: /* cmd ::= KILL CONNECTION NK_INTEGER */ + case 304: /* cmd ::= KILL CONNECTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_CONNECTION_STMT, &yymsp[0].minor.yy0); } break; - case 302: /* cmd ::= KILL QUERY NK_STRING */ + case 305: /* cmd ::= KILL QUERY NK_STRING */ { pCxt->pRootNode = createKillQueryStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 303: /* cmd ::= KILL TRANSACTION NK_INTEGER */ + case 306: /* cmd ::= KILL TRANSACTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_TRANSACTION_STMT, &yymsp[0].minor.yy0); } break; - case 304: /* cmd ::= BALANCE VGROUP */ + case 307: /* cmd ::= BALANCE VGROUP */ { pCxt->pRootNode = createBalanceVgroupStmt(pCxt); } break; - case 305: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + case 308: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ { pCxt->pRootNode = createMergeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } break; - case 306: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ -{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy648); } + case 309: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ +{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy616); } break; - case 307: /* cmd ::= SPLIT VGROUP NK_INTEGER */ + case 310: /* cmd ::= SPLIT VGROUP NK_INTEGER */ { pCxt->pRootNode = createSplitVgroupStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 308: /* dnode_list ::= DNODE NK_INTEGER */ -{ yymsp[-1].minor.yy648 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + case 311: /* dnode_list ::= DNODE NK_INTEGER */ +{ yymsp[-1].minor.yy616 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } break; - case 310: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ -{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); } + case 313: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ +{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy104, yymsp[0].minor.yy104); } break; - case 312: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ -{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-4].minor.yy164, yymsp[-2].minor.yy648, yymsp[0].minor.yy164); } + case 315: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ +{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-4].minor.yy104, yymsp[-2].minor.yy616, yymsp[0].minor.yy104); } break; - case 313: /* cmd ::= INSERT INTO full_table_name query_or_subquery */ -{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-1].minor.yy164, NULL, yymsp[0].minor.yy164); } + case 316: /* cmd ::= INSERT INTO full_table_name query_or_subquery */ +{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-1].minor.yy104, NULL, yymsp[0].minor.yy104); } break; - case 314: /* literal ::= NK_INTEGER */ -{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 317: /* literal ::= NK_INTEGER */ +{ yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 315: /* literal ::= NK_FLOAT */ -{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 318: /* literal ::= NK_FLOAT */ +{ yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 316: /* literal ::= NK_STRING */ -{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 319: /* literal ::= NK_STRING */ +{ yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 317: /* literal ::= NK_BOOL */ -{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 320: /* literal ::= NK_BOOL */ +{ yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 318: /* literal ::= TIMESTAMP NK_STRING */ -{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + case 321: /* literal ::= TIMESTAMP NK_STRING */ +{ yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 319: /* literal ::= duration_literal */ - case 329: /* signed_literal ::= signed */ yytestcase(yyruleno==329); - case 349: /* expr_or_subquery ::= expression */ yytestcase(yyruleno==349); - case 350: /* expression ::= literal */ yytestcase(yyruleno==350); - case 351: /* expression ::= pseudo_column */ yytestcase(yyruleno==351); - case 352: /* expression ::= column_reference */ yytestcase(yyruleno==352); - case 353: /* expression ::= function_expression */ yytestcase(yyruleno==353); - case 354: /* expression ::= case_when_expression */ yytestcase(yyruleno==354); - case 384: /* function_expression ::= literal_func */ yytestcase(yyruleno==384); - case 433: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==433); - case 437: /* boolean_primary ::= predicate */ yytestcase(yyruleno==437); - case 439: /* common_expression ::= expr_or_subquery */ yytestcase(yyruleno==439); - case 440: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==440); - case 443: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==443); - case 445: /* table_reference ::= table_primary */ yytestcase(yyruleno==445); - case 446: /* table_reference ::= joined_table */ yytestcase(yyruleno==446); - case 450: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==450); - case 505: /* query_simple ::= query_specification */ yytestcase(yyruleno==505); - case 506: /* query_simple ::= union_query_expression */ yytestcase(yyruleno==506); - case 509: /* query_simple_or_subquery ::= query_simple */ yytestcase(yyruleno==509); - case 511: /* query_or_subquery ::= query_expression */ yytestcase(yyruleno==511); -{ yylhsminor.yy164 = yymsp[0].minor.yy164; } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 322: /* literal ::= duration_literal */ + case 332: /* signed_literal ::= signed */ yytestcase(yyruleno==332); + case 352: /* expr_or_subquery ::= expression */ yytestcase(yyruleno==352); + case 353: /* expression ::= literal */ yytestcase(yyruleno==353); + case 354: /* expression ::= pseudo_column */ yytestcase(yyruleno==354); + case 355: /* expression ::= column_reference */ yytestcase(yyruleno==355); + case 356: /* expression ::= function_expression */ yytestcase(yyruleno==356); + case 357: /* expression ::= case_when_expression */ yytestcase(yyruleno==357); + case 387: /* function_expression ::= literal_func */ yytestcase(yyruleno==387); + case 436: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==436); + case 440: /* boolean_primary ::= predicate */ yytestcase(yyruleno==440); + case 442: /* common_expression ::= expr_or_subquery */ yytestcase(yyruleno==442); + case 443: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==443); + case 446: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==446); + case 448: /* table_reference ::= table_primary */ yytestcase(yyruleno==448); + case 449: /* table_reference ::= joined_table */ yytestcase(yyruleno==449); + case 453: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==453); + case 508: /* query_simple ::= query_specification */ yytestcase(yyruleno==508); + case 509: /* query_simple ::= union_query_expression */ yytestcase(yyruleno==509); + case 512: /* query_simple_or_subquery ::= query_simple */ yytestcase(yyruleno==512); + case 514: /* query_or_subquery ::= query_expression */ yytestcase(yyruleno==514); +{ yylhsminor.yy104 = yymsp[0].minor.yy104; } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 320: /* literal ::= NULL */ -{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 323: /* literal ::= NULL */ +{ yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 321: /* literal ::= NK_QUESTION */ -{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 324: /* literal ::= NK_QUESTION */ +{ yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 322: /* duration_literal ::= NK_VARIABLE */ -{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 325: /* duration_literal ::= NK_VARIABLE */ +{ yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 323: /* signed ::= NK_INTEGER */ -{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 326: /* signed ::= NK_INTEGER */ +{ yylhsminor.yy104 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 324: /* signed ::= NK_PLUS NK_INTEGER */ -{ yymsp[-1].minor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } + case 327: /* signed ::= NK_PLUS NK_INTEGER */ +{ yymsp[-1].minor.yy104 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } break; - case 325: /* signed ::= NK_MINUS NK_INTEGER */ + case 328: /* signed ::= NK_MINUS NK_INTEGER */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); + yylhsminor.yy104 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 326: /* signed ::= NK_FLOAT */ -{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 329: /* signed ::= NK_FLOAT */ +{ yylhsminor.yy104 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 327: /* signed ::= NK_PLUS NK_FLOAT */ -{ yymsp[-1].minor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } + case 330: /* signed ::= NK_PLUS NK_FLOAT */ +{ yymsp[-1].minor.yy104 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } break; - case 328: /* signed ::= NK_MINUS NK_FLOAT */ + case 331: /* signed ::= NK_MINUS NK_FLOAT */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); + yylhsminor.yy104 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 330: /* signed_literal ::= NK_STRING */ -{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 333: /* signed_literal ::= NK_STRING */ +{ yylhsminor.yy104 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 331: /* signed_literal ::= NK_BOOL */ -{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 334: /* signed_literal ::= NK_BOOL */ +{ yylhsminor.yy104 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 332: /* signed_literal ::= TIMESTAMP NK_STRING */ -{ yymsp[-1].minor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } + case 335: /* signed_literal ::= TIMESTAMP NK_STRING */ +{ yymsp[-1].minor.yy104 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } break; - case 333: /* signed_literal ::= duration_literal */ - case 335: /* signed_literal ::= literal_func */ yytestcase(yyruleno==335); - case 404: /* star_func_para ::= expr_or_subquery */ yytestcase(yyruleno==404); - case 466: /* select_item ::= common_expression */ yytestcase(yyruleno==466); - case 476: /* partition_item ::= expr_or_subquery */ yytestcase(yyruleno==476); - case 510: /* query_simple_or_subquery ::= subquery */ yytestcase(yyruleno==510); - case 512: /* query_or_subquery ::= subquery */ yytestcase(yyruleno==512); - case 525: /* search_condition ::= common_expression */ yytestcase(yyruleno==525); -{ yylhsminor.yy164 = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 336: /* signed_literal ::= duration_literal */ + case 338: /* signed_literal ::= literal_func */ yytestcase(yyruleno==338); + case 407: /* star_func_para ::= expr_or_subquery */ yytestcase(yyruleno==407); + case 469: /* select_item ::= common_expression */ yytestcase(yyruleno==469); + case 479: /* partition_item ::= expr_or_subquery */ yytestcase(yyruleno==479); + case 513: /* query_simple_or_subquery ::= subquery */ yytestcase(yyruleno==513); + case 515: /* query_or_subquery ::= subquery */ yytestcase(yyruleno==515); + case 528: /* search_condition ::= common_expression */ yytestcase(yyruleno==528); +{ yylhsminor.yy104 = releaseRawExprNode(pCxt, yymsp[0].minor.yy104); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 334: /* signed_literal ::= NULL */ -{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 337: /* signed_literal ::= NULL */ +{ yylhsminor.yy104 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 336: /* signed_literal ::= NK_QUESTION */ -{ yylhsminor.yy164 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 339: /* signed_literal ::= NK_QUESTION */ +{ yylhsminor.yy104 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 355: /* expression ::= NK_LP expression NK_RP */ - case 438: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==438); - case 524: /* subquery ::= NK_LP subquery NK_RP */ yytestcase(yyruleno==524); -{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy164)); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 358: /* expression ::= NK_LP expression NK_RP */ + case 441: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==441); + case 527: /* subquery ::= NK_LP subquery NK_RP */ yytestcase(yyruleno==527); +{ yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy104)); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 356: /* expression ::= NK_PLUS expr_or_subquery */ + case 359: /* expression ::= NK_PLUS expr_or_subquery */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy164)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy104)); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 357: /* expression ::= NK_MINUS expr_or_subquery */ + case 360: /* expression ::= NK_MINUS expr_or_subquery */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy164), NULL)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy104), NULL)); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 358: /* expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ + case 361: /* expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 359: /* expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ + case 362: /* expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 360: /* expression ::= expr_or_subquery NK_STAR expr_or_subquery */ + case 363: /* expression ::= expr_or_subquery NK_STAR expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 361: /* expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ + case 364: /* expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 362: /* expression ::= expr_or_subquery NK_REM expr_or_subquery */ + case 365: /* expression ::= expr_or_subquery NK_REM expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 363: /* expression ::= column_reference NK_ARROW NK_STRING */ + case 366: /* expression ::= column_reference NK_ARROW NK_STRING */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 364: /* expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ + case 367: /* expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 365: /* expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ + case 368: /* expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 368: /* column_reference ::= column_name */ -{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy593, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy593)); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 371: /* column_reference ::= column_name */ +{ yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy737, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy737)); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 369: /* column_reference ::= table_name NK_DOT column_name */ -{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593, createColumnNode(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593)); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 372: /* column_reference ::= table_name NK_DOT column_name */ +{ yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy737, &yymsp[0].minor.yy737, createColumnNode(pCxt, &yymsp[-2].minor.yy737, &yymsp[0].minor.yy737)); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 370: /* pseudo_column ::= ROWTS */ - case 371: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==371); - case 373: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==373); - case 374: /* pseudo_column ::= QEND */ yytestcase(yyruleno==374); - case 375: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==375); - case 376: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==376); - case 377: /* pseudo_column ::= WEND */ yytestcase(yyruleno==377); - case 378: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==378); - case 379: /* pseudo_column ::= IROWTS */ yytestcase(yyruleno==379); - case 380: /* pseudo_column ::= QTAGS */ yytestcase(yyruleno==380); - case 386: /* literal_func ::= NOW */ yytestcase(yyruleno==386); -{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 373: /* pseudo_column ::= ROWTS */ + case 374: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==374); + case 376: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==376); + case 377: /* pseudo_column ::= QEND */ yytestcase(yyruleno==377); + case 378: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==378); + case 379: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==379); + case 380: /* pseudo_column ::= WEND */ yytestcase(yyruleno==380); + case 381: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==381); + case 382: /* pseudo_column ::= IROWTS */ yytestcase(yyruleno==382); + case 383: /* pseudo_column ::= QTAGS */ yytestcase(yyruleno==383); + case 389: /* literal_func ::= NOW */ yytestcase(yyruleno==389); +{ yylhsminor.yy104 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 372: /* pseudo_column ::= table_name NK_DOT TBNAME */ -{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy593)))); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 375: /* pseudo_column ::= table_name NK_DOT TBNAME */ +{ yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy737, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy737)))); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 381: /* function_expression ::= function_name NK_LP expression_list NK_RP */ - case 382: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==382); -{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy593, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy593, yymsp[-1].minor.yy648)); } - yymsp[-3].minor.yy164 = yylhsminor.yy164; + case 384: /* function_expression ::= function_name NK_LP expression_list NK_RP */ + case 385: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==385); +{ yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy737, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy737, yymsp[-1].minor.yy616)); } + yymsp[-3].minor.yy104 = yylhsminor.yy104; break; - case 383: /* function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ -{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), yymsp[-1].minor.yy720)); } - yymsp[-5].minor.yy164 = yylhsminor.yy164; + case 386: /* function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ +{ yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy104), yymsp[-1].minor.yy640)); } + yymsp[-5].minor.yy104 = yylhsminor.yy104; break; - case 385: /* literal_func ::= noarg_func NK_LP NK_RP */ -{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy593, NULL)); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 388: /* literal_func ::= noarg_func NK_LP NK_RP */ +{ yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy737, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy737, NULL)); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 400: /* star_func_para_list ::= NK_STAR */ -{ yylhsminor.yy648 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy648 = yylhsminor.yy648; + case 403: /* star_func_para_list ::= NK_STAR */ +{ yylhsminor.yy616 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy616 = yylhsminor.yy616; break; - case 405: /* star_func_para ::= table_name NK_DOT NK_STAR */ - case 469: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==469); -{ yylhsminor.yy164 = createColumnNode(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 408: /* star_func_para ::= table_name NK_DOT NK_STAR */ + case 472: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==472); +{ yylhsminor.yy104 = createColumnNode(pCxt, &yymsp[-2].minor.yy737, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 406: /* case_when_expression ::= CASE when_then_list case_when_else_opt END */ -{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, NULL, yymsp[-2].minor.yy648, yymsp[-1].minor.yy164)); } - yymsp[-3].minor.yy164 = yylhsminor.yy164; + case 409: /* case_when_expression ::= CASE when_then_list case_when_else_opt END */ +{ yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, NULL, yymsp[-2].minor.yy616, yymsp[-1].minor.yy104)); } + yymsp[-3].minor.yy104 = yylhsminor.yy104; break; - case 407: /* case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ -{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), yymsp[-2].minor.yy648, yymsp[-1].minor.yy164)); } - yymsp[-4].minor.yy164 = yylhsminor.yy164; + case 410: /* case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ +{ yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy104), yymsp[-2].minor.yy616, yymsp[-1].minor.yy104)); } + yymsp[-4].minor.yy104 = yylhsminor.yy104; break; - case 410: /* when_then_expr ::= WHEN common_expression THEN common_expression */ -{ yymsp[-3].minor.yy164 = createWhenThenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)); } + case 413: /* when_then_expr ::= WHEN common_expression THEN common_expression */ +{ yymsp[-3].minor.yy104 = createWhenThenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104)); } break; - case 412: /* case_when_else_opt ::= ELSE common_expression */ -{ yymsp[-1].minor.yy164 = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); } + case 415: /* case_when_else_opt ::= ELSE common_expression */ +{ yymsp[-1].minor.yy104 = releaseRawExprNode(pCxt, yymsp[0].minor.yy104); } break; - case 413: /* predicate ::= expr_or_subquery compare_op expr_or_subquery */ - case 418: /* predicate ::= expr_or_subquery in_op in_predicate_value */ yytestcase(yyruleno==418); + case 416: /* predicate ::= expr_or_subquery compare_op expr_or_subquery */ + case 421: /* predicate ::= expr_or_subquery in_op in_predicate_value */ yytestcase(yyruleno==421); { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy656, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy668, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 414: /* predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ + case 417: /* predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy164); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy164), releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy104); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy104), releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[-4].minor.yy164 = yylhsminor.yy164; + yymsp[-4].minor.yy104 = yylhsminor.yy104; break; - case 415: /* predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ + case 418: /* predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy164); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy164), releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy104); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy104), releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[-5].minor.yy164 = yylhsminor.yy164; + yymsp[-5].minor.yy104 = yylhsminor.yy104; break; - case 416: /* predicate ::= expr_or_subquery IS NULL */ + case 419: /* predicate ::= expr_or_subquery IS NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), NULL)); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 417: /* predicate ::= expr_or_subquery IS NOT NULL */ + case 420: /* predicate ::= expr_or_subquery IS NOT NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy104), NULL)); } - yymsp[-3].minor.yy164 = yylhsminor.yy164; + yymsp[-3].minor.yy104 = yylhsminor.yy104; break; - case 419: /* compare_op ::= NK_LT */ -{ yymsp[0].minor.yy656 = OP_TYPE_LOWER_THAN; } + case 422: /* compare_op ::= NK_LT */ +{ yymsp[0].minor.yy668 = OP_TYPE_LOWER_THAN; } break; - case 420: /* compare_op ::= NK_GT */ -{ yymsp[0].minor.yy656 = OP_TYPE_GREATER_THAN; } + case 423: /* compare_op ::= NK_GT */ +{ yymsp[0].minor.yy668 = OP_TYPE_GREATER_THAN; } break; - case 421: /* compare_op ::= NK_LE */ -{ yymsp[0].minor.yy656 = OP_TYPE_LOWER_EQUAL; } + case 424: /* compare_op ::= NK_LE */ +{ yymsp[0].minor.yy668 = OP_TYPE_LOWER_EQUAL; } break; - case 422: /* compare_op ::= NK_GE */ -{ yymsp[0].minor.yy656 = OP_TYPE_GREATER_EQUAL; } + case 425: /* compare_op ::= NK_GE */ +{ yymsp[0].minor.yy668 = OP_TYPE_GREATER_EQUAL; } break; - case 423: /* compare_op ::= NK_NE */ -{ yymsp[0].minor.yy656 = OP_TYPE_NOT_EQUAL; } + case 426: /* compare_op ::= NK_NE */ +{ yymsp[0].minor.yy668 = OP_TYPE_NOT_EQUAL; } break; - case 424: /* compare_op ::= NK_EQ */ -{ yymsp[0].minor.yy656 = OP_TYPE_EQUAL; } + case 427: /* compare_op ::= NK_EQ */ +{ yymsp[0].minor.yy668 = OP_TYPE_EQUAL; } break; - case 425: /* compare_op ::= LIKE */ -{ yymsp[0].minor.yy656 = OP_TYPE_LIKE; } + case 428: /* compare_op ::= LIKE */ +{ yymsp[0].minor.yy668 = OP_TYPE_LIKE; } break; - case 426: /* compare_op ::= NOT LIKE */ -{ yymsp[-1].minor.yy656 = OP_TYPE_NOT_LIKE; } + case 429: /* compare_op ::= NOT LIKE */ +{ yymsp[-1].minor.yy668 = OP_TYPE_NOT_LIKE; } break; - case 427: /* compare_op ::= MATCH */ -{ yymsp[0].minor.yy656 = OP_TYPE_MATCH; } + case 430: /* compare_op ::= MATCH */ +{ yymsp[0].minor.yy668 = OP_TYPE_MATCH; } break; - case 428: /* compare_op ::= NMATCH */ -{ yymsp[0].minor.yy656 = OP_TYPE_NMATCH; } + case 431: /* compare_op ::= NMATCH */ +{ yymsp[0].minor.yy668 = OP_TYPE_NMATCH; } break; - case 429: /* compare_op ::= CONTAINS */ -{ yymsp[0].minor.yy656 = OP_TYPE_JSON_CONTAINS; } + case 432: /* compare_op ::= CONTAINS */ +{ yymsp[0].minor.yy668 = OP_TYPE_JSON_CONTAINS; } break; - case 430: /* in_op ::= IN */ -{ yymsp[0].minor.yy656 = OP_TYPE_IN; } + case 433: /* in_op ::= IN */ +{ yymsp[0].minor.yy668 = OP_TYPE_IN; } break; - case 431: /* in_op ::= NOT IN */ -{ yymsp[-1].minor.yy656 = OP_TYPE_NOT_IN; } + case 434: /* in_op ::= NOT IN */ +{ yymsp[-1].minor.yy668 = OP_TYPE_NOT_IN; } break; - case 432: /* in_predicate_value ::= NK_LP literal_list NK_RP */ -{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy648)); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 435: /* in_predicate_value ::= NK_LP literal_list NK_RP */ +{ yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy616)); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 434: /* boolean_value_expression ::= NOT boolean_primary */ + case 437: /* boolean_value_expression ::= NOT boolean_primary */ { - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy164), NULL)); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy104), NULL)); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 435: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + case 438: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 436: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + case 439: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164); - yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy104); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy104); + yylhsminor.yy104 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 442: /* from_clause_opt ::= FROM table_reference_list */ - case 471: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==471); - case 499: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==499); -{ yymsp[-1].minor.yy164 = yymsp[0].minor.yy164; } + case 445: /* from_clause_opt ::= FROM table_reference_list */ + case 474: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==474); + case 502: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==502); +{ yymsp[-1].minor.yy104 = yymsp[0].minor.yy104; } break; - case 444: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ -{ yylhsminor.yy164 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy164, yymsp[0].minor.yy164, NULL); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 447: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ +{ yylhsminor.yy104 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy104, yymsp[0].minor.yy104, NULL); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 447: /* table_primary ::= table_name alias_opt */ -{ yylhsminor.yy164 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy593, &yymsp[0].minor.yy593); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + case 450: /* table_primary ::= table_name alias_opt */ +{ yylhsminor.yy104 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy737, &yymsp[0].minor.yy737); } + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 448: /* table_primary ::= db_name NK_DOT table_name alias_opt */ -{ yylhsminor.yy164 = createRealTableNode(pCxt, &yymsp[-3].minor.yy593, &yymsp[-1].minor.yy593, &yymsp[0].minor.yy593); } - yymsp[-3].minor.yy164 = yylhsminor.yy164; + case 451: /* table_primary ::= db_name NK_DOT table_name alias_opt */ +{ yylhsminor.yy104 = createRealTableNode(pCxt, &yymsp[-3].minor.yy737, &yymsp[-1].minor.yy737, &yymsp[0].minor.yy737); } + yymsp[-3].minor.yy104 = yylhsminor.yy104; break; - case 449: /* table_primary ::= subquery alias_opt */ -{ yylhsminor.yy164 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy164), &yymsp[0].minor.yy593); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + case 452: /* table_primary ::= subquery alias_opt */ +{ yylhsminor.yy104 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy104), &yymsp[0].minor.yy737); } + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 451: /* alias_opt ::= */ -{ yymsp[1].minor.yy593 = nil_token; } + case 454: /* alias_opt ::= */ +{ yymsp[1].minor.yy737 = nil_token; } break; - case 452: /* alias_opt ::= table_alias */ -{ yylhsminor.yy593 = yymsp[0].minor.yy593; } - yymsp[0].minor.yy593 = yylhsminor.yy593; + case 456: /* alias_opt ::= AS table_alias */ +{ yymsp[-1].minor.yy737 = yymsp[0].minor.yy737; } break; - case 453: /* alias_opt ::= AS table_alias */ -{ yymsp[-1].minor.yy593 = yymsp[0].minor.yy593; } + case 457: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + case 458: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==458); +{ yymsp[-2].minor.yy104 = yymsp[-1].minor.yy104; } break; - case 454: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - case 455: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==455); -{ yymsp[-2].minor.yy164 = yymsp[-1].minor.yy164; } + case 459: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ +{ yylhsminor.yy104 = createJoinTableNode(pCxt, yymsp[-4].minor.yy228, yymsp[-5].minor.yy104, yymsp[-2].minor.yy104, yymsp[0].minor.yy104); } + yymsp[-5].minor.yy104 = yylhsminor.yy104; break; - case 456: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ -{ yylhsminor.yy164 = createJoinTableNode(pCxt, yymsp[-4].minor.yy868, yymsp[-5].minor.yy164, yymsp[-2].minor.yy164, yymsp[0].minor.yy164); } - yymsp[-5].minor.yy164 = yylhsminor.yy164; + case 460: /* join_type ::= */ +{ yymsp[1].minor.yy228 = JOIN_TYPE_INNER; } break; - case 457: /* join_type ::= */ -{ yymsp[1].minor.yy868 = JOIN_TYPE_INNER; } + case 461: /* join_type ::= INNER */ +{ yymsp[0].minor.yy228 = JOIN_TYPE_INNER; } break; - case 458: /* join_type ::= INNER */ -{ yymsp[0].minor.yy868 = JOIN_TYPE_INNER; } - break; - case 459: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ + case 462: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ { - yymsp[-11].minor.yy164 = createSelectStmt(pCxt, yymsp[-10].minor.yy193, yymsp[-9].minor.yy648, yymsp[-8].minor.yy164); - yymsp[-11].minor.yy164 = addWhereClause(pCxt, yymsp[-11].minor.yy164, yymsp[-7].minor.yy164); - yymsp[-11].minor.yy164 = addPartitionByClause(pCxt, yymsp[-11].minor.yy164, yymsp[-6].minor.yy648); - yymsp[-11].minor.yy164 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy164, yymsp[-2].minor.yy164); - yymsp[-11].minor.yy164 = addGroupByClause(pCxt, yymsp[-11].minor.yy164, yymsp[-1].minor.yy648); - yymsp[-11].minor.yy164 = addHavingClause(pCxt, yymsp[-11].minor.yy164, yymsp[0].minor.yy164); - yymsp[-11].minor.yy164 = addRangeClause(pCxt, yymsp[-11].minor.yy164, yymsp[-5].minor.yy164); - yymsp[-11].minor.yy164 = addEveryClause(pCxt, yymsp[-11].minor.yy164, yymsp[-4].minor.yy164); - yymsp[-11].minor.yy164 = addFillClause(pCxt, yymsp[-11].minor.yy164, yymsp[-3].minor.yy164); + yymsp[-11].minor.yy104 = createSelectStmt(pCxt, yymsp[-10].minor.yy185, yymsp[-9].minor.yy616, yymsp[-8].minor.yy104); + yymsp[-11].minor.yy104 = addWhereClause(pCxt, yymsp[-11].minor.yy104, yymsp[-7].minor.yy104); + yymsp[-11].minor.yy104 = addPartitionByClause(pCxt, yymsp[-11].minor.yy104, yymsp[-6].minor.yy616); + yymsp[-11].minor.yy104 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy104, yymsp[-2].minor.yy104); + yymsp[-11].minor.yy104 = addGroupByClause(pCxt, yymsp[-11].minor.yy104, yymsp[-1].minor.yy616); + yymsp[-11].minor.yy104 = addHavingClause(pCxt, yymsp[-11].minor.yy104, yymsp[0].minor.yy104); + yymsp[-11].minor.yy104 = addRangeClause(pCxt, yymsp[-11].minor.yy104, yymsp[-5].minor.yy104); + yymsp[-11].minor.yy104 = addEveryClause(pCxt, yymsp[-11].minor.yy104, yymsp[-4].minor.yy104); + yymsp[-11].minor.yy104 = addFillClause(pCxt, yymsp[-11].minor.yy104, yymsp[-3].minor.yy104); } break; - case 462: /* set_quantifier_opt ::= ALL */ -{ yymsp[0].minor.yy193 = false; } + case 465: /* set_quantifier_opt ::= ALL */ +{ yymsp[0].minor.yy185 = false; } break; - case 465: /* select_item ::= NK_STAR */ -{ yylhsminor.yy164 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy164 = yylhsminor.yy164; + case 468: /* select_item ::= NK_STAR */ +{ yylhsminor.yy104 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy104 = yylhsminor.yy104; break; - case 467: /* select_item ::= common_expression column_alias */ - case 477: /* partition_item ::= expr_or_subquery column_alias */ yytestcase(yyruleno==477); -{ yylhsminor.yy164 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy164), &yymsp[0].minor.yy593); } - yymsp[-1].minor.yy164 = yylhsminor.yy164; + case 470: /* select_item ::= common_expression column_alias */ + case 480: /* partition_item ::= expr_or_subquery column_alias */ yytestcase(yyruleno==480); +{ yylhsminor.yy104 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy104), &yymsp[0].minor.yy737); } + yymsp[-1].minor.yy104 = yylhsminor.yy104; break; - case 468: /* select_item ::= common_expression AS column_alias */ - case 478: /* partition_item ::= expr_or_subquery AS column_alias */ yytestcase(yyruleno==478); -{ yylhsminor.yy164 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), &yymsp[0].minor.yy593); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 471: /* select_item ::= common_expression AS column_alias */ + case 481: /* partition_item ::= expr_or_subquery AS column_alias */ yytestcase(yyruleno==481); +{ yylhsminor.yy104 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), &yymsp[0].minor.yy737); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 473: /* partition_by_clause_opt ::= PARTITION BY partition_list */ - case 495: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==495); - case 514: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==514); -{ yymsp[-2].minor.yy648 = yymsp[0].minor.yy648; } + case 476: /* partition_by_clause_opt ::= PARTITION BY partition_list */ + case 498: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==498); + case 517: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==517); +{ yymsp[-2].minor.yy616 = yymsp[0].minor.yy616; } break; - case 480: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ -{ yymsp[-5].minor.yy164 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), releaseRawExprNode(pCxt, yymsp[-1].minor.yy164)); } + case 483: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ +{ yymsp[-5].minor.yy104 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy104), releaseRawExprNode(pCxt, yymsp[-1].minor.yy104)); } break; - case 481: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ -{ yymsp[-3].minor.yy164 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy164)); } + case 484: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ +{ yymsp[-3].minor.yy104 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy104)); } break; - case 482: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-5].minor.yy164 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), NULL, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); } + case 485: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-5].minor.yy104 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy104), NULL, yymsp[-1].minor.yy104, yymsp[0].minor.yy104); } break; - case 483: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-7].minor.yy164 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy164), releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), yymsp[-1].minor.yy164, yymsp[0].minor.yy164); } + case 486: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-7].minor.yy104 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy104), releaseRawExprNode(pCxt, yymsp[-3].minor.yy104), yymsp[-1].minor.yy104, yymsp[0].minor.yy104); } break; - case 487: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ -{ yymsp[-3].minor.yy164 = createFillNode(pCxt, yymsp[-1].minor.yy638, NULL); } + case 490: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ +{ yymsp[-3].minor.yy104 = createFillNode(pCxt, yymsp[-1].minor.yy246, NULL); } break; - case 488: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ -{ yymsp[-5].minor.yy164 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy648)); } + case 491: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ +{ yymsp[-5].minor.yy104 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy616)); } break; - case 489: /* fill_mode ::= NONE */ -{ yymsp[0].minor.yy638 = FILL_MODE_NONE; } + case 492: /* fill_mode ::= NONE */ +{ yymsp[0].minor.yy246 = FILL_MODE_NONE; } break; - case 490: /* fill_mode ::= PREV */ -{ yymsp[0].minor.yy638 = FILL_MODE_PREV; } + case 493: /* fill_mode ::= PREV */ +{ yymsp[0].minor.yy246 = FILL_MODE_PREV; } break; - case 491: /* fill_mode ::= NULL */ -{ yymsp[0].minor.yy638 = FILL_MODE_NULL; } + case 494: /* fill_mode ::= NULL */ +{ yymsp[0].minor.yy246 = FILL_MODE_NULL; } break; - case 492: /* fill_mode ::= LINEAR */ -{ yymsp[0].minor.yy638 = FILL_MODE_LINEAR; } + case 495: /* fill_mode ::= LINEAR */ +{ yymsp[0].minor.yy246 = FILL_MODE_LINEAR; } break; - case 493: /* fill_mode ::= NEXT */ -{ yymsp[0].minor.yy638 = FILL_MODE_NEXT; } + case 496: /* fill_mode ::= NEXT */ +{ yymsp[0].minor.yy246 = FILL_MODE_NEXT; } break; - case 496: /* group_by_list ::= expr_or_subquery */ -{ yylhsminor.yy648 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); } - yymsp[0].minor.yy648 = yylhsminor.yy648; + case 499: /* group_by_list ::= expr_or_subquery */ +{ yylhsminor.yy616 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } + yymsp[0].minor.yy616 = yylhsminor.yy616; break; - case 497: /* group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ -{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); } - yymsp[-2].minor.yy648 = yylhsminor.yy648; + case 500: /* group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ +{ yylhsminor.yy616 = addNodeToList(pCxt, yymsp[-2].minor.yy616, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy104))); } + yymsp[-2].minor.yy616 = yylhsminor.yy616; break; - case 501: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ -{ yymsp[-5].minor.yy164 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), releaseRawExprNode(pCxt, yymsp[-1].minor.yy164)); } + case 504: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ +{ yymsp[-5].minor.yy104 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy104), releaseRawExprNode(pCxt, yymsp[-1].minor.yy104)); } break; - case 504: /* query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ + case 507: /* query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ { - yylhsminor.yy164 = addOrderByClause(pCxt, yymsp[-3].minor.yy164, yymsp[-2].minor.yy648); - yylhsminor.yy164 = addSlimitClause(pCxt, yylhsminor.yy164, yymsp[-1].minor.yy164); - yylhsminor.yy164 = addLimitClause(pCxt, yylhsminor.yy164, yymsp[0].minor.yy164); + yylhsminor.yy104 = addOrderByClause(pCxt, yymsp[-3].minor.yy104, yymsp[-2].minor.yy616); + yylhsminor.yy104 = addSlimitClause(pCxt, yylhsminor.yy104, yymsp[-1].minor.yy104); + yylhsminor.yy104 = addLimitClause(pCxt, yylhsminor.yy104, yymsp[0].minor.yy104); } - yymsp[-3].minor.yy164 = yylhsminor.yy164; + yymsp[-3].minor.yy104 = yylhsminor.yy104; break; - case 507: /* union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ -{ yylhsminor.yy164 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy164, yymsp[0].minor.yy164); } - yymsp[-3].minor.yy164 = yylhsminor.yy164; + case 510: /* union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ +{ yylhsminor.yy104 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy104, yymsp[0].minor.yy104); } + yymsp[-3].minor.yy104 = yylhsminor.yy104; break; - case 508: /* union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ -{ yylhsminor.yy164 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy164, yymsp[0].minor.yy164); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 511: /* union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ +{ yylhsminor.yy104 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy104, yymsp[0].minor.yy104); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 516: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ - case 520: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==520); -{ yymsp[-1].minor.yy164 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } + case 519: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ + case 523: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==523); +{ yymsp[-1].minor.yy104 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } break; - case 517: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - case 521: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==521); -{ yymsp[-3].minor.yy164 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } + case 520: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + case 524: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==524); +{ yymsp[-3].minor.yy104 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 518: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - case 522: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==522); -{ yymsp[-3].minor.yy164 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } + case 521: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + case 525: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==525); +{ yymsp[-3].minor.yy104 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } break; - case 523: /* subquery ::= NK_LP query_expression NK_RP */ -{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy164); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 526: /* subquery ::= NK_LP query_expression NK_RP */ +{ yylhsminor.yy104 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy104); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 528: /* sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ -{ yylhsminor.yy164 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), yymsp[-1].minor.yy238, yymsp[0].minor.yy153); } - yymsp[-2].minor.yy164 = yylhsminor.yy164; + case 531: /* sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ +{ yylhsminor.yy104 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy104), yymsp[-1].minor.yy50, yymsp[0].minor.yy793); } + yymsp[-2].minor.yy104 = yylhsminor.yy104; break; - case 529: /* ordering_specification_opt ::= */ -{ yymsp[1].minor.yy238 = ORDER_ASC; } + case 532: /* ordering_specification_opt ::= */ +{ yymsp[1].minor.yy50 = ORDER_ASC; } break; - case 530: /* ordering_specification_opt ::= ASC */ -{ yymsp[0].minor.yy238 = ORDER_ASC; } + case 533: /* ordering_specification_opt ::= ASC */ +{ yymsp[0].minor.yy50 = ORDER_ASC; } break; - case 531: /* ordering_specification_opt ::= DESC */ -{ yymsp[0].minor.yy238 = ORDER_DESC; } + case 534: /* ordering_specification_opt ::= DESC */ +{ yymsp[0].minor.yy50 = ORDER_DESC; } break; - case 532: /* null_ordering_opt ::= */ -{ yymsp[1].minor.yy153 = NULL_ORDER_DEFAULT; } + case 535: /* null_ordering_opt ::= */ +{ yymsp[1].minor.yy793 = NULL_ORDER_DEFAULT; } break; - case 533: /* null_ordering_opt ::= NULLS FIRST */ -{ yymsp[-1].minor.yy153 = NULL_ORDER_FIRST; } + case 536: /* null_ordering_opt ::= NULLS FIRST */ +{ yymsp[-1].minor.yy793 = NULL_ORDER_FIRST; } break; - case 534: /* null_ordering_opt ::= NULLS LAST */ -{ yymsp[-1].minor.yy153 = NULL_ORDER_LAST; } + case 537: /* null_ordering_opt ::= NULLS LAST */ +{ yymsp[-1].minor.yy793 = NULL_ORDER_LAST; } break; default: break; diff --git a/source/libs/parser/test/mockCatalog.cpp b/source/libs/parser/test/mockCatalog.cpp index 8f051c67a0..de7487434c 100644 --- a/source/libs/parser/test/mockCatalog.cpp +++ b/source/libs/parser/test/mockCatalog.cpp @@ -101,6 +101,10 @@ void generateInformationSchema(MockCatalogService* mcs) { .addColumn("table_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN) .addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN) .done(); + mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USER_PRIVILEGES, TSDB_SYSTEM_TABLE, 2) + .addColumn("user_name", TSDB_DATA_TYPE_BINARY, TSDB_USER_LEN) + .addColumn("privilege", TSDB_DATA_TYPE_BINARY, 10) + .done(); } void generatePerformanceSchema(MockCatalogService* mcs) { @@ -248,8 +252,8 @@ int32_t __catalogGetTableDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, con return g_mockCatalogService->catalogGetTableDistVgInfo(pTableName, pVgList); } -int32_t __catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId, - int32_t* tableNum, int64_t* stateTs) { +int32_t __catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId, int32_t* tableNum, + int64_t* stateTs) { return 0; } diff --git a/source/libs/parser/test/parAlterToBalanceTest.cpp b/source/libs/parser/test/parAlterToBalanceTest.cpp index 0c8b82ddd4..ba1ba9fc83 100644 --- a/source/libs/parser/test/parAlterToBalanceTest.cpp +++ b/source/libs/parser/test/parAlterToBalanceTest.cpp @@ -613,7 +613,7 @@ TEST_F(ParserInitialATest, alterUser) { if (nullptr != pPass) { strcpy(expect.pass, pPass); } - strcpy(expect.dbname, "test"); + strcpy(expect.objname, "test"); }; setCheckDdlFunc([&](const SQuery* pQuery, ParserStage stage) { @@ -627,7 +627,7 @@ TEST_F(ParserInitialATest, alterUser) { ASSERT_EQ(req.enable, expect.enable); ASSERT_EQ(std::string(req.user), std::string(expect.user)); ASSERT_EQ(std::string(req.pass), std::string(expect.pass)); - ASSERT_EQ(std::string(req.dbname), std::string(expect.dbname)); + ASSERT_EQ(std::string(req.objname), std::string(expect.objname)); }); setAlterUserReq("wxy", TSDB_ALTER_USER_PASSWD, "123456"); diff --git a/source/libs/parser/test/parExplainToSyncdbTest.cpp b/source/libs/parser/test/parExplainToSyncdbTest.cpp index 72083c68ca..f88d6d316b 100644 --- a/source/libs/parser/test/parExplainToSyncdbTest.cpp +++ b/source/libs/parser/test/parExplainToSyncdbTest.cpp @@ -34,10 +34,38 @@ TEST_F(ParserExplainToSyncdbTest, explain) { TEST_F(ParserExplainToSyncdbTest, grant) { useDb("root", "test"); + SAlterUserReq expect = {0}; + + auto setAlterUserReq = [&](int8_t alterType, const string& user, const string& obj) { + expect.alterType = alterType; + snprintf(expect.user, sizeof(expect.user), "%s", user.c_str()); + snprintf(expect.objname, sizeof(expect.objname), "%s", obj.c_str()); + }; + + setCheckDdlFunc([&](const SQuery* pQuery, ParserStage stage) { + ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_GRANT_STMT); + ASSERT_EQ(pQuery->pCmdMsg->msgType, TDMT_MND_ALTER_USER); + SAlterUserReq req = {0}; + ASSERT_EQ(tDeserializeSAlterUserReq(pQuery->pCmdMsg->pMsg, pQuery->pCmdMsg->msgLen, &req), TSDB_CODE_SUCCESS); + ASSERT_EQ(req.alterType, expect.alterType); + ASSERT_EQ(string(req.user), string(expect.user)); + ASSERT_EQ(string(req.objname), string(expect.objname)); + }); + + setAlterUserReq(TSDB_ALTER_USER_ADD_ALL_DB, "wxy", "0.test"); run("GRANT ALL ON test.* TO wxy"); + + setAlterUserReq(TSDB_ALTER_USER_ADD_READ_DB, "wxy", "0.test"); run("GRANT READ ON test.* TO wxy"); + + setAlterUserReq(TSDB_ALTER_USER_ADD_WRITE_DB, "wxy", "0.test"); run("GRANT WRITE ON test.* TO wxy"); + + setAlterUserReq(TSDB_ALTER_USER_ADD_ALL_DB, "wxy", "0.test"); run("GRANT READ, WRITE ON test.* TO wxy"); + + setAlterUserReq(TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC, "wxy", "0.tp1"); + run("GRANT SUBSCRIBE ON tp1 TO wxy"); } TEST_F(ParserExplainToSyncdbTest, insert) { diff --git a/source/libs/parser/test/parShowToUse.cpp b/source/libs/parser/test/parShowToUse.cpp index e2f833cffa..b7bd0e802c 100644 --- a/source/libs/parser/test/parShowToUse.cpp +++ b/source/libs/parser/test/parShowToUse.cpp @@ -213,7 +213,13 @@ TEST_F(ParserShowToUseTest, showTags) { TEST_F(ParserShowToUseTest, showUsers) { useDb("root", "test"); - run("SHOW users"); + run("SHOW USERS"); +} + +TEST_F(ParserShowToUseTest, showUserPrivileges) { + useDb("root", "test"); + + run("SHOW USER PRIVILEGES"); } TEST_F(ParserShowToUseTest, showVariables) { From 9eae79a1f91a0779d84774183b28d601b5df7c4e Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 30 Nov 2022 19:36:02 +0800 Subject: [PATCH 071/105] fix: complie error in windows --- source/client/src/clientSml.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index 9a08f88cfa..d811eb7fec 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -820,9 +820,9 @@ static int8_t smlGetTsTypeByPrecision(int8_t precision) { } static int64_t smlParseInfluxTime(SSmlHandle *info, const char *data, int32_t len) { - char *tmp = (char*)taosMemoryCalloc(1, len + 1); + void *tmp = taosMemoryCalloc(1, len + 1); memcpy(tmp, data, len); - uDebug("SML:0x%" PRIx64 " smlParseInfluxTime ts:%s", info->id, tmp); + uDebug("SML:0x%" PRIx64 " smlParseInfluxTime tslen:%d, ts:%s", info->id, len, (char*)tmp); taosMemoryFree(tmp); if (len == 0 || (len == 1 && data[0] == '0')) { @@ -2076,9 +2076,9 @@ static int32_t smlParseJSONString(SSmlHandle *info, cJSON *root, SSmlTableInfo * static int32_t smlParseInfluxLine(SSmlHandle *info, const char *sql, const int len) { SSmlLineInfo elements = {0}; - char *tmp = (char*)taosMemoryCalloc(1, len + 1); + void *tmp = taosMemoryCalloc(1, len + 1); memcpy(tmp, sql, len); - uDebug("SML:0x%" PRIx64 " smlParseInfluxLine raw:%d, sql:%s", info->id, info->isRawLine, (info->isRawLine ? tmp : sql)); + uDebug("SML:0x%" PRIx64 " smlParseInfluxLine raw:%d, len:%d, sql:%s", info->id, info->isRawLine, len, (info->isRawLine ? (char*)tmp : sql)); taosMemoryFree(tmp); int ret = smlParseInfluxString(sql, sql + len, &elements, &info->msgBuf); From 26122eb51a224808bcbf6ad011c64d7a1179318a Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Wed, 30 Nov 2022 19:47:39 +0800 Subject: [PATCH 072/105] fix: benchmark query result precision (#18581) * fix: taosbenchmark query result precision * test: update to f5da335 * test: update taos-tools 96192d4 * test: update taos-tools c6df1eb * test: update taostools 2378cdf * fix: taosbenchmark query result precision --- cmake/taostools_CMakeLists.txt.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in index 47f2d20828..e0585f8d13 100644 --- a/cmake/taostools_CMakeLists.txt.in +++ b/cmake/taostools_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taos-tools ExternalProject_Add(taos-tools GIT_REPOSITORY https://github.com/taosdata/taos-tools.git - GIT_TAG b103d9b + GIT_TAG 5445810 SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE From 78b0844aec3e00263d8b5731dfb0c9b5ade157a2 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Wed, 30 Nov 2022 20:09:47 +0800 Subject: [PATCH 073/105] test:modify base version from 3.0.1.0 to 3.0.1.8 in compatibility testcase --- tests/system-test/0-others/compatibility.py | 271 ++++++++++---------- 1 file changed, 138 insertions(+), 133 deletions(-) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index 377cdbd7e6..64b1d6cdcd 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -3,8 +3,7 @@ import taos import sys import os import time - - +from pathlib import Path from util.log import * from util.sql import * from util.cases import * @@ -15,159 +14,165 @@ from util.cluster import * class TDTestCase: - def caseDescription(self): - ''' - 3.0 data compatibility test - case1: basedata version is 3.0.1.0 - ''' - return + def caseDescription(self): + ''' + 3.0 data compatibility test + case1: basedata version is 3.0.1.0 + ''' + return - def init(self, conn, logSql, replicaVar=1): - self.replicaVar = int(replicaVar) - tdLog.debug(f"start to excute {__file__}") - tdSql.init(conn.cursor()) + def init(self, conn, logSql, replicaVar=1): + self.replicaVar = int(replicaVar) + tdLog.debug(f"start to excute {__file__}") + tdSql.init(conn.cursor()) - def getBuildPath(self): - selfPath = os.path.dirname(os.path.realpath(__file__)) + def getBuildPath(self): + selfPath = os.path.dirname(os.path.realpath(__file__)) - if ("community" in selfPath): - projPath = selfPath[:selfPath.find("community")] - else: - projPath = selfPath[:selfPath.find("tests")] + if ("community" in selfPath): + projPath = selfPath[:selfPath.find("community")] + else: + projPath = selfPath[:selfPath.find("tests")] - for root, dirs, files in os.walk(projPath): - if ("taosd" in files or "taosd.exe" in files): - rootRealPath = os.path.dirname(os.path.realpath(root)) - if ("packaging" not in rootRealPath): - buildPath = root[:len(root)-len("/build/bin")] - break - return buildPath + for root, dirs, files in os.walk(projPath): + if ("taosd" in files or "taosd.exe" in files): + rootRealPath = os.path.dirname(os.path.realpath(root)) + if ("packaging" not in rootRealPath): + buildPath = root[:len(root)-len("/build/bin")] + break + return buildPath - def getCfgPath(self): - buildPath = self.getBuildPath() - selfPath = os.path.dirname(os.path.realpath(__file__)) + def getCfgPath(self): + buildPath = self.getBuildPath() + selfPath = os.path.dirname(os.path.realpath(__file__)) - if ("community" in selfPath): - cfgPath = buildPath + "/../sim/dnode1/cfg/" - else: - cfgPath = buildPath + "/../sim/dnode1/cfg/" + if ("community" in selfPath): + cfgPath = buildPath + "/../sim/dnode1/cfg/" + else: + cfgPath = buildPath + "/../sim/dnode1/cfg/" - return cfgPath + return cfgPath - def installTaosd(self,bPath,cPath): - # os.system(f"rmtaos && mkdir -p {self.getBuildPath()}/build/lib/temp && mv {self.getBuildPath()}/build/lib/libtaos.so* {self.getBuildPath()}/build/lib/temp/ ") - # os.system(f" mv {bPath}/build {bPath}/build_bak ") - # os.system(f"mv {self.getBuildPath()}/build/lib/libtaos.so {self.getBuildPath()}/build/lib/libtaos.so_bak ") - # os.system(f"mv {self.getBuildPath()}/build/lib/libtaos.so.1 {self.getBuildPath()}/build/lib/libtaos.so.1_bak ") - - packagePath="/usr/local/src/" - packageName="TDengine-server-3.0.1.0-Linux-x64.tar.gz" - os.system(f"cd {packagePath} && tar xvf TDengine-server-3.0.1.0-Linux-x64.tar.gz && cd TDengine-server-3.0.1.0 && ./install.sh -e no " ) - tdDnodes.stop(1) - print(f"start taosd: nohup taosd -c {cPath} & ") - os.system(f" nohup taosd -c {cPath} & " ) - sleep(1) + def installTaosd(self,bPath,cPath): + # os.system(f"rmtaos && mkdir -p {self.getBuildPath()}/build/lib/temp && mv {self.getBuildPath()}/build/lib/libtaos.so* {self.getBuildPath()}/build/lib/temp/ ") + # os.system(f" mv {bPath}/build {bPath}/build_bak ") + # os.system(f"mv {self.getBuildPath()}/build/lib/libtaos.so {self.getBuildPath()}/build/lib/libtaos.so_bak ") + # os.system(f"mv {self.getBuildPath()}/build/lib/libtaos.so.1 {self.getBuildPath()}/build/lib/libtaos.so.1_bak ") + + packagePath = "/usr/local/src/" + baseVersion = "3.0.1.8" + packageName = "TDengine-server-{baseVersion}-Linux-x64.tar.gz" + packageTPath = packageName.split("-Linux-")[0] + my_file = Path(f"{packagePath}/{packageName}") + if not my_file.exists(): + print(f"{packageName} is not exists") + os.system(f"cd {packagePath} && wget https://www.tdengine.com/assets-download/3.0/{packageName}") + else: + print(f"{packageName} has been exists") + os.system(f"cd {packagePath} && tar xvf {packageName} && cd {packageTPath} && ./install.sh -e no " ) + tdDnodes.stop(1) + print(f"start taosd: nohup taosd -c {cPath} & ") + os.system(f" nohup taosd -c {cPath} & " ) + sleep(1) - - def buildTaosd(self,bPath): - # os.system(f"mv {bPath}/build_bak {bPath}/build ") - os.system(f" cd {bPath} && make install ") + + def buildTaosd(self,bPath): + # os.system(f"mv {bPath}/build_bak {bPath}/build ") + os.system(f" cd {bPath} && make install ") - def run(self): - print(f"start taosd run") - bPath=self.getBuildPath() - cPath=self.getCfgPath() - dbname = "test" - stb = f"{dbname}.meters" - self.installTaosd(bPath,cPath) - os.system("echo 'debugFlag 143' > /etc/taos/taos.cfg ") - tableNumbers=100 - recordNumbers1=100 - recordNumbers2=1000 - #tdsqlF=tdCom.newTdSql() - #print(tdsqlF) + def run(self): + bPath=self.getBuildPath() + cPath=self.getCfgPath() + dbname = "test" + stb = f"{dbname}.meters" + self.installTaosd(bPath,cPath) + os.system("echo 'debugFlag 143' > /etc/taos/taos.cfg ") + tableNumbers=100 + recordNumbers1=100 + recordNumbers2=1000 + # tdsqlF=tdCom.newTdSql() + # print(tdsqlF) + # tdsqlF.query(f"SELECT SERVER_VERSION();") + # print(tdsqlF.query(f"SELECT SERVER_VERSION();")) + # oldServerVersion=tdsqlF.queryResult[0][0] + # tdLog.info(f"Base server version is {oldServerVersion}") + # tdsqlF.query(f"SELECT CLIENT_VERSION();") + + # # the oldClientVersion can't be updated in the same python process,so the version is new compiled verison + # oldClientVersion=tdsqlF.queryResult[0][0] + # tdLog.info(f"Base client version is {oldClientVersion}") + oldServerVersion = "3.0.1.0" + tdLog.printNoPrefix(f"==========step1:prepare and check data in old version-{oldServerVersion}") + tdLog.info(f" LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") + os.system(f"LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") + sleep(3) - oldServerVersion = '3.0.1.0' - #tdsqlF.query(f"SELECT SERVER_VERSION();") - #print(tdsqlF.query(f"SELECT SERVER_VERSION();")) - #oldServerVersion=tdsqlF.queryResult[0][0] - #tdLog.info(f"Base server version is {oldServerVersion}") - #tdsqlF.query(f"SELECT CLIENT_VERSION();") - # - ## the oldClientVersion can't be updated in the same python process,so the version is new compiled verison - #oldClientVersion=tdsqlF.queryResult[0][0] + # tdsqlF.query(f"select count(*) from {stb}") + # tdsqlF.checkData(0,0,tableNumbers*recordNumbers1) + os.system("pkill taosd") + sleep(2) - #tdLog.info(f"Base client version is {oldClientVersion}") - - tdLog.printNoPrefix(f"==========step1:prepare and check data in old version-{oldServerVersion}") - tdLog.info(f" LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") - os.system(f"LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") - sleep(3) - - # tdsqlF.query(f"select count(*) from {stb}") - # tdsqlF.checkData(0,0,tableNumbers*recordNumbers1) - os.system("pkill taosd") - sleep(2) - - print(f"start taosd: nohup taosd -c {cPath} & ") - os.system(f" nohup taosd -c {cPath} & " ) - sleep(10) - tdLog.info(" LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y ") - os.system("LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y") - os.system("pkill -9 taosd") + print(f"start taosd: nohup taosd -c {cPath} & ") + os.system(f" nohup taosd -c {cPath} & " ) + sleep(10) + tdLog.info(" LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y ") + os.system("LD_LIBRARY_PATH=/usr/lib taosBenchmark -f 0-others/compa4096.json -y") + os.system("pkill -9 taosd") - tdLog.printNoPrefix("==========step2:update new version ") - self.buildTaosd(bPath) - tdDnodes.start(1) - sleep(1) - tdsql=tdCom.newTdSql() - print(tdsql) + tdLog.printNoPrefix("==========step2:update new version ") + self.buildTaosd(bPath) + tdDnodes.start(1) + sleep(1) + tdsql=tdCom.newTdSql() + print(tdsql) - tdsql.query(f"SELECT SERVER_VERSION();") - nowServerVersion=tdsql.queryResult[0][0] - tdLog.info(f"New server version is {nowServerVersion}") - tdsql.query(f"SELECT CLIENT_VERSION();") - nowClientVersion=tdsql.queryResult[0][0] - tdLog.info(f"New client version is {nowClientVersion}") + tdsql.query(f"SELECT SERVER_VERSION();") + nowServerVersion=tdsql.queryResult[0][0] + tdLog.info(f"New server version is {nowServerVersion}") + tdsql.query(f"SELECT CLIENT_VERSION();") + nowClientVersion=tdsql.queryResult[0][0] + tdLog.info(f"New client version is {nowClientVersion}") - tdLog.printNoPrefix(f"==========step3:prepare and check data in new version-{nowServerVersion}") - tdsql.query(f"select count(*) from {stb}") - tdsql.checkData(0,0,tableNumbers*recordNumbers1) - os.system(f"taosBenchmark -t {tableNumbers} -n {recordNumbers2} -y ") - tdsql.query(f"select count(*) from {stb}") - tdsql.checkData(0,0,tableNumbers*recordNumbers2) + tdLog.printNoPrefix(f"==========step3:prepare and check data in new version-{nowServerVersion}") + tdsql.query(f"select count(*) from {stb}") + tdsql.checkData(0,0,tableNumbers*recordNumbers1) + os.system(f"taosBenchmark -t {tableNumbers} -n {recordNumbers2} -y ") + tdsql.query(f"select count(*) from {stb}") + tdsql.checkData(0,0,tableNumbers*recordNumbers2) + tdsql.query(f"select count(*) from db4096.stb0") + tdsql.checkData(0,0,50000) - tdsql=tdCom.newTdSql() - tdLog.printNoPrefix(f"==========step4:verify backticks in taos Sql-TD18542") - tdsql.execute("drop database if exists db") - tdsql.execute("create database db") - tdsql.execute("use db") - tdsql.execute("create stable db.stb1 (ts timestamp, c1 int) tags (t1 int);") - tdsql.execute("insert into db.ct1 using db.stb1 TAGS(1) values(now(),11);") - tdsql.error(" insert into `db.ct2` using db.stb1 TAGS(9) values(now(),11);") - tdsql.error(" insert into db.`db.ct2` using db.stb1 TAGS(9) values(now(),11);") - tdsql.execute("insert into `db`.ct3 using db.stb1 TAGS(3) values(now(),13);") - tdsql.query("select * from db.ct3") - tdsql.checkData(0,1,13) - tdsql.execute("insert into db.`ct4` using db.stb1 TAGS(4) values(now(),14);") - tdsql.query("select * from db.ct4") - tdsql.checkData(0,1,14) - tdsql.query("describe information_schema.ins_databases;") - qRows=tdsql.queryRows - for i in range(qRows) : - if tdsql.queryResult[i][0]=="retentions" : - return True - else: - return False - def stop(self): - tdSql.close() - tdLog.success(f"{__file__} successfully executed") + tdsql=tdCom.newTdSql() + tdLog.printNoPrefix(f"==========step4:verify backticks in taos Sql-TD18542") + tdsql.execute("drop database if exists db") + tdsql.execute("create database db") + tdsql.execute("use db") + tdsql.execute("create stable db.stb1 (ts timestamp, c1 int) tags (t1 int);") + tdsql.execute("insert into db.ct1 using db.stb1 TAGS(1) values(now(),11);") + tdsql.error(" insert into `db.ct2` using db.stb1 TAGS(9) values(now(),11);") + tdsql.error(" insert into db.`db.ct2` using db.stb1 TAGS(9) values(now(),11);") + tdsql.execute("insert into `db`.ct3 using db.stb1 TAGS(3) values(now(),13);") + tdsql.query("select * from db.ct3") + tdsql.checkData(0,1,13) + tdsql.execute("insert into db.`ct4` using db.stb1 TAGS(4) values(now(),14);") + tdsql.query("select * from db.ct4") + tdsql.checkData(0,1,14) + tdsql.query("describe information_schema.ins_databases;") + qRows=tdsql.queryRows + for i in range(qRows) : + if tdsql.queryResult[i][0]=="retentions" : + return True + else: + return False + def stop(self): + tdSql.close() + tdLog.success(f"{__file__} successfully executed") tdCases.addLinux(__file__, TDTestCase()) tdCases.addWindows(__file__, TDTestCase()) From b67cc0fa0131cb9753f4a905d18e15a82f44c2fd Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Wed, 30 Nov 2022 20:12:15 +0800 Subject: [PATCH 074/105] test:modify base version from 3.0.1.0 to 3.0.1.8 in compatibility testcase --- tests/system-test/0-others/compatibility.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index 64b1d6cdcd..cda8bfb646 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -3,6 +3,7 @@ import taos import sys import os import time + from pathlib import Path from util.log import * from util.sql import * From 6b636ae1ad368a5cfe245158128f697ca2dbed7a Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 30 Nov 2022 20:14:16 +0800 Subject: [PATCH 075/105] fix and more dev --- source/common/src/tmsg.c | 2 +- source/dnode/vnode/src/tsdb/tsdbMemTable.c | 36 +++++++++++++++++----- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index 73a034c23f..97b91cd6aa 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -6737,7 +6737,7 @@ static int32_t tDecodeSSubmitTbData(SDecoder *pCoder, SSubmitTbData *pSubmitTbDa goto _exit; } - pSubmitTbData->aCol = taosArrayInit(nColData, nColData); + pSubmitTbData->aCol = taosArrayInit(nColData, sizeof(SColData)); if (pSubmitTbData->aCol == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _exit; diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index bb6ee6d7c0..ad2e36aa20 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -28,8 +28,10 @@ static void tbDataMovePosTo(STbData *pTbData, SMemSkipListNode **pos, TSDBKEY *pKey, int32_t flags); static int32_t tsdbGetOrCreateTbData(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid, STbData **ppTbData); -static int32_t tsdbInsertTableDataImpl(SMemTable *pMemTable, STbData *pTbData, int64_t version, - SSubmitTbData *pSubmitTbData, int32_t *affectedRows); +static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, int64_t version, + SSubmitTbData *pSubmitTbData, int32_t *affectedRows); +static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, int64_t version, + SSubmitTbData *pSubmitTbData, int32_t *affectedRows); int32_t tsdbMemTableCreate(STsdb *pTsdb, SMemTable **ppMemTable) { int32_t code = 0; @@ -133,10 +135,12 @@ int32_t tsdbInsertTableData(STsdb *pTsdb, int64_t version, SSubmitTbData *pSubmi } // do insert impl - code = tsdbInsertTableDataImpl(pMemTable, pTbData, version, pSubmitTbData, affectedRows); - if (code) { - goto _err; + if (pSubmitTbData->flags & SUBMIT_REQ_COLUMN_DATA_FORMAT) { + code = tsdbInsertColDataToTable(pMemTable, pTbData, version, pSubmitTbData, affectedRows); + } else { + code = tsdbInsertRowDataToTable(pMemTable, pTbData, version, pSubmitTbData, affectedRows); } + if (code) goto _err; return code; @@ -538,8 +542,26 @@ _exit: return code; } -static int32_t tsdbInsertTableDataImpl(SMemTable *pMemTable, STbData *pTbData, int64_t version, - SSubmitTbData *pSubmitTbData, int32_t *affectedRows) { +static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, int64_t version, + SSubmitTbData *pSubmitTbData, int32_t *affectedRows) { + int32_t code = 0; + + int32_t nColData = TARRAY_SIZE(pSubmitTbData->aCol); + SColData *aColData = (SColData *)TARRAY_DATA(pSubmitTbData->aCol); + + ASSERT(aColData[0].cid = PRIMARYKEY_TIMESTAMP_COL_ID); + ASSERT(aColData[0].type = TSDB_DATA_TYPE_TIMESTAMP); + ASSERT(aColData[0].flag = HAS_VALUE); + + // TODO + ASSERT(0); + +_exit: + return code; +} + +static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, int64_t version, + SSubmitTbData *pSubmitTbData, int32_t *affectedRows) { int32_t code = 0; SRow **rows = (SRow **)TARRAY_DATA(pSubmitTbData->aRowP); From 7497eab926e054b0058f39ac49a21481d7c9c4cc Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Wed, 30 Nov 2022 20:32:43 +0800 Subject: [PATCH 076/105] refactor(sync): if already start, force close snapshot receiver --- source/libs/sync/src/syncSnapshot.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/libs/sync/src/syncSnapshot.c b/source/libs/sync/src/syncSnapshot.c index 222b7c4e1e..3722b0f6f5 100644 --- a/source/libs/sync/src/syncSnapshot.c +++ b/source/libs/sync/src/syncSnapshot.c @@ -541,6 +541,10 @@ _START_RECEIVER: taosMsleep(10); } + if (snapshotReceiverIsStart(pReceiver)) { + snapshotReceiverForceStop(pReceiver); + } + snapshotReceiverStart(pReceiver, pMsg); // set start-time same with sender } From df661958fcb86c8213294802231fdbd09fc2cc3c Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 30 Nov 2022 20:42:03 +0800 Subject: [PATCH 077/105] fix case --- source/libs/index/src/indexFilter.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/libs/index/src/indexFilter.c b/source/libs/index/src/indexFilter.c index 2a2865a955..72828e1daa 100644 --- a/source/libs/index/src/indexFilter.c +++ b/source/libs/index/src/indexFilter.c @@ -231,8 +231,10 @@ static int32_t sifInitParam(SNode *node, SIFParam *param, SIFCtx *ctx) { SIF_ERR_RET(sifGetValueFromNode(node, ¶m->condValue)); param->colId = -1; param->colValType = (uint8_t)(vn->node.resType.type); - if (strlen(vn->literal) <= sizeof(param->colName)) { + if (vn->literal != NULL && strlen(vn->literal) <= sizeof(param->colName)) { memcpy(param->colName, vn->literal, strlen(vn->literal)); + } else { + param->status = SFLT_NOT_INDEX; } break; } From f0fdc58c528bbc626f19c6c682c182e827b15d31 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Wed, 30 Nov 2022 20:56:58 +0800 Subject: [PATCH 078/105] refactor(sync): help to display leader** --- include/libs/sync/sync.h | 5 +++++ source/libs/sync/inc/syncInt.h | 1 + source/libs/sync/src/syncMain.c | 17 ++++++++++++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/include/libs/sync/sync.h b/include/libs/sync/sync.h index 1b65d95cb1..c85c0d79c7 100644 --- a/include/libs/sync/sync.h +++ b/include/libs/sync/sync.h @@ -210,9 +210,14 @@ typedef struct SSyncInfo { int32_t (*syncEqCtrlMsg)(const SMsgCb* msgcb, SRpcMsg* pMsg); } SSyncInfo; +// if state == leader +// if restored, display "leader" +// if !restored && canRead, display "leader*" +// if !restored && !canRead, display "leader**" typedef struct SSyncState { ESyncState state; bool restored; + bool canRead; } SSyncState; int32_t syncInit(); diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h index 145880fa3e..04ee7c16c1 100644 --- a/source/libs/sync/inc/syncInt.h +++ b/source/libs/sync/inc/syncInt.h @@ -244,6 +244,7 @@ int32_t syncCacheEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry, LRUHa bool syncNodeHeartbeatReplyTimeout(SSyncNode* pSyncNode); bool syncNodeSnapshotSending(SSyncNode* pSyncNode); bool syncNodeSnapshotRecving(SSyncNode* pSyncNode); +bool syncNodeIsReadyForRead(SSyncNode* pSyncNode); // raft state change -------------- void syncNodeUpdateTerm(SSyncNode* pSyncNode, SyncTerm term); diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 44abf3c5e9..9d85943c36 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -381,15 +381,13 @@ int32_t syncStepDown(int64_t rid, SyncTerm newTerm) { return 0; } -bool syncIsReadyForRead(int64_t rid) { - SSyncNode* pSyncNode = syncNodeAcquire(rid); +bool syncNodeIsReadyForRead(SSyncNode* pSyncNode) { if (pSyncNode == NULL) { sError("sync ready for read error"); return false; } if (pSyncNode->state == TAOS_SYNC_STATE_LEADER && pSyncNode->restoreFinish) { - syncNodeRelease(pSyncNode); return true; } @@ -443,6 +441,18 @@ bool syncIsReadyForRead(int64_t rid) { } } + return ready; +} + +bool syncIsReadyForRead(int64_t rid) { + SSyncNode* pSyncNode = syncNodeAcquire(rid); + if (pSyncNode == NULL) { + sError("sync ready for read error"); + return false; + } + + bool ready = syncNodeIsReadyForRead(pSyncNode); + syncNodeRelease(pSyncNode); return ready; } @@ -521,6 +531,7 @@ SSyncState syncGetState(int64_t rid) { if (pSyncNode != NULL) { state.state = pSyncNode->state; state.restored = pSyncNode->restoreFinish; + state.canRead = syncNodeIsReadyForRead(pSyncNode); syncNodeRelease(pSyncNode); } From 2c8b962b5a1391d450afdb6d3d45d2e5591804fd Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 30 Nov 2022 21:04:58 +0800 Subject: [PATCH 079/105] refactor: do some internal refactor. --- include/libs/executor/executor.h | 7 - source/libs/executor/inc/executil.h | 2 + source/libs/executor/inc/executorimpl.h | 24 +- source/libs/executor/inc/tfill.h | 16 +- source/libs/executor/src/exchangeoperator.c | 11 - source/libs/executor/src/executil.c | 10 + source/libs/executor/src/executor.c | 14 + source/libs/executor/src/executorimpl.c | 349 ---- source/libs/executor/src/filloperator.c | 1494 +++++++++++++++++ source/libs/executor/src/scanoperator.c | 24 - source/libs/executor/src/tfill.c | 1113 +----------- source/libs/executor/src/timewindowoperator.c | 12 +- 12 files changed, 1535 insertions(+), 1541 deletions(-) create mode 100644 source/libs/executor/src/filloperator.c diff --git a/include/libs/executor/executor.h b/include/libs/executor/executor.h index 0bca254e14..d210004760 100644 --- a/include/libs/executor/executor.h +++ b/include/libs/executor/executor.h @@ -160,13 +160,6 @@ int32_t qAsyncKillTask(qTaskInfo_t tinfo); */ void qDestroyTask(qTaskInfo_t tinfo); -/** - * Get the queried table uid - * @param qHandle - * @return - */ -int64_t qGetQueriedTableUid(qTaskInfo_t tinfo); - /** * Extract the qualified table id list, and than pass them to the TSDB driver to load the required table data blocks. * diff --git a/source/libs/executor/inc/executil.h b/source/libs/executor/inc/executil.h index 875528576d..51150ede3c 100644 --- a/source/libs/executor/inc/executil.h +++ b/source/libs/executor/inc/executil.h @@ -161,4 +161,6 @@ int32_t convertFillType(int32_t mode); int32_t resultrowComparAsc(const void* p1, const void* p2); int32_t isQualifiedTable(STableKeyInfo* info, SNode* pTagCond, void* metaHandle, bool* pQualified); +void printDataBlock(SSDataBlock* pBlock, const char* flag); + #endif // TDENGINE_QUERYUTIL_H diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h index 8163217039..8fc3401813 100644 --- a/source/libs/executor/inc/executorimpl.h +++ b/source/libs/executor/inc/executorimpl.h @@ -537,23 +537,6 @@ typedef struct SStreamIntervalOperatorInfo { SWinKey delKey; } SStreamIntervalOperatorInfo; -typedef struct SFillOperatorInfo { - struct SFillInfo* pFillInfo; - SSDataBlock* pRes; - SSDataBlock* pFinalRes; - int64_t totalInputRows; - void** p; - SSDataBlock* existNewGroupBlock; - STimeWindow win; - SColMatchInfo matchInfo; - int32_t primaryTsCol; - int32_t primarySrcSlotId; - uint64_t curGroupId; // current handled group id - SExprInfo* pExprInfo; - int32_t numOfExpr; - SExprSupp noFillExprSupp; -} SFillOperatorInfo; - typedef struct SDataGroupInfo { uint64_t groupId; int64_t numOfRows; @@ -805,8 +788,6 @@ int32_t createExecTaskInfoImpl(SSubplan* pPlan, SExecTaskInfo** pTaskInfo, SRead int32_t createDataSinkParam(SDataSinkNode* pNode, void** pParam, qTaskInfo_t* pTaskInfo, SReadHandle* readHandle); int32_t getOperatorExplainExecInfo(SOperatorInfo* operatorInfo, SArray* pExecInfoList); -void printTaskExecCostInLog(SExecTaskInfo* pTaskInfo); - int32_t getMaximumIdleDurationSec(); STimeWindow getActiveTimeWindow(SDiskbasedBuf* pBuf, SResultRowInfo* pResultRowInfo, int64_t ts, SInterval* pInterval, @@ -824,9 +805,8 @@ bool isDeletedWindow(STimeWindow* pWin, uint64_t groupId, SAggSupporter* pSup); bool isDeletedStreamWindow(STimeWindow* pWin, uint64_t groupId, SStreamState* pState, STimeWindowAggSupp* pTwSup); void appendOneRowToStreamSpecialBlock(SSDataBlock* pBlock, TSKEY* pStartTs, TSKEY* pEndTs, uint64_t* pUid, uint64_t* pGp, void* pTbName); -void printDataBlock(SSDataBlock* pBlock, const char* flag); -uint64_t calGroupIdByData(SPartitionBySupporter* pParSup, SExprSupp* pExprSup, SSDataBlock* pBlock, int32_t rowId); -void calBlockTbName(SStreamScanInfo* pInfo, SSDataBlock* pBlock); +uint64_t calGroupIdByData(SPartitionBySupporter* pParSup, SExprSupp* pExprSup, SSDataBlock* pBlock, int32_t rowId); +void calBlockTbName(SStreamScanInfo* pInfo, SSDataBlock* pBlock); int32_t finalizeResultRows(SDiskbasedBuf* pBuf, SResultRowPosition* resultRowPosition, SExprSupp* pSup, SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo); diff --git a/source/libs/executor/inc/tfill.h b/source/libs/executor/inc/tfill.h index b0017fef50..fad4059515 100644 --- a/source/libs/executor/inc/tfill.h +++ b/source/libs/executor/inc/tfill.h @@ -25,6 +25,8 @@ extern "C" { #include "tcommon.h" #include "tsimplehash.h" +#define GET_DEST_SLOT_ID(_p) ((_p)->pExpr->base.resSchema.slotId) + struct SSDataBlock; typedef struct SFillColInfo { @@ -113,12 +115,12 @@ typedef struct SStreamFillInfo { int64_t getNumOfResultsAfterFillGap(SFillInfo* pFillInfo, int64_t ekey, int32_t maxNumOfRows); -void taosFillSetStartInfo(struct SFillInfo* pFillInfo, int32_t numOfRows, TSKEY endKey); -void taosResetFillInfo(struct SFillInfo* pFillInfo, TSKEY startTimestamp); -void taosFillSetInputDataBlock(struct SFillInfo* pFillInfo, const struct SSDataBlock* pInput); -struct SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfFillExpr, SExprInfo* pNotFillExpr, - int32_t numOfNotFillCols, const struct SNodeListNode* val); -bool taosFillHasMoreResults(struct SFillInfo* pFillInfo); +void taosFillSetStartInfo(struct SFillInfo* pFillInfo, int32_t numOfRows, TSKEY endKey); +void taosResetFillInfo(struct SFillInfo* pFillInfo, TSKEY startTimestamp); +void taosFillSetInputDataBlock(struct SFillInfo* pFillInfo, const struct SSDataBlock* pInput); +SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfFillExpr, SExprInfo* pNotFillExpr, + int32_t numOfNotFillCols, const struct SNodeListNode* val); +bool taosFillHasMoreResults(struct SFillInfo* pFillInfo); SFillInfo* taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols, int32_t numOfNotFillCols, int32_t capacity, SInterval* pInterval, int32_t fillType, struct SFillColInfo* pCol, int32_t slotId, @@ -128,6 +130,8 @@ void* taosDestroyFillInfo(struct SFillInfo* pFillInfo); int64_t taosFillResultDataBlock(struct SFillInfo* pFillInfo, SSDataBlock* p, int32_t capacity); int64_t getFillInfoStart(struct SFillInfo* pFillInfo); +bool fillIfWindowPseudoColumn(SFillInfo* pFillInfo, SFillColInfo* pCol, SColumnInfoData* pDstColInfoData, + int32_t rowIndex); #ifdef __cplusplus } #endif diff --git a/source/libs/executor/src/exchangeoperator.c b/source/libs/executor/src/exchangeoperator.c index b2ddff45a4..963a273290 100644 --- a/source/libs/executor/src/exchangeoperator.c +++ b/source/libs/executor/src/exchangeoperator.c @@ -15,26 +15,15 @@ #include "filter.h" #include "function.h" -#include "functionMgt.h" #include "os.h" -#include "querynodes.h" -#include "tfill.h" #include "tname.h" #include "tref.h" - #include "tdatablock.h" -#include "tglobal.h" #include "tmsg.h" -#include "tsort.h" -#include "ttime.h" - #include "executorimpl.h" #include "index.h" #include "query.h" -#include "tcompare.h" #include "thash.h" -#include "ttypes.h" -#include "vnode.h" typedef struct SFetchRspHandleWrapper { uint32_t exchangeId; diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index b135566caa..8a85885d98 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -2002,3 +2002,13 @@ int32_t createScanTableListInfo(SScanPhysiNode* pScanNode, SNodeList* pGroupTags return TSDB_CODE_SUCCESS; } + +void printDataBlock(SSDataBlock* pBlock, const char* flag) { + if (!pBlock || pBlock->info.rows == 0) { + qDebug("===stream===printDataBlock: Block is Null or Empty"); + return; + } + char* pBuf = NULL; + qDebug("%s", dumpBlockData(pBlock, flag, &pBuf)); + taosMemoryFree(pBuf); +} \ No newline at end of file diff --git a/source/libs/executor/src/executor.c b/source/libs/executor/src/executor.c index 34bd9cf8ca..10ceb9ccee 100644 --- a/source/libs/executor/src/executor.c +++ b/source/libs/executor/src/executor.c @@ -704,6 +704,20 @@ int32_t qAsyncKillTask(qTaskInfo_t qinfo) { return TSDB_CODE_SUCCESS; } +static void printTaskExecCostInLog(SExecTaskInfo* pTaskInfo) { + STaskCostInfo* pSummary = &pTaskInfo->cost; + + SFileBlockLoadRecorder* pRecorder = pSummary->pRecoder; + if (pSummary->pRecoder != NULL) { + qDebug( + "%s :cost summary: elapsed time:%.2f ms, extract tableList:%.2f ms, createGroupIdMap:%.2f ms, total blocks:%d, " + "load block SMA:%d, load data block:%d, total rows:%" PRId64 ", check rows:%" PRId64, + GET_TASKID(pTaskInfo), pSummary->elapsedTime / 1000.0, pSummary->extractListTime, pSummary->groupIdMapTime, + pRecorder->totalBlocks, pRecorder->loadBlockStatis, pRecorder->loadBlocks, pRecorder->totalRows, + pRecorder->totalCheckedRows); + } +} + void qDestroyTask(qTaskInfo_t qTaskHandle) { SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)qTaskHandle; if (pTaskInfo == NULL) { diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 300ba52934..f85287b0ae 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -91,7 +91,6 @@ static void setBlockSMAInfo(SqlFunctionCtx* pCtx, SExprInfo* pExpr, SSDataBlock* static void releaseQueryBuf(size_t numOfTables); -static void destroyFillOperatorInfo(void* param); static void destroyAggOperatorInfo(void* param); static void initCtxOutputBuffer(SqlFunctionCtx* pCtx, int32_t size); static void doSetTableGroupOutputBuf(SOperatorInfo* pOperator, int32_t numOfOutput, uint64_t groupId); @@ -1157,20 +1156,6 @@ void doBuildResultDatablock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SG } } -void printTaskExecCostInLog(SExecTaskInfo* pTaskInfo) { - STaskCostInfo* pSummary = &pTaskInfo->cost; - - SFileBlockLoadRecorder* pRecorder = pSummary->pRecoder; - if (pSummary->pRecoder != NULL) { - qDebug( - "%s :cost summary: elapsed time:%.2f ms, extract tableList:%.2f ms, createGroupIdMap:%.2f ms, total blocks:%d, " - "load block SMA:%d, load data block:%d, total rows:%" PRId64 ", check rows:%" PRId64, - GET_TASKID(pTaskInfo), pSummary->elapsedTime / 1000.0, pSummary->extractListTime, pSummary->groupIdMapTime, - pRecorder->totalBlocks, pRecorder->loadBlockStatis, pRecorder->loadBlocks, pRecorder->totalRows, - pRecorder->totalCheckedRows); - } -} - // void skipBlocks(STaskRuntimeEnv *pRuntimeEnv) { // STaskAttr *pQueryAttr = pRuntimeEnv->pQueryAttr; // @@ -1513,179 +1498,6 @@ static SSDataBlock* getAggregateResult(SOperatorInfo* pOperator) { return (rows == 0) ? NULL : pInfo->pRes; } -static void doHandleRemainBlockForNewGroupImpl(SOperatorInfo* pOperator, SFillOperatorInfo* pInfo, - SResultInfo* pResultInfo, SExecTaskInfo* pTaskInfo) { - pInfo->totalInputRows = pInfo->existNewGroupBlock->info.rows; - SSDataBlock* pResBlock = pInfo->pFinalRes; - - int32_t order = TSDB_ORDER_ASC; - int32_t scanFlag = MAIN_SCAN; - getTableScanInfo(pOperator, &order, &scanFlag); - - int64_t ekey = pInfo->existNewGroupBlock->info.window.ekey; - taosResetFillInfo(pInfo->pFillInfo, getFillInfoStart(pInfo->pFillInfo)); - - blockDataCleanup(pInfo->pRes); - doApplyScalarCalculation(pOperator, pInfo->existNewGroupBlock, order, scanFlag); - - taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, ekey); - taosFillSetInputDataBlock(pInfo->pFillInfo, pInfo->pRes); - - int32_t numOfResultRows = pResultInfo->capacity - pResBlock->info.rows; - taosFillResultDataBlock(pInfo->pFillInfo, pResBlock, numOfResultRows); - - pInfo->curGroupId = pInfo->existNewGroupBlock->info.id.groupId; - pInfo->existNewGroupBlock = NULL; -} - -static void doHandleRemainBlockFromNewGroup(SOperatorInfo* pOperator, SFillOperatorInfo* pInfo, - SResultInfo* pResultInfo, SExecTaskInfo* pTaskInfo) { - if (taosFillHasMoreResults(pInfo->pFillInfo)) { - int32_t numOfResultRows = pResultInfo->capacity - pInfo->pFinalRes->info.rows; - taosFillResultDataBlock(pInfo->pFillInfo, pInfo->pFinalRes, numOfResultRows); - pInfo->pRes->info.id.groupId = pInfo->curGroupId; - return; - } - - // handle the cached new group data block - if (pInfo->existNewGroupBlock) { - doHandleRemainBlockForNewGroupImpl(pOperator, pInfo, pResultInfo, pTaskInfo); - } -} - -static void doApplyScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pBlock, int32_t order, int32_t scanFlag) { - SFillOperatorInfo* pInfo = pOperator->info; - SExprSupp* pSup = &pOperator->exprSupp; - setInputDataBlock(pSup, pBlock, order, scanFlag, false); - projectApplyFunctions(pSup->pExprInfo, pInfo->pRes, pBlock, pSup->pCtx, pSup->numOfExprs, NULL); - - // reset the row value before applying the no-fill functions to the input data block, which is "pBlock" in this case. - pInfo->pRes->info.rows = 0; - SExprSupp* pNoFillSupp = &pInfo->noFillExprSupp; - setInputDataBlock(pNoFillSupp, pBlock, order, scanFlag, false); - - projectApplyFunctions(pNoFillSupp->pExprInfo, pInfo->pRes, pBlock, pNoFillSupp->pCtx, pNoFillSupp->numOfExprs, NULL); - pInfo->pRes->info.id.groupId = pBlock->info.id.groupId; -} - -static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) { - SFillOperatorInfo* pInfo = pOperator->info; - SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; - - SResultInfo* pResultInfo = &pOperator->resultInfo; - SSDataBlock* pResBlock = pInfo->pFinalRes; - - blockDataCleanup(pResBlock); - - int32_t order = TSDB_ORDER_ASC; - int32_t scanFlag = MAIN_SCAN; - getTableScanInfo(pOperator, &order, &scanFlag); - - doHandleRemainBlockFromNewGroup(pOperator, pInfo, pResultInfo, pTaskInfo); - if (pResBlock->info.rows > 0) { - pResBlock->info.id.groupId = pInfo->curGroupId; - return pResBlock; - } - - SOperatorInfo* pDownstream = pOperator->pDownstream[0]; - while (1) { - SSDataBlock* pBlock = pDownstream->fpSet.getNextFn(pDownstream); - if (pBlock == NULL) { - if (pInfo->totalInputRows == 0) { - setOperatorCompleted(pOperator); - return NULL; - } - - taosFillSetStartInfo(pInfo->pFillInfo, 0, pInfo->win.ekey); - } else { - blockDataUpdateTsWindow(pBlock, pInfo->primarySrcSlotId); - - blockDataCleanup(pInfo->pRes); - blockDataEnsureCapacity(pInfo->pRes, pBlock->info.rows); - blockDataEnsureCapacity(pInfo->pFinalRes, pBlock->info.rows); - doApplyScalarCalculation(pOperator, pBlock, order, scanFlag); - - if (pInfo->curGroupId == 0 || pInfo->curGroupId == pInfo->pRes->info.id.groupId) { - pInfo->curGroupId = pInfo->pRes->info.id.groupId; // the first data block - pInfo->totalInputRows += pInfo->pRes->info.rows; - - if (order == pInfo->pFillInfo->order) { - taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, pBlock->info.window.ekey); - } else { - taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, pBlock->info.window.skey); - } - taosFillSetInputDataBlock(pInfo->pFillInfo, pInfo->pRes); - } else if (pInfo->curGroupId != pBlock->info.id.groupId) { // the new group data block - pInfo->existNewGroupBlock = pBlock; - - // Fill the previous group data block, before handle the data block of new group. - // Close the fill operation for previous group data block - taosFillSetStartInfo(pInfo->pFillInfo, 0, pInfo->win.ekey); - } - } - - int32_t numOfResultRows = pOperator->resultInfo.capacity - pResBlock->info.rows; - taosFillResultDataBlock(pInfo->pFillInfo, pResBlock, numOfResultRows); - - // current group has no more result to return - if (pResBlock->info.rows > 0) { - // 1. The result in current group not reach the threshold of output result, continue - // 2. If multiple group results existing in one SSDataBlock is not allowed, return immediately - if (pResBlock->info.rows > pResultInfo->threshold || pBlock == NULL || pInfo->existNewGroupBlock != NULL) { - pResBlock->info.id.groupId = pInfo->curGroupId; - return pResBlock; - } - - doHandleRemainBlockFromNewGroup(pOperator, pInfo, pResultInfo, pTaskInfo); - if (pResBlock->info.rows >= pOperator->resultInfo.threshold || pBlock == NULL) { - pResBlock->info.id.groupId = pInfo->curGroupId; - return pResBlock; - } - } else if (pInfo->existNewGroupBlock) { // try next group - assert(pBlock != NULL); - - blockDataCleanup(pResBlock); - - doHandleRemainBlockForNewGroupImpl(pOperator, pInfo, pResultInfo, pTaskInfo); - if (pResBlock->info.rows > pResultInfo->threshold) { - pResBlock->info.id.groupId = pInfo->curGroupId; - return pResBlock; - } - } else { - return NULL; - } - } -} - -static SSDataBlock* doFill(SOperatorInfo* pOperator) { - SFillOperatorInfo* pInfo = pOperator->info; - SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; - - if (pOperator->status == OP_EXEC_DONE) { - return NULL; - } - - SSDataBlock* fillResult = NULL; - while (true) { - fillResult = doFillImpl(pOperator); - if (fillResult == NULL) { - setOperatorCompleted(pOperator); - break; - } - - doFilter(fillResult, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo); - if (fillResult->info.rows > 0) { - break; - } - } - - if (fillResult != NULL) { - pOperator->resultInfo.totalRows += fillResult->info.rows; - } - - return fillResult; -} - void destroyExprInfo(SExprInfo* pExpr, int32_t numOfExprs) { for (int32_t i = 0; i < numOfExprs; ++i) { SExprInfo* pExprInfo = &pExpr[i]; @@ -1955,167 +1767,6 @@ void destroyAggOperatorInfo(void* param) { taosMemoryFreeClear(param); } -void destroyFillOperatorInfo(void* param) { - SFillOperatorInfo* pInfo = (SFillOperatorInfo*)param; - pInfo->pFillInfo = taosDestroyFillInfo(pInfo->pFillInfo); - pInfo->pRes = blockDataDestroy(pInfo->pRes); - pInfo->pFinalRes = blockDataDestroy(pInfo->pFinalRes); - - cleanupExprSupp(&pInfo->noFillExprSupp); - - taosMemoryFreeClear(pInfo->p); - taosArrayDestroy(pInfo->matchInfo.pList); - taosMemoryFreeClear(param); -} - -static int32_t initFillInfo(SFillOperatorInfo* pInfo, SExprInfo* pExpr, int32_t numOfCols, SExprInfo* pNotFillExpr, - int32_t numOfNotFillCols, SNodeListNode* pValNode, STimeWindow win, int32_t capacity, - const char* id, SInterval* pInterval, int32_t fillType, int32_t order) { - SFillColInfo* pColInfo = createFillColInfo(pExpr, numOfCols, pNotFillExpr, numOfNotFillCols, pValNode); - - int64_t startKey = (order == TSDB_ORDER_ASC) ? win.skey : win.ekey; - STimeWindow w = getAlignQueryTimeWindow(pInterval, pInterval->precision, startKey); - w = getFirstQualifiedTimeWindow(startKey, &w, pInterval, order); - - pInfo->pFillInfo = taosCreateFillInfo(w.skey, numOfCols, numOfNotFillCols, capacity, pInterval, fillType, pColInfo, - pInfo->primaryTsCol, order, id); - - if (order == TSDB_ORDER_ASC) { - pInfo->win.skey = win.skey; - pInfo->win.ekey = win.ekey; - } else { - pInfo->win.skey = win.ekey; - pInfo->win.ekey = win.skey; - } - pInfo->p = taosMemoryCalloc(numOfCols, POINTER_BYTES); - - if (pInfo->pFillInfo == NULL || pInfo->p == NULL) { - taosMemoryFree(pInfo->pFillInfo); - taosMemoryFree(pInfo->p); - return TSDB_CODE_OUT_OF_MEMORY; - } else { - return TSDB_CODE_SUCCESS; - } -} - -static bool isWstartColumnExist(SFillOperatorInfo* pInfo) { - if (pInfo->noFillExprSupp.numOfExprs == 0) { - return false; - } - - for (int32_t i = 0; i < pInfo->noFillExprSupp.numOfExprs; ++i) { - SExprInfo* exprInfo = pInfo->noFillExprSupp.pExprInfo + i; - if (exprInfo->pExpr->nodeType == QUERY_NODE_COLUMN && exprInfo->base.numOfParams == 1 && - exprInfo->base.pParam[0].pCol->colType == COLUMN_TYPE_WINDOW_START) { - return true; - } - } - return false; -} - -static int32_t createPrimaryTsExprIfNeeded(SFillOperatorInfo* pInfo, SFillPhysiNode* pPhyFillNode, SExprSupp* pExprSupp, - const char* idStr) { - bool wstartExist = isWstartColumnExist(pInfo); - - if (wstartExist == false) { - if (pPhyFillNode->pWStartTs->type != QUERY_NODE_TARGET) { - qError("pWStartTs of fill physical node is not a target node, %s", idStr); - return TSDB_CODE_QRY_SYS_ERROR; - } - - SExprInfo* pExpr = taosMemoryRealloc(pExprSupp->pExprInfo, (pExprSupp->numOfExprs + 1) * sizeof(SExprInfo)); - if (pExpr == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; - } - - createExprFromTargetNode(&pExpr[pExprSupp->numOfExprs], (STargetNode*)pPhyFillNode->pWStartTs); - pExprSupp->numOfExprs += 1; - pExprSupp->pExprInfo = pExpr; - } - - return TSDB_CODE_SUCCESS; -} - -SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pPhyFillNode, - SExecTaskInfo* pTaskInfo) { - SFillOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SFillOperatorInfo)); - SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); - if (pInfo == NULL || pOperator == NULL) { - goto _error; - } - - pInfo->pRes = createDataBlockFromDescNode(pPhyFillNode->node.pOutputDataBlockDesc); - SExprInfo* pExprInfo = createExprInfo(pPhyFillNode->pFillExprs, NULL, &pInfo->numOfExpr); - pOperator->exprSupp.pExprInfo = pExprInfo; - - SExprSupp* pNoFillSupp = &pInfo->noFillExprSupp; - pNoFillSupp->pExprInfo = createExprInfo(pPhyFillNode->pNotFillExprs, NULL, &pNoFillSupp->numOfExprs); - int32_t code = createPrimaryTsExprIfNeeded(pInfo, pPhyFillNode, pNoFillSupp, pTaskInfo->id.str); - if (code != TSDB_CODE_SUCCESS) { - goto _error; - } - - code = initExprSupp(pNoFillSupp, pNoFillSupp->pExprInfo, pNoFillSupp->numOfExprs); - if (code != TSDB_CODE_SUCCESS) { - goto _error; - } - - SInterval* pInterval = - QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL == downstream->operatorType - ? &((SMergeAlignedIntervalAggOperatorInfo*)downstream->info)->intervalAggOperatorInfo->interval - : &((SIntervalAggOperatorInfo*)downstream->info)->interval; - - int32_t order = (pPhyFillNode->inputTsOrder == ORDER_ASC) ? TSDB_ORDER_ASC : TSDB_ORDER_DESC; - int32_t type = convertFillType(pPhyFillNode->mode); - - SResultInfo* pResultInfo = &pOperator->resultInfo; - - initResultSizeInfo(&pOperator->resultInfo, 4096); - blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity); - code = initExprSupp(&pOperator->exprSupp, pExprInfo, pInfo->numOfExpr); - if (code != TSDB_CODE_SUCCESS) { - goto _error; - } - - pInfo->primaryTsCol = ((STargetNode*)pPhyFillNode->pWStartTs)->slotId; - pInfo->primarySrcSlotId = ((SColumnNode*)((STargetNode*)pPhyFillNode->pWStartTs)->pExpr)->slotId; - - int32_t numOfOutputCols = 0; - code = extractColMatchInfo(pPhyFillNode->pFillExprs, pPhyFillNode->node.pOutputDataBlockDesc, &numOfOutputCols, - COL_MATCH_FROM_SLOT_ID, &pInfo->matchInfo); - - code = initFillInfo(pInfo, pExprInfo, pInfo->numOfExpr, pNoFillSupp->pExprInfo, pNoFillSupp->numOfExprs, - (SNodeListNode*)pPhyFillNode->pValues, pPhyFillNode->timeRange, pResultInfo->capacity, - pTaskInfo->id.str, pInterval, type, order); - if (code != TSDB_CODE_SUCCESS) { - goto _error; - } - - pInfo->pFinalRes = createOneDataBlock(pInfo->pRes, false); - blockDataEnsureCapacity(pInfo->pFinalRes, pOperator->resultInfo.capacity); - - code = filterInitFromNode((SNode*)pPhyFillNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0); - if (code != TSDB_CODE_SUCCESS) { - goto _error; - } - - setOperatorInfo(pOperator, "FillOperator", QUERY_NODE_PHYSICAL_PLAN_FILL, false, OP_NOT_OPENED, pInfo, pTaskInfo); - pOperator->exprSupp.numOfExprs = pInfo->numOfExpr; - pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doFill, NULL, destroyFillOperatorInfo, NULL); - - code = appendDownstream(pOperator, &downstream, 1); - return pOperator; - -_error: - if (pInfo != NULL) { - destroyFillOperatorInfo(pInfo); - } - - pTaskInfo->code = code; - taosMemoryFreeClear(pOperator); - return NULL; -} - static SExecTaskInfo* createExecTaskInfo(uint64_t queryId, uint64_t taskId, EOPTR_EXEC_MODEL model, char* dbFName) { SExecTaskInfo* pTaskInfo = taosMemoryCalloc(1, sizeof(SExecTaskInfo)); if (pTaskInfo == NULL) { diff --git a/source/libs/executor/src/filloperator.c b/source/libs/executor/src/filloperator.c new file mode 100644 index 0000000000..e26bfe9889 --- /dev/null +++ b/source/libs/executor/src/filloperator.c @@ -0,0 +1,1494 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "filter.h" +#include "os.h" +#include "query.h" +#include "taosdef.h" +#include "tmsg.h" +#include "ttypes.h" + +#include "executorimpl.h" +#include "tcommon.h" +#include "thash.h" +#include "ttime.h" + +#include "executorInt.h" +#include "function.h" +#include "querynodes.h" +#include "tdatablock.h" +#include "tfill.h" + +#define FILL_POS_INVALID 0 +#define FILL_POS_START 1 +#define FILL_POS_MID 2 +#define FILL_POS_END 3 + +typedef struct STimeRange { + TSKEY skey; + TSKEY ekey; + uint64_t groupId; +} STimeRange; + +typedef struct SFillOperatorInfo { + struct SFillInfo* pFillInfo; + SSDataBlock* pRes; + SSDataBlock* pFinalRes; + int64_t totalInputRows; + void** p; + SSDataBlock* existNewGroupBlock; + STimeWindow win; + SColMatchInfo matchInfo; + int32_t primaryTsCol; + int32_t primarySrcSlotId; + uint64_t curGroupId; // current handled group id + SExprInfo* pExprInfo; + int32_t numOfExpr; + SExprSupp noFillExprSupp; +} SFillOperatorInfo; + +static void destroyFillOperatorInfo(void* param); +static void doApplyScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pBlock, int32_t order, int32_t scanFlag); + +static void doHandleRemainBlockForNewGroupImpl(SOperatorInfo* pOperator, SFillOperatorInfo* pInfo, + SResultInfo* pResultInfo, SExecTaskInfo* pTaskInfo) { + pInfo->totalInputRows = pInfo->existNewGroupBlock->info.rows; + SSDataBlock* pResBlock = pInfo->pFinalRes; + + int32_t order = TSDB_ORDER_ASC; + int32_t scanFlag = MAIN_SCAN; + getTableScanInfo(pOperator, &order, &scanFlag); + + int64_t ekey = pInfo->existNewGroupBlock->info.window.ekey; + taosResetFillInfo(pInfo->pFillInfo, getFillInfoStart(pInfo->pFillInfo)); + + blockDataCleanup(pInfo->pRes); + doApplyScalarCalculation(pOperator, pInfo->existNewGroupBlock, order, scanFlag); + + taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, ekey); + taosFillSetInputDataBlock(pInfo->pFillInfo, pInfo->pRes); + + int32_t numOfResultRows = pResultInfo->capacity - pResBlock->info.rows; + taosFillResultDataBlock(pInfo->pFillInfo, pResBlock, numOfResultRows); + + pInfo->curGroupId = pInfo->existNewGroupBlock->info.id.groupId; + pInfo->existNewGroupBlock = NULL; +} + +static void doHandleRemainBlockFromNewGroup(SOperatorInfo* pOperator, SFillOperatorInfo* pInfo, + SResultInfo* pResultInfo, SExecTaskInfo* pTaskInfo) { + if (taosFillHasMoreResults(pInfo->pFillInfo)) { + int32_t numOfResultRows = pResultInfo->capacity - pInfo->pFinalRes->info.rows; + taosFillResultDataBlock(pInfo->pFillInfo, pInfo->pFinalRes, numOfResultRows); + pInfo->pRes->info.id.groupId = pInfo->curGroupId; + return; + } + + // handle the cached new group data block + if (pInfo->existNewGroupBlock) { + doHandleRemainBlockForNewGroupImpl(pOperator, pInfo, pResultInfo, pTaskInfo); + } +} + +void doApplyScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pBlock, int32_t order, int32_t scanFlag) { + SFillOperatorInfo* pInfo = pOperator->info; + SExprSupp* pSup = &pOperator->exprSupp; + setInputDataBlock(pSup, pBlock, order, scanFlag, false); + projectApplyFunctions(pSup->pExprInfo, pInfo->pRes, pBlock, pSup->pCtx, pSup->numOfExprs, NULL); + + // reset the row value before applying the no-fill functions to the input data block, which is "pBlock" in this case. + pInfo->pRes->info.rows = 0; + SExprSupp* pNoFillSupp = &pInfo->noFillExprSupp; + setInputDataBlock(pNoFillSupp, pBlock, order, scanFlag, false); + + projectApplyFunctions(pNoFillSupp->pExprInfo, pInfo->pRes, pBlock, pNoFillSupp->pCtx, pNoFillSupp->numOfExprs, NULL); + pInfo->pRes->info.id.groupId = pBlock->info.id.groupId; +} + +static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) { + SFillOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + + SResultInfo* pResultInfo = &pOperator->resultInfo; + SSDataBlock* pResBlock = pInfo->pFinalRes; + + blockDataCleanup(pResBlock); + + int32_t order = TSDB_ORDER_ASC; + int32_t scanFlag = MAIN_SCAN; + getTableScanInfo(pOperator, &order, &scanFlag); + + doHandleRemainBlockFromNewGroup(pOperator, pInfo, pResultInfo, pTaskInfo); + if (pResBlock->info.rows > 0) { + pResBlock->info.id.groupId = pInfo->curGroupId; + return pResBlock; + } + + SOperatorInfo* pDownstream = pOperator->pDownstream[0]; + while (1) { + SSDataBlock* pBlock = pDownstream->fpSet.getNextFn(pDownstream); + if (pBlock == NULL) { + if (pInfo->totalInputRows == 0) { + setOperatorCompleted(pOperator); + return NULL; + } + + taosFillSetStartInfo(pInfo->pFillInfo, 0, pInfo->win.ekey); + } else { + blockDataUpdateTsWindow(pBlock, pInfo->primarySrcSlotId); + + blockDataCleanup(pInfo->pRes); + blockDataEnsureCapacity(pInfo->pRes, pBlock->info.rows); + blockDataEnsureCapacity(pInfo->pFinalRes, pBlock->info.rows); + doApplyScalarCalculation(pOperator, pBlock, order, scanFlag); + + if (pInfo->curGroupId == 0 || pInfo->curGroupId == pInfo->pRes->info.id.groupId) { + pInfo->curGroupId = pInfo->pRes->info.id.groupId; // the first data block + pInfo->totalInputRows += pInfo->pRes->info.rows; + + if (order == pInfo->pFillInfo->order) { + taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, pBlock->info.window.ekey); + } else { + taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, pBlock->info.window.skey); + } + taosFillSetInputDataBlock(pInfo->pFillInfo, pInfo->pRes); + } else if (pInfo->curGroupId != pBlock->info.id.groupId) { // the new group data block + pInfo->existNewGroupBlock = pBlock; + + // Fill the previous group data block, before handle the data block of new group. + // Close the fill operation for previous group data block + taosFillSetStartInfo(pInfo->pFillInfo, 0, pInfo->win.ekey); + } + } + + int32_t numOfResultRows = pOperator->resultInfo.capacity - pResBlock->info.rows; + taosFillResultDataBlock(pInfo->pFillInfo, pResBlock, numOfResultRows); + + // current group has no more result to return + if (pResBlock->info.rows > 0) { + // 1. The result in current group not reach the threshold of output result, continue + // 2. If multiple group results existing in one SSDataBlock is not allowed, return immediately + if (pResBlock->info.rows > pResultInfo->threshold || pBlock == NULL || pInfo->existNewGroupBlock != NULL) { + pResBlock->info.id.groupId = pInfo->curGroupId; + return pResBlock; + } + + doHandleRemainBlockFromNewGroup(pOperator, pInfo, pResultInfo, pTaskInfo); + if (pResBlock->info.rows >= pOperator->resultInfo.threshold || pBlock == NULL) { + pResBlock->info.id.groupId = pInfo->curGroupId; + return pResBlock; + } + } else if (pInfo->existNewGroupBlock) { // try next group + assert(pBlock != NULL); + + blockDataCleanup(pResBlock); + + doHandleRemainBlockForNewGroupImpl(pOperator, pInfo, pResultInfo, pTaskInfo); + if (pResBlock->info.rows > pResultInfo->threshold) { + pResBlock->info.id.groupId = pInfo->curGroupId; + return pResBlock; + } + } else { + return NULL; + } + } +} + +static SSDataBlock* doFill(SOperatorInfo* pOperator) { + SFillOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + + if (pOperator->status == OP_EXEC_DONE) { + return NULL; + } + + SSDataBlock* fillResult = NULL; + while (true) { + fillResult = doFillImpl(pOperator); + if (fillResult == NULL) { + setOperatorCompleted(pOperator); + break; + } + + doFilter(fillResult, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo); + if (fillResult->info.rows > 0) { + break; + } + } + + if (fillResult != NULL) { + pOperator->resultInfo.totalRows += fillResult->info.rows; + } + + return fillResult; +} + +void destroyFillOperatorInfo(void* param) { + SFillOperatorInfo* pInfo = (SFillOperatorInfo*)param; + pInfo->pFillInfo = taosDestroyFillInfo(pInfo->pFillInfo); + pInfo->pRes = blockDataDestroy(pInfo->pRes); + pInfo->pFinalRes = blockDataDestroy(pInfo->pFinalRes); + + cleanupExprSupp(&pInfo->noFillExprSupp); + + taosMemoryFreeClear(pInfo->p); + taosArrayDestroy(pInfo->matchInfo.pList); + taosMemoryFreeClear(param); +} + +static int32_t initFillInfo(SFillOperatorInfo* pInfo, SExprInfo* pExpr, int32_t numOfCols, SExprInfo* pNotFillExpr, + int32_t numOfNotFillCols, SNodeListNode* pValNode, STimeWindow win, int32_t capacity, + const char* id, SInterval* pInterval, int32_t fillType, int32_t order) { + SFillColInfo* pColInfo = createFillColInfo(pExpr, numOfCols, pNotFillExpr, numOfNotFillCols, pValNode); + + int64_t startKey = (order == TSDB_ORDER_ASC) ? win.skey : win.ekey; + STimeWindow w = getAlignQueryTimeWindow(pInterval, pInterval->precision, startKey); + w = getFirstQualifiedTimeWindow(startKey, &w, pInterval, order); + + pInfo->pFillInfo = taosCreateFillInfo(w.skey, numOfCols, numOfNotFillCols, capacity, pInterval, fillType, pColInfo, + pInfo->primaryTsCol, order, id); + + if (order == TSDB_ORDER_ASC) { + pInfo->win.skey = win.skey; + pInfo->win.ekey = win.ekey; + } else { + pInfo->win.skey = win.ekey; + pInfo->win.ekey = win.skey; + } + pInfo->p = taosMemoryCalloc(numOfCols, POINTER_BYTES); + + if (pInfo->pFillInfo == NULL || pInfo->p == NULL) { + taosMemoryFree(pInfo->pFillInfo); + taosMemoryFree(pInfo->p); + return TSDB_CODE_OUT_OF_MEMORY; + } else { + return TSDB_CODE_SUCCESS; + } +} + +static bool isWstartColumnExist(SFillOperatorInfo* pInfo) { + if (pInfo->noFillExprSupp.numOfExprs == 0) { + return false; + } + + for (int32_t i = 0; i < pInfo->noFillExprSupp.numOfExprs; ++i) { + SExprInfo* exprInfo = pInfo->noFillExprSupp.pExprInfo + i; + if (exprInfo->pExpr->nodeType == QUERY_NODE_COLUMN && exprInfo->base.numOfParams == 1 && + exprInfo->base.pParam[0].pCol->colType == COLUMN_TYPE_WINDOW_START) { + return true; + } + } + return false; +} + +static int32_t createPrimaryTsExprIfNeeded(SFillOperatorInfo* pInfo, SFillPhysiNode* pPhyFillNode, SExprSupp* pExprSupp, + const char* idStr) { + bool wstartExist = isWstartColumnExist(pInfo); + + if (wstartExist == false) { + if (pPhyFillNode->pWStartTs->type != QUERY_NODE_TARGET) { + qError("pWStartTs of fill physical node is not a target node, %s", idStr); + return TSDB_CODE_QRY_SYS_ERROR; + } + + SExprInfo* pExpr = taosMemoryRealloc(pExprSupp->pExprInfo, (pExprSupp->numOfExprs + 1) * sizeof(SExprInfo)); + if (pExpr == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; + } + + createExprFromTargetNode(&pExpr[pExprSupp->numOfExprs], (STargetNode*)pPhyFillNode->pWStartTs); + pExprSupp->numOfExprs += 1; + pExprSupp->pExprInfo = pExpr; + } + + return TSDB_CODE_SUCCESS; +} + +SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pPhyFillNode, + SExecTaskInfo* pTaskInfo) { + SFillOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SFillOperatorInfo)); + SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); + if (pInfo == NULL || pOperator == NULL) { + goto _error; + } + + pInfo->pRes = createDataBlockFromDescNode(pPhyFillNode->node.pOutputDataBlockDesc); + SExprInfo* pExprInfo = createExprInfo(pPhyFillNode->pFillExprs, NULL, &pInfo->numOfExpr); + pOperator->exprSupp.pExprInfo = pExprInfo; + + SExprSupp* pNoFillSupp = &pInfo->noFillExprSupp; + pNoFillSupp->pExprInfo = createExprInfo(pPhyFillNode->pNotFillExprs, NULL, &pNoFillSupp->numOfExprs); + int32_t code = createPrimaryTsExprIfNeeded(pInfo, pPhyFillNode, pNoFillSupp, pTaskInfo->id.str); + if (code != TSDB_CODE_SUCCESS) { + goto _error; + } + + code = initExprSupp(pNoFillSupp, pNoFillSupp->pExprInfo, pNoFillSupp->numOfExprs); + if (code != TSDB_CODE_SUCCESS) { + goto _error; + } + + SInterval* pInterval = + QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL == downstream->operatorType + ? &((SMergeAlignedIntervalAggOperatorInfo*)downstream->info)->intervalAggOperatorInfo->interval + : &((SIntervalAggOperatorInfo*)downstream->info)->interval; + + int32_t order = (pPhyFillNode->inputTsOrder == ORDER_ASC) ? TSDB_ORDER_ASC : TSDB_ORDER_DESC; + int32_t type = convertFillType(pPhyFillNode->mode); + + SResultInfo* pResultInfo = &pOperator->resultInfo; + + initResultSizeInfo(&pOperator->resultInfo, 4096); + blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity); + code = initExprSupp(&pOperator->exprSupp, pExprInfo, pInfo->numOfExpr); + if (code != TSDB_CODE_SUCCESS) { + goto _error; + } + + pInfo->primaryTsCol = ((STargetNode*)pPhyFillNode->pWStartTs)->slotId; + pInfo->primarySrcSlotId = ((SColumnNode*)((STargetNode*)pPhyFillNode->pWStartTs)->pExpr)->slotId; + + int32_t numOfOutputCols = 0; + code = extractColMatchInfo(pPhyFillNode->pFillExprs, pPhyFillNode->node.pOutputDataBlockDesc, &numOfOutputCols, + COL_MATCH_FROM_SLOT_ID, &pInfo->matchInfo); + + code = initFillInfo(pInfo, pExprInfo, pInfo->numOfExpr, pNoFillSupp->pExprInfo, pNoFillSupp->numOfExprs, + (SNodeListNode*)pPhyFillNode->pValues, pPhyFillNode->timeRange, pResultInfo->capacity, + pTaskInfo->id.str, pInterval, type, order); + if (code != TSDB_CODE_SUCCESS) { + goto _error; + } + + pInfo->pFinalRes = createOneDataBlock(pInfo->pRes, false); + blockDataEnsureCapacity(pInfo->pFinalRes, pOperator->resultInfo.capacity); + + code = filterInitFromNode((SNode*)pPhyFillNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0); + if (code != TSDB_CODE_SUCCESS) { + goto _error; + } + + setOperatorInfo(pOperator, "FillOperator", QUERY_NODE_PHYSICAL_PLAN_FILL, false, OP_NOT_OPENED, pInfo, pTaskInfo); + pOperator->exprSupp.numOfExprs = pInfo->numOfExpr; + pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doFill, NULL, destroyFillOperatorInfo, NULL); + + code = appendDownstream(pOperator, &downstream, 1); + return pOperator; + + _error: + if (pInfo != NULL) { + destroyFillOperatorInfo(pInfo); + } + + pTaskInfo->code = code; + taosMemoryFreeClear(pOperator); + return NULL; +} + +TSKEY getNextWindowTs(TSKEY ts, SInterval* pInterval) { + STimeWindow win = {.skey = ts, .ekey = ts}; + getNextIntervalWindow(pInterval, &win, TSDB_ORDER_ASC); + return win.skey; +} + +TSKEY getPrevWindowTs(TSKEY ts, SInterval* pInterval) { + STimeWindow win = {.skey = ts, .ekey = ts}; + getNextIntervalWindow(pInterval, &win, TSDB_ORDER_DESC); + return win.skey; +} + +void setRowCell(SColumnInfoData* pCol, int32_t rowId, const SResultCellData* pCell) { + colDataAppend(pCol, rowId, pCell->pData, pCell->isNull); +} + +SResultCellData* getResultCell(SResultRowData* pRaw, int32_t index) { + if (!pRaw || !pRaw->pRowVal) { + return NULL; + } + char* pData = (char*)pRaw->pRowVal; + SResultCellData* pCell = pRaw->pRowVal; + for (int32_t i = 0; i < index; i++) { + pData += (pCell->bytes + sizeof(SResultCellData)); + pCell = (SResultCellData*)pData; + } + return pCell; +} + +void* destroyFillColumnInfo(SFillColInfo* pFillCol, int32_t start, int32_t end) { + for (int32_t i = start; i < end; i++) { + destroyExprInfo(pFillCol[i].pExpr, 1); + taosVariantDestroy(&pFillCol[i].fillVal); + } + taosMemoryFreeClear(pFillCol[start].pExpr); + taosMemoryFree(pFillCol); + return NULL; +} + +void* destroyStreamFillSupporter(SStreamFillSupporter* pFillSup) { + pFillSup->pAllColInfo = destroyFillColumnInfo(pFillSup->pAllColInfo, pFillSup->numOfFillCols, pFillSup->numOfAllCols); + tSimpleHashCleanup(pFillSup->pResMap); + pFillSup->pResMap = NULL; + releaseOutputBuf(NULL, NULL, (SResultRow*)pFillSup->cur.pRowVal); + pFillSup->cur.pRowVal = NULL; + cleanupExprSupp(&pFillSup->notFillExprSup); + + taosMemoryFree(pFillSup); + return NULL; +} + +void* destroyStreamFillLinearInfo(SStreamFillLinearInfo* pFillLinear) { + taosArrayDestroy(pFillLinear->pDeltaVal); + taosArrayDestroy(pFillLinear->pNextDeltaVal); + taosMemoryFree(pFillLinear); + return NULL; +} +void* destroyStreamFillInfo(SStreamFillInfo* pFillInfo) { + if (pFillInfo->type == TSDB_FILL_SET_VALUE || pFillInfo->type == TSDB_FILL_NULL) { + taosMemoryFreeClear(pFillInfo->pResRow->pRowVal); + taosMemoryFreeClear(pFillInfo->pResRow); + } + pFillInfo->pLinearInfo = destroyStreamFillLinearInfo(pFillInfo->pLinearInfo); + taosArrayDestroy(pFillInfo->delRanges); + taosMemoryFree(pFillInfo); + return NULL; +} + +static void destroyStreamFillOperatorInfo(void* param) { + SStreamFillOperatorInfo* pInfo = (SStreamFillOperatorInfo*)param; + pInfo->pFillInfo = destroyStreamFillInfo(pInfo->pFillInfo); + pInfo->pFillSup = destroyStreamFillSupporter(pInfo->pFillSup); + pInfo->pRes = blockDataDestroy(pInfo->pRes); + pInfo->pSrcBlock = blockDataDestroy(pInfo->pSrcBlock); + pInfo->pPrevSrcBlock = blockDataDestroy(pInfo->pPrevSrcBlock); + pInfo->pDelRes = blockDataDestroy(pInfo->pDelRes); + pInfo->matchInfo.pList = taosArrayDestroy(pInfo->matchInfo.pList); + taosMemoryFree(pInfo); +} + +static void resetFillWindow(SResultRowData* pRowData) { + pRowData->key = INT64_MIN; + pRowData->pRowVal = NULL; +} + +void resetPrevAndNextWindow(SStreamFillSupporter* pFillSup, SStreamState* pState) { + resetFillWindow(&pFillSup->prev); + releaseOutputBuf(NULL, NULL, (SResultRow*)pFillSup->cur.pRowVal); + resetFillWindow(&pFillSup->cur); + resetFillWindow(&pFillSup->next); + resetFillWindow(&pFillSup->nextNext); +} + +void getCurWindowFromDiscBuf(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, SStreamFillSupporter* pFillSup) { + SStreamState* pState = pOperator->pTaskInfo->streamInfo.pState; + resetPrevAndNextWindow(pFillSup, pState); + + SWinKey key = {.ts = ts, .groupId = groupId}; + int32_t curVLen = 0; + int32_t code = streamStateFillGet(pState, &key, (void**)&pFillSup->cur.pRowVal, &curVLen); + ASSERT(code == TSDB_CODE_SUCCESS); + pFillSup->cur.key = key.ts; +} + +void getWindowFromDiscBuf(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, SStreamFillSupporter* pFillSup) { + SStreamState* pState = pOperator->pTaskInfo->streamInfo.pState; + resetPrevAndNextWindow(pFillSup, pState); + + SWinKey key = {.ts = ts, .groupId = groupId}; + void* curVal = NULL; + int32_t curVLen = 0; + int32_t code = streamStateFillGet(pState, &key, (void**)&curVal, &curVLen); + ASSERT(code == TSDB_CODE_SUCCESS); + pFillSup->cur.key = key.ts; + pFillSup->cur.pRowVal = curVal; + + SStreamStateCur* pCur = streamStateFillSeekKeyPrev(pState, &key); + SWinKey preKey = {.groupId = groupId}; + void* preVal = NULL; + int32_t preVLen = 0; + code = streamStateGetGroupKVByCur(pCur, &preKey, (const void**)&preVal, &preVLen); + + if (code == TSDB_CODE_SUCCESS) { + pFillSup->prev.key = preKey.ts; + pFillSup->prev.pRowVal = preVal; + + code = streamStateCurNext(pState, pCur); + ASSERT(code == TSDB_CODE_SUCCESS); + + code = streamStateCurNext(pState, pCur); + if (code != TSDB_CODE_SUCCESS) { + streamStateFreeCur(pCur); + pCur = NULL; + } + } else { + streamStateFreeCur(pCur); + pCur = streamStateFillSeekKeyNext(pState, &key); + } + + SWinKey nextKey = {.groupId = groupId}; + void* nextVal = NULL; + int32_t nextVLen = 0; + code = streamStateGetGroupKVByCur(pCur, &nextKey, (const void**)&nextVal, &nextVLen); + if (code == TSDB_CODE_SUCCESS) { + pFillSup->next.key = nextKey.ts; + pFillSup->next.pRowVal = nextVal; + if (pFillSup->type == TSDB_FILL_PREV || pFillSup->type == TSDB_FILL_NEXT) { + code = streamStateCurNext(pState, pCur); + if (code == TSDB_CODE_SUCCESS) { + SWinKey nextNextKey = {.groupId = groupId}; + void* nextNextVal = NULL; + int32_t nextNextVLen = 0; + code = streamStateGetGroupKVByCur(pCur, &nextNextKey, (const void**)&nextNextVal, &nextNextVLen); + if (code == TSDB_CODE_SUCCESS) { + pFillSup->nextNext.key = nextNextKey.ts; + pFillSup->nextNext.pRowVal = nextNextVal; + } + } + } + } + streamStateFreeCur(pCur); +} + +static bool hasPrevWindow(SStreamFillSupporter* pFillSup) { return pFillSup->prev.key != INT64_MIN; } +static bool hasNextWindow(SStreamFillSupporter* pFillSup) { return pFillSup->next.key != INT64_MIN; } +static bool hasNextNextWindow(SStreamFillSupporter* pFillSup) { + return pFillSup->nextNext.key != INT64_MIN; + return false; +} + +static void transBlockToResultRow(const SSDataBlock* pBlock, int32_t rowId, TSKEY ts, SResultRowData* pRowVal) { + int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock); + for (int32_t i = 0; i < numOfCols; ++i) { + SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, i); + SResultCellData* pCell = getResultCell(pRowVal, i); + if (!colDataIsNull_s(pColData, rowId)) { + pCell->isNull = false; + pCell->type = pColData->info.type; + pCell->bytes = pColData->info.bytes; + char* val = colDataGetData(pColData, rowId); + if (IS_VAR_DATA_TYPE(pCell->type)) { + memcpy(pCell->pData, val, varDataTLen(val)); + } else { + memcpy(pCell->pData, val, pCell->bytes); + } + } else { + pCell->isNull = true; + } + } + pRowVal->key = ts; +} + +static void calcDeltaData(SSDataBlock* pBlock, int32_t rowId, SResultRowData* pRowVal, SArray* pDelta, + SFillColInfo* pFillCol, int32_t numOfCol, int32_t winCount, int32_t order) { + for (int32_t i = 0; i < numOfCol; i++) { + if (!pFillCol[i].notFillCol) { + int32_t slotId = GET_DEST_SLOT_ID(pFillCol + i); + SColumnInfoData* pCol = taosArrayGet(pBlock->pDataBlock, slotId); + char* var = colDataGetData(pCol, rowId); + double start = 0; + GET_TYPED_DATA(start, double, pCol->info.type, var); + SResultCellData* pCell = getResultCell(pRowVal, slotId); + double end = 0; + GET_TYPED_DATA(end, double, pCell->type, pCell->pData); + double delta = 0; + if (order == TSDB_ORDER_ASC) { + delta = (end - start) / winCount; + } else { + delta = (start - end) / winCount; + } + taosArraySet(pDelta, slotId, &delta); + } + } +} + +static void calcRowDeltaData(SResultRowData* pStartRow, SResultRowData* pEndRow, SArray* pDelta, SFillColInfo* pFillCol, + int32_t numOfCol, int32_t winCount) { + for (int32_t i = 0; i < numOfCol; i++) { + if (!pFillCol[i].notFillCol) { + int32_t slotId = GET_DEST_SLOT_ID(pFillCol + i); + SResultCellData* pSCell = getResultCell(pStartRow, slotId); + double start = 0.0; + GET_TYPED_DATA(start, double, pSCell->type, pSCell->pData); + SResultCellData* pECell = getResultCell(pEndRow, slotId); + double end = 0.0; + GET_TYPED_DATA(end, double, pECell->type, pECell->pData); + double delta = (end - start) / winCount; + taosArraySet(pDelta, slotId, &delta); + } + } +} + +static void setFillInfoStart(TSKEY ts, SInterval* pInterval, SStreamFillInfo* pFillInfo) { + ts = taosTimeAdd(ts, pInterval->sliding, pInterval->slidingUnit, pInterval->precision); + pFillInfo->start = ts; +} + +static void setFillInfoEnd(TSKEY ts, SInterval* pInterval, SStreamFillInfo* pFillInfo) { + ts = taosTimeAdd(ts, pInterval->sliding * -1, pInterval->slidingUnit, pInterval->precision); + pFillInfo->end = ts; +} + +static void setFillKeyInfo(TSKEY start, TSKEY end, SInterval* pInterval, SStreamFillInfo* pFillInfo) { + setFillInfoStart(start, pInterval, pFillInfo); + pFillInfo->current = pFillInfo->start; + setFillInfoEnd(end, pInterval, pFillInfo); +} + +void setDeleteFillValueInfo(TSKEY start, TSKEY end, SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo) { + if (!hasPrevWindow(pFillSup) || !hasNextWindow(pFillSup)) { + pFillInfo->needFill = false; + return; + } + + TSKEY realStart = taosTimeAdd(pFillSup->prev.key, pFillSup->interval.sliding, pFillSup->interval.slidingUnit, + pFillSup->interval.precision); + + pFillInfo->needFill = true; + pFillInfo->start = realStart; + pFillInfo->current = pFillInfo->start; + pFillInfo->end = end; + pFillInfo->pos = FILL_POS_INVALID; + switch (pFillInfo->type) { + case TSDB_FILL_NULL: + case TSDB_FILL_SET_VALUE: + break; + case TSDB_FILL_PREV: + pFillInfo->pResRow = &pFillSup->prev; + break; + case TSDB_FILL_NEXT: + pFillInfo->pResRow = &pFillSup->next; + break; + case TSDB_FILL_LINEAR: { + setFillKeyInfo(pFillSup->prev.key, pFillSup->next.key, &pFillSup->interval, pFillInfo); + pFillInfo->pLinearInfo->hasNext = false; + pFillInfo->pLinearInfo->nextEnd = INT64_MIN; + int32_t numOfWins = taosTimeCountInterval(pFillSup->prev.key, pFillSup->next.key, pFillSup->interval.sliding, + pFillSup->interval.slidingUnit, pFillSup->interval.precision); + calcRowDeltaData(&pFillSup->prev, &pFillSup->next, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo, + pFillSup->numOfAllCols, numOfWins); + pFillInfo->pResRow = &pFillSup->prev; + pFillInfo->pLinearInfo->winIndex = 0; + } break; + default: + ASSERT(0); + break; + } +} + +void copyNotFillExpData(SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo) { + for (int32_t i = pFillSup->numOfFillCols; i < pFillSup->numOfAllCols; ++i) { + SFillColInfo* pFillCol = pFillSup->pAllColInfo + i; + int32_t slotId = GET_DEST_SLOT_ID(pFillCol); + SResultCellData* pCell = getResultCell(pFillInfo->pResRow, slotId); + SResultCellData* pCurCell = getResultCell(&pFillSup->cur, slotId); + pCell->isNull = pCurCell->isNull; + if (!pCurCell->isNull) { + memcpy(pCell->pData, pCurCell->pData, pCell->bytes); + } + } +} + +void setFillValueInfo(SSDataBlock* pBlock, TSKEY ts, int32_t rowId, SStreamFillSupporter* pFillSup, + SStreamFillInfo* pFillInfo) { + pFillInfo->preRowKey = pFillSup->cur.key; + if (!hasPrevWindow(pFillSup) && !hasNextWindow(pFillSup)) { + pFillInfo->needFill = false; + pFillInfo->pos = FILL_POS_START; + return; + } + TSKEY prevWKey = INT64_MIN; + TSKEY nextWKey = INT64_MIN; + if (hasPrevWindow(pFillSup)) { + prevWKey = pFillSup->prev.key; + } + if (hasNextWindow(pFillSup)) { + nextWKey = pFillSup->next.key; + } + + pFillInfo->needFill = true; + pFillInfo->pos = FILL_POS_INVALID; + switch (pFillInfo->type) { + case TSDB_FILL_NULL: + case TSDB_FILL_SET_VALUE: { + if (pFillSup->prev.key == pFillInfo->preRowKey) { + resetFillWindow(&pFillSup->prev); + } + if (hasPrevWindow(pFillSup) && hasNextWindow(pFillSup)) { + if (pFillSup->next.key == pFillInfo->nextRowKey) { + pFillInfo->preRowKey = INT64_MIN; + setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo); + pFillInfo->pos = FILL_POS_END; + } else { + pFillInfo->needFill = false; + pFillInfo->pos = FILL_POS_START; + } + } else if (hasPrevWindow(pFillSup)) { + setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo); + pFillInfo->pos = FILL_POS_END; + } else { + setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo); + pFillInfo->pos = FILL_POS_START; + } + copyNotFillExpData(pFillSup, pFillInfo); + } break; + case TSDB_FILL_PREV: { + if (hasNextWindow(pFillSup) && ((pFillSup->next.key != pFillInfo->nextRowKey) || + (pFillSup->next.key == pFillInfo->nextRowKey && hasNextNextWindow(pFillSup)) || + (pFillSup->next.key == pFillInfo->nextRowKey && !hasPrevWindow(pFillSup)))) { + setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo); + pFillInfo->pos = FILL_POS_START; + pFillSup->prev.key = pFillSup->cur.key; + pFillSup->prev.pRowVal = pFillSup->cur.pRowVal; + } else if (hasPrevWindow(pFillSup)) { + setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo); + pFillInfo->pos = FILL_POS_END; + pFillInfo->preRowKey = INT64_MIN; + } + pFillInfo->pResRow = &pFillSup->prev; + } break; + case TSDB_FILL_NEXT: { + if (hasPrevWindow(pFillSup)) { + setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo); + pFillInfo->pos = FILL_POS_END; + pFillSup->next.key = pFillSup->cur.key; + pFillSup->next.pRowVal = pFillSup->cur.pRowVal; + pFillInfo->preRowKey = INT64_MIN; + } else { + ASSERT(hasNextWindow(pFillSup)); + setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo); + pFillInfo->pos = FILL_POS_START; + } + pFillInfo->pResRow = &pFillSup->next; + } break; + case TSDB_FILL_LINEAR: { + pFillInfo->pLinearInfo->winIndex = 0; + if (hasPrevWindow(pFillSup) && hasNextWindow(pFillSup)) { + setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo); + pFillInfo->pos = FILL_POS_MID; + pFillInfo->pLinearInfo->nextEnd = nextWKey; + int32_t numOfWins = taosTimeCountInterval(prevWKey, ts, pFillSup->interval.sliding, + pFillSup->interval.slidingUnit, pFillSup->interval.precision); + calcRowDeltaData(&pFillSup->prev, &pFillSup->cur, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo, + pFillSup->numOfAllCols, numOfWins); + pFillInfo->pResRow = &pFillSup->prev; + + numOfWins = taosTimeCountInterval(ts, nextWKey, pFillSup->interval.sliding, pFillSup->interval.slidingUnit, + pFillSup->interval.precision); + calcRowDeltaData(&pFillSup->cur, &pFillSup->next, pFillInfo->pLinearInfo->pNextDeltaVal, pFillSup->pAllColInfo, + pFillSup->numOfAllCols, numOfWins); + pFillInfo->pLinearInfo->hasNext = true; + } else if (hasPrevWindow(pFillSup)) { + setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo); + pFillInfo->pos = FILL_POS_END; + pFillInfo->pLinearInfo->nextEnd = INT64_MIN; + int32_t numOfWins = taosTimeCountInterval(prevWKey, ts, pFillSup->interval.sliding, + pFillSup->interval.slidingUnit, pFillSup->interval.precision); + calcRowDeltaData(&pFillSup->prev, &pFillSup->cur, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo, + pFillSup->numOfAllCols, numOfWins); + pFillInfo->pResRow = &pFillSup->prev; + pFillInfo->pLinearInfo->hasNext = false; + } else { + ASSERT(hasNextWindow(pFillSup)); + setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo); + pFillInfo->pos = FILL_POS_START; + pFillInfo->pLinearInfo->nextEnd = INT64_MIN; + int32_t numOfWins = taosTimeCountInterval(ts, nextWKey, pFillSup->interval.sliding, + pFillSup->interval.slidingUnit, pFillSup->interval.precision); + calcRowDeltaData(&pFillSup->cur, &pFillSup->next, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo, + pFillSup->numOfAllCols, numOfWins); + pFillInfo->pResRow = &pFillSup->cur; + pFillInfo->pLinearInfo->hasNext = false; + } + } break; + default: + ASSERT(0); + break; + } + ASSERT(pFillInfo->pos != FILL_POS_INVALID); +} + +static bool checkResult(SStreamFillSupporter* pFillSup, TSKEY ts, uint64_t groupId) { + SWinKey key = {.groupId = groupId, .ts = ts}; + if (tSimpleHashGet(pFillSup->pResMap, &key, sizeof(SWinKey)) != NULL) { + return false; + } + tSimpleHashPut(pFillSup->pResMap, &key, sizeof(SWinKey), NULL, 0); + return true; +} + +static void buildFillResult(SResultRowData* pResRow, SStreamFillSupporter* pFillSup, TSKEY ts, SSDataBlock* pBlock) { + uint64_t groupId = pBlock->info.id.groupId; + if (pFillSup->hasDelete && !checkResult(pFillSup, ts, groupId)) { + return; + } + for (int32_t i = 0; i < pFillSup->numOfAllCols; ++i) { + SFillColInfo* pFillCol = pFillSup->pAllColInfo + i; + int32_t slotId = GET_DEST_SLOT_ID(pFillCol); + SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, slotId); + SFillInfo tmpInfo = { + .currentKey = ts, + .order = TSDB_ORDER_ASC, + .interval = pFillSup->interval, + }; + bool filled = fillIfWindowPseudoColumn(&tmpInfo, pFillCol, pColData, pBlock->info.rows); + if (!filled) { + SResultCellData* pCell = getResultCell(pResRow, slotId); + setRowCell(pColData, pBlock->info.rows, pCell); + } + } + pBlock->info.rows++; +} + +static bool hasRemainCalc(SStreamFillInfo* pFillInfo) { + if (pFillInfo->current != INT64_MIN && pFillInfo->current <= pFillInfo->end) { + return true; + } + return false; +} + +static void doStreamFillNormal(SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo, SSDataBlock* pBlock) { + while (hasRemainCalc(pFillInfo) && pBlock->info.rows < pBlock->info.capacity) { + buildFillResult(pFillInfo->pResRow, pFillSup, pFillInfo->current, pBlock); + pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit, + pFillSup->interval.precision); + } +} + +static void doStreamFillLinear(SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo, SSDataBlock* pBlock) { + while (hasRemainCalc(pFillInfo) && pBlock->info.rows < pBlock->info.capacity) { + uint64_t groupId = pBlock->info.id.groupId; + SWinKey key = {.groupId = groupId, .ts = pFillInfo->current}; + if (pFillSup->hasDelete && !checkResult(pFillSup, pFillInfo->current, groupId)) { + pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit, + pFillSup->interval.precision); + pFillInfo->pLinearInfo->winIndex++; + continue; + } + pFillInfo->pLinearInfo->winIndex++; + for (int32_t i = 0; i < pFillSup->numOfAllCols; ++i) { + SFillColInfo* pFillCol = pFillSup->pAllColInfo + i; + SFillInfo tmp = { + .currentKey = pFillInfo->current, + .order = TSDB_ORDER_ASC, + .interval = pFillSup->interval, + }; + + int32_t slotId = GET_DEST_SLOT_ID(pFillCol); + SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, slotId); + int16_t type = pColData->info.type; + SResultCellData* pCell = getResultCell(pFillInfo->pResRow, slotId); + int32_t index = pBlock->info.rows; + if (pFillCol->notFillCol) { + bool filled = fillIfWindowPseudoColumn(&tmp, pFillCol, pColData, index); + if (!filled) { + setRowCell(pColData, index, pCell); + } + } else { + if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_BOOL || pCell->isNull) { + colDataAppendNULL(pColData, index); + continue; + } + double* pDelta = taosArrayGet(pFillInfo->pLinearInfo->pDeltaVal, slotId); + double vCell = 0; + GET_TYPED_DATA(vCell, double, pCell->type, pCell->pData); + vCell += (*pDelta) * pFillInfo->pLinearInfo->winIndex; + int64_t result = 0; + SET_TYPED_DATA(&result, pCell->type, vCell); + colDataAppend(pColData, index, (const char*)&result, false); + } + } + pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit, + pFillSup->interval.precision); + pBlock->info.rows++; + } +} + +static void keepResultInDiscBuf(SOperatorInfo* pOperator, uint64_t groupId, SResultRowData* pRow, int32_t len) { + SWinKey key = {.groupId = groupId, .ts = pRow->key}; + int32_t code = streamStateFillPut(pOperator->pTaskInfo->streamInfo.pState, &key, pRow->pRowVal, len); + ASSERT(code == TSDB_CODE_SUCCESS); +} + +static void doStreamFillRange(SStreamFillInfo* pFillInfo, SStreamFillSupporter* pFillSup, SSDataBlock* pRes) { + if (pFillInfo->needFill == false) { + buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes); + return; + } + + if (pFillInfo->pos == FILL_POS_START) { + buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes); + } + if (pFillInfo->type != TSDB_FILL_LINEAR) { + doStreamFillNormal(pFillSup, pFillInfo, pRes); + } else { + doStreamFillLinear(pFillSup, pFillInfo, pRes); + + if (pFillInfo->pos == FILL_POS_MID) { + buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes); + } + + if (pFillInfo->current > pFillInfo->end && pFillInfo->pLinearInfo->hasNext) { + pFillInfo->pLinearInfo->hasNext = false; + pFillInfo->pLinearInfo->winIndex = 0; + taosArrayClear(pFillInfo->pLinearInfo->pDeltaVal); + taosArrayAddAll(pFillInfo->pLinearInfo->pDeltaVal, pFillInfo->pLinearInfo->pNextDeltaVal); + pFillInfo->pResRow = &pFillSup->cur; + setFillKeyInfo(pFillSup->cur.key, pFillInfo->pLinearInfo->nextEnd, &pFillSup->interval, pFillInfo); + doStreamFillLinear(pFillSup, pFillInfo, pRes); + } + } + if (pFillInfo->pos == FILL_POS_END) { + buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes); + } +} + +void keepBlockRowInDiscBuf(SOperatorInfo* pOperator, SStreamFillInfo* pFillInfo, SSDataBlock* pBlock, TSKEY* tsCol, + int32_t rowId, uint64_t groupId, int32_t rowSize) { + TSKEY ts = tsCol[rowId]; + pFillInfo->nextRowKey = ts; + SResultRowData tmpNextRow = {.key = ts}; + tmpNextRow.pRowVal = taosMemoryCalloc(1, rowSize); + transBlockToResultRow(pBlock, rowId, ts, &tmpNextRow); + keepResultInDiscBuf(pOperator, groupId, &tmpNextRow, rowSize); + taosMemoryFreeClear(tmpNextRow.pRowVal); +} + +static void doFillResults(SOperatorInfo* pOperator, SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo, + SSDataBlock* pBlock, TSKEY* tsCol, int32_t rowId, SSDataBlock* pRes) { + uint64_t groupId = pBlock->info.id.groupId; + getWindowFromDiscBuf(pOperator, tsCol[rowId], groupId, pFillSup); + if (pFillSup->prev.key == pFillInfo->preRowKey) { + resetFillWindow(&pFillSup->prev); + } + setFillValueInfo(pBlock, tsCol[rowId], rowId, pFillSup, pFillInfo); + doStreamFillRange(pFillInfo, pFillSup, pRes); +} + +static void doStreamFillImpl(SOperatorInfo* pOperator) { + SStreamFillOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + SStreamFillSupporter* pFillSup = pInfo->pFillSup; + SStreamFillInfo* pFillInfo = pInfo->pFillInfo; + SSDataBlock* pBlock = pInfo->pSrcBlock; + uint64_t groupId = pBlock->info.id.groupId; + SSDataBlock* pRes = pInfo->pRes; + pRes->info.id.groupId = groupId; + if (hasRemainCalc(pFillInfo)) { + doStreamFillRange(pFillInfo, pFillSup, pRes); + } + + SColumnInfoData* pTsCol = taosArrayGet(pInfo->pSrcBlock->pDataBlock, pInfo->primaryTsCol); + TSKEY* tsCol = (TSKEY*)pTsCol->pData; + + if (pInfo->srcRowIndex == 0) { + keepBlockRowInDiscBuf(pOperator, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex, groupId, pFillSup->rowSize); + SSDataBlock* preBlock = pInfo->pPrevSrcBlock; + if (preBlock->info.rows > 0) { + int preRowId = preBlock->info.rows - 1; + SColumnInfoData* pPreTsCol = taosArrayGet(preBlock->pDataBlock, pInfo->primaryTsCol); + doFillResults(pOperator, pFillSup, pFillInfo, preBlock, (TSKEY*)pPreTsCol->pData, preRowId, pRes); + } + pInfo->srcRowIndex++; + } + + while (pInfo->srcRowIndex < pBlock->info.rows) { + TSKEY ts = tsCol[pInfo->srcRowIndex]; + keepBlockRowInDiscBuf(pOperator, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex, groupId, pFillSup->rowSize); + doFillResults(pOperator, pFillSup, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex - 1, pRes); + if (pInfo->pRes->info.rows == pInfo->pRes->info.capacity) { + blockDataUpdateTsWindow(pRes, pInfo->primaryTsCol); + return; + } + pInfo->srcRowIndex++; + } + blockDataUpdateTsWindow(pRes, pInfo->primaryTsCol); + blockDataCleanup(pInfo->pPrevSrcBlock); + copyDataBlock(pInfo->pPrevSrcBlock, pInfo->pSrcBlock); + blockDataCleanup(pInfo->pSrcBlock); +} + +static void buildDeleteRange(SOperatorInfo* pOp, TSKEY start, TSKEY end, uint64_t groupId, SSDataBlock* delRes) { + SStreamState* pState = pOp->pTaskInfo->streamInfo.pState; + + SSDataBlock* pBlock = delRes; + SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); + SColumnInfoData* pEndCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX); + SColumnInfoData* pUidCol = taosArrayGet(pBlock->pDataBlock, UID_COLUMN_INDEX); + SColumnInfoData* pGroupCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX); + SColumnInfoData* pCalStartCol = taosArrayGet(pBlock->pDataBlock, CALCULATE_START_TS_COLUMN_INDEX); + SColumnInfoData* pCalEndCol = taosArrayGet(pBlock->pDataBlock, CALCULATE_END_TS_COLUMN_INDEX); + SColumnInfoData* pTbNameCol = taosArrayGet(pBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX); + colDataAppend(pStartCol, pBlock->info.rows, (const char*)&start, false); + colDataAppend(pEndCol, pBlock->info.rows, (const char*)&end, false); + colDataAppendNULL(pUidCol, pBlock->info.rows); + colDataAppend(pGroupCol, pBlock->info.rows, (const char*)&groupId, false); + colDataAppendNULL(pCalStartCol, pBlock->info.rows); + colDataAppendNULL(pCalEndCol, pBlock->info.rows); + + SColumnInfoData* pTableCol = taosArrayGet(pBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX); + + void* tbname = NULL; + streamStateGetParName(pOp->pTaskInfo->streamInfo.pState, groupId, &tbname); + if (tbname == NULL) { + colDataAppendNULL(pTableCol, pBlock->info.rows); + } else { + char parTbName[VARSTR_HEADER_SIZE + TSDB_TABLE_NAME_LEN]; + STR_WITH_MAXSIZE_TO_VARSTR(parTbName, tbname, sizeof(parTbName)); + colDataAppend(pTableCol, pBlock->info.rows, (const char*)parTbName, false); + tdbFree(tbname); + } + + pBlock->info.rows++; +} + +static void buildDeleteResult(SOperatorInfo* pOperator, TSKEY startTs, TSKEY endTs, uint64_t groupId, + SSDataBlock* delRes) { + SStreamFillOperatorInfo* pInfo = pOperator->info; + SStreamFillSupporter* pFillSup = pInfo->pFillSup; + if (hasPrevWindow(pFillSup)) { + TSKEY start = getNextWindowTs(pFillSup->prev.key, &pFillSup->interval); + buildDeleteRange(pOperator, start, endTs, groupId, delRes); + } else if (hasNextWindow(pFillSup)) { + TSKEY end = getPrevWindowTs(pFillSup->next.key, &pFillSup->interval); + buildDeleteRange(pOperator, startTs, end, groupId, delRes); + } else { + buildDeleteRange(pOperator, startTs, endTs, groupId, delRes); + } +} + +static void doDeleteFillResultImpl(SOperatorInfo* pOperator, TSKEY startTs, TSKEY endTs, uint64_t groupId) { + SStreamFillOperatorInfo* pInfo = pOperator->info; + getWindowFromDiscBuf(pOperator, startTs, groupId, pInfo->pFillSup); + setDeleteFillValueInfo(startTs, endTs, pInfo->pFillSup, pInfo->pFillInfo); + SWinKey key = {.ts = startTs, .groupId = groupId}; + if (!pInfo->pFillInfo->needFill) { + streamStateFillDel(pOperator->pTaskInfo->streamInfo.pState, &key); + buildDeleteResult(pOperator, startTs, endTs, groupId, pInfo->pDelRes); + } else { + STimeRange tw = { + .skey = startTs, + .ekey = endTs, + .groupId = groupId, + }; + taosArrayPush(pInfo->pFillInfo->delRanges, &tw); + while (key.ts <= endTs) { + key.ts = taosTimeAdd(key.ts, pInfo->pFillSup->interval.sliding, pInfo->pFillSup->interval.slidingUnit, + pInfo->pFillSup->interval.precision); + tSimpleHashPut(pInfo->pFillSup->pResMap, &key, sizeof(SWinKey), NULL, 0); + } + } +} + +static void doDeleteFillFinalize(SOperatorInfo* pOperator) { + SStreamFillOperatorInfo* pInfo = pOperator->info; + SStreamFillInfo* pFillInfo = pInfo->pFillInfo; + int32_t size = taosArrayGetSize(pFillInfo->delRanges); + tSimpleHashClear(pInfo->pFillSup->pResMap); + for (; pFillInfo->delIndex < size; pFillInfo->delIndex++) { + STimeRange* range = taosArrayGet(pFillInfo->delRanges, pFillInfo->delIndex); + if (pInfo->pRes->info.id.groupId != 0 && pInfo->pRes->info.id.groupId != range->groupId) { + return; + } + getWindowFromDiscBuf(pOperator, range->skey, range->groupId, pInfo->pFillSup); + setDeleteFillValueInfo(range->skey, range->ekey, pInfo->pFillSup, pInfo->pFillInfo); + if (pInfo->pFillInfo->needFill) { + doStreamFillRange(pInfo->pFillInfo, pInfo->pFillSup, pInfo->pRes); + pInfo->pRes->info.id.groupId = range->groupId; + } + SWinKey key = {.ts = range->skey, .groupId = range->groupId}; + streamStateFillDel(pOperator->pTaskInfo->streamInfo.pState, &key); + } +} + +static void doDeleteFillResult(SOperatorInfo* pOperator) { + SStreamFillOperatorInfo* pInfo = pOperator->info; + SStreamFillSupporter* pFillSup = pInfo->pFillSup; + SStreamFillInfo* pFillInfo = pInfo->pFillInfo; + SSDataBlock* pBlock = pInfo->pSrcDelBlock; + SSDataBlock* pRes = pInfo->pRes; + SSDataBlock* pDelRes = pInfo->pDelRes; + + SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); + TSKEY* tsStarts = (TSKEY*)pStartCol->pData; + SColumnInfoData* pGroupCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX); + uint64_t* groupIds = (uint64_t*)pGroupCol->pData; + while (pInfo->srcDelRowIndex < pBlock->info.rows) { + TSKEY ts = tsStarts[pInfo->srcDelRowIndex]; + TSKEY endTs = ts; + uint64_t groupId = groupIds[pInfo->srcDelRowIndex]; + SWinKey key = {.ts = ts, .groupId = groupId}; + SStreamStateCur* pCur = streamStateGetAndCheckCur(pOperator->pTaskInfo->streamInfo.pState, &key); + if (!pCur) { + pInfo->srcDelRowIndex++; + continue; + } + + SWinKey nextKey = {.groupId = groupId, .ts = ts}; + while (pInfo->srcDelRowIndex < pBlock->info.rows) { + void* nextVal = NULL; + int32_t nextLen = 0; + TSKEY delTs = tsStarts[pInfo->srcDelRowIndex]; + uint64_t delGroupId = groupIds[pInfo->srcDelRowIndex]; + int32_t code = TSDB_CODE_SUCCESS; + if (groupId != delGroupId) { + break; + } + if (delTs > nextKey.ts) { + break; + } + endTs = delTs; + SWinKey delKey = {.groupId = delGroupId, .ts = delTs}; + if (delTs == nextKey.ts) { + code = streamStateCurNext(pOperator->pTaskInfo->streamInfo.pState, pCur); + if (code == TSDB_CODE_SUCCESS) { + code = streamStateGetGroupKVByCur(pCur, &nextKey, (const void**)&nextVal, &nextLen); + } + // ts will be deleted later + if (delTs != ts) { + streamStateFillDel(pOperator->pTaskInfo->streamInfo.pState, &delKey); + streamStateFreeCur(pCur); + pCur = streamStateGetAndCheckCur(pOperator->pTaskInfo->streamInfo.pState, &nextKey); + } + endTs = TMAX(ts, nextKey.ts - 1); + if (code != TSDB_CODE_SUCCESS) { + break; + } + } + pInfo->srcDelRowIndex++; + } + streamStateFreeCur(pCur); + doDeleteFillResultImpl(pOperator, ts, endTs, groupId); + } + pFillInfo->current = pFillInfo->end + 1; +} + +static void resetStreamFillInfo(SStreamFillOperatorInfo* pInfo) { + blockDataCleanup(pInfo->pPrevSrcBlock); + tSimpleHashClear(pInfo->pFillSup->pResMap); + pInfo->pFillSup->hasDelete = false; + taosArrayClear(pInfo->pFillInfo->delRanges); + pInfo->pFillInfo->delIndex = 0; +} + +static void doApplyStreamScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pSrcBlock, SSDataBlock* pDstBlock) { + SStreamFillOperatorInfo* pInfo = pOperator->info; + SExprSupp* pSup = &pOperator->exprSupp; + + blockDataCleanup(pDstBlock); + blockDataEnsureCapacity(pDstBlock, pSrcBlock->info.rows); + setInputDataBlock(pSup, pSrcBlock, TSDB_ORDER_ASC, MAIN_SCAN, false); + projectApplyFunctions(pSup->pExprInfo, pDstBlock, pSrcBlock, pSup->pCtx, pSup->numOfExprs, NULL); + + pDstBlock->info.rows = 0; + pSup = &pInfo->pFillSup->notFillExprSup; + setInputDataBlock(pSup, pSrcBlock, TSDB_ORDER_ASC, MAIN_SCAN, false); + projectApplyFunctions(pSup->pExprInfo, pDstBlock, pSrcBlock, pSup->pCtx, pSup->numOfExprs, NULL); + pDstBlock->info.id.groupId = pSrcBlock->info.id.groupId; + + blockDataUpdateTsWindow(pDstBlock, pInfo->primaryTsCol); +} + +static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) { + SStreamFillOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + + if (pOperator->status == OP_EXEC_DONE) { + return NULL; + } + blockDataCleanup(pInfo->pRes); + if (pOperator->status == OP_RES_TO_RETURN) { + if (hasRemainCalc(pInfo->pFillInfo)) { + doStreamFillRange(pInfo->pFillInfo, pInfo->pFillSup, pInfo->pRes); + if (pInfo->pRes->info.rows > 0) { + return pInfo->pRes; + } + } + doDeleteFillFinalize(pOperator); + if (pInfo->pRes->info.rows > 0) { + printDataBlock(pInfo->pRes, "stream fill"); + return pInfo->pRes; + } + setOperatorCompleted(pOperator); + resetStreamFillInfo(pInfo); + return NULL; + } + + SSDataBlock* fillResult = NULL; + SOperatorInfo* downstream = pOperator->pDownstream[0]; + while (1) { + if (pInfo->srcRowIndex >= pInfo->pSrcBlock->info.rows) { + // If there are delete datablocks, we receive them first. + SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); + if (pBlock == NULL) { + pOperator->status = OP_RES_TO_RETURN; + SSDataBlock* preBlock = pInfo->pPrevSrcBlock; + if (preBlock->info.rows > 0) { + int preRowId = preBlock->info.rows - 1; + SColumnInfoData* pPreTsCol = taosArrayGet(preBlock->pDataBlock, pInfo->primaryTsCol); + doFillResults(pOperator, pInfo->pFillSup, pInfo->pFillInfo, preBlock, (TSKEY*)pPreTsCol->pData, preRowId, + pInfo->pRes); + } + pInfo->pFillInfo->preRowKey = INT64_MIN; + if (pInfo->pRes->info.rows > 0) { + printDataBlock(pInfo->pRes, "stream fill"); + return pInfo->pRes; + } + break; + } + printDataBlock(pBlock, "stream fill recv"); + + switch (pBlock->info.type) { + case STREAM_RETRIEVE: + return pBlock; + case STREAM_DELETE_RESULT: { + pInfo->pSrcDelBlock = pBlock; + pInfo->srcDelRowIndex = 0; + blockDataCleanup(pInfo->pDelRes); + pInfo->pFillSup->hasDelete = true; + doDeleteFillResult(pOperator); + if (pInfo->pDelRes->info.rows > 0) { + printDataBlock(pInfo->pDelRes, "stream fill delete"); + return pInfo->pDelRes; + } + continue; + } break; + case STREAM_NORMAL: + case STREAM_INVALID: { + doApplyStreamScalarCalculation(pOperator, pBlock, pInfo->pSrcBlock); + memcpy(pInfo->pSrcBlock->info.parTbName, pBlock->info.parTbName, TSDB_TABLE_NAME_LEN); + pInfo->srcRowIndex = 0; + } break; + default: + ASSERT(0); + break; + } + } + + doStreamFillImpl(pOperator); + doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo); + memcpy(pInfo->pRes->info.parTbName, pInfo->pSrcBlock->info.parTbName, TSDB_TABLE_NAME_LEN); + pOperator->resultInfo.totalRows += pInfo->pRes->info.rows; + if (pInfo->pRes->info.rows > 0) { + break; + } + } + if (pOperator->status == OP_RES_TO_RETURN) { + doDeleteFillFinalize(pOperator); + } + + if (pInfo->pRes->info.rows == 0) { + setOperatorCompleted(pOperator); + resetStreamFillInfo(pInfo); + return NULL; + } + + pOperator->resultInfo.totalRows += pInfo->pRes->info.rows; + printDataBlock(pInfo->pRes, "stream fill"); + return pInfo->pRes; +} + +static int32_t initResultBuf(SStreamFillSupporter* pFillSup) { + pFillSup->rowSize = sizeof(SResultCellData) * pFillSup->numOfAllCols; + for (int i = 0; i < pFillSup->numOfAllCols; i++) { + SFillColInfo* pCol = &pFillSup->pAllColInfo[i]; + SResSchema* pSchema = &pCol->pExpr->base.resSchema; + pFillSup->rowSize += pSchema->bytes; + } + pFillSup->next.key = INT64_MIN; + pFillSup->nextNext.key = INT64_MIN; + pFillSup->prev.key = INT64_MIN; + pFillSup->cur.key = INT64_MIN; + pFillSup->next.pRowVal = NULL; + pFillSup->nextNext.pRowVal = NULL; + pFillSup->prev.pRowVal = NULL; + pFillSup->cur.pRowVal = NULL; + + return TSDB_CODE_SUCCESS; +} + +static SStreamFillSupporter* initStreamFillSup(SStreamFillPhysiNode* pPhyFillNode, SInterval* pInterval, + SExprInfo* pFillExprInfo, int32_t numOfFillCols) { + SStreamFillSupporter* pFillSup = taosMemoryCalloc(1, sizeof(SStreamFillSupporter)); + if (!pFillSup) { + return NULL; + } + pFillSup->numOfFillCols = numOfFillCols; + int32_t numOfNotFillCols = 0; + SExprInfo* noFillExprInfo = createExprInfo(pPhyFillNode->pNotFillExprs, NULL, &numOfNotFillCols); + pFillSup->pAllColInfo = createFillColInfo(pFillExprInfo, pFillSup->numOfFillCols, noFillExprInfo, numOfNotFillCols, + (const SNodeListNode*)(pPhyFillNode->pValues)); + pFillSup->type = convertFillType(pPhyFillNode->mode); + pFillSup->numOfAllCols = pFillSup->numOfFillCols + numOfNotFillCols; + pFillSup->interval = *pInterval; + + int32_t code = initResultBuf(pFillSup); + if (code != TSDB_CODE_SUCCESS) { + destroyStreamFillSupporter(pFillSup); + return NULL; + } + + SExprInfo* noFillExpr = createExprInfo(pPhyFillNode->pNotFillExprs, NULL, &numOfNotFillCols); + code = initExprSupp(&pFillSup->notFillExprSup, noFillExpr, numOfNotFillCols); + if (code != TSDB_CODE_SUCCESS) { + destroyStreamFillSupporter(pFillSup); + return NULL; + } + + _hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY); + pFillSup->pResMap = tSimpleHashInit(16, hashFn); + pFillSup->hasDelete = false; + return pFillSup; +} + +SStreamFillInfo* initStreamFillInfo(SStreamFillSupporter* pFillSup, SSDataBlock* pRes) { + SStreamFillInfo* pFillInfo = taosMemoryCalloc(1, sizeof(SStreamFillInfo)); + pFillInfo->start = INT64_MIN; + pFillInfo->current = INT64_MIN; + pFillInfo->end = INT64_MIN; + pFillInfo->preRowKey = INT64_MIN; + pFillInfo->needFill = false; + pFillInfo->pLinearInfo = taosMemoryCalloc(1, sizeof(SStreamFillLinearInfo)); + pFillInfo->pLinearInfo->hasNext = false; + pFillInfo->pLinearInfo->nextEnd = INT64_MIN; + pFillInfo->pLinearInfo->pDeltaVal = NULL; + pFillInfo->pLinearInfo->pNextDeltaVal = NULL; + if (pFillSup->type == TSDB_FILL_LINEAR) { + pFillInfo->pLinearInfo->pDeltaVal = taosArrayInit(pFillSup->numOfAllCols, sizeof(double)); + pFillInfo->pLinearInfo->pNextDeltaVal = taosArrayInit(pFillSup->numOfAllCols, sizeof(double)); + for (int32_t i = 0; i < pFillSup->numOfAllCols; i++) { + double value = 0.0; + taosArrayPush(pFillInfo->pLinearInfo->pDeltaVal, &value); + taosArrayPush(pFillInfo->pLinearInfo->pNextDeltaVal, &value); + } + } + pFillInfo->pLinearInfo->winIndex = 0; + + pFillInfo->pResRow = NULL; + if (pFillSup->type == TSDB_FILL_SET_VALUE || pFillSup->type == TSDB_FILL_NULL) { + pFillInfo->pResRow = taosMemoryCalloc(1, sizeof(SResultRowData)); + pFillInfo->pResRow->key = INT64_MIN; + pFillInfo->pResRow->pRowVal = taosMemoryCalloc(1, pFillSup->rowSize); + for (int32_t i = 0; i < pFillSup->numOfAllCols; ++i) { + SColumnInfoData* pColData = taosArrayGet(pRes->pDataBlock, i); + SResultCellData* pCell = getResultCell(pFillInfo->pResRow, i); + pCell->bytes = pColData->info.bytes; + pCell->type = pColData->info.type; + } + } + + pFillInfo->type = pFillSup->type; + pFillInfo->delRanges = taosArrayInit(16, sizeof(STimeRange)); + pFillInfo->delIndex = 0; + return pFillInfo; +} + +SOperatorInfo* createStreamFillOperatorInfo(SOperatorInfo* downstream, SStreamFillPhysiNode* pPhyFillNode, + SExecTaskInfo* pTaskInfo) { + SStreamFillOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamFillOperatorInfo)); + SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); + if (pInfo == NULL || pOperator == NULL) { + goto _error; + } + + SInterval* pInterval = &((SStreamIntervalOperatorInfo*)downstream->info)->interval; + int32_t numOfFillCols = 0; + SExprInfo* pFillExprInfo = createExprInfo(pPhyFillNode->pFillExprs, NULL, &numOfFillCols); + pInfo->pFillSup = initStreamFillSup(pPhyFillNode, pInterval, pFillExprInfo, numOfFillCols); + if (!pInfo->pFillSup) { + goto _error; + } + + initResultSizeInfo(&pOperator->resultInfo, 4096); + pInfo->pRes = createDataBlockFromDescNode(pPhyFillNode->node.pOutputDataBlockDesc); + pInfo->pSrcBlock = createDataBlockFromDescNode(pPhyFillNode->node.pOutputDataBlockDesc); + pInfo->pPrevSrcBlock = createDataBlockFromDescNode(pPhyFillNode->node.pOutputDataBlockDesc); + blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity); + blockDataEnsureCapacity(pInfo->pSrcBlock, pOperator->resultInfo.capacity); + blockDataEnsureCapacity(pInfo->pPrevSrcBlock, pOperator->resultInfo.capacity); + + pInfo->pFillInfo = initStreamFillInfo(pInfo->pFillSup, pInfo->pRes); + if (!pInfo->pFillInfo) { + goto _error; + } + + if (pInfo->pFillInfo->type == TSDB_FILL_SET_VALUE) { + for (int32_t i = 0; i < pInfo->pFillSup->numOfAllCols; ++i) { + SFillColInfo* pFillCol = pInfo->pFillSup->pAllColInfo + i; + int32_t slotId = GET_DEST_SLOT_ID(pFillCol); + SResultCellData* pCell = getResultCell(pInfo->pFillInfo->pResRow, slotId); + SVariant* pVar = &(pFillCol->fillVal); + if (pCell->type == TSDB_DATA_TYPE_FLOAT) { + float v = 0; + GET_TYPED_DATA(v, float, pVar->nType, &pVar->i); + SET_TYPED_DATA(pCell->pData, pCell->type, v); + } else if (pCell->type == TSDB_DATA_TYPE_DOUBLE) { + double v = 0; + GET_TYPED_DATA(v, double, pVar->nType, &pVar->i); + SET_TYPED_DATA(pCell->pData, pCell->type, v); + } else if (IS_SIGNED_NUMERIC_TYPE(pCell->type)) { + int64_t v = 0; + GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i); + SET_TYPED_DATA(pCell->pData, pCell->type, v); + } else { + pCell->isNull = true; + } + } + } else if (pInfo->pFillInfo->type == TSDB_FILL_NULL) { + for (int32_t i = 0; i < pInfo->pFillSup->numOfAllCols; ++i) { + SFillColInfo* pFillCol = pInfo->pFillSup->pAllColInfo + i; + int32_t slotId = GET_DEST_SLOT_ID(pFillCol); + SResultCellData* pCell = getResultCell(pInfo->pFillInfo->pResRow, slotId); + pCell->isNull = true; + } + } + + pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT); + blockDataEnsureCapacity(pInfo->pDelRes, pOperator->resultInfo.capacity); + + pInfo->primaryTsCol = ((STargetNode*)pPhyFillNode->pWStartTs)->slotId; + pInfo->primarySrcSlotId = ((SColumnNode*)((STargetNode*)pPhyFillNode->pWStartTs)->pExpr)->slotId; + + int32_t numOfOutputCols = 0; + int32_t code = extractColMatchInfo(pPhyFillNode->pFillExprs, pPhyFillNode->node.pOutputDataBlockDesc, + &numOfOutputCols, COL_MATCH_FROM_SLOT_ID, &pInfo->matchInfo); + if (code != TSDB_CODE_SUCCESS) { + goto _error; + } + + code = filterInitFromNode((SNode*)pPhyFillNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0); + if (code != TSDB_CODE_SUCCESS) { + goto _error; + } + + code = initExprSupp(&pOperator->exprSupp, pFillExprInfo, numOfFillCols); + if (code != TSDB_CODE_SUCCESS) { + goto _error; + } + + pInfo->srcRowIndex = 0; + setOperatorInfo(pOperator, "StreamFillOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL, false, OP_NOT_OPENED, pInfo, + pTaskInfo); + pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamFill, NULL, destroyStreamFillOperatorInfo, NULL); + + code = appendDownstream(pOperator, &downstream, 1); + if (code != TSDB_CODE_SUCCESS) { + goto _error; + } + return pOperator; + + _error: + destroyStreamFillOperatorInfo(pInfo); + taosMemoryFreeClear(pOperator); + pTaskInfo->code = code; + return NULL; +} diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 84b7678b9f..c5d86ed653 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -1335,30 +1335,6 @@ static int32_t generateScanRange(SStreamScanInfo* pInfo, SSDataBlock* pSrcBlock, return code; } -static void calBlockTag(SExprSupp* pTagCalSup, SSDataBlock* pBlock, SSDataBlock* pResBlock) { - if (pTagCalSup == NULL || pTagCalSup->numOfExprs == 0) return; - if (pBlock == NULL || pBlock->info.rows == 0) return; - - SSDataBlock* pSrcBlock = blockCopyOneRow(pBlock, 0); - ASSERT(pSrcBlock->info.rows == 1); - - blockDataEnsureCapacity(pResBlock, 1); - - projectApplyFunctions(pTagCalSup->pExprInfo, pResBlock, pSrcBlock, pTagCalSup->pCtx, 1, NULL); - ASSERT(pResBlock->info.rows == 1); - - // build tagArray - /*SArray* tagArray = taosArrayInit(0, sizeof(void*));*/ - /*STagVal tagVal = {*/ - /*.cid = 0,*/ - /*.type = 0,*/ - /*};*/ - // build STag - // set STag - - blockDataDestroy(pSrcBlock); -} - void calBlockTbName(SStreamScanInfo* pInfo, SSDataBlock* pBlock) { SExprSupp* pTbNameCalSup = &pInfo->tbnameCalSup; SStreamState* pState = pInfo->pStreamScanOp->pTaskInfo->streamInfo.pState; diff --git a/source/libs/executor/src/tfill.c b/source/libs/executor/src/tfill.c index 2300fc3359..a66a5e7089 100644 --- a/source/libs/executor/src/tfill.c +++ b/source/libs/executor/src/tfill.c @@ -35,22 +35,7 @@ #define DO_INTERPOLATION(_v1, _v2, _k1, _k2, _k) \ ((_v1) + ((_v2) - (_v1)) * (((double)(_k)) - ((double)(_k1))) / (((double)(_k2)) - ((double)(_k1)))) -#define GET_DEST_SLOT_ID(_p) ((_p)->pExpr->base.resSchema.slotId) - -#define FILL_POS_INVALID 0 -#define FILL_POS_START 1 -#define FILL_POS_MID 2 -#define FILL_POS_END 3 - -typedef struct STimeRange { - TSKEY skey; - TSKEY ekey; - uint64_t groupId; -} STimeRange; - static void doSetVal(SColumnInfoData* pDstColInfoData, int32_t rowIndex, const SGroupKeys* pKey); -static bool fillIfWindowPseudoColumn(SFillInfo* pFillInfo, SFillColInfo* pCol, SColumnInfoData* pDstColInfoData, - int32_t rowIndex); static void setNullRow(SSDataBlock* pBlock, SFillInfo* pFillInfo, int32_t rowIndex) { for (int32_t i = 0; i < pFillInfo->numOfCols; ++i) { @@ -91,8 +76,8 @@ static void doSetUserSpecifiedValue(SColumnInfoData* pDst, SVariant* pVar, int32 } // fill windows pseudo column, _wstart, _wend, _wduration and return true, otherwise return false -static bool fillIfWindowPseudoColumn(SFillInfo* pFillInfo, SFillColInfo* pCol, SColumnInfoData* pDstColInfoData, - int32_t rowIndex) { +bool fillIfWindowPseudoColumn(SFillInfo* pFillInfo, SFillColInfo* pCol, SColumnInfoData* pDstColInfoData, + int32_t rowIndex) { if (!pCol->notFillCol) { return false; } @@ -663,1097 +648,3 @@ SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfFillExpr, SExprIn return pFillCol; } - -TSKEY getNextWindowTs(TSKEY ts, SInterval* pInterval) { - STimeWindow win = {.skey = ts, .ekey = ts}; - getNextIntervalWindow(pInterval, &win, TSDB_ORDER_ASC); - return win.skey; -} - -TSKEY getPrevWindowTs(TSKEY ts, SInterval* pInterval) { - STimeWindow win = {.skey = ts, .ekey = ts}; - getNextIntervalWindow(pInterval, &win, TSDB_ORDER_DESC); - return win.skey; -} - -void setRowCell(SColumnInfoData* pCol, int32_t rowId, const SResultCellData* pCell) { - colDataAppend(pCol, rowId, pCell->pData, pCell->isNull); -} - -SResultCellData* getResultCell(SResultRowData* pRaw, int32_t index) { - if (!pRaw || !pRaw->pRowVal) { - return NULL; - } - char* pData = (char*)pRaw->pRowVal; - SResultCellData* pCell = pRaw->pRowVal; - for (int32_t i = 0; i < index; i++) { - pData += (pCell->bytes + sizeof(SResultCellData)); - pCell = (SResultCellData*)pData; - } - return pCell; -} - -void* destroyFillColumnInfo(SFillColInfo* pFillCol, int32_t start, int32_t end) { - for (int32_t i = start; i < end; i++) { - destroyExprInfo(pFillCol[i].pExpr, 1); - taosVariantDestroy(&pFillCol[i].fillVal); - } - taosMemoryFreeClear(pFillCol[start].pExpr); - taosMemoryFree(pFillCol); - return NULL; -} - -void* destroyStreamFillSupporter(SStreamFillSupporter* pFillSup) { - pFillSup->pAllColInfo = destroyFillColumnInfo(pFillSup->pAllColInfo, pFillSup->numOfFillCols, pFillSup->numOfAllCols); - tSimpleHashCleanup(pFillSup->pResMap); - pFillSup->pResMap = NULL; - releaseOutputBuf(NULL, NULL, (SResultRow*)pFillSup->cur.pRowVal); - pFillSup->cur.pRowVal = NULL; - cleanupExprSupp(&pFillSup->notFillExprSup); - - taosMemoryFree(pFillSup); - return NULL; -} - -void* destroyStreamFillLinearInfo(SStreamFillLinearInfo* pFillLinear) { - taosArrayDestroy(pFillLinear->pDeltaVal); - taosArrayDestroy(pFillLinear->pNextDeltaVal); - taosMemoryFree(pFillLinear); - return NULL; -} -void* destroyStreamFillInfo(SStreamFillInfo* pFillInfo) { - if (pFillInfo->type == TSDB_FILL_SET_VALUE || pFillInfo->type == TSDB_FILL_NULL) { - taosMemoryFreeClear(pFillInfo->pResRow->pRowVal); - taosMemoryFreeClear(pFillInfo->pResRow); - } - pFillInfo->pLinearInfo = destroyStreamFillLinearInfo(pFillInfo->pLinearInfo); - taosArrayDestroy(pFillInfo->delRanges); - taosMemoryFree(pFillInfo); - return NULL; -} - -void destroyStreamFillOperatorInfo(void* param) { - SStreamFillOperatorInfo* pInfo = (SStreamFillOperatorInfo*)param; - pInfo->pFillInfo = destroyStreamFillInfo(pInfo->pFillInfo); - pInfo->pFillSup = destroyStreamFillSupporter(pInfo->pFillSup); - pInfo->pRes = blockDataDestroy(pInfo->pRes); - pInfo->pSrcBlock = blockDataDestroy(pInfo->pSrcBlock); - pInfo->pPrevSrcBlock = blockDataDestroy(pInfo->pPrevSrcBlock); - pInfo->pDelRes = blockDataDestroy(pInfo->pDelRes); - pInfo->matchInfo.pList = taosArrayDestroy(pInfo->matchInfo.pList); - taosMemoryFree(pInfo); -} - -static void resetFillWindow(SResultRowData* pRowData) { - pRowData->key = INT64_MIN; - pRowData->pRowVal = NULL; -} - -void resetPrevAndNextWindow(SStreamFillSupporter* pFillSup, SStreamState* pState) { - resetFillWindow(&pFillSup->prev); - releaseOutputBuf(NULL, NULL, (SResultRow*)pFillSup->cur.pRowVal); - resetFillWindow(&pFillSup->cur); - resetFillWindow(&pFillSup->next); - resetFillWindow(&pFillSup->nextNext); -} - -void getCurWindowFromDiscBuf(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, SStreamFillSupporter* pFillSup) { - SStreamState* pState = pOperator->pTaskInfo->streamInfo.pState; - resetPrevAndNextWindow(pFillSup, pState); - - SWinKey key = {.ts = ts, .groupId = groupId}; - int32_t curVLen = 0; - int32_t code = streamStateFillGet(pState, &key, (void**)&pFillSup->cur.pRowVal, &curVLen); - ASSERT(code == TSDB_CODE_SUCCESS); - pFillSup->cur.key = key.ts; -} - -void getWindowFromDiscBuf(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, SStreamFillSupporter* pFillSup) { - SStreamState* pState = pOperator->pTaskInfo->streamInfo.pState; - resetPrevAndNextWindow(pFillSup, pState); - - SWinKey key = {.ts = ts, .groupId = groupId}; - void* curVal = NULL; - int32_t curVLen = 0; - int32_t code = streamStateFillGet(pState, &key, (void**)&curVal, &curVLen); - ASSERT(code == TSDB_CODE_SUCCESS); - pFillSup->cur.key = key.ts; - pFillSup->cur.pRowVal = curVal; - - SStreamStateCur* pCur = streamStateFillSeekKeyPrev(pState, &key); - SWinKey preKey = {.groupId = groupId}; - void* preVal = NULL; - int32_t preVLen = 0; - code = streamStateGetGroupKVByCur(pCur, &preKey, (const void**)&preVal, &preVLen); - - if (code == TSDB_CODE_SUCCESS) { - pFillSup->prev.key = preKey.ts; - pFillSup->prev.pRowVal = preVal; - - code = streamStateCurNext(pState, pCur); - ASSERT(code == TSDB_CODE_SUCCESS); - - code = streamStateCurNext(pState, pCur); - if (code != TSDB_CODE_SUCCESS) { - streamStateFreeCur(pCur); - pCur = NULL; - } - } else { - streamStateFreeCur(pCur); - pCur = streamStateFillSeekKeyNext(pState, &key); - } - - SWinKey nextKey = {.groupId = groupId}; - void* nextVal = NULL; - int32_t nextVLen = 0; - code = streamStateGetGroupKVByCur(pCur, &nextKey, (const void**)&nextVal, &nextVLen); - if (code == TSDB_CODE_SUCCESS) { - pFillSup->next.key = nextKey.ts; - pFillSup->next.pRowVal = nextVal; - if (pFillSup->type == TSDB_FILL_PREV || pFillSup->type == TSDB_FILL_NEXT) { - code = streamStateCurNext(pState, pCur); - if (code == TSDB_CODE_SUCCESS) { - SWinKey nextNextKey = {.groupId = groupId}; - void* nextNextVal = NULL; - int32_t nextNextVLen = 0; - code = streamStateGetGroupKVByCur(pCur, &nextNextKey, (const void**)&nextNextVal, &nextNextVLen); - if (code == TSDB_CODE_SUCCESS) { - pFillSup->nextNext.key = nextNextKey.ts; - pFillSup->nextNext.pRowVal = nextNextVal; - } - } - } - } - streamStateFreeCur(pCur); -} - -static bool hasPrevWindow(SStreamFillSupporter* pFillSup) { return pFillSup->prev.key != INT64_MIN; } -static bool hasNextWindow(SStreamFillSupporter* pFillSup) { return pFillSup->next.key != INT64_MIN; } -static bool hasNextNextWindow(SStreamFillSupporter* pFillSup) { - return pFillSup->nextNext.key != INT64_MIN; - return false; -} - -static void transBlockToResultRow(const SSDataBlock* pBlock, int32_t rowId, TSKEY ts, SResultRowData* pRowVal) { - int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock); - for (int32_t i = 0; i < numOfCols; ++i) { - SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, i); - SResultCellData* pCell = getResultCell(pRowVal, i); - if (!colDataIsNull_s(pColData, rowId)) { - pCell->isNull = false; - pCell->type = pColData->info.type; - pCell->bytes = pColData->info.bytes; - char* val = colDataGetData(pColData, rowId); - if (IS_VAR_DATA_TYPE(pCell->type)) { - memcpy(pCell->pData, val, varDataTLen(val)); - } else { - memcpy(pCell->pData, val, pCell->bytes); - } - } else { - pCell->isNull = true; - } - } - pRowVal->key = ts; -} - -static void calcDeltaData(SSDataBlock* pBlock, int32_t rowId, SResultRowData* pRowVal, SArray* pDelta, - SFillColInfo* pFillCol, int32_t numOfCol, int32_t winCount, int32_t order) { - for (int32_t i = 0; i < numOfCol; i++) { - if (!pFillCol[i].notFillCol) { - int32_t slotId = GET_DEST_SLOT_ID(pFillCol + i); - SColumnInfoData* pCol = taosArrayGet(pBlock->pDataBlock, slotId); - char* var = colDataGetData(pCol, rowId); - double start = 0; - GET_TYPED_DATA(start, double, pCol->info.type, var); - SResultCellData* pCell = getResultCell(pRowVal, slotId); - double end = 0; - GET_TYPED_DATA(end, double, pCell->type, pCell->pData); - double delta = 0; - if (order == TSDB_ORDER_ASC) { - delta = (end - start) / winCount; - } else { - delta = (start - end) / winCount; - } - taosArraySet(pDelta, slotId, &delta); - } - } -} - -static void calcRowDeltaData(SResultRowData* pStartRow, SResultRowData* pEndRow, SArray* pDelta, SFillColInfo* pFillCol, - int32_t numOfCol, int32_t winCount) { - for (int32_t i = 0; i < numOfCol; i++) { - if (!pFillCol[i].notFillCol) { - int32_t slotId = GET_DEST_SLOT_ID(pFillCol + i); - SResultCellData* pSCell = getResultCell(pStartRow, slotId); - double start = 0.0; - GET_TYPED_DATA(start, double, pSCell->type, pSCell->pData); - SResultCellData* pECell = getResultCell(pEndRow, slotId); - double end = 0.0; - GET_TYPED_DATA(end, double, pECell->type, pECell->pData); - double delta = (end - start) / winCount; - taosArraySet(pDelta, slotId, &delta); - } - } -} - -static void setFillInfoStart(TSKEY ts, SInterval* pInterval, SStreamFillInfo* pFillInfo) { - ts = taosTimeAdd(ts, pInterval->sliding, pInterval->slidingUnit, pInterval->precision); - pFillInfo->start = ts; -} - -static void setFillInfoEnd(TSKEY ts, SInterval* pInterval, SStreamFillInfo* pFillInfo) { - ts = taosTimeAdd(ts, pInterval->sliding * -1, pInterval->slidingUnit, pInterval->precision); - pFillInfo->end = ts; -} - -static void setFillKeyInfo(TSKEY start, TSKEY end, SInterval* pInterval, SStreamFillInfo* pFillInfo) { - setFillInfoStart(start, pInterval, pFillInfo); - pFillInfo->current = pFillInfo->start; - setFillInfoEnd(end, pInterval, pFillInfo); -} - -void setDeleteFillValueInfo(TSKEY start, TSKEY end, SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo) { - if (!hasPrevWindow(pFillSup) || !hasNextWindow(pFillSup)) { - pFillInfo->needFill = false; - return; - } - - TSKEY realStart = taosTimeAdd(pFillSup->prev.key, pFillSup->interval.sliding, pFillSup->interval.slidingUnit, - pFillSup->interval.precision); - - pFillInfo->needFill = true; - pFillInfo->start = realStart; - pFillInfo->current = pFillInfo->start; - pFillInfo->end = end; - pFillInfo->pos = FILL_POS_INVALID; - switch (pFillInfo->type) { - case TSDB_FILL_NULL: - case TSDB_FILL_SET_VALUE: - break; - case TSDB_FILL_PREV: - pFillInfo->pResRow = &pFillSup->prev; - break; - case TSDB_FILL_NEXT: - pFillInfo->pResRow = &pFillSup->next; - break; - case TSDB_FILL_LINEAR: { - setFillKeyInfo(pFillSup->prev.key, pFillSup->next.key, &pFillSup->interval, pFillInfo); - pFillInfo->pLinearInfo->hasNext = false; - pFillInfo->pLinearInfo->nextEnd = INT64_MIN; - int32_t numOfWins = taosTimeCountInterval(pFillSup->prev.key, pFillSup->next.key, pFillSup->interval.sliding, - pFillSup->interval.slidingUnit, pFillSup->interval.precision); - calcRowDeltaData(&pFillSup->prev, &pFillSup->next, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo, - pFillSup->numOfAllCols, numOfWins); - pFillInfo->pResRow = &pFillSup->prev; - pFillInfo->pLinearInfo->winIndex = 0; - } break; - default: - ASSERT(0); - break; - } -} - -void copyNotFillExpData(SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo) { - for (int32_t i = pFillSup->numOfFillCols; i < pFillSup->numOfAllCols; ++i) { - SFillColInfo* pFillCol = pFillSup->pAllColInfo + i; - int32_t slotId = GET_DEST_SLOT_ID(pFillCol); - SResultCellData* pCell = getResultCell(pFillInfo->pResRow, slotId); - SResultCellData* pCurCell = getResultCell(&pFillSup->cur, slotId); - pCell->isNull = pCurCell->isNull; - if (!pCurCell->isNull) { - memcpy(pCell->pData, pCurCell->pData, pCell->bytes); - } - } -} - -void setFillValueInfo(SSDataBlock* pBlock, TSKEY ts, int32_t rowId, SStreamFillSupporter* pFillSup, - SStreamFillInfo* pFillInfo) { - pFillInfo->preRowKey = pFillSup->cur.key; - if (!hasPrevWindow(pFillSup) && !hasNextWindow(pFillSup)) { - pFillInfo->needFill = false; - pFillInfo->pos = FILL_POS_START; - return; - } - TSKEY prevWKey = INT64_MIN; - TSKEY nextWKey = INT64_MIN; - if (hasPrevWindow(pFillSup)) { - prevWKey = pFillSup->prev.key; - } - if (hasNextWindow(pFillSup)) { - nextWKey = pFillSup->next.key; - } - - pFillInfo->needFill = true; - pFillInfo->pos = FILL_POS_INVALID; - switch (pFillInfo->type) { - case TSDB_FILL_NULL: - case TSDB_FILL_SET_VALUE: { - if (pFillSup->prev.key == pFillInfo->preRowKey) { - resetFillWindow(&pFillSup->prev); - } - if (hasPrevWindow(pFillSup) && hasNextWindow(pFillSup)) { - if (pFillSup->next.key == pFillInfo->nextRowKey) { - pFillInfo->preRowKey = INT64_MIN; - setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo); - pFillInfo->pos = FILL_POS_END; - } else { - pFillInfo->needFill = false; - pFillInfo->pos = FILL_POS_START; - } - } else if (hasPrevWindow(pFillSup)) { - setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo); - pFillInfo->pos = FILL_POS_END; - } else { - setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo); - pFillInfo->pos = FILL_POS_START; - } - copyNotFillExpData(pFillSup, pFillInfo); - } break; - case TSDB_FILL_PREV: { - if (hasNextWindow(pFillSup) && ((pFillSup->next.key != pFillInfo->nextRowKey) || - (pFillSup->next.key == pFillInfo->nextRowKey && hasNextNextWindow(pFillSup)) || - (pFillSup->next.key == pFillInfo->nextRowKey && !hasPrevWindow(pFillSup)))) { - setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo); - pFillInfo->pos = FILL_POS_START; - pFillSup->prev.key = pFillSup->cur.key; - pFillSup->prev.pRowVal = pFillSup->cur.pRowVal; - } else if (hasPrevWindow(pFillSup)) { - setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo); - pFillInfo->pos = FILL_POS_END; - pFillInfo->preRowKey = INT64_MIN; - } - pFillInfo->pResRow = &pFillSup->prev; - } break; - case TSDB_FILL_NEXT: { - if (hasPrevWindow(pFillSup)) { - setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo); - pFillInfo->pos = FILL_POS_END; - pFillSup->next.key = pFillSup->cur.key; - pFillSup->next.pRowVal = pFillSup->cur.pRowVal; - pFillInfo->preRowKey = INT64_MIN; - } else { - ASSERT(hasNextWindow(pFillSup)); - setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo); - pFillInfo->pos = FILL_POS_START; - } - pFillInfo->pResRow = &pFillSup->next; - } break; - case TSDB_FILL_LINEAR: { - pFillInfo->pLinearInfo->winIndex = 0; - if (hasPrevWindow(pFillSup) && hasNextWindow(pFillSup)) { - setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo); - pFillInfo->pos = FILL_POS_MID; - pFillInfo->pLinearInfo->nextEnd = nextWKey; - int32_t numOfWins = taosTimeCountInterval(prevWKey, ts, pFillSup->interval.sliding, - pFillSup->interval.slidingUnit, pFillSup->interval.precision); - calcRowDeltaData(&pFillSup->prev, &pFillSup->cur, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo, - pFillSup->numOfAllCols, numOfWins); - pFillInfo->pResRow = &pFillSup->prev; - - numOfWins = taosTimeCountInterval(ts, nextWKey, pFillSup->interval.sliding, pFillSup->interval.slidingUnit, - pFillSup->interval.precision); - calcRowDeltaData(&pFillSup->cur, &pFillSup->next, pFillInfo->pLinearInfo->pNextDeltaVal, pFillSup->pAllColInfo, - pFillSup->numOfAllCols, numOfWins); - pFillInfo->pLinearInfo->hasNext = true; - } else if (hasPrevWindow(pFillSup)) { - setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo); - pFillInfo->pos = FILL_POS_END; - pFillInfo->pLinearInfo->nextEnd = INT64_MIN; - int32_t numOfWins = taosTimeCountInterval(prevWKey, ts, pFillSup->interval.sliding, - pFillSup->interval.slidingUnit, pFillSup->interval.precision); - calcRowDeltaData(&pFillSup->prev, &pFillSup->cur, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo, - pFillSup->numOfAllCols, numOfWins); - pFillInfo->pResRow = &pFillSup->prev; - pFillInfo->pLinearInfo->hasNext = false; - } else { - ASSERT(hasNextWindow(pFillSup)); - setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo); - pFillInfo->pos = FILL_POS_START; - pFillInfo->pLinearInfo->nextEnd = INT64_MIN; - int32_t numOfWins = taosTimeCountInterval(ts, nextWKey, pFillSup->interval.sliding, - pFillSup->interval.slidingUnit, pFillSup->interval.precision); - calcRowDeltaData(&pFillSup->cur, &pFillSup->next, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo, - pFillSup->numOfAllCols, numOfWins); - pFillInfo->pResRow = &pFillSup->cur; - pFillInfo->pLinearInfo->hasNext = false; - } - } break; - default: - ASSERT(0); - break; - } - ASSERT(pFillInfo->pos != FILL_POS_INVALID); -} - -static bool checkResult(SStreamFillSupporter* pFillSup, TSKEY ts, uint64_t groupId) { - SWinKey key = {.groupId = groupId, .ts = ts}; - if (tSimpleHashGet(pFillSup->pResMap, &key, sizeof(SWinKey)) != NULL) { - return false; - } - tSimpleHashPut(pFillSup->pResMap, &key, sizeof(SWinKey), NULL, 0); - return true; -} - -static void buildFillResult(SResultRowData* pResRow, SStreamFillSupporter* pFillSup, TSKEY ts, SSDataBlock* pBlock) { - uint64_t groupId = pBlock->info.id.groupId; - if (pFillSup->hasDelete && !checkResult(pFillSup, ts, groupId)) { - return; - } - for (int32_t i = 0; i < pFillSup->numOfAllCols; ++i) { - SFillColInfo* pFillCol = pFillSup->pAllColInfo + i; - int32_t slotId = GET_DEST_SLOT_ID(pFillCol); - SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, slotId); - SFillInfo tmpInfo = { - .currentKey = ts, - .order = TSDB_ORDER_ASC, - .interval = pFillSup->interval, - }; - bool filled = fillIfWindowPseudoColumn(&tmpInfo, pFillCol, pColData, pBlock->info.rows); - if (!filled) { - SResultCellData* pCell = getResultCell(pResRow, slotId); - setRowCell(pColData, pBlock->info.rows, pCell); - } - } - pBlock->info.rows++; -} - -static bool hasRemainCalc(SStreamFillInfo* pFillInfo) { - if (pFillInfo->current != INT64_MIN && pFillInfo->current <= pFillInfo->end) { - return true; - } - return false; -} - -static void doStreamFillNormal(SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo, SSDataBlock* pBlock) { - while (hasRemainCalc(pFillInfo) && pBlock->info.rows < pBlock->info.capacity) { - buildFillResult(pFillInfo->pResRow, pFillSup, pFillInfo->current, pBlock); - pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit, - pFillSup->interval.precision); - } -} - -static void doStreamFillLinear(SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo, SSDataBlock* pBlock) { - while (hasRemainCalc(pFillInfo) && pBlock->info.rows < pBlock->info.capacity) { - uint64_t groupId = pBlock->info.id.groupId; - SWinKey key = {.groupId = groupId, .ts = pFillInfo->current}; - if (pFillSup->hasDelete && !checkResult(pFillSup, pFillInfo->current, groupId)) { - pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit, - pFillSup->interval.precision); - pFillInfo->pLinearInfo->winIndex++; - continue; - } - pFillInfo->pLinearInfo->winIndex++; - for (int32_t i = 0; i < pFillSup->numOfAllCols; ++i) { - SFillColInfo* pFillCol = pFillSup->pAllColInfo + i; - SFillInfo tmp = { - .currentKey = pFillInfo->current, - .order = TSDB_ORDER_ASC, - .interval = pFillSup->interval, - }; - - int32_t slotId = GET_DEST_SLOT_ID(pFillCol); - SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, slotId); - int16_t type = pColData->info.type; - SResultCellData* pCell = getResultCell(pFillInfo->pResRow, slotId); - int32_t index = pBlock->info.rows; - if (pFillCol->notFillCol) { - bool filled = fillIfWindowPseudoColumn(&tmp, pFillCol, pColData, index); - if (!filled) { - setRowCell(pColData, index, pCell); - } - } else { - if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_BOOL || pCell->isNull) { - colDataAppendNULL(pColData, index); - continue; - } - double* pDelta = taosArrayGet(pFillInfo->pLinearInfo->pDeltaVal, slotId); - double vCell = 0; - GET_TYPED_DATA(vCell, double, pCell->type, pCell->pData); - vCell += (*pDelta) * pFillInfo->pLinearInfo->winIndex; - int64_t result = 0; - SET_TYPED_DATA(&result, pCell->type, vCell); - colDataAppend(pColData, index, (const char*)&result, false); - } - } - pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit, - pFillSup->interval.precision); - pBlock->info.rows++; - } -} - -static void keepResultInDiscBuf(SOperatorInfo* pOperator, uint64_t groupId, SResultRowData* pRow, int32_t len) { - SWinKey key = {.groupId = groupId, .ts = pRow->key}; - int32_t code = streamStateFillPut(pOperator->pTaskInfo->streamInfo.pState, &key, pRow->pRowVal, len); - ASSERT(code == TSDB_CODE_SUCCESS); -} - -static void doStreamFillRange(SStreamFillInfo* pFillInfo, SStreamFillSupporter* pFillSup, SSDataBlock* pRes) { - if (pFillInfo->needFill == false) { - buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes); - return; - } - - if (pFillInfo->pos == FILL_POS_START) { - buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes); - } - if (pFillInfo->type != TSDB_FILL_LINEAR) { - doStreamFillNormal(pFillSup, pFillInfo, pRes); - } else { - doStreamFillLinear(pFillSup, pFillInfo, pRes); - - if (pFillInfo->pos == FILL_POS_MID) { - buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes); - } - - if (pFillInfo->current > pFillInfo->end && pFillInfo->pLinearInfo->hasNext) { - pFillInfo->pLinearInfo->hasNext = false; - pFillInfo->pLinearInfo->winIndex = 0; - taosArrayClear(pFillInfo->pLinearInfo->pDeltaVal); - taosArrayAddAll(pFillInfo->pLinearInfo->pDeltaVal, pFillInfo->pLinearInfo->pNextDeltaVal); - pFillInfo->pResRow = &pFillSup->cur; - setFillKeyInfo(pFillSup->cur.key, pFillInfo->pLinearInfo->nextEnd, &pFillSup->interval, pFillInfo); - doStreamFillLinear(pFillSup, pFillInfo, pRes); - } - } - if (pFillInfo->pos == FILL_POS_END) { - buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes); - } -} - -void keepBlockRowInDiscBuf(SOperatorInfo* pOperator, SStreamFillInfo* pFillInfo, SSDataBlock* pBlock, TSKEY* tsCol, - int32_t rowId, uint64_t groupId, int32_t rowSize) { - TSKEY ts = tsCol[rowId]; - pFillInfo->nextRowKey = ts; - SResultRowData tmpNextRow = {.key = ts}; - tmpNextRow.pRowVal = taosMemoryCalloc(1, rowSize); - transBlockToResultRow(pBlock, rowId, ts, &tmpNextRow); - keepResultInDiscBuf(pOperator, groupId, &tmpNextRow, rowSize); - taosMemoryFreeClear(tmpNextRow.pRowVal); -} - -static void doFillResults(SOperatorInfo* pOperator, SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo, - SSDataBlock* pBlock, TSKEY* tsCol, int32_t rowId, SSDataBlock* pRes) { - uint64_t groupId = pBlock->info.id.groupId; - getWindowFromDiscBuf(pOperator, tsCol[rowId], groupId, pFillSup); - if (pFillSup->prev.key == pFillInfo->preRowKey) { - resetFillWindow(&pFillSup->prev); - } - setFillValueInfo(pBlock, tsCol[rowId], rowId, pFillSup, pFillInfo); - doStreamFillRange(pFillInfo, pFillSup, pRes); -} - -static void doStreamFillImpl(SOperatorInfo* pOperator) { - SStreamFillOperatorInfo* pInfo = pOperator->info; - SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; - SStreamFillSupporter* pFillSup = pInfo->pFillSup; - SStreamFillInfo* pFillInfo = pInfo->pFillInfo; - SSDataBlock* pBlock = pInfo->pSrcBlock; - uint64_t groupId = pBlock->info.id.groupId; - SSDataBlock* pRes = pInfo->pRes; - pRes->info.id.groupId = groupId; - if (hasRemainCalc(pFillInfo)) { - doStreamFillRange(pFillInfo, pFillSup, pRes); - } - - SColumnInfoData* pTsCol = taosArrayGet(pInfo->pSrcBlock->pDataBlock, pInfo->primaryTsCol); - TSKEY* tsCol = (TSKEY*)pTsCol->pData; - - if (pInfo->srcRowIndex == 0) { - keepBlockRowInDiscBuf(pOperator, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex, groupId, pFillSup->rowSize); - SSDataBlock* preBlock = pInfo->pPrevSrcBlock; - if (preBlock->info.rows > 0) { - int preRowId = preBlock->info.rows - 1; - SColumnInfoData* pPreTsCol = taosArrayGet(preBlock->pDataBlock, pInfo->primaryTsCol); - doFillResults(pOperator, pFillSup, pFillInfo, preBlock, (TSKEY*)pPreTsCol->pData, preRowId, pRes); - } - pInfo->srcRowIndex++; - } - - while (pInfo->srcRowIndex < pBlock->info.rows) { - TSKEY ts = tsCol[pInfo->srcRowIndex]; - keepBlockRowInDiscBuf(pOperator, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex, groupId, pFillSup->rowSize); - doFillResults(pOperator, pFillSup, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex - 1, pRes); - if (pInfo->pRes->info.rows == pInfo->pRes->info.capacity) { - blockDataUpdateTsWindow(pRes, pInfo->primaryTsCol); - return; - } - pInfo->srcRowIndex++; - } - blockDataUpdateTsWindow(pRes, pInfo->primaryTsCol); - blockDataCleanup(pInfo->pPrevSrcBlock); - copyDataBlock(pInfo->pPrevSrcBlock, pInfo->pSrcBlock); - blockDataCleanup(pInfo->pSrcBlock); -} - -static void buildDeleteRange(SOperatorInfo* pOp, TSKEY start, TSKEY end, uint64_t groupId, SSDataBlock* delRes) { - SStreamState* pState = pOp->pTaskInfo->streamInfo.pState; - - SSDataBlock* pBlock = delRes; - SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); - SColumnInfoData* pEndCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX); - SColumnInfoData* pUidCol = taosArrayGet(pBlock->pDataBlock, UID_COLUMN_INDEX); - SColumnInfoData* pGroupCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX); - SColumnInfoData* pCalStartCol = taosArrayGet(pBlock->pDataBlock, CALCULATE_START_TS_COLUMN_INDEX); - SColumnInfoData* pCalEndCol = taosArrayGet(pBlock->pDataBlock, CALCULATE_END_TS_COLUMN_INDEX); - SColumnInfoData* pTbNameCol = taosArrayGet(pBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX); - colDataAppend(pStartCol, pBlock->info.rows, (const char*)&start, false); - colDataAppend(pEndCol, pBlock->info.rows, (const char*)&end, false); - colDataAppendNULL(pUidCol, pBlock->info.rows); - colDataAppend(pGroupCol, pBlock->info.rows, (const char*)&groupId, false); - colDataAppendNULL(pCalStartCol, pBlock->info.rows); - colDataAppendNULL(pCalEndCol, pBlock->info.rows); - - SColumnInfoData* pTableCol = taosArrayGet(pBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX); - - void* tbname = NULL; - streamStateGetParName(pOp->pTaskInfo->streamInfo.pState, groupId, &tbname); - if (tbname == NULL) { - colDataAppendNULL(pTableCol, pBlock->info.rows); - } else { - char parTbName[VARSTR_HEADER_SIZE + TSDB_TABLE_NAME_LEN]; - STR_WITH_MAXSIZE_TO_VARSTR(parTbName, tbname, sizeof(parTbName)); - colDataAppend(pTableCol, pBlock->info.rows, (const char*)parTbName, false); - tdbFree(tbname); - } - - pBlock->info.rows++; -} - -static void buildDeleteResult(SOperatorInfo* pOperator, TSKEY startTs, TSKEY endTs, uint64_t groupId, - SSDataBlock* delRes) { - SStreamFillOperatorInfo* pInfo = pOperator->info; - SStreamFillSupporter* pFillSup = pInfo->pFillSup; - if (hasPrevWindow(pFillSup)) { - TSKEY start = getNextWindowTs(pFillSup->prev.key, &pFillSup->interval); - buildDeleteRange(pOperator, start, endTs, groupId, delRes); - } else if (hasNextWindow(pFillSup)) { - TSKEY end = getPrevWindowTs(pFillSup->next.key, &pFillSup->interval); - buildDeleteRange(pOperator, startTs, end, groupId, delRes); - } else { - buildDeleteRange(pOperator, startTs, endTs, groupId, delRes); - } -} - -static void doDeleteFillResultImpl(SOperatorInfo* pOperator, TSKEY startTs, TSKEY endTs, uint64_t groupId) { - SStreamFillOperatorInfo* pInfo = pOperator->info; - getWindowFromDiscBuf(pOperator, startTs, groupId, pInfo->pFillSup); - setDeleteFillValueInfo(startTs, endTs, pInfo->pFillSup, pInfo->pFillInfo); - SWinKey key = {.ts = startTs, .groupId = groupId}; - if (!pInfo->pFillInfo->needFill) { - streamStateFillDel(pOperator->pTaskInfo->streamInfo.pState, &key); - buildDeleteResult(pOperator, startTs, endTs, groupId, pInfo->pDelRes); - } else { - STimeRange tw = { - .skey = startTs, - .ekey = endTs, - .groupId = groupId, - }; - taosArrayPush(pInfo->pFillInfo->delRanges, &tw); - while (key.ts <= endTs) { - key.ts = taosTimeAdd(key.ts, pInfo->pFillSup->interval.sliding, pInfo->pFillSup->interval.slidingUnit, - pInfo->pFillSup->interval.precision); - tSimpleHashPut(pInfo->pFillSup->pResMap, &key, sizeof(SWinKey), NULL, 0); - } - } -} - -static void doDeleteFillFinalize(SOperatorInfo* pOperator) { - SStreamFillOperatorInfo* pInfo = pOperator->info; - SStreamFillInfo* pFillInfo = pInfo->pFillInfo; - int32_t size = taosArrayGetSize(pFillInfo->delRanges); - tSimpleHashClear(pInfo->pFillSup->pResMap); - for (; pFillInfo->delIndex < size; pFillInfo->delIndex++) { - STimeRange* range = taosArrayGet(pFillInfo->delRanges, pFillInfo->delIndex); - if (pInfo->pRes->info.id.groupId != 0 && pInfo->pRes->info.id.groupId != range->groupId) { - return; - } - getWindowFromDiscBuf(pOperator, range->skey, range->groupId, pInfo->pFillSup); - setDeleteFillValueInfo(range->skey, range->ekey, pInfo->pFillSup, pInfo->pFillInfo); - if (pInfo->pFillInfo->needFill) { - doStreamFillRange(pInfo->pFillInfo, pInfo->pFillSup, pInfo->pRes); - pInfo->pRes->info.id.groupId = range->groupId; - } - SWinKey key = {.ts = range->skey, .groupId = range->groupId}; - streamStateFillDel(pOperator->pTaskInfo->streamInfo.pState, &key); - } -} - -static void doDeleteFillResult(SOperatorInfo* pOperator) { - SStreamFillOperatorInfo* pInfo = pOperator->info; - SStreamFillSupporter* pFillSup = pInfo->pFillSup; - SStreamFillInfo* pFillInfo = pInfo->pFillInfo; - SSDataBlock* pBlock = pInfo->pSrcDelBlock; - SSDataBlock* pRes = pInfo->pRes; - SSDataBlock* pDelRes = pInfo->pDelRes; - - SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); - TSKEY* tsStarts = (TSKEY*)pStartCol->pData; - SColumnInfoData* pGroupCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX); - uint64_t* groupIds = (uint64_t*)pGroupCol->pData; - while (pInfo->srcDelRowIndex < pBlock->info.rows) { - TSKEY ts = tsStarts[pInfo->srcDelRowIndex]; - TSKEY endTs = ts; - uint64_t groupId = groupIds[pInfo->srcDelRowIndex]; - SWinKey key = {.ts = ts, .groupId = groupId}; - SStreamStateCur* pCur = streamStateGetAndCheckCur(pOperator->pTaskInfo->streamInfo.pState, &key); - if (!pCur) { - pInfo->srcDelRowIndex++; - continue; - } - - SWinKey nextKey = {.groupId = groupId, .ts = ts}; - while (pInfo->srcDelRowIndex < pBlock->info.rows) { - void* nextVal = NULL; - int32_t nextLen = 0; - TSKEY delTs = tsStarts[pInfo->srcDelRowIndex]; - uint64_t delGroupId = groupIds[pInfo->srcDelRowIndex]; - int32_t code = TSDB_CODE_SUCCESS; - if (groupId != delGroupId) { - break; - } - if (delTs > nextKey.ts) { - break; - } - endTs = delTs; - SWinKey delKey = {.groupId = delGroupId, .ts = delTs}; - if (delTs == nextKey.ts) { - code = streamStateCurNext(pOperator->pTaskInfo->streamInfo.pState, pCur); - if (code == TSDB_CODE_SUCCESS) { - code = streamStateGetGroupKVByCur(pCur, &nextKey, (const void**)&nextVal, &nextLen); - } - // ts will be deleted later - if (delTs != ts) { - streamStateFillDel(pOperator->pTaskInfo->streamInfo.pState, &delKey); - streamStateFreeCur(pCur); - pCur = streamStateGetAndCheckCur(pOperator->pTaskInfo->streamInfo.pState, &nextKey); - } - endTs = TMAX(ts, nextKey.ts - 1); - if (code != TSDB_CODE_SUCCESS) { - break; - } - } - pInfo->srcDelRowIndex++; - } - streamStateFreeCur(pCur); - doDeleteFillResultImpl(pOperator, ts, endTs, groupId); - } - pFillInfo->current = pFillInfo->end + 1; -} - -static void resetStreamFillInfo(SStreamFillOperatorInfo* pInfo) { - blockDataCleanup(pInfo->pPrevSrcBlock); - tSimpleHashClear(pInfo->pFillSup->pResMap); - pInfo->pFillSup->hasDelete = false; - taosArrayClear(pInfo->pFillInfo->delRanges); - pInfo->pFillInfo->delIndex = 0; -} - -static void doApplyStreamScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pSrcBlock, SSDataBlock* pDstBlock) { - SStreamFillOperatorInfo* pInfo = pOperator->info; - SExprSupp* pSup = &pOperator->exprSupp; - - blockDataCleanup(pDstBlock); - blockDataEnsureCapacity(pDstBlock, pSrcBlock->info.rows); - setInputDataBlock(pSup, pSrcBlock, TSDB_ORDER_ASC, MAIN_SCAN, false); - projectApplyFunctions(pSup->pExprInfo, pDstBlock, pSrcBlock, pSup->pCtx, pSup->numOfExprs, NULL); - - pDstBlock->info.rows = 0; - pSup = &pInfo->pFillSup->notFillExprSup; - setInputDataBlock(pSup, pSrcBlock, TSDB_ORDER_ASC, MAIN_SCAN, false); - projectApplyFunctions(pSup->pExprInfo, pDstBlock, pSrcBlock, pSup->pCtx, pSup->numOfExprs, NULL); - pDstBlock->info.id.groupId = pSrcBlock->info.id.groupId; - - blockDataUpdateTsWindow(pDstBlock, pInfo->primaryTsCol); -} - -static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) { - SStreamFillOperatorInfo* pInfo = pOperator->info; - SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; - - if (pOperator->status == OP_EXEC_DONE) { - return NULL; - } - blockDataCleanup(pInfo->pRes); - if (pOperator->status == OP_RES_TO_RETURN) { - if (hasRemainCalc(pInfo->pFillInfo)) { - doStreamFillRange(pInfo->pFillInfo, pInfo->pFillSup, pInfo->pRes); - if (pInfo->pRes->info.rows > 0) { - return pInfo->pRes; - } - } - doDeleteFillFinalize(pOperator); - if (pInfo->pRes->info.rows > 0) { - printDataBlock(pInfo->pRes, "stream fill"); - return pInfo->pRes; - } - setOperatorCompleted(pOperator); - resetStreamFillInfo(pInfo); - return NULL; - } - - SSDataBlock* fillResult = NULL; - SOperatorInfo* downstream = pOperator->pDownstream[0]; - while (1) { - if (pInfo->srcRowIndex >= pInfo->pSrcBlock->info.rows) { - // If there are delete datablocks, we receive them first. - SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); - if (pBlock == NULL) { - pOperator->status = OP_RES_TO_RETURN; - SSDataBlock* preBlock = pInfo->pPrevSrcBlock; - if (preBlock->info.rows > 0) { - int preRowId = preBlock->info.rows - 1; - SColumnInfoData* pPreTsCol = taosArrayGet(preBlock->pDataBlock, pInfo->primaryTsCol); - doFillResults(pOperator, pInfo->pFillSup, pInfo->pFillInfo, preBlock, (TSKEY*)pPreTsCol->pData, preRowId, - pInfo->pRes); - } - pInfo->pFillInfo->preRowKey = INT64_MIN; - if (pInfo->pRes->info.rows > 0) { - printDataBlock(pInfo->pRes, "stream fill"); - return pInfo->pRes; - } - break; - } - printDataBlock(pBlock, "stream fill recv"); - - switch (pBlock->info.type) { - case STREAM_RETRIEVE: - return pBlock; - case STREAM_DELETE_RESULT: { - pInfo->pSrcDelBlock = pBlock; - pInfo->srcDelRowIndex = 0; - blockDataCleanup(pInfo->pDelRes); - pInfo->pFillSup->hasDelete = true; - doDeleteFillResult(pOperator); - if (pInfo->pDelRes->info.rows > 0) { - printDataBlock(pInfo->pDelRes, "stream fill delete"); - return pInfo->pDelRes; - } - continue; - } break; - case STREAM_NORMAL: - case STREAM_INVALID: { - doApplyStreamScalarCalculation(pOperator, pBlock, pInfo->pSrcBlock); - memcpy(pInfo->pSrcBlock->info.parTbName, pBlock->info.parTbName, TSDB_TABLE_NAME_LEN); - pInfo->srcRowIndex = 0; - } break; - default: - ASSERT(0); - break; - } - } - - doStreamFillImpl(pOperator); - doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo); - memcpy(pInfo->pRes->info.parTbName, pInfo->pSrcBlock->info.parTbName, TSDB_TABLE_NAME_LEN); - pOperator->resultInfo.totalRows += pInfo->pRes->info.rows; - if (pInfo->pRes->info.rows > 0) { - break; - } - } - if (pOperator->status == OP_RES_TO_RETURN) { - doDeleteFillFinalize(pOperator); - } - - if (pInfo->pRes->info.rows == 0) { - setOperatorCompleted(pOperator); - resetStreamFillInfo(pInfo); - return NULL; - } - - pOperator->resultInfo.totalRows += pInfo->pRes->info.rows; - printDataBlock(pInfo->pRes, "stream fill"); - return pInfo->pRes; -} - -static int32_t initResultBuf(SStreamFillSupporter* pFillSup) { - pFillSup->rowSize = sizeof(SResultCellData) * pFillSup->numOfAllCols; - for (int i = 0; i < pFillSup->numOfAllCols; i++) { - SFillColInfo* pCol = &pFillSup->pAllColInfo[i]; - SResSchema* pSchema = &pCol->pExpr->base.resSchema; - pFillSup->rowSize += pSchema->bytes; - } - pFillSup->next.key = INT64_MIN; - pFillSup->nextNext.key = INT64_MIN; - pFillSup->prev.key = INT64_MIN; - pFillSup->cur.key = INT64_MIN; - pFillSup->next.pRowVal = NULL; - pFillSup->nextNext.pRowVal = NULL; - pFillSup->prev.pRowVal = NULL; - pFillSup->cur.pRowVal = NULL; - - return TSDB_CODE_SUCCESS; -} - -static SStreamFillSupporter* initStreamFillSup(SStreamFillPhysiNode* pPhyFillNode, SInterval* pInterval, - SExprInfo* pFillExprInfo, int32_t numOfFillCols) { - SStreamFillSupporter* pFillSup = taosMemoryCalloc(1, sizeof(SStreamFillSupporter)); - if (!pFillSup) { - return NULL; - } - pFillSup->numOfFillCols = numOfFillCols; - int32_t numOfNotFillCols = 0; - SExprInfo* noFillExprInfo = createExprInfo(pPhyFillNode->pNotFillExprs, NULL, &numOfNotFillCols); - pFillSup->pAllColInfo = createFillColInfo(pFillExprInfo, pFillSup->numOfFillCols, noFillExprInfo, numOfNotFillCols, - (const SNodeListNode*)(pPhyFillNode->pValues)); - pFillSup->type = convertFillType(pPhyFillNode->mode); - pFillSup->numOfAllCols = pFillSup->numOfFillCols + numOfNotFillCols; - pFillSup->interval = *pInterval; - - int32_t code = initResultBuf(pFillSup); - if (code != TSDB_CODE_SUCCESS) { - destroyStreamFillSupporter(pFillSup); - return NULL; - } - - SExprInfo* noFillExpr = createExprInfo(pPhyFillNode->pNotFillExprs, NULL, &numOfNotFillCols); - code = initExprSupp(&pFillSup->notFillExprSup, noFillExpr, numOfNotFillCols); - if (code != TSDB_CODE_SUCCESS) { - destroyStreamFillSupporter(pFillSup); - return NULL; - } - - _hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY); - pFillSup->pResMap = tSimpleHashInit(16, hashFn); - pFillSup->hasDelete = false; - return pFillSup; -} - -SStreamFillInfo* initStreamFillInfo(SStreamFillSupporter* pFillSup, SSDataBlock* pRes) { - SStreamFillInfo* pFillInfo = taosMemoryCalloc(1, sizeof(SStreamFillInfo)); - pFillInfo->start = INT64_MIN; - pFillInfo->current = INT64_MIN; - pFillInfo->end = INT64_MIN; - pFillInfo->preRowKey = INT64_MIN; - pFillInfo->needFill = false; - pFillInfo->pLinearInfo = taosMemoryCalloc(1, sizeof(SStreamFillLinearInfo)); - pFillInfo->pLinearInfo->hasNext = false; - pFillInfo->pLinearInfo->nextEnd = INT64_MIN; - pFillInfo->pLinearInfo->pDeltaVal = NULL; - pFillInfo->pLinearInfo->pNextDeltaVal = NULL; - if (pFillSup->type == TSDB_FILL_LINEAR) { - pFillInfo->pLinearInfo->pDeltaVal = taosArrayInit(pFillSup->numOfAllCols, sizeof(double)); - pFillInfo->pLinearInfo->pNextDeltaVal = taosArrayInit(pFillSup->numOfAllCols, sizeof(double)); - for (int32_t i = 0; i < pFillSup->numOfAllCols; i++) { - double value = 0.0; - taosArrayPush(pFillInfo->pLinearInfo->pDeltaVal, &value); - taosArrayPush(pFillInfo->pLinearInfo->pNextDeltaVal, &value); - } - } - pFillInfo->pLinearInfo->winIndex = 0; - - pFillInfo->pResRow = NULL; - if (pFillSup->type == TSDB_FILL_SET_VALUE || pFillSup->type == TSDB_FILL_NULL) { - pFillInfo->pResRow = taosMemoryCalloc(1, sizeof(SResultRowData)); - pFillInfo->pResRow->key = INT64_MIN; - pFillInfo->pResRow->pRowVal = taosMemoryCalloc(1, pFillSup->rowSize); - for (int32_t i = 0; i < pFillSup->numOfAllCols; ++i) { - SColumnInfoData* pColData = taosArrayGet(pRes->pDataBlock, i); - SResultCellData* pCell = getResultCell(pFillInfo->pResRow, i); - pCell->bytes = pColData->info.bytes; - pCell->type = pColData->info.type; - } - } - - pFillInfo->type = pFillSup->type; - pFillInfo->delRanges = taosArrayInit(16, sizeof(STimeRange)); - pFillInfo->delIndex = 0; - return pFillInfo; -} - -SOperatorInfo* createStreamFillOperatorInfo(SOperatorInfo* downstream, SStreamFillPhysiNode* pPhyFillNode, - SExecTaskInfo* pTaskInfo) { - SStreamFillOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamFillOperatorInfo)); - SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); - if (pInfo == NULL || pOperator == NULL) { - goto _error; - } - - SInterval* pInterval = &((SStreamIntervalOperatorInfo*)downstream->info)->interval; - int32_t numOfFillCols = 0; - SExprInfo* pFillExprInfo = createExprInfo(pPhyFillNode->pFillExprs, NULL, &numOfFillCols); - pInfo->pFillSup = initStreamFillSup(pPhyFillNode, pInterval, pFillExprInfo, numOfFillCols); - if (!pInfo->pFillSup) { - goto _error; - } - - initResultSizeInfo(&pOperator->resultInfo, 4096); - pInfo->pRes = createDataBlockFromDescNode(pPhyFillNode->node.pOutputDataBlockDesc); - pInfo->pSrcBlock = createDataBlockFromDescNode(pPhyFillNode->node.pOutputDataBlockDesc); - pInfo->pPrevSrcBlock = createDataBlockFromDescNode(pPhyFillNode->node.pOutputDataBlockDesc); - blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity); - blockDataEnsureCapacity(pInfo->pSrcBlock, pOperator->resultInfo.capacity); - blockDataEnsureCapacity(pInfo->pPrevSrcBlock, pOperator->resultInfo.capacity); - - pInfo->pFillInfo = initStreamFillInfo(pInfo->pFillSup, pInfo->pRes); - if (!pInfo->pFillInfo) { - goto _error; - } - - if (pInfo->pFillInfo->type == TSDB_FILL_SET_VALUE) { - for (int32_t i = 0; i < pInfo->pFillSup->numOfAllCols; ++i) { - SFillColInfo* pFillCol = pInfo->pFillSup->pAllColInfo + i; - int32_t slotId = GET_DEST_SLOT_ID(pFillCol); - SResultCellData* pCell = getResultCell(pInfo->pFillInfo->pResRow, slotId); - SVariant* pVar = &(pFillCol->fillVal); - if (pCell->type == TSDB_DATA_TYPE_FLOAT) { - float v = 0; - GET_TYPED_DATA(v, float, pVar->nType, &pVar->i); - SET_TYPED_DATA(pCell->pData, pCell->type, v); - } else if (pCell->type == TSDB_DATA_TYPE_DOUBLE) { - double v = 0; - GET_TYPED_DATA(v, double, pVar->nType, &pVar->i); - SET_TYPED_DATA(pCell->pData, pCell->type, v); - } else if (IS_SIGNED_NUMERIC_TYPE(pCell->type)) { - int64_t v = 0; - GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i); - SET_TYPED_DATA(pCell->pData, pCell->type, v); - } else { - pCell->isNull = true; - } - } - } else if (pInfo->pFillInfo->type == TSDB_FILL_NULL) { - for (int32_t i = 0; i < pInfo->pFillSup->numOfAllCols; ++i) { - SFillColInfo* pFillCol = pInfo->pFillSup->pAllColInfo + i; - int32_t slotId = GET_DEST_SLOT_ID(pFillCol); - SResultCellData* pCell = getResultCell(pInfo->pFillInfo->pResRow, slotId); - pCell->isNull = true; - } - } - - pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT); - blockDataEnsureCapacity(pInfo->pDelRes, pOperator->resultInfo.capacity); - - pInfo->primaryTsCol = ((STargetNode*)pPhyFillNode->pWStartTs)->slotId; - pInfo->primarySrcSlotId = ((SColumnNode*)((STargetNode*)pPhyFillNode->pWStartTs)->pExpr)->slotId; - - int32_t numOfOutputCols = 0; - int32_t code = extractColMatchInfo(pPhyFillNode->pFillExprs, pPhyFillNode->node.pOutputDataBlockDesc, - &numOfOutputCols, COL_MATCH_FROM_SLOT_ID, &pInfo->matchInfo); - - code = filterInitFromNode((SNode*)pPhyFillNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0); - if (code != TSDB_CODE_SUCCESS) { - goto _error; - } - - code = initExprSupp(&pOperator->exprSupp, pFillExprInfo, numOfFillCols); - if (code != TSDB_CODE_SUCCESS) { - goto _error; - } - - pInfo->srcRowIndex = 0; - setOperatorInfo(pOperator, "StreamFillOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL, false, OP_NOT_OPENED, pInfo, - pTaskInfo); - pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamFill, NULL, destroyStreamFillOperatorInfo, NULL); - - code = appendDownstream(pOperator, &downstream, 1); - if (code != TSDB_CODE_SUCCESS) { - goto _error; - } - return pOperator; - -_error: - destroyStreamFillOperatorInfo(pInfo); - taosMemoryFreeClear(pOperator); - pTaskInfo->code = code; - return NULL; -} diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index d598fd09ca..f2c2e24a41 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -677,16 +677,6 @@ static void doInterpUnclosedTimeWindow(SOperatorInfo* pOperatorInfo, int32_t num } } -void printDataBlock(SSDataBlock* pBlock, const char* flag) { - if (!pBlock || pBlock->info.rows == 0) { - qDebug("===stream===printDataBlock: Block is Null or Empty"); - return; - } - char* pBuf = NULL; - qDebug("%s", dumpBlockData(pBlock, flag, &pBuf)); - taosMemoryFree(pBuf); -} - typedef int32_t (*__compare_fn_t)(void* pKey, void* data, int32_t index); int32_t binarySearchCom(void* keyList, int num, void* pKey, int order, __compare_fn_t comparefn) { @@ -3854,7 +3844,7 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SStreamStateAggOperatorInfo* pInfo = pOperator->info; int32_t numOfOutput = pOperator->exprSupp.numOfExprs; - int64_t groupId = pSDataBlock->info.id.groupId; + uint64_t groupId = pSDataBlock->info.id.groupId; int64_t code = TSDB_CODE_SUCCESS; TSKEY* tsCols = NULL; SResultRow* pResult = NULL; From f67b516241e70b7cdf532486ccbc6ef958e16ae5 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 30 Nov 2022 21:17:34 +0800 Subject: [PATCH 080/105] more code --- source/dnode/vnode/src/tsdb/tsdbMemTable.c | 36 ++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index ad2e36aa20..f16ec1bd80 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -546,13 +546,45 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, SSubmitTbData *pSubmitTbData, int32_t *affectedRows) { int32_t code = 0; - int32_t nColData = TARRAY_SIZE(pSubmitTbData->aCol); - SColData *aColData = (SColData *)TARRAY_DATA(pSubmitTbData->aCol); + SVBufPool *pPool = pMemTable->pTsdb->pVnode->inUse; + int32_t nColData = TARRAY_SIZE(pSubmitTbData->aCol); + SColData *aColData = (SColData *)TARRAY_DATA(pSubmitTbData->aCol); ASSERT(aColData[0].cid = PRIMARYKEY_TIMESTAMP_COL_ID); ASSERT(aColData[0].type = TSDB_DATA_TYPE_TIMESTAMP); ASSERT(aColData[0].flag = HAS_VALUE); + // copy and construct block data + SBlockData *pBlockData = vnodeBufPoolMalloc(pPool, sizeof(*pBlockData)); + if (pBlockData == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + + pBlockData->suid = pTbData->suid; + pBlockData->uid = pTbData->uid; + pBlockData->nRow = aColData[0].nVal; + pBlockData->aUid = NULL; + pBlockData->aVersion = vnodeBufPoolMalloc(pPool, aColData[0].nData); + if (pBlockData->aVersion == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + for (int32_t i = 0; i < pBlockData->nRow; i++) { // todo: here can be optimized + pBlockData->aVersion[i] = version; + } + + pBlockData->aTSKEY = vnodeBufPoolMalloc(pPool, aColData[0].nData); + if (pBlockData->aTSKEY == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + memcpy(pBlockData->aTSKEY, aColData[0].pData, aColData[0].nData); + + pBlockData->nColData = nColData - 1; + for (int32_t iColData = 1; iColData < nColData; ++iColData) { + } + // TODO ASSERT(0); From 1e8a8161552db2fb8a1e7924b4d1b000765271f6 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 30 Nov 2022 21:42:42 +0800 Subject: [PATCH 081/105] enh: show leader ** if vnode can read and can't write --- include/common/tmsg.h | 1 + source/common/src/tmsg.c | 10 ++++++++++ source/dnode/mnode/impl/inc/mndDef.h | 1 + source/dnode/mnode/impl/src/mndDnode.c | 20 ++++++++++++-------- source/dnode/mnode/impl/src/mndMain.c | 16 ++++++++++------ source/dnode/mnode/impl/src/mndVgroup.c | 13 +++++++++++-- source/dnode/vnode/src/vnd/vnodeQuery.c | 1 + 7 files changed, 46 insertions(+), 16 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 80590a25c0..681a5ec423 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -1059,6 +1059,7 @@ typedef struct { int32_t vgId; int8_t syncState; int8_t syncRestore; + int8_t syncCanRead; int64_t cacheUsage; int64_t numOfTables; int64_t numOfTimeSeries; diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index c7e98415d1..c7046c7422 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -992,15 +992,20 @@ int32_t tSerializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) { if (tEncodeI32(&encoder, vlen) < 0) return -1; for (int32_t i = 0; i < vlen; ++i) { SVnodeLoad *pload = taosArrayGet(pReq->pVloads, i); + int64_t reserved = 0; if (tEncodeI32(&encoder, pload->vgId) < 0) return -1; if (tEncodeI8(&encoder, pload->syncState) < 0) return -1; if (tEncodeI8(&encoder, pload->syncRestore) < 0) return -1; + if (tEncodeI8(&encoder, pload->syncCanRead) < 0) return -1; if (tEncodeI64(&encoder, pload->cacheUsage) < 0) return -1; if (tEncodeI64(&encoder, pload->numOfTables) < 0) return -1; if (tEncodeI64(&encoder, pload->numOfTimeSeries) < 0) return -1; if (tEncodeI64(&encoder, pload->totalStorage) < 0) return -1; if (tEncodeI64(&encoder, pload->compStorage) < 0) return -1; if (tEncodeI64(&encoder, pload->pointsWritten) < 0) return -1; + if (tEncodeI64(&encoder, reserved) < 0) return -1; + if (tEncodeI64(&encoder, reserved) < 0) return -1; + if (tEncodeI64(&encoder, reserved) < 0) return -1; } // mnode loads @@ -1065,15 +1070,20 @@ int32_t tDeserializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) { for (int32_t i = 0; i < vlen; ++i) { SVnodeLoad vload = {0}; + int64_t reserved = 0; if (tDecodeI32(&decoder, &vload.vgId) < 0) return -1; if (tDecodeI8(&decoder, &vload.syncState) < 0) return -1; if (tDecodeI8(&decoder, &vload.syncRestore) < 0) return -1; + if (tDecodeI8(&decoder, &vload.syncCanRead) < 0) return -1; if (tDecodeI64(&decoder, &vload.cacheUsage) < 0) return -1; if (tDecodeI64(&decoder, &vload.numOfTables) < 0) return -1; if (tDecodeI64(&decoder, &vload.numOfTimeSeries) < 0) return -1; if (tDecodeI64(&decoder, &vload.totalStorage) < 0) return -1; if (tDecodeI64(&decoder, &vload.compStorage) < 0) return -1; if (tDecodeI64(&decoder, &vload.pointsWritten) < 0) return -1; + if (tDecodeI64(&decoder, &reserved) < 0) return -1; + if (tDecodeI64(&decoder, &reserved) < 0) return -1; + if (tDecodeI64(&decoder, &reserved) < 0) return -1; if (taosArrayPush(pReq->pVloads, &vload) == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; return -1; diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index 04ac5aba49..d0d2930abe 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -328,6 +328,7 @@ typedef struct { int32_t dnodeId; ESyncState syncState; bool syncRestore; + bool syncCanRead; } SVnodeGid; typedef struct { diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index 2a3ecf1924..49887c0dab 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -375,14 +375,18 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { } bool roleChanged = false; for (int32_t vg = 0; vg < pVgroup->replica; ++vg) { - if (pVgroup->vnodeGid[vg].dnodeId == statusReq.dnodeId) { - if (pVgroup->vnodeGid[vg].syncState != pVload->syncState || - pVgroup->vnodeGid[vg].syncRestore != pVload->syncRestore) { - mInfo("vgId:%d, state changed by status msg, old state:%s restored:%d new state:%s restored:%d", - pVgroup->vgId, syncStr(pVgroup->vnodeGid[vg].syncState), pVgroup->vnodeGid[vg].syncRestore, - syncStr(pVload->syncState), pVload->syncRestore); - pVgroup->vnodeGid[vg].syncState = pVload->syncState; - pVgroup->vnodeGid[vg].syncRestore = pVload->syncRestore; + SVnodeGid *pGid = &pVgroup->vnodeGid[vg]; + if (pGid->dnodeId == statusReq.dnodeId) { + if (pGid->syncState != pVload->syncState || pGid->syncRestore != pVload->syncRestore || + pGid->syncCanRead != pVload->syncCanRead) { + mInfo( + "vgId:%d, state changed by status msg, old state:%s restored:%d canRead:%d new state:%s restored:%d " + "canRead:%d", + pVgroup->vgId, syncStr(pGid->syncState), pGid->syncRestore, pGid->syncCanRead, + syncStr(pVload->syncState), pVload->syncRestore, pVload->syncCanRead); + pGid->syncState = pVload->syncState; + pGid->syncRestore = pVload->syncRestore; + pGid->syncCanRead = pVload->syncCanRead; roleChanged = true; } break; diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index f533fafeee..b16e4985c4 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -150,12 +150,16 @@ static void mndSetVgroupOffline(SMnode *pMnode, int32_t dnodeId, int64_t curMs) bool roleChanged = false; for (int32_t vg = 0; vg < pVgroup->replica; ++vg) { - if (pVgroup->vnodeGid[vg].dnodeId == dnodeId) { - if (pVgroup->vnodeGid[vg].syncState != TAOS_SYNC_STATE_OFFLINE) { - mInfo("vgId:%d, state changed by offline check, old state:%s restored:%d new state:error restored:0", - pVgroup->vgId, syncStr(pVgroup->vnodeGid[vg].syncState), pVgroup->vnodeGid[vg].syncRestore); - pVgroup->vnodeGid[vg].syncState = TAOS_SYNC_STATE_OFFLINE; - pVgroup->vnodeGid[vg].syncRestore = 0; + SVnodeGid *pGid = &pVgroup->vnodeGid[vg]; + if (pGid->dnodeId == dnodeId) { + if (pGid->syncState != TAOS_SYNC_STATE_OFFLINE) { + mInfo( + "vgId:%d, state changed by offline check, old state:%s restored:%d canRead:%d new state:error restored:0 " + "canRead:0", + pVgroup->vgId, syncStr(pGid->syncState), pGid->syncRestore, pGid->syncCanRead); + pGid->syncState = TAOS_SYNC_STATE_OFFLINE; + pGid->syncRestore = 0; + pGid->syncCanRead = 0; roleChanged = true; } break; diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index d06853e470..eec112d225 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -186,6 +186,7 @@ static int32_t mndVgroupActionUpdate(SSdb *pSdb, SVgObj *pOld, SVgObj *pNew) { if (pNewGid->dnodeId == pOldGid->dnodeId) { pNewGid->syncState = pOldGid->syncState; pNewGid->syncRestore = pOldGid->syncRestore; + pNewGid->syncCanRead = pOldGid->syncCanRead; } } } @@ -696,8 +697,16 @@ static int32_t mndRetrieveVgroups(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p if (!exist) { strcpy(role, "dropping"); } else if (online) { - bool show = (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_LEADER && !pVgroup->vnodeGid[i].syncRestore); - snprintf(role, sizeof(role), "%s%s", syncStr(pVgroup->vnodeGid[i].syncState), show ? "*" : ""); + char *star = ""; + if (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_LEADER) { + if (!pVgroup->vnodeGid[i].syncRestore && !pVgroup->vnodeGid[i].syncCanRead) { + star = "**"; + } else if (!pVgroup->vnodeGid[i].syncRestore && pVgroup->vnodeGid[i].syncCanRead) { + star = "*"; + } else { + } + } + snprintf(role, sizeof(role), "%s%s", syncStr(pVgroup->vnodeGid[i].syncState), star); } else { } STR_WITH_MAXSIZE_TO_VARSTR(buf1, role, pShow->pMeta->pSchemas[cols].bytes); diff --git a/source/dnode/vnode/src/vnd/vnodeQuery.c b/source/dnode/vnode/src/vnd/vnodeQuery.c index 8e9aab0afd..1199127f6d 100644 --- a/source/dnode/vnode/src/vnd/vnodeQuery.c +++ b/source/dnode/vnode/src/vnd/vnodeQuery.c @@ -380,6 +380,7 @@ int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) { pLoad->vgId = TD_VID(pVnode); pLoad->syncState = state.state; pLoad->syncRestore = state.restored; + pLoad->syncCanRead = state.canRead; pLoad->cacheUsage = tsdbCacheGetUsage(pVnode); pLoad->numOfTables = metaGetTbNum(pVnode->pMeta); pLoad->numOfTimeSeries = metaGetTimeSeriesNum(pVnode->pMeta); From 80188f92135cce7d0b6a8198fb52aac437fb6182 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 30 Nov 2022 22:04:54 +0800 Subject: [PATCH 082/105] fix case --- tests/system-test/0-others/compatibility.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index 377cdbd7e6..9d4d14dcd0 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -84,6 +84,7 @@ class TDTestCase: stb = f"{dbname}.meters" self.installTaosd(bPath,cPath) os.system("echo 'debugFlag 143' > /etc/taos/taos.cfg ") + os.system("echo ' supportVnodes 256' > /etc/taos/taos.cfg ") tableNumbers=100 recordNumbers1=100 recordNumbers2=1000 From efc883707c26588ac99041bcc04a832f11478351 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Wed, 30 Nov 2022 22:22:49 +0800 Subject: [PATCH 083/105] test:modify base version from 3.0.1.0 to 3.0.1.8 in compatibility testcase --- tests/system-test/0-others/compatibility.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index cda8bfb646..f44a6395e3 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -13,12 +13,12 @@ from util.dnodes import TDDnodes from util.dnodes import TDDnode from util.cluster import * - +BASEVERSION = "3.0.1.8" class TDTestCase: def caseDescription(self): ''' 3.0 data compatibility test - case1: basedata version is 3.0.1.0 + case1: basedata version is 3.0.1.8 ''' return @@ -62,8 +62,8 @@ class TDTestCase: # os.system(f"mv {self.getBuildPath()}/build/lib/libtaos.so.1 {self.getBuildPath()}/build/lib/libtaos.so.1_bak ") packagePath = "/usr/local/src/" - baseVersion = "3.0.1.8" - packageName = "TDengine-server-{baseVersion}-Linux-x64.tar.gz" + + packageName = "TDengine-server-"+ BASEVERSION + "-Linux-x64.tar.gz" packageTPath = packageName.split("-Linux-")[0] my_file = Path(f"{packagePath}/{packageName}") if not my_file.exists(): @@ -101,12 +101,11 @@ class TDTestCase: # oldServerVersion=tdsqlF.queryResult[0][0] # tdLog.info(f"Base server version is {oldServerVersion}") # tdsqlF.query(f"SELECT CLIENT_VERSION();") - # # the oldClientVersion can't be updated in the same python process,so the version is new compiled verison # oldClientVersion=tdsqlF.queryResult[0][0] # tdLog.info(f"Base client version is {oldClientVersion}") - oldServerVersion = "3.0.1.0" - tdLog.printNoPrefix(f"==========step1:prepare and check data in old version-{oldServerVersion}") + # baseVersion = "3.0.1.8" + tdLog.printNoPrefix(f"==========step1:prepare and check data in old version-{BASEVERSION}") tdLog.info(f" LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") os.system(f"LD_LIBRARY_PATH=/usr/lib taosBenchmark -t {tableNumbers} -n {recordNumbers1} -y ") sleep(3) From 3cbe109e4b17a325c60c748c75db558726cab641 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Wed, 30 Nov 2022 22:41:33 +0800 Subject: [PATCH 084/105] fix: initialize vnode state applyTerm with commitTerm in vnodeOpen --- source/dnode/vnode/src/vnd/vnodeCommit.c | 4 ++-- source/dnode/vnode/src/vnd/vnodeOpen.c | 9 +++------ source/dnode/vnode/src/vnd/vnodeSvr.c | 1 + source/libs/sync/src/syncPipeline.c | 7 +++++++ source/libs/sync/src/syncTimeout.c | 2 +- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/source/dnode/vnode/src/vnd/vnodeCommit.c b/source/dnode/vnode/src/vnd/vnodeCommit.c index 7040d2d7c8..4bdaf8d353 100644 --- a/source/dnode/vnode/src/vnd/vnodeCommit.c +++ b/source/dnode/vnode/src/vnd/vnodeCommit.c @@ -209,8 +209,8 @@ int vnodeCommit(SVnode *pVnode) { SVnodeInfo info = {0}; char dir[TSDB_FILENAME_LEN]; - vInfo("vgId:%d, start to commit, commit ID:%" PRId64 " version:%" PRId64, TD_VID(pVnode), pVnode->state.commitID, - pVnode->state.applied); + vInfo("vgId:%d, start to commit, commit ID:%" PRId64 " version:%" PRId64 " term: %" PRId64, TD_VID(pVnode), + pVnode->state.commitID, pVnode->state.applied, pVnode->state.applyTerm); // persist wal before starting if (walPersist(pVnode->pWal) < 0) { diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c index 77d375bc45..0ff4a46d44 100644 --- a/source/dnode/vnode/src/vnd/vnodeOpen.c +++ b/source/dnode/vnode/src/vnd/vnodeOpen.c @@ -144,9 +144,9 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) { pVnode->config = info.config; pVnode->state.committed = info.state.committed; pVnode->state.commitTerm = info.state.commitTerm; - pVnode->state.applied = info.state.committed; pVnode->state.commitID = info.state.commitID; - pVnode->state.commitTerm = info.state.commitTerm; + pVnode->state.applied = info.state.committed; + pVnode->state.applyTerm = info.state.commitTerm; pVnode->pTfs = pTfs; pVnode->msgCb = msgCb; taosThreadMutexInit(&pVnode->lock, NULL); @@ -269,10 +269,7 @@ void vnodeClose(SVnode *pVnode) { } // start the sync timer after the queue is ready -int32_t vnodeStart(SVnode *pVnode) { - vnodeSyncStart(pVnode); - return 0; -} +int32_t vnodeStart(SVnode *pVnode) { return vnodeSyncStart(pVnode); } void vnodeStop(SVnode *pVnode) {} diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 4248998d58..5c55296858 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -187,6 +187,7 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp vDebug("vgId:%d, start to process write request %s, index:%" PRId64, TD_VID(pVnode), TMSG_INFO(pMsg->msgType), version); + ASSERT(pVnode->state.applyTerm <= pMsg->info.conn.applyTerm); pVnode->state.applied = version; pVnode->state.applyTerm = pMsg->info.conn.applyTerm; diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index e655ed13c8..03306af925 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -224,6 +224,9 @@ int32_t syncLogBufferInitWithoutLock(SSyncLogBuffer* pBuf, SSyncNode* pNode) { // update startIndex pBuf->startIndex = takeDummy ? index : index + 1; + sInfo("vgId:%d, init sync log buffer. buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, + pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + // validate syncLogBufferValidate(pBuf); return 0; @@ -826,6 +829,10 @@ int32_t syncLogReplMgrReplicateAttemptedOnce(SSyncLogReplMgr* pMgr, SSyncNode* p pMgr->endIndex = index + 1; if (barrier) { + sInfo("vgId:%d, replicated sync barrier to dest: %" PRIx64 ". index: %" PRId64 ", term: %" PRId64 + ", repl mgr: rs(%d) [%" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pDestId->addr, index, term, pMgr->restored, pMgr->startIndex, pMgr->matchIndex, + pMgr->endIndex); break; } } diff --git a/source/libs/sync/src/syncTimeout.c b/source/libs/sync/src/syncTimeout.c index 73b5d7e79a..529fada467 100644 --- a/source/libs/sync/src/syncTimeout.c +++ b/source/libs/sync/src/syncTimeout.c @@ -52,7 +52,7 @@ static void syncNodeCleanConfigIndex(SSyncNode* ths) { } static int32_t syncNodeTimerRoutine(SSyncNode* ths) { - sNInfo(ths, "timer routines"); + sNDebug(ths, "timer routines"); // timer replicate syncNodeReplicate(ths); From de87d901f050f11d2e3e07c9371871f2d6f2dbff Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Thu, 1 Dec 2022 08:50:42 +0800 Subject: [PATCH 085/105] fix: build taosdump release by default for windows (#18594) * feat: taos-tools 2333455 * feat: taosdump for windows * feat: update taos-tools dd298d1 * feat: update taostools d4e4c28 * feat: taosdump for windows d4e4c28 * fix: update taos-tools 2aac500 * fix: update taos-tools 8334230 * fix: taosdump build release by default on windows --- cmake/taostools_CMakeLists.txt.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in index e0585f8d13..ed2ec0b6da 100644 --- a/cmake/taostools_CMakeLists.txt.in +++ b/cmake/taostools_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taos-tools ExternalProject_Add(taos-tools GIT_REPOSITORY https://github.com/taosdata/taos-tools.git - GIT_TAG 5445810 + GIT_TAG d5df76d SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE From 3d24b70ceb581d047f135f2bdbaef0b0c4674393 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Thu, 1 Dec 2022 09:46:19 +0800 Subject: [PATCH 086/105] test:modify base version from 3.0.1.0 to 3.0.1.8 in compatibility testcase --- tests/system-test/0-others/compatibility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index f44a6395e3..90d81ac955 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -75,7 +75,7 @@ class TDTestCase: tdDnodes.stop(1) print(f"start taosd: nohup taosd -c {cPath} & ") os.system(f" nohup taosd -c {cPath} & " ) - sleep(1) + sleep(5) From 5347eb4dec0540ffa7f62a8d6b02e93af8b40bc6 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 1 Dec 2022 10:31:44 +0800 Subject: [PATCH 087/105] more code --- source/dnode/vnode/src/tsdb/tsdbMemTable.c | 39 ++++++++++++++++------ 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index f16ec1bd80..b1f4e2d53a 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -585,8 +585,33 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, for (int32_t iColData = 1; iColData < nColData; ++iColData) { } + // loop to add each row to the skiplist + TSDBKEY key = {.version = version}; + SMemSkipListNode *pos[SL_MAX_LEVEL]; + int32_t iRow = 0; + TSDBROW row = tsdbRowFromBlockData(pBlockData, iRow); + // TODO - ASSERT(0); + tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_BACKWARD); + code = tbDataDoPut(pMemTable, pTbData, pos, version, NULL, 0); + if (code) goto _exit; + ++iRow; + + if (iRow < pBlockData->nRow) { + for (int8_t iLevel = pos[0]->level; iLevel < pTbData->sl.maxLevel; iLevel++) { + pos[iLevel] = SL_NODE_BACKWARD(pos[iLevel], iLevel); + } + + while (iRow < pBlockData->nRow) { + if (SL_NODE_FORWARD(pos[0], 0) != pTbData->sl.pTail) { + tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_FROM_POS); + } + + code = tbDataDoPut(pMemTable, pTbData, pos, version, NULL, 0); + if (code) goto _exit; + ++iRow; + } + } _exit: return code; @@ -610,9 +635,7 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, iRow++; tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_BACKWARD); code = tbDataDoPut(pMemTable, pTbData, pos, version, row.pTSRow, 0); - if (code) { - goto _err; - } + if (code) goto _exit; pTbData->minKey = TMIN(pTbData->minKey, key.ts); @@ -633,9 +656,7 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, } code = tbDataDoPut(pMemTable, pTbData, pos, version, row.pTSRow, 1); - if (code) { - goto _err; - } + if (code) goto _exit; pLastRow = row.pTSRow; @@ -664,9 +685,7 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, if (affectedRows) *affectedRows = nRow; - return code; - -_err: +_exit: return code; } From 16cd9db428ef2a066a125c478d4186630adc30d8 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 1 Dec 2022 10:42:08 +0800 Subject: [PATCH 088/105] more code --- source/common/src/tmsg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index 97b91cd6aa..b2e83d4538 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -6943,7 +6943,7 @@ _exit: } void tDestroySSubmitRsp2(SSubmitRsp2 *pRsp, int32_t flag) { - if (TSDB_MSG_FLG_ENCODE) { + if (flag & TSDB_MSG_FLG_ENCODE) { if (pRsp->aCreateTbRsp) { int32_t nCreateTbRsp = TARRAY_SIZE(pRsp->aCreateTbRsp); SVCreateTbRsp *aCreateTbRsp = TARRAY_DATA(pRsp->aCreateTbRsp); @@ -6954,7 +6954,7 @@ void tDestroySSubmitRsp2(SSubmitRsp2 *pRsp, int32_t flag) { } taosArrayDestroy(pRsp->aCreateTbRsp); } - } else if (TSDB_MSG_FLG_DECODE) { + } else if (flag & TSDB_MSG_FLG_DECODE) { // TODO taosArrayDestroy(pRsp->aCreateTbRsp); } From 31890adfbd8bcab9b5cbcd589e9295d032c25e32 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 1 Dec 2022 10:43:06 +0800 Subject: [PATCH 089/105] test: remove unstable case --- tests/parallel_test/cases.task | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 15648d2a92..e514b069a8 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -418,7 +418,7 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/fsync.py ,,n,system-test,python3 ./test.py -f 0-others/compatibility.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/alter_database.py -,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/influxdb_line_taosc_insert.py +#,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/influxdb_line_taosc_insert.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/opentsdb_telnet_line_taosc_insert.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/opentsdb_json_taosc_insert.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_stmt_muti_insert_query.py From fc50d94156ca3d95d08c775c9a69d425e2c21e2e Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 1 Dec 2022 11:45:26 +0800 Subject: [PATCH 090/105] more coe --- source/dnode/vnode/src/inc/tsdb.h | 32 ++++++--- source/dnode/vnode/src/tsdb/tsdbMemTable.c | 76 +++++++++++++--------- 2 files changed, 68 insertions(+), 40 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index ed71891783..b9ca91f6b5 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -70,6 +70,9 @@ typedef struct SDiskData SDiskData; typedef struct SDiskDataBuilder SDiskDataBuilder; typedef struct SBlkInfo SBlkInfo; +#define TSDBROW_ROW_FMT ((int8_t)0x0) +#define TSDBROW_COL_FMT ((int8_t)0x1) + #define TSDB_FILE_DLMT ((uint32_t)0xF00AFA0F) #define TSDB_MAX_SUBBLOCKS 8 #define TSDB_FHDR_SIZE 512 @@ -102,12 +105,13 @@ static FORCE_INLINE int64_t tsdbLogicToFileSize(int64_t lSize, int32_t szPage) { // tsdbUtil.c ============================================================================================== // TSDBROW -#define TSDBROW_TS(ROW) (((ROW)->type == 0) ? (ROW)->pTSRow->ts : (ROW)->pBlockData->aTSKEY[(ROW)->iRow]) -#define TSDBROW_VERSION(ROW) (((ROW)->type == 0) ? (ROW)->version : (ROW)->pBlockData->aVersion[(ROW)->iRow]) -#define TSDBROW_SVERSION(ROW) TD_ROW_SVER((ROW)->pTSRow) -#define TSDBROW_KEY(ROW) ((TSDBKEY){.version = TSDBROW_VERSION(ROW), .ts = TSDBROW_TS(ROW)}) -#define tsdbRowFromTSRow(VERSION, TSROW) ((TSDBROW){.type = 0, .version = (VERSION), .pTSRow = (TSROW)}) -#define tsdbRowFromBlockData(BLOCKDATA, IROW) ((TSDBROW){.type = 1, .pBlockData = (BLOCKDATA), .iRow = (IROW)}) +#define TSDBROW_TS(ROW) (((ROW)->type == 0) ? (ROW)->pTSRow->ts : (ROW)->pBlockData->aTSKEY[(ROW)->iRow]) +#define TSDBROW_VERSION(ROW) (((ROW)->type == 0) ? (ROW)->version : (ROW)->pBlockData->aVersion[(ROW)->iRow]) +#define TSDBROW_SVERSION(ROW) TD_ROW_SVER((ROW)->pTSRow) +#define TSDBROW_KEY(ROW) ((TSDBKEY){.version = TSDBROW_VERSION(ROW), .ts = TSDBROW_TS(ROW)}) +#define tsdbRowFromTSRow(VERSION, TSROW) ((TSDBROW){.type = TSDBROW_ROW_FMT, .version = (VERSION), .pTSRow = (TSROW)}) +#define tsdbRowFromBlockData(BLOCKDATA, IROW) \ + ((TSDBROW){.type = TSDBROW_COL_FMT, .pBlockData = (BLOCKDATA), .iRow = (IROW)}) void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal); // int32_t tPutTSDBRow(uint8_t *p, TSDBROW *pRow); int32_t tsdbRowCmprFn(const void *p1, const void *p2); @@ -335,10 +339,13 @@ struct SVersionRange { typedef struct SMemSkipListNode SMemSkipListNode; struct SMemSkipListNode { int8_t level; + int8_t flag; // TSDBROW_ROW_FMT for row format, TSDBROW_COL_FMT for col format + int32_t iRow; int64_t version; - SRow *pTSRow; + void *pData; SMemSkipListNode *forwards[0]; }; + typedef struct SMemSkipList { int64_t size; uint32_t seed; @@ -376,7 +383,7 @@ struct SMemTable { }; struct TSDBROW { - int8_t type; // 0 for row from tsRow, 1 for row from block data + int8_t type; // TSDBROW_ROW_FMT for row from tsRow, TSDBROW_COL_FMT for row from block data union { struct { int64_t version; @@ -795,8 +802,13 @@ static FORCE_INLINE TSDBROW *tsdbTbDataIterGet(STbDataIter *pIter) { } pIter->pRow = &pIter->row; - pIter->pRow->version = pIter->pNode->version; - pIter->pRow->pTSRow = pIter->pNode->pTSRow; + if (pIter->pNode->flag == TSDBROW_ROW_FMT) { + pIter->row = tsdbRowFromTSRow(pIter->pNode->version, pIter->pNode->pData); + } else if (pIter->pNode->flag == TSDBROW_COL_FMT) { + pIter->row = tsdbRowFromBlockData(pIter->pNode->pData, pIter->pNode->iRow); + } else { + ASSERT(0); + } return pIter->pRow; } diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index b1f4e2d53a..f69e9e23b9 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -247,7 +247,6 @@ void tsdbTbDataIterOpen(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDa pIter->pTbData = pTbData; pIter->backward = backward; pIter->pRow = NULL; - pIter->row.type = 0; if (pFrom == NULL) { // create from head or tail if (backward) { @@ -415,8 +414,13 @@ static void tbDataMovePosTo(STbData *pTbData, SMemSkipListNode **pos, TSDBKEY *p for (int8_t iLevel = pTbData->sl.level - 1; iLevel >= 0; iLevel--) { pn = SL_NODE_BACKWARD(px, iLevel); while (pn != pTbData->sl.pHead) { - tKey.version = pn->version; - tKey.ts = pn->pTSRow->ts; + if (pn->flag == TSDBROW_ROW_FMT) { + tKey.version = pn->version; + tKey.ts = ((SRow *)pn->pData)->ts; + } else if (pn->flag == TSDBROW_COL_FMT) { + tKey.version = ((SBlockData *)pn->pData)->aVersion[pn->iRow]; + tKey.ts = ((SBlockData *)pn->pData)->aTSKEY[pn->iRow]; + } int32_t c = tsdbKeyCmprFn(&tKey, pKey); if (c <= 0) { @@ -445,8 +449,13 @@ static void tbDataMovePosTo(STbData *pTbData, SMemSkipListNode **pos, TSDBKEY *p for (int8_t iLevel = pTbData->sl.level - 1; iLevel >= 0; iLevel--) { pn = SL_NODE_FORWARD(px, iLevel); while (pn != pTbData->sl.pTail) { - tKey.version = pn->version; - tKey.ts = pn->pTSRow->ts; + if (pn->flag == TSDBROW_ROW_FMT) { + tKey.version = pn->version; + tKey.ts = ((SRow *)pn->pData)->ts; + } else if (pn->flag == TSDBROW_COL_FMT) { + tKey.version = ((SBlockData *)pn->pData)->aVersion[pn->iRow]; + tKey.ts = ((SBlockData *)pn->pData)->aTSKEY[pn->iRow]; + } int32_t c = tsdbKeyCmprFn(&tKey, pKey); if (c >= 0) { @@ -473,29 +482,37 @@ static FORCE_INLINE int8_t tsdbMemSkipListRandLevel(SMemSkipList *pSl) { return level; } -static int32_t tbDataDoPut(SMemTable *pMemTable, STbData *pTbData, SMemSkipListNode **pos, int64_t version, SRow *pRow, +static int32_t tbDataDoPut(SMemTable *pMemTable, STbData *pTbData, SMemSkipListNode **pos, TSDBROW *pRow, int8_t forward) { int32_t code = 0; int8_t level; SMemSkipListNode *pNode; SVBufPool *pPool = pMemTable->pTsdb->pVnode->inUse; + ASSERT(pPool != NULL); + // node level = tsdbMemSkipListRandLevel(&pTbData->sl); - ASSERT(pPool != NULL); pNode = (SMemSkipListNode *)vnodeBufPoolMalloc(pPool, SL_NODE_SIZE(level)); if (pNode == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _exit; } pNode->level = level; - pNode->version = version; - pNode->pTSRow = vnodeBufPoolMalloc(pPool, pRow->len); - if (NULL == pNode->pTSRow) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _exit; + pNode->flag = pRow->type; + + if (pRow->type == TSDBROW_ROW_FMT) { + pNode->version = pRow->version; + pNode->pData = vnodeBufPoolMalloc(pPool, pRow->pTSRow->len); + if (NULL == pNode->pData) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + memcpy(pNode->pData, pRow->pTSRow, pRow->pTSRow->len); + } else if (pRow->type == TSDBROW_COL_FMT) { + pNode->iRow = pRow->iRow; + pNode->pData = pRow->pBlockData; } - memcpy(pNode->pTSRow, pRow, pRow->len); for (int8_t iLevel = level - 1; iLevel >= 0; iLevel--) { SMemSkipListNode *pn = pos[iLevel]; @@ -589,13 +606,12 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, TSDBKEY key = {.version = version}; SMemSkipListNode *pos[SL_MAX_LEVEL]; int32_t iRow = 0; - TSDBROW row = tsdbRowFromBlockData(pBlockData, iRow); + TSDBROW tRow = {.type = TSDBROW_COL_FMT, .pBlockData = pBlockData}; - // TODO + tRow.iRow = iRow++; tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_BACKWARD); - code = tbDataDoPut(pMemTable, pTbData, pos, version, NULL, 0); + code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0); if (code) goto _exit; - ++iRow; if (iRow < pBlockData->nRow) { for (int8_t iLevel = pos[0]->level; iLevel < pTbData->sl.maxLevel; iLevel++) { @@ -607,9 +623,9 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_FROM_POS); } - code = tbDataDoPut(pMemTable, pTbData, pos, version, NULL, 0); + tRow.iRow = ++iRow; + code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0); if (code) goto _exit; - ++iRow; } } @@ -621,25 +637,25 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, SSubmitTbData *pSubmitTbData, int32_t *affectedRows) { int32_t code = 0; - SRow **rows = (SRow **)TARRAY_DATA(pSubmitTbData->aRowP); + int32_t nRow = TARRAY_SIZE(pSubmitTbData->aRowP); + SRow **aRow = (SRow **)TARRAY_DATA(pSubmitTbData->aRowP); TSDBKEY key = {.version = version}; SMemSkipListNode *pos[SL_MAX_LEVEL]; - TSDBROW row = tsdbRowFromTSRow(version, NULL); - int32_t nRow = TARRAY_SIZE(pSubmitTbData->aRowP); + TSDBROW tRow = {.type = TSDBROW_ROW_FMT, .version = version}; int32_t iRow = 0; SRow *pLastRow = NULL; // backward put first data - row.pTSRow = rows[iRow]; - key.ts = row.pTSRow->ts; + tRow.pTSRow = aRow[iRow]; + key.ts = aRow[iRow]->ts; iRow++; tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_BACKWARD); - code = tbDataDoPut(pMemTable, pTbData, pos, version, row.pTSRow, 0); + code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0); if (code) goto _exit; pTbData->minKey = TMIN(pTbData->minKey, key.ts); - pLastRow = row.pTSRow; + pLastRow = tRow.pTSRow; // forward put rest data if (iRow < nRow) { @@ -648,17 +664,17 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, } while (iRow < nRow) { - row.pTSRow = rows[iRow]; - key.ts = row.pTSRow->ts; + tRow.pTSRow = aRow[iRow]; + key.ts = tRow.pTSRow->ts; if (SL_NODE_FORWARD(pos[0], 0) != pTbData->sl.pTail) { tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_FROM_POS); } - code = tbDataDoPut(pMemTable, pTbData, pos, version, row.pTSRow, 1); + code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 1); if (code) goto _exit; - pLastRow = row.pTSRow; + pLastRow = tRow.pTSRow; iRow++; } From 7765f542d3882d9854f866bbbd9c27b7113ab84c Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 1 Dec 2022 11:53:29 +0800 Subject: [PATCH 091/105] more code --- source/dnode/vnode/src/tsdb/tsdbMemTable.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index f69e9e23b9..5c91c80827 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -512,6 +512,8 @@ static int32_t tbDataDoPut(SMemTable *pMemTable, STbData *pTbData, SMemSkipListN } else if (pRow->type == TSDBROW_COL_FMT) { pNode->iRow = pRow->iRow; pNode->pData = pRow->pBlockData; + } else { + ASSERT(0); } for (int8_t iLevel = level - 1; iLevel >= 0; iLevel--) { @@ -605,27 +607,29 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, // loop to add each row to the skiplist TSDBKEY key = {.version = version}; SMemSkipListNode *pos[SL_MAX_LEVEL]; - int32_t iRow = 0; TSDBROW tRow = {.type = TSDBROW_COL_FMT, .pBlockData = pBlockData}; - tRow.iRow = iRow++; tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_BACKWARD); code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0); if (code) goto _exit; - if (iRow < pBlockData->nRow) { + tRow.iRow++; + if (tRow.iRow < pBlockData->nRow) { for (int8_t iLevel = pos[0]->level; iLevel < pTbData->sl.maxLevel; iLevel++) { pos[iLevel] = SL_NODE_BACKWARD(pos[iLevel], iLevel); } - while (iRow < pBlockData->nRow) { + while (tRow.iRow < pBlockData->nRow) { + key.ts = pBlockData->aTSKEY[tRow.iRow]; + if (SL_NODE_FORWARD(pos[0], 0) != pTbData->sl.pTail) { tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_FROM_POS); } - tRow.iRow = ++iRow; code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0); if (code) goto _exit; + + tRow.iRow++; } } From f5bebc53f16ba03b3d72da7eb32568499fb47e74 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Thu, 1 Dec 2022 12:53:38 +0800 Subject: [PATCH 092/105] refactor(sync): add traceId log --- source/libs/sync/inc/syncUtil.h | 7 ++++--- source/libs/sync/src/syncMain.c | 12 ++++++++++-- source/libs/sync/src/syncUtil.c | 21 +++++++++++---------- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/source/libs/sync/inc/syncUtil.h b/source/libs/sync/inc/syncUtil.h index ce6ff25c89..f198f3809d 100644 --- a/source/libs/sync/inc/syncUtil.h +++ b/source/libs/sync/inc/syncUtil.h @@ -94,11 +94,12 @@ void syncLogRecvLocalCmd(SSyncNode* pSyncNode, const SyncLocalCmd* pMsg, const c void syncLogSendAppendEntriesReply(SSyncNode* pSyncNode, const SyncAppendEntriesReply* pMsg, const char* s); void syncLogRecvAppendEntriesReply(SSyncNode* pSyncNode, const SyncAppendEntriesReply* pMsg, const char* s); -void syncLogSendHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, bool printX, int64_t timerElapsed, int64_t execTime); -void syncLogRecvHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, int64_t timeDiff); +void syncLogSendHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, bool printX, int64_t timerElapsed, + int64_t execTime); +void syncLogRecvHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, int64_t timeDiff, const char* s); void syncLogSendHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* pMsg, const char* s); -void syncLogRecvHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* pMsg, int64_t timeDiff); +void syncLogRecvHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* pMsg, int64_t timeDiff, const char* s); void syncLogSendSyncPreSnapshot(SSyncNode* pSyncNode, const SyncPreSnapshot* pMsg, const char* s); void syncLogRecvSyncPreSnapshot(SSyncNode* pSyncNode, const SyncPreSnapshot* pMsg, const char* s); diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 9d85943c36..3f0d6b935f 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -2266,9 +2266,13 @@ static int32_t syncNodeAppendNoop(SSyncNode* ths) { int32_t syncNodeOnHeartbeat(SSyncNode* ths, const SRpcMsg* pRpcMsg) { SyncHeartbeat* pMsg = pRpcMsg->pCont; + const STraceId* trace = &pRpcMsg->info.traceId; + char tbuf[40] = {0}; + TRACE_TO_STR(trace, tbuf); + int64_t tsMs = taosGetTimestampMs(); int64_t timeDiff = tsMs - pMsg->timeStamp; - syncLogRecvHeartbeat(ths, pMsg, timeDiff); + syncLogRecvHeartbeat(ths, pMsg, timeDiff, tbuf); SRpcMsg rpcMsg = {0}; (void)syncBuildHeartbeatReply(&rpcMsg, ths->vgId); @@ -2343,9 +2347,13 @@ int32_t syncNodeOnHeartbeat(SSyncNode* ths, const SRpcMsg* pRpcMsg) { int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) { SyncHeartbeatReply* pMsg = pRpcMsg->pCont; + const STraceId* trace = &pRpcMsg->info.traceId; + char tbuf[40] = {0}; + TRACE_TO_STR(trace, tbuf); + int64_t tsMs = taosGetTimestampMs(); int64_t timeDiff = tsMs - pMsg->timeStamp; - syncLogRecvHeartbeatReply(ths, pMsg, timeDiff); + syncLogRecvHeartbeatReply(ths, pMsg, timeDiff, tbuf); // update last reply time, make decision whether the other node is alive or not syncIndexMgrSetRecvTime(ths->pMatchIndex, &pMsg->srcId, tsMs); diff --git a/source/libs/sync/src/syncUtil.c b/source/libs/sync/src/syncUtil.c index 4cd3a53283..ecaa9c92b8 100644 --- a/source/libs/sync/src/syncUtil.c +++ b/source/libs/sync/src/syncUtil.c @@ -464,7 +464,7 @@ void syncLogSendHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, bool } } -void syncLogRecvHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, int64_t timeDiff) { +void syncLogRecvHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, int64_t timeDiff, const char* s) { if (timeDiff > SYNC_HEARTBEAT_SLOW_MS) { pSyncNode->hbSlowNum++; @@ -473,8 +473,8 @@ void syncLogRecvHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, int64 syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); sNInfo(pSyncNode, "recv sync-heartbeat from %s:%d slow {term:%" PRId64 ", cmt:%" PRId64 ", min-match:%" PRId64 ", ts:%" PRId64 - "}, net elapsed:%" PRId64, - host, port, pMsg->term, pMsg->commitIndex, pMsg->minMatchIndex, pMsg->timeStamp, timeDiff); + "}, %s, net elapsed:%" PRId64, + host, port, pMsg->term, pMsg->commitIndex, pMsg->minMatchIndex, pMsg->timeStamp, s, timeDiff); } if (!(sDebugFlag & DEBUG_TRACE)) return; @@ -484,8 +484,8 @@ void syncLogRecvHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, int64 syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); sNTrace(pSyncNode, "recv sync-heartbeat from %s:%d {term:%" PRId64 ", cmt:%" PRId64 ", min-match:%" PRId64 ", ts:%" PRId64 - "}, net elapsed:%" PRId64, - host, port, pMsg->term, pMsg->commitIndex, pMsg->minMatchIndex, pMsg->timeStamp, timeDiff); + "}, %s, net elapsed:%" PRId64, + host, port, pMsg->term, pMsg->commitIndex, pMsg->minMatchIndex, pMsg->timeStamp, s, timeDiff); } void syncLogSendHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* pMsg, const char* s) { @@ -499,7 +499,7 @@ void syncLogSendHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* p pMsg->term, pMsg->timeStamp, s); } -void syncLogRecvHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* pMsg, int64_t timeDiff) { +void syncLogRecvHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* pMsg, int64_t timeDiff, const char* s) { if (timeDiff > SYNC_HEARTBEAT_REPLY_SLOW_MS) { pSyncNode->hbrSlowNum++; @@ -507,8 +507,8 @@ void syncLogRecvHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* p uint16_t port; syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); sNTrace(pSyncNode, - "recv sync-heartbeat-reply from %s:%d slow {term:%" PRId64 ", ts:%" PRId64 "}, net elapsed:%" PRId64, host, - port, pMsg->term, pMsg->timeStamp, timeDiff); + "recv sync-heartbeat-reply from %s:%d slow {term:%" PRId64 ", ts:%" PRId64 "}, %s, net elapsed:%" PRId64, + host, port, pMsg->term, pMsg->timeStamp, s, timeDiff); } if (!(sDebugFlag & DEBUG_TRACE)) return; @@ -516,8 +516,9 @@ void syncLogRecvHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* p char host[64]; uint16_t port; syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port); - sNTrace(pSyncNode, "recv sync-heartbeat-reply from %s:%d {term:%" PRId64 ", ts:%" PRId64 "}, net elapsed:%" PRId64, - host, port, pMsg->term, pMsg->timeStamp, timeDiff); + sNTrace(pSyncNode, + "recv sync-heartbeat-reply from %s:%d {term:%" PRId64 ", ts:%" PRId64 "}, %s, net elapsed:%" PRId64, host, + port, pMsg->term, pMsg->timeStamp, s, timeDiff); } void syncLogSendSyncPreSnapshot(SSyncNode* pSyncNode, const SyncPreSnapshot* pMsg, const char* s) { From 86d5cba6be9905afdd78f6e68d61a04447a1e3e6 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Thu, 1 Dec 2022 13:34:33 +0800 Subject: [PATCH 093/105] refactor(sync): delete code wait snapshot end in pre-close --- source/dnode/mnode/impl/src/mndMain.c | 3 ++- source/dnode/vnode/src/vnd/vnodeSync.c | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index f533fafeee..e940b68c37 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -491,7 +491,7 @@ void mndPreClose(SMnode *pMnode) { if (pMnode != NULL) { syncLeaderTransfer(pMnode->syncMgmt.sync); syncPreStop(pMnode->syncMgmt.sync); - +#if 0 while (syncSnapshotRecving(pMnode->syncMgmt.sync)) { mInfo("vgId:1, snapshot is recving"); taosMsleep(300); @@ -500,6 +500,7 @@ void mndPreClose(SMnode *pMnode) { mInfo("vgId:1, snapshot is sending"); taosMsleep(300); } +#endif } } diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index dd382411c1..dcf4e7bc3e 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -515,7 +515,7 @@ void vnodeSyncPreClose(SVnode *pVnode) { vInfo("vgId:%d, pre close sync", pVnode->config.vgId); syncLeaderTransfer(pVnode->sync); syncPreStop(pVnode->sync); - +#if 0 while (syncSnapshotRecving(pVnode->sync)) { vInfo("vgId:%d, snapshot is recving", pVnode->config.vgId); taosMsleep(300); @@ -524,7 +524,7 @@ void vnodeSyncPreClose(SVnode *pVnode) { vInfo("vgId:%d, snapshot is sending", pVnode->config.vgId); taosMsleep(300); } - +#endif taosThreadMutexLock(&pVnode->lock); if (pVnode->blocked) { vInfo("vgId:%d, post block after close sync", pVnode->config.vgId); From 915e9a8ae294f1137a0de3a2dab8f6dbee269340 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 1 Dec 2022 13:39:59 +0800 Subject: [PATCH 094/105] adjust more code --- source/dnode/vnode/src/tsdb/tsdbMemTable.c | 51 +++++++++++++++------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index 5c91c80827..1367ad67c8 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -602,18 +602,23 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, pBlockData->nColData = nColData - 1; for (int32_t iColData = 1; iColData < nColData; ++iColData) { + // todo } // loop to add each row to the skiplist - TSDBKEY key = {.version = version}; SMemSkipListNode *pos[SL_MAX_LEVEL]; - TSDBROW tRow = {.type = TSDBROW_COL_FMT, .pBlockData = pBlockData}; + TSDBROW tRow = tsdbRowFromBlockData(pBlockData, 0); + TSDBKEY key = {.version = version, .ts = pBlockData->aTSKEY[0]}; + TSDBROW lRow; // last row + // first row tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_BACKWARD); - code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0); - if (code) goto _exit; + if ((code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0))) goto _exit; + pTbData->minKey = TMIN(pTbData->minKey, key.ts); + lRow = tRow; - tRow.iRow++; + // remain row + ++tRow.iRow; if (tRow.iRow < pBlockData->nRow) { for (int8_t iLevel = pos[0]->level; iLevel < pTbData->sl.maxLevel; iLevel++) { pos[iLevel] = SL_NODE_BACKWARD(pos[iLevel], iLevel); @@ -626,13 +631,32 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_FROM_POS); } - code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0); - if (code) goto _exit; + if ((code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0))) goto _exit; + lRow = tRow; - tRow.iRow++; + ++tRow.iRow; } } + if (key.ts >= pTbData->maxKey) { + pTbData->maxKey = key.ts; + + // if (TSDB_CACHE_LAST_ROW(pMemTable->pTsdb->pVnode->config) && pLastRow != NULL) { + // tsdbCacheInsertLastrow(pMemTable->pTsdb->lruCache, pMemTable->pTsdb, pTbData->uid, pLastRow, true); + // } + } + + if (TSDB_CACHE_LAST(pMemTable->pTsdb->pVnode->config)) { + // tsdbCacheInsertLast(pMemTable->pTsdb->lruCache, pTbData->uid, pLastRow, pMemTable->pTsdb); + } + + // SMemTable + pMemTable->minKey = TMIN(pMemTable->minKey, pTbData->minKey); + pMemTable->maxKey = TMAX(pMemTable->maxKey, pTbData->maxKey); + pMemTable->nRow += pBlockData->nRow; + + if (affectedRows) *affectedRows = pBlockData->nRow; + _exit: return code; } @@ -650,9 +674,8 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, SRow *pLastRow = NULL; // backward put first data - tRow.pTSRow = aRow[iRow]; - key.ts = aRow[iRow]->ts; - iRow++; + tRow.pTSRow = aRow[iRow++]; + key.ts = tRow.pTSRow->ts; tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_BACKWARD); code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0); if (code) goto _exit; @@ -668,7 +691,7 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, } while (iRow < nRow) { - tRow.pTSRow = aRow[iRow]; + tRow.pTSRow = aRow[iRow++]; key.ts = tRow.pTSRow->ts; if (SL_NODE_FORWARD(pos[0], 0) != pTbData->sl.pTail) { @@ -685,9 +708,7 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, } if (key.ts >= pTbData->maxKey) { - if (key.ts > pTbData->maxKey) { - pTbData->maxKey = key.ts; - } + pTbData->maxKey = key.ts; if (TSDB_CACHE_LAST_ROW(pMemTable->pTsdb->pVnode->config) && pLastRow != NULL) { tsdbCacheInsertLastrow(pMemTable->pTsdb->lruCache, pMemTable->pTsdb, pTbData->uid, pLastRow, true); From 2cccc3d18ed8125d09766ff47609c0c4f631eb4a Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 1 Dec 2022 13:48:51 +0800 Subject: [PATCH 095/105] test: adjust test case (add leader**) --- .../6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py | 6 +++--- .../vnode/4dnode1mnode_basic_replica1_insertdatas.py | 4 ++-- .../vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py | 4 ++-- .../vnode/4dnode1mnode_basic_replica3_insertdatas.py | 4 ++-- .../vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py | 4 ++-- ...ic_replica3_insertdatas_querys_loop_restart_all_vnode.py | 4 ++-- ...sic_replica3_insertdatas_querys_loop_restart_follower.py | 4 ++-- ...basic_replica3_insertdatas_querys_loop_restart_leader.py | 4 ++-- ...e1mnode_basic_replica3_insertdatas_stop_follower_sync.py | 4 ++-- ...mnode_basic_replica3_insertdatas_stop_follower_unsync.py | 4 ++-- ..._replica3_insertdatas_stop_follower_unsync_force_stop.py | 4 ++-- ...de_basic_replica3_insertdatas_stop_leader_forece_stop.py | 4 ++-- ...4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py | 4 ++-- .../6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py | 4 ++-- .../vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py | 4 ++-- 15 files changed, 31 insertions(+), 31 deletions(-) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py index 19239513d6..139be74a08 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py @@ -62,7 +62,7 @@ class TDTestCase: # only for 1 mnode mnode_name = k - if v[2] in ['leader', 'leader*']: + if v[2] in ['leader', 'leader*', 'leader**']: is_leader=True if count==1 and is_leader: @@ -111,12 +111,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader', 'leader*', 'follower']: + if role in ['leader', 'leader*', 'leader**', 'follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) ==1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py index f27c343329..4a0522ad35 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py @@ -116,12 +116,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader', 'leader*', 'leader**', 'follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.notice(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py index 671010db9a..82ba256122 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py @@ -117,12 +117,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader', 'leader*', 'leader**', 'follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.notice(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py index 0537d824b9..3751391d65 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py @@ -116,12 +116,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader', 'leader*', 'leader**', 'follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.notice(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py index d054e25e46..24b4ff63dd 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py @@ -117,12 +117,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader', 'leader*', 'leader**', 'follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.notice(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py index 2eb631d433..6ef239382b 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py @@ -120,12 +120,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader', 'leader*', 'leader**', 'follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py index 2993ce3a4a..35ea3f392c 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py @@ -120,12 +120,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader', 'leader*', 'leader**', 'follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.notice(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py index d9a84db6a2..ab5d05f362 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py @@ -120,12 +120,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader', 'leader*', 'leader**', 'follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.notice(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py index 74181bc563..6e9aacebc2 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py @@ -125,12 +125,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader', 'leader*', 'leader**', 'follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.notice(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py index f1275dcecc..a55bc3c39f 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py @@ -125,12 +125,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader', 'leader*', 'leader**', 'follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.notice(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py index b48fed77ee..dd8b6b374a 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py @@ -125,12 +125,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader','leader*', 'leader**','follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.info(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py index 6308e67068..124bf838bb 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py @@ -208,12 +208,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader','leader*', 'leader**','follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.notice(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py index ea5c4679a9..791b58d28d 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py @@ -117,12 +117,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader','leader*', 'leader**','follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py index 1f994e3350..53a9463d64 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py @@ -116,12 +116,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader', 'leader*', 'leader**', 'follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.notice(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py index 56131f24be..ddb765085a 100644 --- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py +++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py @@ -119,12 +119,12 @@ class TDTestCase: vgroup_id = vgroup_info[0] tmp_list = [] for role in vgroup_info[3:-4]: - if role in ['leader','leader*','follower']: + if role in ['leader', 'leader*', 'leader**', 'follower']: tmp_list.append(role) vgroups_infos[vgroup_id]=tmp_list for k , v in vgroups_infos.items(): - if len(v) ==1 and v[0] in ['leader', 'leader*']: + if len(v) == 1 and v[0] in ['leader', 'leader*', 'leader**']: tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k)) else: tdLog.notice(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k)) From bccb31aced6e5dfcb95d39c256a3810dccc7e651 Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao@163.com> Date: Thu, 1 Dec 2022 14:15:50 +0800 Subject: [PATCH 096/105] fix:stream crash && add debug log --- source/libs/executor/inc/executorimpl.h | 1 + source/libs/executor/src/filloperator.c | 4 ++-- source/libs/executor/src/scanoperator.c | 2 +- source/libs/executor/src/timewindowoperator.c | 9 ++++++++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h index f17d7f6468..7100be58e3 100644 --- a/source/libs/executor/inc/executorimpl.h +++ b/source/libs/executor/inc/executorimpl.h @@ -536,6 +536,7 @@ typedef struct SStreamIntervalOperatorInfo { SArray* pChildren; SStreamState* pState; SWinKey delKey; + uint64_t numOfDatapack; } SStreamIntervalOperatorInfo; typedef struct SDataGroupInfo { diff --git a/source/libs/executor/src/filloperator.c b/source/libs/executor/src/filloperator.c index e26bfe9889..5ed26f627a 100644 --- a/source/libs/executor/src/filloperator.c +++ b/source/libs/executor/src/filloperator.c @@ -1146,7 +1146,7 @@ static void doDeleteFillResult(SOperatorInfo* pOperator) { if (delTs > nextKey.ts) { break; } - endTs = delTs; + SWinKey delKey = {.groupId = delGroupId, .ts = delTs}; if (delTs == nextKey.ts) { code = streamStateCurNext(pOperator->pTaskInfo->streamInfo.pState, pCur); @@ -1159,7 +1159,7 @@ static void doDeleteFillResult(SOperatorInfo* pOperator) { streamStateFreeCur(pCur); pCur = streamStateGetAndCheckCur(pOperator->pTaskInfo->streamInfo.pState, &nextKey); } - endTs = TMAX(ts, nextKey.ts - 1); + endTs = TMAX(delTs, nextKey.ts - 1); if (code != TSDB_CODE_SUCCESS) { break; } diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index b6353061fb..7f0dec1959 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -1113,7 +1113,7 @@ static STimeWindow getSlidingWindow(TSKEY* startTsCol, TSKEY* endTsCol, uint64_t if (hasGroup) { (*pRowIndex) += 1; } else { - while ((groupId == gpIdCol[(*pRowIndex)] && startTsCol[*pRowIndex] < endWin.ekey)) { + while ((groupId == gpIdCol[(*pRowIndex)] && startTsCol[*pRowIndex] <= endWin.ekey)) { (*pRowIndex) += 1; if ((*pRowIndex) == pDataBlockInfo->rows) { break; diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index f2c2e24a41..5cf0d31117 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -2516,9 +2516,11 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); if (pBlock == NULL) { pOperator->status = OP_RES_TO_RETURN; - qDebug("%s return data", IS_FINAL_OP(pInfo) ? "interval final" : "interval semi"); + qDebug("===stream===return data:%s. recv datablock num:%" PRIu64 , IS_FINAL_OP(pInfo) ? "interval final" : "interval semi", pInfo->numOfDatapack); + pInfo->numOfDatapack = 0; break; } + pInfo->numOfDatapack++; printDataBlock(pBlock, IS_FINAL_OP(pInfo) ? "interval final recv" : "interval semi recv"); ASSERT(pBlock->info.type != STREAM_INVERT); @@ -2734,6 +2736,7 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, pInfo->pDelWins = taosArrayInit(4, sizeof(SWinKey)); pInfo->delKey.ts = INT64_MAX; pInfo->delKey.groupId = 0; + pInfo->numOfDatapack = 0; pOperator->operatorType = pPhyNode->type; pOperator->blocking = true; @@ -4700,8 +4703,11 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { while (1) { SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); if (pBlock == NULL) { + qDebug("===stream===return data:single interval. recv datablock num:%" PRIu64, pInfo->numOfDatapack); + pInfo->numOfDatapack = 0; break; } + pInfo->numOfDatapack++; printDataBlock(pBlock, "single interval recv"); if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT || @@ -4851,6 +4857,7 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys pInfo->pChildren = NULL; pInfo->delKey.ts = INT64_MAX; pInfo->delKey.groupId = 0; + pInfo->numOfDatapack = 0; setOperatorInfo(pOperator, "StreamIntervalOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL, true, OP_NOT_OPENED, pInfo, pTaskInfo); From 73f8dc6a5b7bb95e3c4cf68c66d482d552eafced Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 1 Dec 2022 14:24:10 +0800 Subject: [PATCH 097/105] more code --- source/dnode/vnode/src/inc/tsdb.h | 2 +- source/dnode/vnode/src/tsdb/tsdbCache.c | 6 +++--- source/dnode/vnode/src/tsdb/tsdbCommit.c | 8 ++++---- source/dnode/vnode/src/tsdb/tsdbMemTable.c | 8 ++++---- source/dnode/vnode/src/tsdb/tsdbMergeTree.c | 12 +++++------ source/dnode/vnode/src/tsdb/tsdbRead.c | 4 ++-- source/dnode/vnode/src/tsdb/tsdbSnapshot.c | 22 ++++++++++----------- source/dnode/vnode/src/tsdb/tsdbUtil.c | 4 ++-- 8 files changed, 33 insertions(+), 33 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index b9ca91f6b5..19a47646b5 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -156,7 +156,7 @@ int32_t tCmprBlockL(void const *lhs, void const *rhs); #define tBlockDataLastKey(PBLOCKDATA) TSDBROW_KEY(&tBlockDataLastRow(PBLOCKDATA)) int32_t tBlockDataCreate(SBlockData *pBlockData); -void tBlockDataDestroy(SBlockData *pBlockData, int8_t deepClear); +void tBlockDataDestroy(SBlockData *pBlockData); int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema, int16_t *aCid, int32_t nCid); void tBlockDataReset(SBlockData *pBlockData); int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema, int64_t uid); diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 76b45ffec7..6d04bee093 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -672,7 +672,7 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) { } else { // tBlockDataDestroy(&state->blockData, 1); if (state->pBlockData) { - tBlockDataDestroy(state->pBlockData, 1); + tBlockDataDestroy(state->pBlockData); state->pBlockData = NULL; } @@ -794,7 +794,7 @@ _err: state->aBlockIdx = NULL; } if (state->pBlockData) { - tBlockDataDestroy(state->pBlockData, 1); + tBlockDataDestroy(state->pBlockData); state->pBlockData = NULL; } @@ -821,7 +821,7 @@ int32_t clearNextRowFromFS(void *iter) { } if (state->pBlockData) { // tBlockDataDestroy(&state->blockData, 1); - tBlockDataDestroy(state->pBlockData, 1); + tBlockDataDestroy(state->pBlockData); state->pBlockData = NULL; } diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index cf9ae30ff0..4bff58f2a7 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -903,24 +903,24 @@ static void tsdbCommitDataEnd(SCommitter *pCommitter) { // reader taosArrayDestroy(pCommitter->dReader.aBlockIdx); tMapDataClear(&pCommitter->dReader.mBlock); - tBlockDataDestroy(&pCommitter->dReader.bData, 1); + tBlockDataDestroy(&pCommitter->dReader.bData); // merger for (int32_t iStt = 0; iStt < TSDB_MAX_STT_TRIGGER; iStt++) { SDataIter *pIter = &pCommitter->aDataIter[iStt]; taosArrayDestroy(pIter->aSttBlk); - tBlockDataDestroy(&pIter->bData, 1); + tBlockDataDestroy(&pIter->bData); } // writer taosArrayDestroy(pCommitter->dWriter.aBlockIdx); taosArrayDestroy(pCommitter->dWriter.aSttBlk); tMapDataClear(&pCommitter->dWriter.mBlock); - tBlockDataDestroy(&pCommitter->dWriter.bData, 1); + tBlockDataDestroy(&pCommitter->dWriter.bData); #if USE_STREAM_COMPRESSION tDiskDataBuilderDestroy(pCommitter->dWriter.pBuilder); #else - tBlockDataDestroy(&pCommitter->dWriter.bDatal, 1); + tBlockDataDestroy(&pCommitter->dWriter.bDatal); #endif tDestroyTSchema(pCommitter->skmTable.pTSchema); tDestroyTSchema(pCommitter->skmRow.pTSchema); diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index 1367ad67c8..1bb0a34661 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -641,9 +641,9 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, if (key.ts >= pTbData->maxKey) { pTbData->maxKey = key.ts; - // if (TSDB_CACHE_LAST_ROW(pMemTable->pTsdb->pVnode->config) && pLastRow != NULL) { - // tsdbCacheInsertLastrow(pMemTable->pTsdb->lruCache, pMemTable->pTsdb, pTbData->uid, pLastRow, true); - // } + if (TSDB_CACHE_LAST_ROW(pMemTable->pTsdb->pVnode->config)) { + // tsdbCacheInsertLastrow(pMemTable->pTsdb->lruCache, pMemTable->pTsdb, pTbData->uid, pLastRow, true); + } } if (TSDB_CACHE_LAST(pMemTable->pTsdb->pVnode->config)) { @@ -710,7 +710,7 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, if (key.ts >= pTbData->maxKey) { pTbData->maxKey = key.ts; - if (TSDB_CACHE_LAST_ROW(pMemTable->pTsdb->pVnode->config) && pLastRow != NULL) { + if (TSDB_CACHE_LAST_ROW(pMemTable->pTsdb->pVnode->config)) { tsdbCacheInsertLastrow(pMemTable->pTsdb->lruCache, pMemTable->pTsdb, pTbData->uid, pLastRow, true); } } diff --git a/source/dnode/vnode/src/tsdb/tsdbMergeTree.c b/source/dnode/vnode/src/tsdb/tsdbMergeTree.c index 01fbcf657f..48575b108f 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMergeTree.c +++ b/source/dnode/vnode/src/tsdb/tsdbMergeTree.c @@ -89,8 +89,8 @@ void *destroyLastBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo) { pLoadInfo[i].blockIndex[0] = -1; pLoadInfo[i].blockIndex[1] = -1; - tBlockDataDestroy(&pLoadInfo[i].blockData[0], true); - tBlockDataDestroy(&pLoadInfo[i].blockData[1], true); + tBlockDataDestroy(&pLoadInfo[i].blockData[0]); + tBlockDataDestroy(&pLoadInfo[i].blockData[1]); taosArrayDestroy(pLoadInfo[i].aSttBlk); } @@ -154,8 +154,8 @@ static SBlockData *loadLastBlock(SLDataIter *pIter, const char *idStr) { tsdbDebug("read last block, total load:%d, trigger by uid:%" PRIu64 ", last file index:%d, last block index:%d, entry:%d, rows:%d, %p, elapsed time:%.2f ms, %s", - pInfo->loadBlocks, pIter->uid, pIter->iStt, pIter->iSttBlk, pInfo->currentLoadBlockIndex, pBlock->nRow, pBlock, el, - idStr); + pInfo->loadBlocks, pIter->uid, pIter->iStt, pIter->iSttBlk, pInfo->currentLoadBlockIndex, pBlock->nRow, + pBlock, el, idStr); pInfo->blockIndex[pInfo->currentLoadBlockIndex] = pIter->iSttBlk; tsdbDebug("last block index list:%d, %d, %s", pInfo->blockIndex[0], pInfo->blockIndex[1], idStr); @@ -552,9 +552,9 @@ int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFRead } pMTree->idStr = idStr; - if (!pMTree->backward) { // asc + if (!pMTree->backward) { // asc tRBTreeCreate(&pMTree->rbt, tLDataIterCmprFn); - } else { // desc + } else { // desc tRBTreeCreate(&pMTree->rbt, tLDataIterDescCmprFn); } int32_t code = TSDB_CODE_SUCCESS; diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index eb34eec13a..e2cd73e52b 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -3883,7 +3883,7 @@ void tsdbReaderClose(STsdbReader* pReader) { } taosMemoryFree(pSupInfo->buildBuf); - tBlockDataDestroy(&pReader->status.fileBlockData, true); + tBlockDataDestroy(&pReader->status.fileBlockData); cleanupDataBlockIterator(&pReader->status.blockIter); @@ -4171,7 +4171,7 @@ static SArray* doRetrieveDataBlock(STsdbReader* pReader) { int32_t code = doLoadFileBlockData(pReader, &pStatus->blockIter, &pStatus->fileBlockData, pBlockScanInfo->uid); if (code != TSDB_CODE_SUCCESS) { - tBlockDataDestroy(&pStatus->fileBlockData, 1); + tBlockDataDestroy(&pStatus->fileBlockData); terrno = code; return NULL; } diff --git a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c index f4bdeeb387..048d3cc22b 100644 --- a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c +++ b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c @@ -524,7 +524,7 @@ _exit: if (pReader) { taosArrayDestroy(pReader->aDelData); taosArrayDestroy(pReader->aDelIdx); - tBlockDataDestroy(&pReader->bData, 1); + tBlockDataDestroy(&pReader->bData); tsdbFSDestroy(&pReader->fs); taosMemoryFree(pReader); } @@ -551,10 +551,10 @@ int32_t tsdbSnapReaderClose(STsdbSnapReader** ppReader) { taosArrayDestroy(pIter->aSttBlk); } - tBlockDataDestroy(&pIter->bData, 1); + tBlockDataDestroy(&pIter->bData); } - tBlockDataDestroy(&pReader->bData, 1); + tBlockDataDestroy(&pReader->bData); tDestroyTSchema(pReader->skmTable.pTSchema); // del @@ -1345,13 +1345,13 @@ _exit: if (pWriter->aDelIdxW) taosArrayDestroy(pWriter->aDelIdxW); if (pWriter->aDelData) taosArrayDestroy(pWriter->aDelData); if (pWriter->aDelIdxR) taosArrayDestroy(pWriter->aDelIdxR); - tBlockDataDestroy(&pWriter->dWriter.sData, 1); - tBlockDataDestroy(&pWriter->dWriter.bData, 1); + tBlockDataDestroy(&pWriter->dWriter.sData); + tBlockDataDestroy(&pWriter->dWriter.bData); if (pWriter->dWriter.aSttBlk) taosArrayDestroy(pWriter->dWriter.aSttBlk); if (pWriter->dWriter.aBlockIdx) taosArrayDestroy(pWriter->dWriter.aBlockIdx); - tBlockDataDestroy(&pWriter->dReader.bData, 1); + tBlockDataDestroy(&pWriter->dReader.bData); if (pWriter->dReader.aBlockIdx) taosArrayDestroy(pWriter->dReader.aBlockIdx); - tBlockDataDestroy(&pWriter->bData, 1); + tBlockDataDestroy(&pWriter->bData); tsdbFSDestroy(&pWriter->fs); taosMemoryFree(pWriter); } @@ -1404,18 +1404,18 @@ int32_t tsdbSnapWriterClose(STsdbSnapWriter** ppWriter, int8_t rollback) { // SNAP_DATA_TSDB // Writer - tBlockDataDestroy(&pWriter->dWriter.sData, 1); - tBlockDataDestroy(&pWriter->dWriter.bData, 1); + tBlockDataDestroy(&pWriter->dWriter.sData); + tBlockDataDestroy(&pWriter->dWriter.bData); taosArrayDestroy(pWriter->dWriter.aSttBlk); tMapDataClear(&pWriter->dWriter.mDataBlk); taosArrayDestroy(pWriter->dWriter.aBlockIdx); // Reader - tBlockDataDestroy(&pWriter->dReader.bData, 1); + tBlockDataDestroy(&pWriter->dReader.bData); tMapDataClear(&pWriter->dReader.mDataBlk); taosArrayDestroy(pWriter->dReader.aBlockIdx); - tBlockDataDestroy(&pWriter->bData, 1); + tBlockDataDestroy(&pWriter->bData); tDestroyTSchema(pWriter->skmTable.pTSchema); for (int32_t iBuf = 0; iBuf < sizeof(pWriter->aBuf) / sizeof(uint8_t*); iBuf++) { diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index b019bf3165..98560a2fc6 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -938,11 +938,11 @@ _exit: return code; } -void tBlockDataDestroy(SBlockData *pBlockData, int8_t deepClear) { +void tBlockDataDestroy(SBlockData *pBlockData) { tFree((uint8_t *)pBlockData->aUid); tFree((uint8_t *)pBlockData->aVersion); tFree((uint8_t *)pBlockData->aTSKEY); - taosArrayDestroyEx(pBlockData->aColData, deepClear ? tColDataDestroy : NULL); + taosArrayDestroyEx(pBlockData->aColData, tColDataDestroy); pBlockData->aUid = NULL; pBlockData->aVersion = NULL; pBlockData->aTSKEY = NULL; From a6d4fe7a636ea22d7d44990a4479aac0126b811a Mon Sep 17 00:00:00 2001 From: Bo Xiao Date: Thu, 1 Dec 2022 14:40:03 +0800 Subject: [PATCH 098/105] Update 01-faq.md Add FAQ 19: how to fix macOS Too many open files --- docs/zh/27-train-faq/01-faq.md | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/docs/zh/27-train-faq/01-faq.md b/docs/zh/27-train-faq/01-faq.md index 9c2f1e790c..595b69b08b 100644 --- a/docs/zh/27-train-faq/01-faq.md +++ b/docs/zh/27-train-faq/01-faq.md @@ -201,3 +201,45 @@ TDengine 中时间戳的时区总是由客户端进行处理,而与服务端 OOM 是操作系统的保护机制,当操作系统内存(包括 SWAP )不足时,会杀掉某些进程,从而保证操作系统的稳定运行。通常内存不足主要是如下两个原因导致,一是剩余内存小于 vm.min_free_kbytes ;二是程序请求的内存大于剩余内存。还有一种情况是内存充足但程序占用了特殊的内存地址,也会触发 OOM 。 TDengine 会预先为每个 VNode 分配好内存,每个 Database 的 VNode 个数受 建库时的vgroups参数影响,每个 VNode 占用的内存大小受 buffer参数 影响。要防止 OOM,需要在项目建设之初合理规划内存,并合理设置 SWAP ,除此之外查询过量的数据也有可能导致内存暴涨,这取决于具体的查询语句。TDengine 企业版对内存管理做了优化,采用了新的内存分配器,对稳定性有更高要求的用户可以考虑选择企业版。 + +### 19. 在macOS上遇到Too many open files怎么办? + +taosd日志文件报错Too many open file,是由于taosd打开文件数超过系统设置的上限所致。 +解决方案如下: +1. 新建文件 /Library/LaunchDaemons/limit.maxfiles.plist,写入以下内容(以下示例将limit和maxfiles改为10万,可按需修改): +``` + + + + +Label + limit.maxfiles +ProgramArguments + + launchctl + limit + maxfiles + 100000 + 100000 + +RunAtLoad + +ServiceIPC + + + +``` +2. 修改文件权限 +``` +sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist +sudo chmod 644 /Library/LaunchDaemons/limit.maxfiles.plist +``` +3. 加载 plist 文件 (或重启系统后生效。launchd在启动时会自动加载该目录的 plist) +``` +sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist +``` +4.确认更改后的限制 +``` +launchctl limit maxfiles +``` From 704885e21245ba277374823ee279be3317d70417 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 1 Dec 2022 15:07:40 +0800 Subject: [PATCH 099/105] fix: compile error --- source/libs/sync/src/syncMain.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 2b4a435aee..f102095ce2 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -2532,6 +2532,10 @@ int32_t syncNodeOnHeartbeat(SSyncNode* ths, const SRpcMsg* pRpcMsg) { } int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) { + const STraceId* trace = &pRpcMsg->info.traceId; + char tbuf[40] = {0}; + TRACE_TO_STR(trace, tbuf); + SyncHeartbeatReply* pMsg = pRpcMsg->pCont; SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(ths, &pMsg->srcId); if (pMgr == NULL) { @@ -2540,7 +2544,7 @@ int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) { } int64_t tsMs = taosGetTimestampMs(); - syncLogRecvHeartbeatReply(ths, pMsg, tsMs - pMsg->timeStamp); + syncLogRecvHeartbeatReply(ths, pMsg, tsMs - pMsg->timeStamp, tbuf); syncIndexMgrSetRecvTime(ths->pMatchIndex, &pMsg->srcId, tsMs); From 0860ac1c9bf2a8b3cb98695c466c54492ffbaad9 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 1 Dec 2022 15:14:34 +0800 Subject: [PATCH 100/105] fix: show Permission denied error in mac --- source/util/src/terror.c | 2 +- tools/shell/src/shellEngine.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/util/src/terror.c b/source/util/src/terror.c index 1901e48c50..2025f196f2 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -519,7 +519,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_FIRST_COLUMN, "First column must b TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN, "Invalid binary/nchar column length") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_TAGS_NUM, "Invalid number of tag columns") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_PERMISSION_DENIED, "Permission denied") -TAOS_DEFINE_ERROR(TSDB_CODE_PAR_PERMISSION_DENIED, "Invalid stream query") +TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_STREAM_QUERY, "Invalid stream query") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_INTERNAL_PK, "Invalid _c0 or _rowts expression") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_TIMELINE_FUNC, "Invalid timeline function") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_PASSWD, "Invalid password") diff --git a/tools/shell/src/shellEngine.c b/tools/shell/src/shellEngine.c index 28578e48a2..118a6caf7a 100644 --- a/tools/shell/src/shellEngine.c +++ b/tools/shell/src/shellEngine.c @@ -935,7 +935,7 @@ void shellGetGrantInfo() { int32_t code = taos_errno(tres); if (code != TSDB_CODE_SUCCESS) { - if (code != TSDB_CODE_OPS_NOT_SUPPORT && code != TSDB_CODE_MND_NO_RIGHTS) { + if (code != TSDB_CODE_OPS_NOT_SUPPORT && code != TSDB_CODE_MND_NO_RIGHTS && code != TSDB_CODE_PAR_PERMISSION_DENIED) { fprintf(stderr, "Failed to check Server Edition, Reason:0x%04x:%s\r\n\r\n", code, taos_errstr(tres)); } return; From 0525b4fa0d832c86276179f8d2fabf5d66aa35de Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 1 Dec 2022 15:36:10 +0800 Subject: [PATCH 101/105] more code --- include/common/tdataformat.h | 2 +- include/util/tRealloc.h | 12 +- source/common/src/tdataformat.c | 38 ++-- source/dnode/vnode/src/inc/tsdb.h | 48 +++-- source/dnode/vnode/src/tsdb/tsdbUtil.c | 261 +++++++------------------ 5 files changed, 124 insertions(+), 237 deletions(-) diff --git a/include/common/tdataformat.h b/include/common/tdataformat.h index 022036c368..314c1525bc 100644 --- a/include/common/tdataformat.h +++ b/include/common/tdataformat.h @@ -94,7 +94,7 @@ int32_t tRowMerge(SArray *aRowP, STSchema *pTSchema, int8_t flag); int32_t tRowIterOpen(SRow *pRow, STSchema *pTSchema, SRowIter **ppIter); void tRowIterClose(SRowIter **ppIter); SColVal *tRowIterNext(SRowIter *pIter); -int32_t tRowAppendToColData(SRow *pRow, STSchema *pTSchema, SArray *aColData, int32_t nColData); +int32_t tRowAppendToColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData); // STag ================================ int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag); diff --git a/include/util/tRealloc.h b/include/util/tRealloc.h index f3593d5818..3229c53039 100644 --- a/include/util/tRealloc.h +++ b/include/util/tRealloc.h @@ -52,11 +52,13 @@ _exit: return code; } -static FORCE_INLINE void tFree(uint8_t *pBuf) { - if (pBuf) { - taosMemoryFree(pBuf - sizeof(int64_t)); - } -} +#define tFree(BUF) \ + do { \ + if (BUF) { \ + taosMemoryFree((uint8_t *)(BUF) - sizeof(int64_t)); \ + (BUF) = NULL; \ + } \ + } while (0) #ifdef __cplusplus } diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c index 5d1f40532d..a4f1105820 100644 --- a/source/common/src/tdataformat.c +++ b/source/common/src/tdataformat.c @@ -841,11 +841,11 @@ _exit: return &pIter->cv; } -static int32_t tRowAppendNoneToColData(SArray *aColData, int32_t nColData) { +static int32_t tRowAppendNoneToColData(SColData *aColData, int32_t nColData) { int32_t code = 0; for (int32_t iColData = 0; iColData < nColData; iColData++) { - SColData *pColData = taosArrayGet(aColData, iColData); + SColData *pColData = &aColData[iColData]; code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0); if (code) goto _exit; } @@ -853,11 +853,11 @@ static int32_t tRowAppendNoneToColData(SArray *aColData, int32_t nColData) { _exit: return code; } -static int32_t tRowAppendNullToColData(SArray *aColData, int32_t nColData, STSchema *pSchema) { +static int32_t tRowAppendNullToColData(SColData *aColData, int32_t nColData, STSchema *pSchema) { int32_t code = 0; int32_t iColData = 0; - SColData *pColData = taosArrayGet(aColData, iColData); + SColData *pColData = &aColData[iColData]; int32_t iTColumn = 1; STColumn *pTColumn = &pSchema->columns[iTColumn]; @@ -866,12 +866,12 @@ static int32_t tRowAppendNullToColData(SArray *aColData, int32_t nColData, STSch if (pTColumn->colId == pColData->cid) { // NULL code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0); if (code) goto _exit; - pColData = (++iColData < nColData) ? taosArrayGet(aColData, iColData) : NULL; + pColData = (++iColData < nColData) ? &aColData[iColData] : NULL; pTColumn = (++iTColumn < pSchema->numOfCols) ? &pSchema->columns[iTColumn] : NULL; } else if (pTColumn->colId > pColData->cid) { // NONE code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0); if (code) goto _exit; - pColData = (++iColData < nColData) ? taosArrayGet(aColData, iColData) : NULL; + pColData = (++iColData < nColData) ? &aColData[iColData] : NULL; } else { pTColumn = (++iTColumn < pSchema->numOfCols) ? &pSchema->columns[iTColumn] : NULL; } @@ -879,18 +879,18 @@ static int32_t tRowAppendNullToColData(SArray *aColData, int32_t nColData, STSch code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0); if (code) goto _exit; - pColData = (++iColData < nColData) ? taosArrayGet(aColData, iColData) : NULL; + pColData = (++iColData < nColData) ? &aColData[iColData] : NULL; } } _exit: return code; } -static int32_t tRowAppendTupleToColData(SRow *pRow, STSchema *pTSchema, SArray *aColData, int32_t nColData) { +static int32_t tRowAppendTupleToColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData) { int32_t code = 0; int32_t iColData = 0; - SColData *pColData = taosArrayGet(aColData, iColData); + SColData *pColData = &aColData[iColData]; int32_t iTColumn = 1; STColumn *pTColumn = &pTSchema->columns[iTColumn]; @@ -971,13 +971,13 @@ static int32_t tRowAppendTupleToColData(SRow *pRow, STSchema *pTSchema, SArray * } _continue: - pColData = (++iColData < nColData) ? taosArrayGet(aColData, iColData) : NULL; + pColData = (++iColData < nColData) ? &aColData[iColData] : NULL; pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL; } else if (pTColumn->colId > pColData->cid) { // NONE code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0); if (code) goto _exit; - pColData = (++iColData < nColData) ? taosArrayGet(aColData, iColData) : NULL; + pColData = (++iColData < nColData) ? &aColData[iColData] : NULL; } else { pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL; } @@ -985,20 +985,20 @@ static int32_t tRowAppendTupleToColData(SRow *pRow, STSchema *pTSchema, SArray * code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0); if (code) goto _exit; - pColData = (++iColData < nColData) ? taosArrayGet(aColData, iColData) : NULL; + pColData = (++iColData < nColData) ? &aColData[iColData] : NULL; } } _exit: return code; } -static int32_t tRowAppendKVToColData(SRow *pRow, STSchema *pTSchema, SArray *aColData, int32_t nColData) { +static int32_t tRowAppendKVToColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData) { int32_t code = 0; SKVIdx *pKVIdx = (SKVIdx *)pRow->data; uint8_t *pv = NULL; int32_t iColData = 0; - SColData *pColData = taosArrayGet(aColData, iColData); + SColData *pColData = &aColData[iColData]; int32_t iTColumn = 1; STColumn *pTColumn = &pTSchema->columns[iTColumn]; int32_t iCol = 0; @@ -1054,26 +1054,26 @@ static int32_t tRowAppendKVToColData(SRow *pRow, STSchema *pTSchema, SArray *aCo if (code) goto _exit; _continue: - pColData = (++iColData < nColData) ? taosArrayGet(aColData, iColData) : NULL; + pColData = (++iColData < nColData) ? &aColData[iColData] : NULL; pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL; } else if (pTColumn->colId > pColData->cid) { code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0); if (code) goto _exit; - pColData = (++iColData < nColData) ? taosArrayGet(aColData, iColData) : NULL; + pColData = (++iColData < nColData) ? &aColData[iColData] : NULL; } else { pTColumn = (++iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL; } } else { code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0); if (code) goto _exit; - pColData = (++iColData < nColData) ? taosArrayGet(aColData, iColData) : NULL; + pColData = (++iColData < nColData) ? &aColData[iColData] : NULL; } } _exit: return code; } -int32_t tRowAppendToColData(SRow *pRow, STSchema *pTSchema, SArray *aColData, int32_t nColData) { +int32_t tRowAppendToColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData) { ASSERT(pRow->sver == pTSchema->version); ASSERT(nColData > 0); @@ -1529,7 +1529,7 @@ void tColDataDestroy(void *ph) { SColData *pColData = (SColData *)ph; tFree(pColData->pBitMap); - tFree((uint8_t *)pColData->aOffset); + tFree(pColData->aOffset); tFree(pColData->pData); } diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 19a47646b5..5346a58667 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -150,24 +150,22 @@ int32_t tGetBlockIdx(uint8_t *p, void *ph); int32_t tCmprBlockIdx(void const *lhs, void const *rhs); int32_t tCmprBlockL(void const *lhs, void const *rhs); // SBlockData -#define tBlockDataFirstRow(PBLOCKDATA) tsdbRowFromBlockData(PBLOCKDATA, 0) -#define tBlockDataLastRow(PBLOCKDATA) tsdbRowFromBlockData(PBLOCKDATA, (PBLOCKDATA)->nRow - 1) -#define tBlockDataFirstKey(PBLOCKDATA) TSDBROW_KEY(&tBlockDataFirstRow(PBLOCKDATA)) -#define tBlockDataLastKey(PBLOCKDATA) TSDBROW_KEY(&tBlockDataLastRow(PBLOCKDATA)) +#define tBlockDataFirstRow(PBLOCKDATA) tsdbRowFromBlockData(PBLOCKDATA, 0) +#define tBlockDataLastRow(PBLOCKDATA) tsdbRowFromBlockData(PBLOCKDATA, (PBLOCKDATA)->nRow - 1) +#define tBlockDataFirstKey(PBLOCKDATA) TSDBROW_KEY(&tBlockDataFirstRow(PBLOCKDATA)) +#define tBlockDataLastKey(PBLOCKDATA) TSDBROW_KEY(&tBlockDataLastRow(PBLOCKDATA)) +#define tBlockDataGetColDataByIdx(PBLOCKDATA, IDX) (&(PBLOCKDATA)->aColData[IDX]) -int32_t tBlockDataCreate(SBlockData *pBlockData); -void tBlockDataDestroy(SBlockData *pBlockData); -int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema, int16_t *aCid, int32_t nCid); -void tBlockDataReset(SBlockData *pBlockData); -int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema, int64_t uid); -void tBlockDataClear(SBlockData *pBlockData); -SColData *tBlockDataGetColDataByIdx(SBlockData *pBlockData, int32_t idx); -void tBlockDataGetColData(SBlockData *pBlockData, int16_t cid, SColData **ppColData); -int32_t tBlockDataMerge(SBlockData *pBlockData1, SBlockData *pBlockData2, SBlockData *pBlockData); -int32_t tBlockDataAddColData(SBlockData *pBlockData, SColData **ppColData); -int32_t tCmprBlockData(SBlockData *pBlockData, int8_t cmprAlg, uint8_t **ppOut, int32_t *szOut, uint8_t *aBuf[], - int32_t aBufN[]); -int32_t tDecmprBlockData(uint8_t *pIn, int32_t szIn, SBlockData *pBlockData, uint8_t *aBuf[]); +int32_t tBlockDataCreate(SBlockData *pBlockData); +void tBlockDataDestroy(SBlockData *pBlockData); +int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema, int16_t *aCid, int32_t nCid); +void tBlockDataReset(SBlockData *pBlockData); +int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema, int64_t uid); +void tBlockDataClear(SBlockData *pBlockData); +void tBlockDataGetColData(SBlockData *pBlockData, int16_t cid, SColData **ppColData); +int32_t tCmprBlockData(SBlockData *pBlockData, int8_t cmprAlg, uint8_t **ppOut, int32_t *szOut, uint8_t *aBuf[], + int32_t aBufN[]); +int32_t tDecmprBlockData(uint8_t *pIn, int32_t szIn, SBlockData *pBlockData, uint8_t *aBuf[]); // SDiskDataHdr int32_t tPutDiskDataHdr(uint8_t *p, const SDiskDataHdr *pHdr); int32_t tGetDiskDataHdr(uint8_t *p, void *ph); @@ -473,14 +471,14 @@ struct SSttBlk { // (SBlockData){.suid = suid, .uid = 0}: block data for N child tables int .last file // (SBlockData){.suid = 0, .uid = uid}: block data for 1 normal table int .last/.data file struct SBlockData { - int64_t suid; // 0 means normal table block data, otherwise child table block data - int64_t uid; // 0 means block data in .last file, otherwise in .data file - int32_t nRow; // number of rows - int64_t *aUid; // uids of each row, only exist in block data in .last file (uid == 0) - int64_t *aVersion; // versions of each row - TSKEY *aTSKEY; // timestamp of each row - int32_t nColData; - SArray *aColData; // SArray + int64_t suid; // 0 means normal table block data, otherwise child table block data + int64_t uid; // 0 means block data in .last file, otherwise in .data file + int32_t nRow; // number of rows + int64_t *aUid; // uids of each row, only exist in block data in .last file (uid == 0) + int64_t *aVersion; // versions of each row + TSKEY *aTSKEY; // timestamp of each row + int32_t nColData; + SColData *aColData; }; struct TABLEID { diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index 98560a2fc6..23740583a4 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -23,7 +23,7 @@ void tMapDataReset(SMapData *pMapData) { } void tMapDataClear(SMapData *pMapData) { - tFree((uint8_t *)pMapData->aOffset); + tFree(pMapData->aOffset); tFree(pMapData->pData); pMapData->pData = NULL; pMapData->aOffset = NULL; @@ -928,27 +928,49 @@ int32_t tBlockDataCreate(SBlockData *pBlockData) { pBlockData->aVersion = NULL; pBlockData->aTSKEY = NULL; pBlockData->nColData = 0; - pBlockData->aColData = taosArrayInit(0, sizeof(SColData)); - if (pBlockData->aColData == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _exit; - } + pBlockData->aColData = NULL; _exit: return code; } void tBlockDataDestroy(SBlockData *pBlockData) { - tFree((uint8_t *)pBlockData->aUid); - tFree((uint8_t *)pBlockData->aVersion); - tFree((uint8_t *)pBlockData->aTSKEY); - taosArrayDestroyEx(pBlockData->aColData, tColDataDestroy); - pBlockData->aUid = NULL; - pBlockData->aVersion = NULL; - pBlockData->aTSKEY = NULL; - pBlockData->aColData = NULL; + tFree(pBlockData->aUid); + tFree(pBlockData->aVersion); + tFree(pBlockData->aTSKEY); + + for (int32_t i = 0; i < pBlockData->nColData; i++) { + tColDataDestroy(&pBlockData->aColData[i]); + } + + if (pBlockData->aColData) { + taosMemoryFree(pBlockData->aColData); + pBlockData->aColData = NULL; + } } +static int32_t tBlockDataAdjustColData(SBlockData *pBlockData, int32_t nColData) { + int32_t code = 0; + + if (pBlockData->nColData > nColData) { + for (int32_t i = nColData; i < pBlockData->nColData; i++) { + tColDataDestroy(&pBlockData->aColData[i]); + } + } else if (pBlockData->nColData < nColData) { + SColData *aColData = taosMemoryRealloc(pBlockData->aColData, sizeof(SBlockData) * nColData); + if (aColData == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + + pBlockData->aColData = aColData; + memset(&pBlockData->aColData[pBlockData->nColData], 0, sizeof(SBlockData) * (nColData - pBlockData->nColData)); + } + pBlockData->nColData = nColData; + +_exit: + return code; +} int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema, int16_t *aCid, int32_t nCid) { int32_t code = 0; @@ -958,37 +980,35 @@ int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema, pBlockData->uid = pId->uid; pBlockData->nRow = 0; - pBlockData->nColData = 0; if (aCid) { + code = tBlockDataAdjustColData(pBlockData, nCid); + if (code) goto _exit; + int32_t iColumn = 1; STColumn *pTColumn = &pTSchema->columns[iColumn]; for (int32_t iCid = 0; iCid < nCid; iCid++) { - while (pTColumn && pTColumn->colId < aCid[iCid]) { + ASSERT(pTColumn); + while (pTColumn->colId < aCid[iCid]) { iColumn++; - pTColumn = (iColumn < pTSchema->numOfCols) ? &pTSchema->columns[iColumn] : NULL; + ASSERT(iColumn < pTSchema->numOfCols); + pTColumn = &pTSchema->columns[iColumn]; } - if (pTColumn == NULL) { - break; - } else if (pTColumn->colId == aCid[iCid]) { - SColData *pColData; - code = tBlockDataAddColData(pBlockData, &pColData); - if (code) goto _exit; - tColDataInit(pColData, pTColumn->colId, pTColumn->type, (pTColumn->flags & COL_SMA_ON) ? 1 : 0); + ASSERT(pTColumn->colId == aCid[iCid]); + tColDataInit(&pBlockData->aColData[iCid], pTColumn->colId, pTColumn->type, + (pTColumn->flags & COL_SMA_ON) ? 1 : 0); - iColumn++; - pTColumn = (iColumn < pTSchema->numOfCols) ? &pTSchema->columns[iColumn] : NULL; - } + iColumn++; + pTColumn = (iColumn < pTSchema->numOfCols) ? &pTSchema->columns[iColumn] : NULL; } } else { - for (int32_t iColumn = 1; iColumn < pTSchema->numOfCols; iColumn++) { - STColumn *pTColumn = &pTSchema->columns[iColumn]; + code = tBlockDataAdjustColData(pBlockData, pTSchema->numOfCols - 1); + if (code) goto _exit; - SColData *pColData; - code = tBlockDataAddColData(pBlockData, &pColData); - if (code) goto _exit; - - tColDataInit(pColData, pTColumn->colId, pTColumn->type, (pTColumn->flags & COL_SMA_ON) ? 1 : 0); + for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) { + STColumn *pTColumn = &pTSchema->columns[iColData + 1]; + tColDataInit(&pBlockData->aColData[iColData], pTColumn->colId, pTColumn->type, + (pTColumn->flags & COL_SMA_ON) ? 1 : 0); } } @@ -999,8 +1019,6 @@ _exit: void tBlockDataReset(SBlockData *pBlockData) { pBlockData->suid = 0; pBlockData->uid = 0; - pBlockData->nRow = 0; - pBlockData->nColData = 0; } void tBlockDataClear(SBlockData *pBlockData) { @@ -1008,33 +1026,10 @@ void tBlockDataClear(SBlockData *pBlockData) { pBlockData->nRow = 0; for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) { - SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData); - tColDataClear(pColData); + tColDataClear(tBlockDataGetColDataByIdx(pBlockData, iColData)); } } -int32_t tBlockDataAddColData(SBlockData *pBlockData, SColData **ppColData) { - int32_t code = 0; - SColData *pColData = NULL; - - if (pBlockData->nColData >= taosArrayGetSize(pBlockData->aColData)) { - if (taosArrayPush(pBlockData->aColData, &((SColData){0})) == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } - } - pColData = (SColData *)taosArrayGet(pBlockData->aColData, pBlockData->nColData); - - pBlockData->nColData++; - - *ppColData = pColData; - return code; - -_err: - *ppColData = NULL; - return code; -} - static int32_t tBlockDataAppendBlockRow(SBlockData *pBlockData, SBlockData *pBlockDataFrom, int32_t iRow) { int32_t code = 0; @@ -1095,12 +1090,14 @@ int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTS pBlockData->aTSKEY[pBlockData->nRow] = TSDBROW_TS(pRow); SColVal cv = {0}; - if (pRow->type == 0) { + if (pRow->type == TSDBROW_ROW_FMT) { code = tRowAppendToColData(pRow->pTSRow, pTSchema, pBlockData->aColData, pBlockData->nColData); if (code) goto _err; - } else { + } else if (pRow->type == TSDBROW_COL_FMT) { code = tBlockDataAppendBlockRow(pBlockData, pRow->pBlockData, pRow->iRow); if (code) goto _err; + } else { + ASSERT(0); } pBlockData->nRow++; @@ -1110,133 +1107,13 @@ _err: return code; } -int32_t tBlockDataCorrectSchema(SBlockData *pBlockData, SBlockData *pBlockDataFrom) { - int32_t code = 0; - - int32_t iColData = 0; - for (int32_t iColDataFrom = 0; iColDataFrom < pBlockDataFrom->nColData; iColDataFrom++) { - SColData *pColDataFrom = tBlockDataGetColDataByIdx(pBlockDataFrom, iColDataFrom); - - while (true) { - SColData *pColData; - if (iColData < pBlockData->nColData) { - pColData = tBlockDataGetColDataByIdx(pBlockData, iColData); - } else { - pColData = NULL; - } - - if (pColData == NULL || pColData->cid > pColDataFrom->cid) { - code = tBlockDataAddColData(pBlockData, &pColData); - if (code) goto _exit; - - tColDataInit(pColData, pColDataFrom->cid, pColDataFrom->type, pColDataFrom->smaOn); - for (int32_t iRow = 0; iRow < pBlockData->nRow; iRow++) { - code = tColDataAppendValue(pColData, &COL_VAL_NONE(pColData->cid, pColData->type)); - if (code) goto _exit; - } - - iColData++; - break; - } else if (pColData->cid == pColDataFrom->cid) { - iColData++; - break; - } else { - iColData++; - } - } - } - -_exit: - return code; -} - -int32_t tBlockDataMerge(SBlockData *pBlockData1, SBlockData *pBlockData2, SBlockData *pBlockData) { - int32_t code = 0; - - ASSERT(pBlockData->suid == pBlockData1->suid); - ASSERT(pBlockData->uid == pBlockData1->uid); - ASSERT(pBlockData1->nRow > 0); - ASSERT(pBlockData2->nRow > 0); - - tBlockDataClear(pBlockData); - - TSDBROW row1 = tsdbRowFromBlockData(pBlockData1, 0); - TSDBROW row2 = tsdbRowFromBlockData(pBlockData2, 0); - TSDBROW *pRow1 = &row1; - TSDBROW *pRow2 = &row2; - - while (pRow1 && pRow2) { - int32_t c = tsdbRowCmprFn(pRow1, pRow2); - - if (c < 0) { - code = tBlockDataAppendRow(pBlockData, pRow1, NULL, - pBlockData1->uid ? pBlockData1->uid : pBlockData1->aUid[pRow1->iRow]); - if (code) goto _exit; - - pRow1->iRow++; - if (pRow1->iRow < pBlockData1->nRow) { - *pRow1 = tsdbRowFromBlockData(pBlockData1, pRow1->iRow); - } else { - pRow1 = NULL; - } - } else if (c > 0) { - code = tBlockDataAppendRow(pBlockData, pRow2, NULL, - pBlockData2->uid ? pBlockData2->uid : pBlockData2->aUid[pRow2->iRow]); - if (code) goto _exit; - - pRow2->iRow++; - if (pRow2->iRow < pBlockData2->nRow) { - *pRow2 = tsdbRowFromBlockData(pBlockData2, pRow2->iRow); - } else { - pRow2 = NULL; - } - } else { - ASSERT(0); - } - } - - while (pRow1) { - code = tBlockDataAppendRow(pBlockData, pRow1, NULL, - pBlockData1->uid ? pBlockData1->uid : pBlockData1->aUid[pRow1->iRow]); - if (code) goto _exit; - - pRow1->iRow++; - if (pRow1->iRow < pBlockData1->nRow) { - *pRow1 = tsdbRowFromBlockData(pBlockData1, pRow1->iRow); - } else { - pRow1 = NULL; - } - } - - while (pRow2) { - code = tBlockDataAppendRow(pBlockData, pRow2, NULL, - pBlockData2->uid ? pBlockData2->uid : pBlockData2->aUid[pRow2->iRow]); - if (code) goto _exit; - - pRow2->iRow++; - if (pRow2->iRow < pBlockData2->nRow) { - *pRow2 = tsdbRowFromBlockData(pBlockData2, pRow2->iRow); - } else { - pRow2 = NULL; - } - } - -_exit: - return code; -} - -SColData *tBlockDataGetColDataByIdx(SBlockData *pBlockData, int32_t idx) { - ASSERT(idx >= 0 && idx < pBlockData->nColData); - return (SColData *)taosArrayGet(pBlockData->aColData, idx); -} - void tBlockDataGetColData(SBlockData *pBlockData, int16_t cid, SColData **ppColData) { ASSERT(cid != PRIMARYKEY_TIMESTAMP_COL_ID); int32_t lidx = 0; int32_t ridx = pBlockData->nColData - 1; while (lidx <= ridx) { - int32_t midx = (lidx + ridx) / 2; + int32_t midx = (lidx + ridx) >> 2; SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, midx); int32_t c = (pColData->cid == cid) ? 0 : ((pColData->cid > cid) ? 1 : -1); @@ -1383,15 +1260,25 @@ int32_t tDecmprBlockData(uint8_t *pIn, int32_t szIn, SBlockData *pBlockData, uin // loop to decode each column data if (hdr.szBlkCol == 0) goto _exit; + int32_t nColData = 0; int32_t nt = 0; while (nt < hdr.szBlkCol) { SBlockCol blockCol = {0}; nt += tGetBlockCol(pIn + n + nt, &blockCol); - ASSERT(nt <= hdr.szBlkCol); + ++nColData; + } + ASSERT(nt == hdr.szBlkCol); - SColData *pColData; - code = tBlockDataAddColData(pBlockData, &pColData); - if (code) goto _exit; + code = tBlockDataAdjustColData(pBlockData, nColData); + if (code) goto _exit; + + nt = 0; + int32_t iColData = 0; + while (nt < hdr.szBlkCol) { + SBlockCol blockCol = {0}; + nt += tGetBlockCol(pIn + n + nt, &blockCol); + + SColData *pColData = &pBlockData->aColData[iColData++]; tColDataInit(pColData, blockCol.cid, blockCol.type, blockCol.smaOn); if (blockCol.flag == HAS_NULL) { From 3700f0dc8e0a95197f0f253363f2a428bf5e5cc8 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 1 Dec 2022 16:19:21 +0800 Subject: [PATCH 102/105] more code --- include/common/tdataformat.h | 3 +- source/common/src/tdataformat.c | 69 ++++++++++++++-------- source/dnode/vnode/src/inc/vnodeInt.h | 2 +- source/dnode/vnode/src/tsdb/tsdbMemTable.c | 9 ++- source/dnode/vnode/src/vnd/vnodeBufPool.c | 6 +- 5 files changed, 57 insertions(+), 32 deletions(-) diff --git a/include/common/tdataformat.h b/include/common/tdataformat.h index 314c1525bc..e308666524 100644 --- a/include/common/tdataformat.h +++ b/include/common/tdataformat.h @@ -111,6 +111,7 @@ void debugPrintSTag(STag *pTag, const char *tag, int32_t ln); // TODO: remov int32_t parseJsontoTagData(const char *json, SArray *pTagVals, STag **ppTag, void *pMsgBuf); // SColData ================================ +typedef void *(*xMallocFn)(void *, int32_t); void tColDataDestroy(void *ph); void tColDataInit(SColData *pColData, int16_t cid, int8_t type, int8_t smaOn); void tColDataClear(SColData *pColData); @@ -118,7 +119,7 @@ void tColDataDeepClear(SColData *pColData); int32_t tColDataAppendValue(SColData *pColData, SColVal *pColVal); void tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal); uint8_t tColDataGetBitValue(const SColData *pColData, int32_t iVal); -int32_t tColDataCopy(SColData *pColDataSrc, SColData *pColDataDest); +int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMalloc, void *arg); extern void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min, int16_t *numOfNull); // for stmt bind diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c index a4f1105820..eba30ff506 100644 --- a/source/common/src/tdataformat.c +++ b/source/common/src/tdataformat.c @@ -2018,41 +2018,60 @@ uint8_t tColDataGetBitValue(const SColData *pColData, int32_t iVal) { return v; } -int32_t tColDataCopy(SColData *pColDataSrc, SColData *pColDataDest) { +int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMalloc, void *arg) { int32_t code = 0; - int32_t size; - ASSERT(pColDataSrc->nVal > 0); - ASSERT(pColDataDest->cid == pColDataSrc->cid); - ASSERT(pColDataDest->type == pColDataSrc->type); - - pColDataDest->smaOn = pColDataSrc->smaOn; - pColDataDest->nVal = pColDataSrc->nVal; - pColDataDest->flag = pColDataSrc->flag; + *pColData = *pColDataFrom; // bitmap - if (pColDataSrc->flag != HAS_NONE && pColDataSrc->flag != HAS_NULL && pColDataSrc->flag != HAS_VALUE) { - size = BIT2_SIZE(pColDataSrc->nVal); - code = tRealloc(&pColDataDest->pBitMap, size); - if (code) goto _exit; - memcpy(pColDataDest->pBitMap, pColDataSrc->pBitMap, size); + switch (pColData->flag) { + case (HAS_NULL | HAS_NONE): + case (HAS_VALUE | HAS_NONE): + case (HAS_VALUE | HAS_NULL): + pColData->pBitMap = xMalloc(arg, BIT1_SIZE(pColData->nVal)); + if (pColData->pBitMap == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT1_SIZE(pColData->nVal)); + break; + case (HAS_VALUE | HAS_NULL | HAS_NONE): + pColData->pBitMap = xMalloc(arg, BIT2_SIZE(pColData->nVal)); + if (pColData->pBitMap == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT2_SIZE(pColData->nVal)); + break; + default: + pColData->pBitMap = NULL; + break; } // offset - if (IS_VAR_DATA_TYPE(pColDataDest->type)) { - size = sizeof(int32_t) * pColDataSrc->nVal; - - code = tRealloc((uint8_t **)&pColDataDest->aOffset, size); - if (code) goto _exit; - - memcpy(pColDataDest->aOffset, pColDataSrc->aOffset, size); + if (IS_VAR_DATA_TYPE(pColData->type) && (pColData->flag & HAS_VALUE)) { + pColData->aOffset = xMalloc(arg, pColData->nVal << 2); + if (pColData->aOffset == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + memcpy(pColData->aOffset, pColDataFrom->aOffset, pColData->nVal << 2); + } else { + pColData->aOffset = NULL; } // value - pColDataDest->nData = pColDataSrc->nData; - code = tRealloc(&pColDataDest->pData, pColDataSrc->nData); - if (code) goto _exit; - memcpy(pColDataDest->pData, pColDataSrc->pData, pColDataDest->nData); + if (pColData->nVal) { + pColData->pData = xMalloc(arg, pColData->nVal); + if (pColData->pData == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + + memcpy(pColData->pData, pColDataFrom->pData, pColData->nData); + } else { + pColData->pData = NULL; + } _exit: return code; diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index 64a2712c13..eb11e4ac22 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -87,7 +87,7 @@ typedef struct SSnapDataHdr SSnapDataHdr; #define VNODE_RSMA2_DIR "rsma2" // vnd.h -void* vnodeBufPoolMalloc(SVBufPool* pPool, int size); +void* vnodeBufPoolMalloc(SVBufPool* pPool, int32_t size); void vnodeBufPoolFree(SVBufPool* pPool, void* p); void vnodeBufPoolRef(SVBufPool* pPool); void vnodeBufPoolUnRef(SVBufPool* pPool); diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index 1bb0a34661..e7f414c70d 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -601,8 +601,13 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, memcpy(pBlockData->aTSKEY, aColData[0].pData, aColData[0].nData); pBlockData->nColData = nColData - 1; - for (int32_t iColData = 1; iColData < nColData; ++iColData) { - // todo + pBlockData->aColData = vnodeBufPoolMalloc(pPool, sizeof(SColData) * pBlockData->nColData); + if (pBlockData->aColData == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + } + for (int32_t iColData = 0; iColData < pBlockData->nColData; ++iColData) { + code = tColDataCopy(&aColData[iColData + 1], &pBlockData->aColData[iColData], (xMallocFn)vnodeBufPoolMalloc, pPool); + if (code) goto _exit; } // loop to add each row to the skiplist diff --git a/source/dnode/vnode/src/vnd/vnodeBufPool.c b/source/dnode/vnode/src/vnd/vnodeBufPool.c index 71e926bd35..51d3d19746 100644 --- a/source/dnode/vnode/src/vnd/vnodeBufPool.c +++ b/source/dnode/vnode/src/vnd/vnodeBufPool.c @@ -35,7 +35,7 @@ static int vnodeBufPoolCreate(SVnode *pVnode, int64_t size, SVBufPool **ppPool) return -1; } if (taosThreadSpinInit(pPool->lock, 0) != 0) { - taosMemoryFree((void*)pPool->lock); + taosMemoryFree((void *)pPool->lock); taosMemoryFree(pPool); terrno = TAOS_SYSTEM_ERROR(errno); return -1; @@ -62,7 +62,7 @@ static int vnodeBufPoolDestroy(SVBufPool *pPool) { vnodeBufPoolReset(pPool); if (pPool->lock) { taosThreadSpinDestroy(pPool->lock); - taosMemoryFree((void*)pPool->lock); + taosMemoryFree((void *)pPool->lock); } taosMemoryFree(pPool); return 0; @@ -123,7 +123,7 @@ void vnodeBufPoolReset(SVBufPool *pPool) { pPool->ptr = pPool->node.data; } -void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) { +void *vnodeBufPoolMalloc(SVBufPool *pPool, int32_t size) { SVBufPoolNode *pNode; void *p = NULL; ASSERT(pPool != NULL); From 78beb8f4f13da7d81252ddf7967be41624390d9f Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 1 Dec 2022 16:36:25 +0800 Subject: [PATCH 103/105] more code --- source/dnode/vnode/src/tsdb/tsdbMemTable.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index e7f414c70d..3fee42dc59 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -636,7 +636,7 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_FROM_POS); } - if ((code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0))) goto _exit; + if ((code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 1))) goto _exit; lRow = tRow; ++tRow.iRow; From 69617030fa1a7176cbe99c2629bee78a69f6e8db Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 1 Dec 2022 16:51:36 +0800 Subject: [PATCH 104/105] more code --- source/dnode/vnode/src/inc/tsdb.h | 5 +++-- source/dnode/vnode/src/tsdb/tsdbCommit.c | 6 ++---- source/dnode/vnode/src/tsdb/tsdbUtil.c | 14 ++++++++------ 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 5346a58667..188b5979f4 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -105,8 +105,9 @@ static FORCE_INLINE int64_t tsdbLogicToFileSize(int64_t lSize, int32_t szPage) { // tsdbUtil.c ============================================================================================== // TSDBROW -#define TSDBROW_TS(ROW) (((ROW)->type == 0) ? (ROW)->pTSRow->ts : (ROW)->pBlockData->aTSKEY[(ROW)->iRow]) -#define TSDBROW_VERSION(ROW) (((ROW)->type == 0) ? (ROW)->version : (ROW)->pBlockData->aVersion[(ROW)->iRow]) +#define TSDBROW_TS(ROW) (((ROW)->type == TSDBROW_ROW_FMT) ? (ROW)->pTSRow->ts : (ROW)->pBlockData->aTSKEY[(ROW)->iRow]) +#define TSDBROW_VERSION(ROW) \ + (((ROW)->type == TSDBROW_ROW_FMT) ? (ROW)->version : (ROW)->pBlockData->aVersion[(ROW)->iRow]) #define TSDBROW_SVERSION(ROW) TD_ROW_SVER((ROW)->pTSRow) #define TSDBROW_KEY(ROW) ((TSDBKEY){.version = TSDBROW_VERSION(ROW), .ts = TSDBROW_TS(ROW)}) #define tsdbRowFromTSRow(VERSION, TSROW) ((TSDBROW){.type = TSDBROW_ROW_FMT, .version = (VERSION), .pTSRow = (TSROW)}) diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 4bff58f2a7..b60ab0ce26 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -1173,7 +1173,6 @@ static int32_t tsdbCommitAheadBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) tBlockDataClear(pBlockData); while (pRowInfo) { - ASSERT(pRowInfo->row.type == 0); code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row)); TSDB_CHECK_CODE(code, lino, _exit); @@ -1241,7 +1240,6 @@ static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) pRow = NULL; } } else if (c > 0) { - ASSERT(pRowInfo->row.type == 0); code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row)); TSDB_CHECK_CODE(code, lino, _exit); @@ -1483,7 +1481,7 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { while (pRowInfo) { STSchema *pTSchema = NULL; - if (pRowInfo->row.type == 0) { + if (pRowInfo->row.type == TSDBROW_ROW_FMT) { code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row)); TSDB_CHECK_CODE(code, lino, _exit); pTSchema = pCommitter->skmRow.pTSchema; @@ -1526,7 +1524,7 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { while (pRowInfo) { STSchema *pTSchema = NULL; - if (pRowInfo->row.type == 0) { + if (pRowInfo->row.type == TSDBROW_ROW_FMT) { code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row)); TSDB_CHECK_CODE(code, lino, _exit); pTSchema = pCommitter->skmRow.pTSchema; diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index 23740583a4..e474313188 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -572,9 +572,9 @@ void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal * ASSERT(iCol > 0); - if (pRow->type == 0) { + if (pRow->type == TSDBROW_ROW_FMT) { tRowGet(pRow->pTSRow, pTSchema, iCol, pColVal); - } else if (pRow->type == 1) { + } else if (pRow->type == TSDBROW_COL_FMT) { SColData *pColData; tBlockDataGetColData(pRow->pBlockData, pTColumn->colId, &pColData); @@ -606,11 +606,11 @@ int32_t tsdbRowCmprFn(const void *p1, const void *p2) { // STSDBRowIter ====================================================== void tsdbRowIterInit(STSDBRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema) { pIter->pRow = pRow; - if (pRow->type == 0) { + if (pRow->type == TSDBROW_ROW_FMT) { ASSERT(pTSchema); pIter->pTSchema = pTSchema; pIter->i = 1; - } else if (pRow->type == 1) { + } else if (pRow->type == TSDBROW_COL_FMT) { pIter->pTSchema = NULL; pIter->i = 0; } else { @@ -619,14 +619,14 @@ void tsdbRowIterInit(STSDBRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema) { } SColVal *tsdbRowIterNext(STSDBRowIter *pIter) { - if (pIter->pRow->type == 0) { + if (pIter->pRow->type == TSDBROW_ROW_FMT) { if (pIter->i < pIter->pTSchema->numOfCols) { tRowGet(pIter->pRow->pTSRow, pIter->pTSchema, pIter->i, &pIter->colVal); pIter->i++; return &pIter->colVal; } - } else { + } else if (pIter->pRow->type == TSDBROW_COL_FMT) { if (pIter->i < pIter->pRow->pBlockData->nColData) { SColData *pColData = tBlockDataGetColDataByIdx(pIter->pRow->pBlockData, pIter->i); @@ -635,6 +635,8 @@ SColVal *tsdbRowIterNext(STSDBRowIter *pIter) { return &pIter->colVal; } + } else { + ASSERT(0); } return NULL; From 6dcdafa486bb01e118cfe61df27bb8181abf4325 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 1 Dec 2022 17:00:33 +0800 Subject: [PATCH 105/105] more code --- source/dnode/vnode/src/inc/tsdb.h | 4 ++-- source/dnode/vnode/src/tsdb/tsdbCache.c | 12 ++++++------ source/dnode/vnode/src/tsdb/tsdbMemTable.c | 15 +++++++-------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 188b5979f4..6918bcc1f6 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -745,8 +745,8 @@ typedef struct { int32_t tsdbOpenCache(STsdb *pTsdb); void tsdbCloseCache(STsdb *pTsdb); -int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, SRow *row, STsdb *pTsdb); -int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, SRow *row, bool dup); +int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, TSDBROW *row, STsdb *pTsdb); +int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, TSDBROW *row, bool dup); int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, SCacheRowsReader *pr, LRUHandle **h); int32_t tsdbCacheGetLastrowH(SLRUCache *pCache, tb_uid_t uid, SCacheRowsReader *pr, LRUHandle **h); int32_t tsdbCacheRelease(SLRUCache *pCache, LRUHandle *h); diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 6d04bee093..33351c710b 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -190,7 +190,7 @@ int32_t tsdbCacheDelete(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey) { return code; } -int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, SRow *row, bool dup) { +int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, TSDBROW *row, bool dup) { int32_t code = 0; STSRow *cacheRow = NULL; char key[32] = {0}; @@ -201,7 +201,7 @@ int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, SR LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen); if (h) { STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1); - TSKEY keyTs = row->ts; + TSKEY keyTs = TSDBROW_TS(row); bool invalidate = false; SArray *pLast = (SArray *)taosLRUCacheValue(pCache, h); @@ -222,7 +222,7 @@ int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, SR SColVal *tColVal = &tTsVal1->colVal; SColVal colVal = {0}; - tRowGet(row, pTSchema, iCol, &colVal); + tsdbRowGetColVal(row, pTSchema, iCol, &colVal); if (!COL_VAL_IS_NONE(&colVal)) { if (keyTs == tTsVal1->ts && !COL_VAL_IS_NONE(tColVal)) { invalidate = true; @@ -316,7 +316,7 @@ int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, SR return code; } -int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, SRow *row, STsdb *pTsdb) { +int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, TSDBROW *row, STsdb *pTsdb) { int32_t code = 0; STSRow *cacheRow = NULL; char key[32] = {0}; @@ -327,7 +327,7 @@ int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, SRow *row, STsdb *p LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen); if (h) { STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1); - TSKEY keyTs = row->ts; + TSKEY keyTs = TSDBROW_TS(row); bool invalidate = false; SArray *pLast = (SArray *)taosLRUCacheValue(pCache, h); @@ -348,7 +348,7 @@ int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, SRow *row, STsdb *p SColVal *tColVal = &tTsVal1->colVal; SColVal colVal = {0}; - tRowGet(row, pTSchema, iCol, &colVal); + tsdbRowGetColVal(row, pTSchema, iCol, &colVal); if (!COL_VAL_IS_VALUE(&colVal)) { if (keyTs == tTsVal1->ts && COL_VAL_IS_VALUE(tColVal)) { invalidate = true; diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c index 3fee42dc59..baac0fc8f7 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c +++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c @@ -647,12 +647,12 @@ static int32_t tsdbInsertColDataToTable(SMemTable *pMemTable, STbData *pTbData, pTbData->maxKey = key.ts; if (TSDB_CACHE_LAST_ROW(pMemTable->pTsdb->pVnode->config)) { - // tsdbCacheInsertLastrow(pMemTable->pTsdb->lruCache, pMemTable->pTsdb, pTbData->uid, pLastRow, true); + tsdbCacheInsertLastrow(pMemTable->pTsdb->lruCache, pMemTable->pTsdb, pTbData->uid, &lRow, true); } } if (TSDB_CACHE_LAST(pMemTable->pTsdb->pVnode->config)) { - // tsdbCacheInsertLast(pMemTable->pTsdb->lruCache, pTbData->uid, pLastRow, pMemTable->pTsdb); + tsdbCacheInsertLast(pMemTable->pTsdb->lruCache, pTbData->uid, &lRow, pMemTable->pTsdb); } // SMemTable @@ -676,7 +676,7 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, SMemSkipListNode *pos[SL_MAX_LEVEL]; TSDBROW tRow = {.type = TSDBROW_ROW_FMT, .version = version}; int32_t iRow = 0; - SRow *pLastRow = NULL; + TSDBROW lRow; // backward put first data tRow.pTSRow = aRow[iRow++]; @@ -684,11 +684,10 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_BACKWARD); code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 0); if (code) goto _exit; + lRow = tRow; pTbData->minKey = TMIN(pTbData->minKey, key.ts); - pLastRow = tRow.pTSRow; - // forward put rest data if (iRow < nRow) { for (int8_t iLevel = pos[0]->level; iLevel < pTbData->sl.maxLevel; iLevel++) { @@ -706,7 +705,7 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, code = tbDataDoPut(pMemTable, pTbData, pos, &tRow, 1); if (code) goto _exit; - pLastRow = tRow.pTSRow; + lRow = tRow; iRow++; } @@ -716,12 +715,12 @@ static int32_t tsdbInsertRowDataToTable(SMemTable *pMemTable, STbData *pTbData, pTbData->maxKey = key.ts; if (TSDB_CACHE_LAST_ROW(pMemTable->pTsdb->pVnode->config)) { - tsdbCacheInsertLastrow(pMemTable->pTsdb->lruCache, pMemTable->pTsdb, pTbData->uid, pLastRow, true); + tsdbCacheInsertLastrow(pMemTable->pTsdb->lruCache, pMemTable->pTsdb, pTbData->uid, &lRow, true); } } if (TSDB_CACHE_LAST(pMemTable->pTsdb->pVnode->config)) { - tsdbCacheInsertLast(pMemTable->pTsdb->lruCache, pTbData->uid, pLastRow, pMemTable->pTsdb); + tsdbCacheInsertLast(pMemTable->pTsdb->lruCache, pTbData->uid, &lRow, pMemTable->pTsdb); } // SMemTable