From 5878c9a31a899676c26358be1f2f3f3109e1b169 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Mon, 31 Oct 2022 12:59:42 +0800 Subject: [PATCH 01/77] 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 02/77] 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 03/77] 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 04/77] 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 05/77] 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 06/77] 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 07/77] 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 08/77] 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 09/77] 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 10/77] 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 11/77] 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 12/77] 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 13/77] 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 14/77] 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 15/77] 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 16/77] 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 17/77] 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 18/77] 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 19/77] 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 20/77] 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 21/77] 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 22/77] 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 23/77] 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 24/77] 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 25/77] 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 26/77] 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 27/77] 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 28/77] 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 29/77] 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 30/77] 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 31/77] 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 32/77] 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 33/77] 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 34/77] 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 35/77] 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 8ee170bef1c5b5a64c6d415d0e8317c74e31034e Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Tue, 29 Nov 2022 16:17:05 +0800 Subject: [PATCH 36/77] enh: add retry for vnode closed case --- include/libs/executor/executor.h | 2 +- include/util/taoserror.h | 1 + source/libs/executor/inc/executorimpl.h | 2 +- source/libs/executor/src/executor.c | 4 ++-- source/libs/executor/src/executorimpl.c | 15 ++------------- source/libs/qworker/inc/qwInt.h | 2 +- source/libs/qworker/src/qwUtil.c | 4 ++-- source/libs/qworker/src/qworker.c | 18 ++++++++++-------- source/libs/qworker/test/qworkerTests.cpp | 2 +- source/util/src/terror.c | 1 + 10 files changed, 22 insertions(+), 29 deletions(-) diff --git a/include/libs/executor/executor.h b/include/libs/executor/executor.h index 0bca254e14..1413b41756 100644 --- a/include/libs/executor/executor.h +++ b/include/libs/executor/executor.h @@ -152,7 +152,7 @@ void qCleanExecTaskBlockBuf(qTaskInfo_t tinfo); * @param tinfo qhandle * @return */ -int32_t qAsyncKillTask(qTaskInfo_t tinfo); +int32_t qAsyncKillTask(qTaskInfo_t tinfo, int32_t rspCode); /** * destroy query info structure diff --git a/include/util/taoserror.h b/include/util/taoserror.h index e5d0bcb249..ba7c72e0f3 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -323,6 +323,7 @@ int32_t* taosGetErrno(); #define TSDB_CODE_VND_COL_NOT_EXISTS TAOS_DEF_ERROR_CODE(0, 0x0526) #define TSDB_CODE_VND_COL_SUBSCRIBED TAOS_DEF_ERROR_CODE(0, 0x0527) #define TSDB_CODE_VND_NO_AVAIL_BUFPOOL TAOS_DEF_ERROR_CODE(0, 0x0528) +#define TSDB_CODE_VND_STOPPED TAOS_DEF_ERROR_CODE(0, 0x0529) // tsdb #define TSDB_CODE_TDB_INVALID_TABLE_ID TAOS_DEF_ERROR_CODE(0, 0x0600) diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h index 8163217039..e18a6916dd 100644 --- a/source/libs/executor/inc/executorimpl.h +++ b/source/libs/executor/inc/executorimpl.h @@ -796,7 +796,7 @@ void setInputDataBlock(SExprSupp* pExprSupp, SSDataBlock* pBlock, int32_t order, int32_t checkForQueryBuf(size_t numOfTables); bool isTaskKilled(SExecTaskInfo* pTaskInfo); -void setTaskKilled(SExecTaskInfo* pTaskInfo); +void setTaskKilled(SExecTaskInfo* pTaskInfo, int32_t rspCode); void doDestroyTask(SExecTaskInfo* pTaskInfo); void setTaskStatus(SExecTaskInfo* pTaskInfo, int8_t status); diff --git a/source/libs/executor/src/executor.c b/source/libs/executor/src/executor.c index 34bd9cf8ca..fd4dd3bd12 100644 --- a/source/libs/executor/src/executor.c +++ b/source/libs/executor/src/executor.c @@ -688,7 +688,7 @@ void qStopTaskOperators(SExecTaskInfo* pTaskInfo) { taosWUnLockLatch(&pTaskInfo->stopInfo.lock); } -int32_t qAsyncKillTask(qTaskInfo_t qinfo) { +int32_t qAsyncKillTask(qTaskInfo_t qinfo, int32_t rspCode) { SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)qinfo; if (pTaskInfo == NULL) { @@ -697,7 +697,7 @@ int32_t qAsyncKillTask(qTaskInfo_t qinfo) { qDebug("%s execTask async killed", GET_TASKID(pTaskInfo)); - setTaskKilled(pTaskInfo); + setTaskKilled(pTaskInfo, rspCode); qStopTaskOperators(pTaskInfo); diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 300ba52934..2766b48744 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -611,21 +611,10 @@ void setBlockSMAInfo(SqlFunctionCtx* pCtx, SExprInfo* pExprInfo, SSDataBlock* pB } bool isTaskKilled(SExecTaskInfo* pTaskInfo) { - // query has been executed more than tsShellActivityTimer, and the retrieve has not arrived - // abort current query execution. - if (pTaskInfo->owner != 0 && - ((taosGetTimestampSec() - pTaskInfo->cost.start / 1000) > 10 * getMaximumIdleDurationSec()) - /*(!needBuildResAfterQueryComplete(pTaskInfo))*/) { - assert(pTaskInfo->cost.start != 0); - // qDebug("QInfo:%" PRIu64 " retrieve not arrive beyond %d ms, abort current query execution, start:%" PRId64 - // ", current:%d", pQInfo->qId, 1, pQInfo->startExecTs, taosGetTimestampSec()); - // return true; - } - - return false; + return (0 != pTaskInfo->code) ? true : false; } -void setTaskKilled(SExecTaskInfo* pTaskInfo) { pTaskInfo->code = TSDB_CODE_TSC_QUERY_CANCELLED; } +void setTaskKilled(SExecTaskInfo* pTaskInfo, int32_t rspCode) { pTaskInfo->code = rspCode; } ///////////////////////////////////////////////////////////////////////////////////////////// STimeWindow getAlignQueryTimeWindow(SInterval* pInterval, int32_t precision, int64_t key) { diff --git a/source/libs/qworker/inc/qwInt.h b/source/libs/qworker/inc/qwInt.h index a0e04b6a19..af361323a7 100644 --- a/source/libs/qworker/inc/qwInt.h +++ b/source/libs/qworker/inc/qwInt.h @@ -363,7 +363,7 @@ int32_t qwAcquireTaskCtx(QW_FPARAMS_DEF, SQWTaskCtx **ctx); int32_t qwGetTaskCtx(QW_FPARAMS_DEF, SQWTaskCtx **ctx); int32_t qwAddAcquireTaskCtx(QW_FPARAMS_DEF, SQWTaskCtx **ctx); void qwReleaseTaskCtx(SQWorker *mgmt, void *ctx); -int32_t qwKillTaskHandle(SQWTaskCtx *ctx); +int32_t qwKillTaskHandle(SQWTaskCtx *ctx, int32_t rspCode); int32_t qwUpdateTaskStatus(QW_FPARAMS_DEF, int8_t status); int32_t qwDropTask(QW_FPARAMS_DEF); void qwSaveTbVersionInfo(qTaskInfo_t pTaskInfo, SQWTaskCtx *ctx); diff --git a/source/libs/qworker/src/qwUtil.c b/source/libs/qworker/src/qwUtil.c index 2c0a4072ae..86fd1d533c 100644 --- a/source/libs/qworker/src/qwUtil.c +++ b/source/libs/qworker/src/qwUtil.c @@ -279,14 +279,14 @@ void qwFreeTaskHandle(qTaskInfo_t *taskHandle) { } } -int32_t qwKillTaskHandle(SQWTaskCtx *ctx) { +int32_t qwKillTaskHandle(SQWTaskCtx *ctx, int32_t rspCode) { int32_t code = 0; // Note: free/kill may in RC qTaskInfo_t taskHandle = atomic_load_ptr(&ctx->taskHandle); if (taskHandle && atomic_val_compare_exchange_ptr(&ctx->taskHandle, taskHandle, NULL)) { qDebug("start to kill task"); - code = qAsyncKillTask(taskHandle); + code = qAsyncKillTask(taskHandle, rspCode); atomic_store_ptr(&ctx->taskHandle, taskHandle); } diff --git a/source/libs/qworker/src/qworker.c b/source/libs/qworker/src/qworker.c index 0890d10b65..9a318df324 100644 --- a/source/libs/qworker/src/qworker.c +++ b/source/libs/qworker/src/qworker.c @@ -411,7 +411,7 @@ int32_t qwHandlePrePhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *inpu // qwBuildAndSendDropRsp(&ctx->ctrlConnInfo, code); // QW_TASK_DLOG("drop rsp send, handle:%p, code:%x - %s", ctx->ctrlConnInfo.handle, code, tstrerror(code)); - QW_ERR_JRET(TSDB_CODE_QRY_TASK_DROPPED); + QW_ERR_JRET(ctx->rspCode); } QW_ERR_JRET(qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_EXEC)); @@ -420,7 +420,7 @@ int32_t qwHandlePrePhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *inpu case QW_PHASE_PRE_FETCH: { if (QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP) || QW_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) { QW_TASK_WLOG("task dropping or already dropped, phase:%s", qwPhaseStr(phase)); - QW_ERR_JRET(TSDB_CODE_QRY_TASK_DROPPED); + QW_ERR_JRET(ctx->rspCode); } if (QW_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) { @@ -442,7 +442,7 @@ int32_t qwHandlePrePhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *inpu case QW_PHASE_PRE_CQUERY: { if (QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) { QW_TASK_WLOG("task already dropped, phase:%s", qwPhaseStr(phase)); - QW_ERR_JRET(TSDB_CODE_QRY_TASK_DROPPED); + QW_ERR_JRET(ctx->rspCode); } if (ctx->rspCode) { @@ -456,7 +456,7 @@ int32_t qwHandlePrePhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *inpu // qwBuildAndSendDropRsp(&ctx->ctrlConnInfo, code); // QW_TASK_DLOG("drop rsp send, handle:%p, code:%x - %s", ctx->ctrlConnInfo.handle, code, tstrerror(code)); - QW_ERR_JRET(TSDB_CODE_QRY_TASK_DROPPED); + QW_ERR_JRET(ctx->rspCode); } break; @@ -502,7 +502,7 @@ int32_t qwHandlePostPhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *inp if (QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) { QW_TASK_WLOG("task already dropped, phase:%s", qwPhaseStr(phase)); - QW_ERR_JRET(TSDB_CODE_QRY_TASK_DROPPED); + QW_ERR_JRET(ctx->rspCode); } if (QW_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) { @@ -515,7 +515,7 @@ int32_t qwHandlePostPhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *inp // QW_TASK_DLOG("drop rsp send, handle:%p, code:%x - %s", ctx->ctrlConnInfo.handle, code, tstrerror(code)); QW_ERR_JRET(qwDropTask(QW_FPARAMS())); - QW_ERR_JRET(TSDB_CODE_QRY_TASK_DROPPED); + QW_ERR_JRET(ctx->rspCode); } if (ctx->rspCode) { @@ -861,7 +861,7 @@ int32_t qwProcessDrop(QW_FPARAMS_DEF, SQWMsg *qwMsg) { } if (QW_QUERY_RUNNING(ctx)) { - QW_ERR_JRET(qwKillTaskHandle(ctx)); + QW_ERR_JRET(qwKillTaskHandle(ctx, TSDB_CODE_TSC_QUERY_CANCELLED)); qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_DROP); } else { QW_ERR_JRET(qwDropTask(QW_FPARAMS())); @@ -869,6 +869,7 @@ int32_t qwProcessDrop(QW_FPARAMS_DEF, SQWMsg *qwMsg) { } if (!dropped) { + QW_UPDATE_RSP_CODE(ctx, TSDB_CODE_TSC_QUERY_CANCELLED); QW_SET_EVENT_RECEIVED(ctx, QW_EVENT_DROP); } @@ -1195,8 +1196,9 @@ void qWorkerStopAllTasks(void *qWorkerMgmt) { } if (QW_QUERY_RUNNING(ctx)) { - qwKillTaskHandle(ctx); + qwKillTaskHandle(ctx, TSDB_CODE_VND_STOPPED); } else if (!QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) { + QW_UPDATE_RSP_CODE(ctx, TSDB_CODE_VND_STOPPED); QW_SET_EVENT_RECEIVED(ctx, QW_EVENT_DROP); } diff --git a/source/libs/qworker/test/qworkerTests.cpp b/source/libs/qworker/test/qworkerTests.cpp index 8a48977c77..02b341e28c 100644 --- a/source/libs/qworker/test/qworkerTests.cpp +++ b/source/libs/qworker/test/qworkerTests.cpp @@ -302,7 +302,7 @@ int32_t qwtExecTask(qTaskInfo_t tinfo, SSDataBlock **pRes, uint64_t *useconds) { return 0; } -int32_t qwtKillTask(qTaskInfo_t qinfo) { return 0; } +int32_t qwtKillTask(qTaskInfo_t qinfo, int32_t rspCode) { return 0; } void qwtDestroyTask(qTaskInfo_t qHandle) {} diff --git a/source/util/src/terror.c b/source/util/src/terror.c index 4d889843e8..35f59c4881 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -315,6 +315,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_VND_COL_ALREADY_EXISTS, "Table column already TAOS_DEFINE_ERROR(TSDB_CODE_VND_COL_NOT_EXISTS, "Table column not exists") TAOS_DEFINE_ERROR(TSDB_CODE_VND_COL_SUBSCRIBED, "Table column is subscribed") TAOS_DEFINE_ERROR(TSDB_CODE_VND_NO_AVAIL_BUFPOOL, "No availabe buffer pool") +TAOS_DEFINE_ERROR(TSDB_CODE_VND_STOPPED, "Vnode stopped") // tsdb TAOS_DEFINE_ERROR(TSDB_CODE_TDB_INVALID_TABLE_ID, "Invalid table ID") From 4f37947e42ab6f6e37b6759292495005bfec539f Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Tue, 29 Nov 2022 17:15:48 +0800 Subject: [PATCH 37/77] 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 38/77] 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 decb17fcb16c38f548bd2a1bed1258ba1400038d Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Tue, 29 Nov 2022 20:21:33 +0800 Subject: [PATCH 39/77] 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 a450fae89a5cacebddd163ee5f3ae95bccf2f207 Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Wed, 30 Nov 2022 17:00:36 +0800 Subject: [PATCH 40/77] fix:window time wait --- source/os/src/osSemaphore.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/source/os/src/osSemaphore.c b/source/os/src/osSemaphore.c index bfce8b3151..3a375732b2 100644 --- a/source/os/src/osSemaphore.c +++ b/source/os/src/osSemaphore.c @@ -76,19 +76,15 @@ int32_t tsem_wait(tsem_t* sem) { } int32_t tsem_timewait(tsem_t* sem, int64_t milis) { - return 0; - /*return tsem_wait(sem);*/ -#if 0 struct timespec ts; - timespec_get(&ts); + taosClockGetTime(0, &ts); + ts.tv_nsec += ms * 1000000; ts.tv_sec += ts.tv_nsec / 1000000000; ts.tv_nsec %= 1000000000; - - /*GetSystemTimeAsFileTime(&ft_before);*/ - // errno = 0; - rc = sem_timedwait(sem, ts); - + int rc; + while ((rc = sem_timedwait(sem, &ts)) == -1 && errno == EINTR) continue; + return rc; /* This should have timed out */ // assert(errno == ETIMEDOUT); // assert(rc != 0); @@ -103,8 +99,6 @@ int32_t tsem_timewait(tsem_t* sem, int64_t milis) { // printf("time must advance during sem_timedwait."); // return 1; // } - return rc; -#endif } #elif defined(_TD_DARWIN_64) From 4e8acca2eb98622a772a6fdda2314aafb6585475 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Wed, 30 Nov 2022 19:24:15 +0800 Subject: [PATCH 41/77] 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 f0fdc58c528bbc626f19c6c682c182e827b15d31 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Wed, 30 Nov 2022 20:56:58 +0800 Subject: [PATCH 42/77] 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 1e8a8161552db2fb8a1e7924b4d1b000765271f6 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 30 Nov 2022 21:42:42 +0800 Subject: [PATCH 43/77] 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 3cbe109e4b17a325c60c748c75db558726cab641 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Wed, 30 Nov 2022 22:41:33 +0800 Subject: [PATCH 44/77] 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 89be771b6172bb04e19b72e8193889daa523bcee Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 1 Dec 2022 09:53:41 +0800 Subject: [PATCH 45/77] enh: add retry for vnode stopped case --- include/libs/qcom/query.h | 2 +- source/dnode/mgmt/node_mgmt/src/dmTransport.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/libs/qcom/query.h b/include/libs/qcom/query.h index f51aa88485..ef543470aa 100644 --- a/include/libs/qcom/query.h +++ b/include/libs/qcom/query.h @@ -260,7 +260,7 @@ extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t (NEED_CLIENT_RM_TBLMETA_ERROR(_code) || NEED_CLIENT_REFRESH_VG_ERROR(_code) || \ NEED_CLIENT_REFRESH_TBLMETA_ERROR(_code)) -#define SYNC_UNKNOWN_LEADER_REDIRECT_ERROR(_code) ((_code) == TSDB_CODE_SYN_NOT_LEADER || (_code) == TSDB_CODE_SYN_INTERNAL_ERROR) +#define SYNC_UNKNOWN_LEADER_REDIRECT_ERROR(_code) ((_code) == TSDB_CODE_SYN_NOT_LEADER || (_code) == TSDB_CODE_SYN_INTERNAL_ERROR || (_code) == TSDB_CODE_VND_STOPPED) #define SYNC_SELF_LEADER_REDIRECT_ERROR(_code) ((_code) == TSDB_CODE_SYN_NOT_LEADER || (_code) == TSDB_CODE_SYN_INTERNAL_ERROR) #define SYNC_OTHER_LEADER_REDIRECT_ERROR(_code) (false) // used later diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c index 95656fd76c..b9b7477952 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c +++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c @@ -234,7 +234,8 @@ static inline void dmReleaseHandle(SRpcHandleInfo *pHandle, int8_t type) { rpcRe static bool rpcRfp(int32_t code, tmsg_t msgType) { if (code == TSDB_CODE_RPC_REDIRECT || code == TSDB_CODE_RPC_NETWORK_UNAVAIL || code == TSDB_CODE_NODE_NOT_DEPLOYED || - code == TSDB_CODE_SYN_NOT_LEADER || code == TSDB_CODE_APP_NOT_READY || code == TSDB_CODE_RPC_BROKEN_LINK) { + code == TSDB_CODE_SYN_NOT_LEADER || code == TSDB_CODE_APP_NOT_READY || code == TSDB_CODE_RPC_BROKEN_LINK || + code == TSDB_CODE_VND_STOPPED) { if (msgType == TDMT_SCH_QUERY || msgType == TDMT_SCH_MERGE_QUERY || msgType == TDMT_SCH_FETCH || msgType == TDMT_SCH_MERGE_FETCH) { return false; From bf2808e45ecf88f9beaaba87035e08a033792f0f Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 1 Dec 2022 10:56:51 +0800 Subject: [PATCH 46/77] fix:memory leak for table meta --- source/client/src/clientSml.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index d811eb7fec..283e72cc82 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -559,6 +559,7 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { goto end; } + taosMemoryFreeClear(pTableMeta); code = catalogRefreshTableMeta(info->pCatalog, &conn, &pName, -1); if (code != TSDB_CODE_SUCCESS) { goto end; From 04b0280693dd06ef6b412746b00f4ee7fb2b05a7 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 1 Dec 2022 11:45:31 +0800 Subject: [PATCH 47/77] enh: add topic privilege in mnode --- source/dnode/mnode/impl/inc/mndDef.h | 2 + source/dnode/mnode/impl/inc/mndPrivilege.h | 1 + source/dnode/mnode/impl/src/mndPrivilege.c | 3 + source/dnode/mnode/impl/src/mndUser.c | 67 ++++++++++++++++++++-- 4 files changed, 68 insertions(+), 5 deletions(-) diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index 04ac5aba49..7dc50318b4 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -71,6 +71,7 @@ typedef enum { MND_OPER_READ_DB, MND_OPER_READ_OR_WRITE_DB, MND_OPER_SHOW_VARIBALES, + MND_OPER_SUBSCRIBE, } EOperType; typedef enum { @@ -273,6 +274,7 @@ typedef struct { int32_t authVersion; SHashObj* readDbs; SHashObj* writeDbs; + SHashObj* topics; SRWLatch lock; } SUserObj; diff --git a/source/dnode/mnode/impl/inc/mndPrivilege.h b/source/dnode/mnode/impl/inc/mndPrivilege.h index dc88b25f51..3e505eb5dc 100644 --- a/source/dnode/mnode/impl/inc/mndPrivilege.h +++ b/source/dnode/mnode/impl/inc/mndPrivilege.h @@ -28,6 +28,7 @@ void mndCleanupPrivilege(SMnode *pMnode); int32_t mndCheckOperPrivilege(SMnode *pMnode, const char *user, EOperType operType); int32_t mndCheckDbPrivilege(SMnode *pMnode, const char *user, EOperType operType, SDbObj *pDb); int32_t mndCheckDbPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *dbname); +int32_t mndCheckTopicPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *dbname); int32_t mndCheckShowPrivilege(SMnode *pMnode, const char *user, EShowType showType, const char *dbname); int32_t mndCheckAlterUserPrivilege(SUserObj *pOperUser, SUserObj *pUser, SAlterUserReq *pAlter); int32_t mndSetUserAuthRsp(SMnode *pMnode, SUserObj *pUser, SGetUserAuthRsp *pRsp); diff --git a/source/dnode/mnode/impl/src/mndPrivilege.c b/source/dnode/mnode/impl/src/mndPrivilege.c index 151a2a6404..edd7bb2a65 100644 --- a/source/dnode/mnode/impl/src/mndPrivilege.c +++ b/source/dnode/mnode/impl/src/mndPrivilege.c @@ -28,6 +28,9 @@ int32_t mndCheckDbPrivilege(SMnode *pMnode, const char *user, EOperType operType int32_t mndCheckDbPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *dbname) { return 0; } +int32_t mndCheckTopicPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *dbname) { + return 0; +} int32_t mndSetUserAuthRsp(SMnode *pMnode, SUserObj *pUser, SGetUserAuthRsp *pRsp) { memcpy(pRsp->user, pUser->user, TSDB_USER_LEN); pRsp->superAuth = 1; diff --git a/source/dnode/mnode/impl/src/mndUser.c b/source/dnode/mnode/impl/src/mndUser.c index 2f50ab04b8..2f310fba92 100644 --- a/source/dnode/mnode/impl/src/mndUser.c +++ b/source/dnode/mnode/impl/src/mndUser.c @@ -18,10 +18,11 @@ #include "mndDb.h" #include "mndPrivilege.h" #include "mndShow.h" +#include "mndTopic.h" #include "mndTrans.h" #include "tbase64.h" -#define USER_VER_NUMBER 1 +#define USER_VER_NUMBER 2 #define USER_RESERVE_SIZE 64 static int32_t mndCreateDefaultUsers(SMnode *pMnode); @@ -36,6 +37,8 @@ static int32_t mndProcessDropUserReq(SRpcMsg *pReq); static int32_t mndProcessGetUserAuthReq(SRpcMsg *pReq); static int32_t mndRetrieveUsers(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows); static void mndCancelGetNextUser(SMnode *pMnode, void *pIter); +static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows); +static void mndCancelGetNextPrivileges(SMnode *pMnode, void *pIter); int32_t mndInitUser(SMnode *pMnode) { SSdbTable table = { @@ -119,7 +122,9 @@ SSdbRaw *mndUserActionEncode(SUserObj *pUser) { int32_t numOfReadDbs = taosHashGetSize(pUser->readDbs); int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs); - int32_t size = sizeof(SUserObj) + USER_RESERVE_SIZE + (numOfReadDbs + numOfWriteDbs) * TSDB_DB_FNAME_LEN; + int32_t numOfTopics = taosHashGetSize(pUser->topics); + int32_t size = sizeof(SUserObj) + USER_RESERVE_SIZE + (numOfReadDbs + numOfWriteDbs) * TSDB_DB_FNAME_LEN + + numOfTopics * TSDB_TOPIC_FNAME_LEN; SSdbRaw *pRaw = sdbAllocRaw(SDB_USER, USER_VER_NUMBER, size); if (pRaw == NULL) goto _OVER; @@ -137,6 +142,7 @@ SSdbRaw *mndUserActionEncode(SUserObj *pUser) { SDB_SET_INT32(pRaw, dataPos, pUser->authVersion, _OVER) SDB_SET_INT32(pRaw, dataPos, numOfReadDbs, _OVER) SDB_SET_INT32(pRaw, dataPos, numOfWriteDbs, _OVER) + SDB_SET_INT32(pRaw, dataPos, numOfTopics, _OVER) char *db = taosHashIterate(pUser->readDbs, NULL); while (db != NULL) { @@ -150,6 +156,12 @@ SSdbRaw *mndUserActionEncode(SUserObj *pUser) { db = taosHashIterate(pUser->writeDbs, db); } + char *topic = taosHashIterate(pUser->topics, NULL); + while (topic != NULL) { + SDB_SET_BINARY(pRaw, dataPos, topic, TSDB_TOPIC_FNAME_LEN, _OVER); + db = taosHashIterate(pUser->topics, topic); + } + SDB_SET_RESERVE(pRaw, dataPos, USER_RESERVE_SIZE, _OVER) SDB_SET_DATALEN(pRaw, dataPos, _OVER) @@ -172,7 +184,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; - if (sver != USER_VER_NUMBER) { + if (sver != 1 && sver != 2) { terrno = TSDB_CODE_SDB_INVALID_DATA_VER; goto _OVER; } @@ -197,12 +209,18 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { int32_t numOfReadDbs = 0; int32_t numOfWriteDbs = 0; + int32_t numOfTopics = 0; SDB_GET_INT32(pRaw, dataPos, &numOfReadDbs, _OVER) SDB_GET_INT32(pRaw, dataPos, &numOfWriteDbs, _OVER) + if (sver >= 2) { + SDB_GET_INT32(pRaw, dataPos, &numOfTopics, _OVER) + } + pUser->readDbs = taosHashInit(numOfReadDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK); pUser->writeDbs = taosHashInit(numOfWriteDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK); - if (pUser->readDbs == NULL || pUser->writeDbs == NULL) goto _OVER; + pUser->topics = taosHashInit(numOfTopics, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK); + if (pUser->readDbs == NULL || pUser->writeDbs == NULL || pUser->topics == NULL) goto _OVER; for (int32_t i = 0; i < numOfReadDbs; ++i) { char db[TSDB_DB_FNAME_LEN] = {0}; @@ -218,6 +236,15 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { taosHashPut(pUser->writeDbs, db, len, db, TSDB_DB_FNAME_LEN); } + if (sver >= 2) { + for (int32_t i = 0; i < numOfTopics; ++i) { + char topic[TSDB_TOPIC_FNAME_LEN] = {0}; + SDB_GET_BINARY(pRaw, dataPos, topic, TSDB_TOPIC_FNAME_LEN, _OVER) + int32_t len = strlen(topic) + 1; + taosHashPut(pUser->topics, topic, len, topic, TSDB_TOPIC_FNAME_LEN); + } + } + SDB_GET_RESERVE(pRaw, dataPos, USER_RESERVE_SIZE, _OVER) taosInitRWLatch(&pUser->lock); @@ -228,6 +255,7 @@ _OVER: mError("user:%s, failed to decode from raw:%p since %s", pUser->user, pRaw, terrstr()); taosHashCleanup(pUser->readDbs); taosHashCleanup(pUser->writeDbs); + taosHashCleanup(pUser->topics); taosMemoryFreeClear(pRow); return NULL; } @@ -255,8 +283,10 @@ static int32_t mndUserActionDelete(SSdb *pSdb, SUserObj *pUser) { mTrace("user:%s, perform delete action, row:%p", pUser->user, pUser); taosHashCleanup(pUser->readDbs); taosHashCleanup(pUser->writeDbs); + taosHashCleanup(pUser->topics); pUser->readDbs = NULL; pUser->writeDbs = NULL; + pUser->topics = NULL; return 0; } @@ -270,6 +300,7 @@ static int32_t mndUserActionUpdate(SSdb *pSdb, SUserObj *pOld, SUserObj *pNew) { memcpy(pOld->pass, pNew->pass, TSDB_PASSWORD_LEN); TSWAP(pOld->readDbs, pNew->readDbs); TSWAP(pOld->writeDbs, pNew->writeDbs); + TSWAP(pOld->topics, pNew->topics); taosWUnLockLatch(&pOld->lock); return 0; @@ -482,9 +513,10 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { taosRLockLatch(&pUser->lock); newUser.readDbs = mndDupDbHash(pUser->readDbs); newUser.writeDbs = mndDupDbHash(pUser->writeDbs); + newUser.topics = mndDupDbHash(pUser->topics); taosRUnLockLatch(&pUser->lock); - if (newUser.readDbs == NULL || newUser.writeDbs == NULL) { + if (newUser.readDbs == NULL || newUser.writeDbs == NULL || newUser.topics == NULL) { goto _OVER; } @@ -582,6 +614,26 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { } } + if (alterReq.alterType == TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC) { + int32_t len = strlen(alterReq.objname) + 1; + SMqTopicObj *pTopic = mndAcquireTopic(pMnode, alterReq.objname); + if (pTopic == NULL) { + mndReleaseTopic(pMnode, pTopic); + goto _OVER; + } + taosHashPut(newUser.topics, pTopic->name, len, pTopic->name, TSDB_TOPIC_FNAME_LEN); + } + + if (alterReq.alterType == TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC) { + int32_t len = strlen(alterReq.objname) + 1; + SMqTopicObj *pTopic = mndAcquireTopic(pMnode, alterReq.objname); + if (pTopic == NULL) { + mndReleaseTopic(pMnode, pTopic); + goto _OVER; + } + taosHashRemove(newUser.topics, alterReq.objname, len); + } + code = mndAlterUser(pMnode, pUser, &newUser, pReq); if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS; @@ -594,6 +646,7 @@ _OVER: mndReleaseUser(pMnode, pUser); taosHashCleanup(newUser.writeDbs); taosHashCleanup(newUser.readDbs); + taosHashCleanup(newUser.topics); return code; } @@ -756,6 +809,10 @@ static void mndCancelGetNextUser(SMnode *pMnode, void *pIter) { sdbCancelFetch(pSdb, pIter); } +static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { return 0; } + +static void mndCancelGetNextPrivileges(SMnode *pMnode, void *pIter) {} + int32_t mndValidateUserAuthInfo(SMnode *pMnode, SUserAuthVersion *pUsers, int32_t numOfUses, void **ppRsp, int32_t *pRspLen) { SUserAuthBatchRsp batchRsp = {0}; From 6e73c89e504038577d273880637689a14343f500 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 1 Dec 2022 12:22:03 +0800 Subject: [PATCH 48/77] fix: executor returns kill task error code --- source/libs/executor/src/exchangeoperator.c | 6 +++--- source/libs/executor/src/scanoperator.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/source/libs/executor/src/exchangeoperator.c b/source/libs/executor/src/exchangeoperator.c index 963a273290..53660d88e1 100644 --- a/source/libs/executor/src/exchangeoperator.c +++ b/source/libs/executor/src/exchangeoperator.c @@ -70,7 +70,7 @@ static void concurrentlyLoadRemoteDataImpl(SOperatorInfo* pOperator, SExchangeIn tsem_wait(&pExchangeInfo->ready); if (isTaskKilled(pTaskInfo)) { - longjmp(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED); + longjmp(pTaskInfo->env, pTaskInfo->code); } for (int32_t i = 0; i < totalSources; ++i) { @@ -573,7 +573,7 @@ int32_t prepareConcurrentlyLoad(SOperatorInfo* pOperator) { tsem_wait(&pExchangeInfo->ready); if (isTaskKilled(pTaskInfo)) { - longjmp(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED); + longjmp(pTaskInfo->env, pTaskInfo->code); } tsem_post(&pExchangeInfo->ready); @@ -621,7 +621,7 @@ int32_t seqLoadRemoteData(SOperatorInfo* pOperator) { doSendFetchDataRequest(pExchangeInfo, pTaskInfo, pExchangeInfo->current); tsem_wait(&pExchangeInfo->ready); if (isTaskKilled(pTaskInfo)) { - longjmp(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED); + longjmp(pTaskInfo->env, pTaskInfo->code); } SDownstreamSourceNode* pSource = taosArrayGet(pExchangeInfo->pSources, pExchangeInfo->current); diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index b6353061fb..3c4ed00000 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -629,7 +629,7 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) { while (tsdbNextDataBlock(pTableScanInfo->base.dataReader)) { if (isTaskKilled(pTaskInfo)) { - T_LONG_JMP(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED); + T_LONG_JMP(pTaskInfo->env, pTaskInfo->code); } // process this data block based on the probabilities @@ -2032,7 +2032,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) { if (pInfo->dataReader && tsdbNextDataBlock(pInfo->dataReader)) { if (isTaskKilled(pTaskInfo)) { - longjmp(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED); + longjmp(pTaskInfo->env, pTaskInfo->code); } int32_t rows = 0; @@ -2529,7 +2529,7 @@ static SSDataBlock* getTableDataBlockImpl(void* param) { STsdbReader* reader = pInfo->base.dataReader; while (tsdbNextDataBlock(reader)) { if (isTaskKilled(pTaskInfo)) { - T_LONG_JMP(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED); + T_LONG_JMP(pTaskInfo->env, pTaskInfo->code); } // process this data block based on the probabilities From 51378aae40f6400d9651fa28a99bcced01b7362a Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 1 Dec 2022 12:22:43 +0800 Subject: [PATCH 49/77] enh: add topic privilege --- source/dnode/mnode/impl/inc/mndDef.h | 2 ++ source/dnode/mnode/impl/inc/mndPrivilege.h | 3 ++- source/dnode/mnode/impl/inc/mndTopic.h | 2 +- source/dnode/mnode/impl/src/mndPrivilege.c | 3 ++- source/dnode/mnode/impl/src/mndTopic.c | 9 +++++++-- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index 7dc50318b4..f9ec167319 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -72,6 +72,8 @@ typedef enum { MND_OPER_READ_OR_WRITE_DB, MND_OPER_SHOW_VARIBALES, MND_OPER_SUBSCRIBE, + MND_OPER_CREATE_TOPIC, + MND_OPER_DROP_TOPIC, } EOperType; typedef enum { diff --git a/source/dnode/mnode/impl/inc/mndPrivilege.h b/source/dnode/mnode/impl/inc/mndPrivilege.h index 3e505eb5dc..dfde2f671e 100644 --- a/source/dnode/mnode/impl/inc/mndPrivilege.h +++ b/source/dnode/mnode/impl/inc/mndPrivilege.h @@ -28,7 +28,8 @@ void mndCleanupPrivilege(SMnode *pMnode); int32_t mndCheckOperPrivilege(SMnode *pMnode, const char *user, EOperType operType); int32_t mndCheckDbPrivilege(SMnode *pMnode, const char *user, EOperType operType, SDbObj *pDb); int32_t mndCheckDbPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *dbname); -int32_t mndCheckTopicPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *dbname); +int32_t mndCheckTopicPrivilege(SMnode *pMnode, const char *user, EOperType operType, SMqTopicObj *pTopic); +int32_t mndCheckTopicPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *topicName); int32_t mndCheckShowPrivilege(SMnode *pMnode, const char *user, EShowType showType, const char *dbname); int32_t mndCheckAlterUserPrivilege(SUserObj *pOperUser, SUserObj *pUser, SAlterUserReq *pAlter); int32_t mndSetUserAuthRsp(SMnode *pMnode, SUserObj *pUser, SGetUserAuthRsp *pRsp); diff --git a/source/dnode/mnode/impl/inc/mndTopic.h b/source/dnode/mnode/impl/inc/mndTopic.h index 9f516904ce..8cd669c769 100644 --- a/source/dnode/mnode/impl/inc/mndTopic.h +++ b/source/dnode/mnode/impl/inc/mndTopic.h @@ -25,7 +25,7 @@ extern "C" { int32_t mndInitTopic(SMnode *pMnode); void mndCleanupTopic(SMnode *pMnode); -SMqTopicObj *mndAcquireTopic(SMnode *pMnode, char *topicName); +SMqTopicObj *mndAcquireTopic(SMnode *pMnode, const char *topicName); void mndReleaseTopic(SMnode *pMnode, SMqTopicObj *pTopic); SSdbRaw *mndTopicActionEncode(SMqTopicObj *pTopic); diff --git a/source/dnode/mnode/impl/src/mndPrivilege.c b/source/dnode/mnode/impl/src/mndPrivilege.c index edd7bb2a65..ccb4140b83 100644 --- a/source/dnode/mnode/impl/src/mndPrivilege.c +++ b/source/dnode/mnode/impl/src/mndPrivilege.c @@ -28,7 +28,8 @@ int32_t mndCheckDbPrivilege(SMnode *pMnode, const char *user, EOperType operType int32_t mndCheckDbPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *dbname) { return 0; } -int32_t mndCheckTopicPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *dbname) { +int32_t mndCheckTopicPrivilege(SMnode *pMnode, const char *user, EOperType operType, SMqTopicObj *pTopic) { return 0; } +int32_t mndCheckTopicPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *topicName) { return 0; } int32_t mndSetUserAuthRsp(SMnode *pMnode, SUserObj *pUser, SGetUserAuthRsp *pRsp) { diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c index 6412761f0b..aabb2e5087 100644 --- a/source/dnode/mnode/impl/src/mndTopic.c +++ b/source/dnode/mnode/impl/src/mndTopic.c @@ -288,7 +288,7 @@ static int32_t mndTopicActionUpdate(SSdb *pSdb, SMqTopicObj *pOldTopic, SMqTopic return 0; } -SMqTopicObj *mndAcquireTopic(SMnode *pMnode, char *topicName) { +SMqTopicObj *mndAcquireTopic(SMnode *pMnode, const char *topicName) { SSdb *pSdb = pMnode->pSdb; SMqTopicObj *pTopic = sdbAcquire(pSdb, SDB_TOPIC, topicName); if (pTopic == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) { @@ -573,7 +573,7 @@ static int32_t mndProcessCreateTopicReq(SRpcMsg *pReq) { goto _OVER; } - if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_READ_DB, pDb) != 0) { + if (mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_TOPIC) != 0) { goto _OVER; } @@ -633,6 +633,11 @@ static int32_t mndProcessDropTopicReq(SRpcMsg *pReq) { } } + if (mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_TOPIC) != 0) { + mndReleaseTopic(pMnode, pTopic); + return -1; + } + void *pIter = NULL; SMqConsumerObj *pConsumer; while (1) { From f5bebc53f16ba03b3d72da7eb32568499fb47e74 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Thu, 1 Dec 2022 12:53:38 +0800 Subject: [PATCH 50/77] 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 51/77] 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 9f9e2081f1b720da3658f13245003153010e46c3 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 1 Dec 2022 13:37:32 +0800 Subject: [PATCH 52/77] enh: add topic privilege --- include/common/tmsg.h | 1 + source/dnode/mnode/impl/src/mndUser.c | 104 +++++++++++++++++++++++++- 2 files changed, 103 insertions(+), 2 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index b6966c97b9..3b9857a21f 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -120,6 +120,7 @@ typedef enum _mgmt_table { TSDB_MGMT_TABLE_VNODES, TSDB_MGMT_TABLE_APPS, TSDB_MGMT_TABLE_STREAM_TASKS, + TSDB_MGMT_TABLE_PRIVILEGES, TSDB_MGMT_TABLE_MAX, } EShowType; diff --git a/source/dnode/mnode/impl/src/mndUser.c b/source/dnode/mnode/impl/src/mndUser.c index 2f310fba92..fd0a04f2e7 100644 --- a/source/dnode/mnode/impl/src/mndUser.c +++ b/source/dnode/mnode/impl/src/mndUser.c @@ -59,6 +59,8 @@ int32_t mndInitUser(SMnode *pMnode) { mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_USER, mndRetrieveUsers); mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_USER, mndCancelGetNextUser); + mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_PRIVILEGES, mndRetrievePrivileges); + mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_PRIVILEGES, mndCancelGetNextPrivileges); return sdbSetTable(pMnode->pSdb, table); } @@ -809,9 +811,107 @@ static void mndCancelGetNextUser(SMnode *pMnode, void *pIter) { sdbCancelFetch(pSdb, pIter); } -static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { return 0; } +static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) { + SMnode *pMnode = pReq->info.node; + SSdb *pSdb = pMnode->pSdb; + int32_t numOfRows = 0; + SUserObj *pUser = NULL; + int32_t cols = 0; + char *pWrite; -static void mndCancelGetNextPrivileges(SMnode *pMnode, void *pIter) {} + while (numOfRows < rows) { + pShow->pIter = sdbFetch(pSdb, SDB_USER, pShow->pIter, (void **)&pUser); + if (pShow->pIter == NULL) break; + + int32_t numOfReadDbs = taosHashGetSize(pUser->readDbs); + int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs); + int32_t numOfTopics = taosHashGetSize(pUser->topics); + if (numOfRows + numOfReadDbs + numOfWriteDbs + numOfTopics >= rows) break; + + char *db = taosHashIterate(pUser->readDbs, NULL); + while (db != NULL) { + cols = 0; + SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes); + colDataAppend(pColInfo, numOfRows, (const char *)userName, false); + + char privilege[20] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(privilege, "read", pShow->pMeta->pSchemas[cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + colDataAppend(pColInfo, numOfRows, (const char *)privilege, false); + + SName name = {0}; + char objName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + tNameFromString(&name, db, T_NAME_ACCT | T_NAME_DB); + tNameGetDbName(&name, varDataVal(objName)); + varDataSetLen(objName, strlen(varDataVal(objName))); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + colDataAppend(pColInfo, numOfRows, (const char *)objName, false); + + numOfRows++; + db = taosHashIterate(pUser->readDbs, db); + } + + db = taosHashIterate(pUser->writeDbs, NULL); + while (db != NULL) { + cols = 0; + SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes); + colDataAppend(pColInfo, numOfRows, (const char *)userName, false); + + char privilege[20] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(privilege, "write", pShow->pMeta->pSchemas[cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + colDataAppend(pColInfo, numOfRows, (const char *)privilege, false); + + SName name = {0}; + char objName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + tNameFromString(&name, db, T_NAME_ACCT | T_NAME_DB); + tNameGetDbName(&name, varDataVal(objName)); + varDataSetLen(objName, strlen(varDataVal(objName))); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + colDataAppend(pColInfo, numOfRows, (const char *)objName, false); + + numOfRows++; + db = taosHashIterate(pUser->writeDbs, db); + } + + char *topic = taosHashIterate(pUser->topics, NULL); + while (topic != NULL) { + cols = 0; + SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes); + colDataAppend(pColInfo, numOfRows, (const char *)userName, false); + + char privilege[20] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(privilege, "subscribe", pShow->pMeta->pSchemas[cols].bytes); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + colDataAppend(pColInfo, numOfRows, (const char *)privilege, false); + + char topicName[TSDB_TOPIC_NAME_LEN + VARSTR_HEADER_SIZE + 5] = {0}; + tstrncpy(varDataVal(topicName), mndGetDbStr(topic), TSDB_TOPIC_NAME_LEN - 2); + varDataSetLen(topicName, strlen(varDataVal(topicName))); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + colDataAppend(pColInfo, numOfRows, (const char *)topicName, false); + + numOfRows++; + db = taosHashIterate(pUser->topics, topic); + } + + sdbRelease(pSdb, pUser); + } + + pShow->numOfRows += numOfRows; + return numOfRows; +} + +static void mndCancelGetNextPrivileges(SMnode *pMnode, void *pIter) { + SSdb *pSdb = pMnode->pSdb; + sdbCancelFetch(pSdb, pIter); +} int32_t mndValidateUserAuthInfo(SMnode *pMnode, SUserAuthVersion *pUsers, int32_t numOfUses, void **ppRsp, int32_t *pRspLen) { From 2cccc3d18ed8125d09766ff47609c0c4f631eb4a Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 1 Dec 2022 13:48:51 +0800 Subject: [PATCH 53/77] 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 54/77] 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 a6d4fe7a636ea22d7d44990a4479aac0126b811a Mon Sep 17 00:00:00 2001 From: Bo Xiao Date: Thu, 1 Dec 2022 14:40:03 +0800 Subject: [PATCH 55/77] 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 f15d284d6238a4c3b8cd582ffbfd82e57f981bac Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 1 Dec 2022 14:54:27 +0800 Subject: [PATCH 56/77] fix:remove log for ts & add log for meta --- source/client/src/clientSml.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index 283e72cc82..719a6f82d2 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -139,6 +139,8 @@ typedef struct { int32_t numOfSTables; int32_t numOfCTables; int32_t numOfCreateSTables; + int32_t numOfAlterColSTables; + int32_t numOfAlterTagSTables; int64_t parseTime; int64_t schemaTime; @@ -512,6 +514,7 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { goto end; } + info->cost.numOfAlterTagSTables++; taosMemoryFreeClear(pTableMeta); code = catalogRefreshTableMeta(info->pCatalog, &conn, &pName, -1); if (code != TSDB_CODE_SUCCESS) { @@ -559,6 +562,7 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { goto end; } + info->cost.numOfAlterColSTables++; taosMemoryFreeClear(pTableMeta); code = catalogRefreshTableMeta(info->pCatalog, &conn, &pName, -1); if (code != TSDB_CODE_SUCCESS) { @@ -821,11 +825,6 @@ static int8_t smlGetTsTypeByPrecision(int8_t precision) { } static int64_t smlParseInfluxTime(SSmlHandle *info, const char *data, int32_t len) { - void *tmp = taosMemoryCalloc(1, len + 1); - memcpy(tmp, data, len); - uDebug("SML:0x%" PRIx64 " smlParseInfluxTime tslen:%d, ts:%s", info->id, len, (char*)tmp); - taosMemoryFree(tmp); - if (len == 0 || (len == 1 && data[0] == '0')) { return taosGetTimestampNs(); } @@ -878,7 +877,10 @@ static int32_t smlParseTS(SSmlHandle *info, const char *data, int32_t len, SArra } uDebug("SML:0x%" PRIx64 " smlParseTS:%" PRId64, info->id, ts); - if (ts == -1) return TSDB_CODE_INVALID_TIMESTAMP; + if (ts <= 0) { + uError("SML:0x%" PRIx64 " smlParseTS error:%" PRId64, info->id, ts); + return TSDB_CODE_INVALID_TIMESTAMP; + } // add ts to SSmlKv *kv = (SSmlKv *)taosMemoryCalloc(sizeof(SSmlKv), 1); @@ -2077,10 +2079,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}; - void *tmp = taosMemoryCalloc(1, len + 1); - memcpy(tmp, sql, len); - uDebug("SML:0x%" PRIx64 " smlParseInfluxLine raw:%d, len:%d, sql:%s", info->id, info->isRawLine, len, (info->isRawLine ? (char*)tmp : sql)); - taosMemoryFree(tmp); + uDebug("SML:0x%" PRIx64 " smlParseInfluxLine raw:%d, len:%d, sql:%s", info->id, info->isRawLine, len, (info->isRawLine ? "rawdata" : sql)); int ret = smlParseInfluxString(sql, sql + len, &elements, &info->msgBuf); if (ret != TSDB_CODE_SUCCESS) { @@ -2373,11 +2372,12 @@ static int32_t smlInsertData(SSmlHandle *info) { static void smlPrintStatisticInfo(SSmlHandle *info) { uError("SML:0x%" PRIx64 - " smlInsertLines result, code:%d,lineNum:%d,stable num:%d,ctable num:%d,create stable num:%d \ + " smlInsertLines result, code:%d,lineNum:%d,stable num:%d,ctable num:%d,create stable num:%d,alter stable tag num:%d,alter stable col num:%d \ parse cost:%" PRId64 ",schema cost:%" PRId64 ",bind cost:%" PRId64 ",rpc cost:%" PRId64 ",total cost:%" PRId64 "", info->id, info->cost.code, info->cost.lineNum, info->cost.numOfSTables, info->cost.numOfCTables, - info->cost.numOfCreateSTables, info->cost.schemaTime - info->cost.parseTime, + info->cost.numOfCreateSTables, info->cost.numOfAlterTagSTables, info->cost.numOfAlterColSTables, + info->cost.schemaTime - info->cost.parseTime, info->cost.insertBindTime - info->cost.schemaTime, info->cost.insertRpcTime - info->cost.insertBindTime, info->cost.endTime - info->cost.insertRpcTime, info->cost.endTime - info->cost.parseTime); } From 98726f17fa13b21fe88fd41f2536396528833f16 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 1 Dec 2022 14:54:58 +0800 Subject: [PATCH 57/77] fix: redirect handler issue --- source/libs/scheduler/src/schTask.c | 10 +++++----- source/libs/transport/src/transCli.c | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/source/libs/scheduler/src/schTask.c b/source/libs/scheduler/src/schTask.c index 9a7f3332b3..289fb35032 100644 --- a/source/libs/scheduler/src/schTask.c +++ b/source/libs/scheduler/src/schTask.c @@ -430,15 +430,15 @@ int32_t schDoTaskRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf *pData, int32 if (SCH_IS_DATA_BIND_TASK(pTask)) { if (pData && pData->pEpSet) { SCH_ERR_JRET(schUpdateTaskCandidateAddr(pJob, pTask, pData->pEpSet)); - } else if (SYNC_UNKNOWN_LEADER_REDIRECT_ERROR(rspCode)) { - SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx); - SCH_SWITCH_EPSET(addr); - SCH_TASK_DLOG("switch task target node %d epset to %d/%d", addr->nodeId, addr->epSet.inUse, addr->epSet.numOfEps); - } else { + } else if (SYNC_SELF_LEADER_REDIRECT_ERROR(rspCode)) { SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx); SEp *pEp = &addr->epSet.eps[addr->epSet.inUse]; SCH_TASK_DLOG("task retry node %d current ep, idx:%d/%d,%s:%d", addr->nodeId, addr->epSet.inUse, addr->epSet.numOfEps, pEp->fqdn, pEp->port); + } else { + SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx); + SCH_SWITCH_EPSET(addr); + SCH_TASK_DLOG("switch task target node %d epset to %d/%d", addr->nodeId, addr->epSet.inUse, addr->epSet.numOfEps); } if (SCH_TASK_NEED_FLOW_CTRL(pJob, pTask)) { diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index fbcc1fb525..4003a74ec7 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -1512,7 +1512,7 @@ bool cliGenRetryRule(SCliConn* pConn, STransMsg* pResp, SCliMsg* pMsg) { transFreeMsg(pResp->pCont); transUnrefCliHandle(pConn); } else if (code == TSDB_CODE_SYN_NOT_LEADER || code == TSDB_CODE_SYN_INTERNAL_ERROR || - code == TSDB_CODE_SYN_PROPOSE_NOT_READY || code == TSDB_CODE_RPC_REDIRECT) { + code == TSDB_CODE_SYN_PROPOSE_NOT_READY || code == TSDB_CODE_RPC_REDIRECT || TSDB_CODE_VND_STOPPED) { tDebug("code str %s, contlen:%d 1", tstrerror(code), pResp->contLen); noDelay = cliResetEpset(pCtx, pResp, true); transFreeMsg(pResp->pCont); From 704885e21245ba277374823ee279be3317d70417 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 1 Dec 2022 15:07:40 +0800 Subject: [PATCH 58/77] 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 59/77] 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 3378ff0fb89d8e8fd2b698e865e2fba3c6f02cf9 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 1 Dec 2022 16:03:40 +0800 Subject: [PATCH 60/77] refactor code --- source/libs/transport/inc/transComm.h | 4 +-- source/libs/transport/src/transCli.c | 44 +++++++++++++++++++-------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/source/libs/transport/inc/transComm.h b/source/libs/transport/inc/transComm.h index 479c1a5af7..bf9a6c0051 100644 --- a/source/libs/transport/inc/transComm.h +++ b/source/libs/transport/inc/transComm.h @@ -151,8 +151,8 @@ typedef struct { int64_t retryNextInterval; bool retryInit; int32_t retryStep; - - int8_t epsetRetryCnt; + int8_t epsetRetryCnt; + int32_t retryCode; int hThrdIdx; } STransConnCtx; diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index fbcc1fb525..e92b44f8c2 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -1020,7 +1020,6 @@ void cliHandleReq(SCliMsg* pMsg, SCliThrd* pThrd) { char tbuf[256] = {0}; EPSET_DEBUG_STR(&pCtx->epSet, tbuf); - tDebug("current epset %s", tbuf); if (!EPSET_IS_VALID(&pCtx->epSet)) { tError("invalid epset"); @@ -1500,34 +1499,46 @@ bool cliGenRetryRule(SCliConn* pConn, STransMsg* pResp, SCliMsg* pMsg) { pCtx->retryNextInterval = pCtx->retryMinInterval; pCtx->retryStep = 0; pCtx->retryInit = true; + pCtx->retryCode = TSDB_CODE_SUCCESS; } + if (-1 != pCtx->retryMaxTimeout && taosGetTimestampMs() - pCtx->retryInitTimestamp >= pCtx->retryMaxTimeout) { return false; } + // code, msgType + + // A: epset, leader, not self + // B: epset, not know leader + // C: no epset, leader but not serivce + bool noDelay = false; if (code == TSDB_CODE_RPC_BROKEN_LINK || code == TSDB_CODE_RPC_NETWORK_UNAVAIL) { - tDebug("code str %s, contlen:%d 0", tstrerror(code), pResp->contLen); + tTrace("code str %s, contlen:%d 0", tstrerror(code), pResp->contLen); noDelay = cliResetEpset(pCtx, pResp, false); transFreeMsg(pResp->pCont); transUnrefCliHandle(pConn); } else if (code == TSDB_CODE_SYN_NOT_LEADER || code == TSDB_CODE_SYN_INTERNAL_ERROR || code == TSDB_CODE_SYN_PROPOSE_NOT_READY || code == TSDB_CODE_RPC_REDIRECT) { - tDebug("code str %s, contlen:%d 1", tstrerror(code), pResp->contLen); + tTrace("code str %s, contlen:%d 1", tstrerror(code), pResp->contLen); noDelay = cliResetEpset(pCtx, pResp, true); transFreeMsg(pResp->pCont); addConnToPool(pThrd->pool, pConn); } else if (code == TSDB_CODE_SYN_RESTORING) { - tDebug("code str %s, contlen:%d 0", tstrerror(code), pResp->contLen); + tTrace("code str %s, contlen:%d 0", tstrerror(code), pResp->contLen); noDelay = cliResetEpset(pCtx, pResp, false); addConnToPool(pThrd->pool, pConn); transFreeMsg(pResp->pCont); } else { - tDebug("code str %s, contlen:%d 0", tstrerror(code), pResp->contLen); + tTrace("code str %s, contlen:%d 0", tstrerror(code), pResp->contLen); noDelay = cliResetEpset(pCtx, pResp, false); addConnToPool(pThrd->pool, pConn); transFreeMsg(pResp->pCont); } + if (code != TSDB_CODE_RPC_BROKEN_LINK && code != TSDB_CODE_RPC_NETWORK_UNAVAIL && code != TSDB_CODE_SUCCESS) { + // save one internal code + pCtx->retryCode = code; + } if (noDelay == false) { pCtx->epsetRetryCnt = 1; @@ -1556,29 +1567,36 @@ int cliAppCb(SCliConn* pConn, STransMsg* pResp, SCliMsg* pMsg) { STrans* pTransInst = pThrd->pTransInst; if (pMsg == NULL || pMsg->ctx == NULL) { - tDebug("%s conn %p handle resp", pTransInst->label, pConn); + tTrace("%s conn %p handle resp", pTransInst->label, pConn); pTransInst->cfp(pTransInst->parent, pResp, NULL); return 0; } STransConnCtx* pCtx = pMsg->ctx; - int32_t code = pResp->code; bool retry = cliGenRetryRule(pConn, pResp, pMsg); if (retry == true) { return -1; } - STraceId* trace = &pResp->info.traceId; - bool hasEpSet = cliTryExtractEpSet(pResp, &pCtx->epSet); + if (pCtx->retryCode != TSDB_CODE_SUCCESS) { + int32_t code = pResp->code; + // return internal code app + if (code == TSDB_CODE_RPC_NETWORK_UNAVAIL || code == TSDB_CODE_RPC_BROKEN_LINK) { + pResp->code = pCtx->retryCode; + } + } + + STraceId* trace = &pResp->info.traceId; + bool hasEpSet = cliTryExtractEpSet(pResp, &pCtx->epSet); if (hasEpSet) { char tbuf[256] = {0}; EPSET_DEBUG_STR(&pCtx->epSet, tbuf); - tGDebug("%s conn %p extract epset from msg", CONN_GET_INST_LABEL(pConn), pConn); + tGTrace("%s conn %p extract epset from msg", CONN_GET_INST_LABEL(pConn), pConn); } if (pCtx->pSem != NULL) { - tGDebug("%s conn %p(sync) handle resp", CONN_GET_INST_LABEL(pConn), pConn); + tGTrace("%s conn %p(sync) handle resp", CONN_GET_INST_LABEL(pConn), pConn); if (pCtx->pRsp == NULL) { tGTrace("%s conn %p(sync) failed to resp, ignore", CONN_GET_INST_LABEL(pConn), pConn); } else { @@ -1587,11 +1605,11 @@ int cliAppCb(SCliConn* pConn, STransMsg* pResp, SCliMsg* pMsg) { tsem_post(pCtx->pSem); pCtx->pRsp = NULL; } else { - tGDebug("%s conn %p handle resp", CONN_GET_INST_LABEL(pConn), pConn); + tGTrace("%s conn %p handle resp", CONN_GET_INST_LABEL(pConn), pConn); if (retry == false && hasEpSet == true) { pTransInst->cfp(pTransInst->parent, pResp, &pCtx->epSet); } else { - if (!cliIsEpsetUpdated(code, pCtx)) { + if (!cliIsEpsetUpdated(pResp->code, pCtx)) { pTransInst->cfp(pTransInst->parent, pResp, NULL); } else { pTransInst->cfp(pTransInst->parent, pResp, &pCtx->epSet); From 2d485639591708b3d95aeb3003399f25179aaac6 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 1 Dec 2022 16:04:39 +0800 Subject: [PATCH 61/77] fix: crash if failed to decode sdb row --- source/dnode/mnode/impl/src/mndAcct.c | 8 +++++--- source/dnode/mnode/impl/src/mndCluster.c | 9 ++++++--- source/dnode/mnode/impl/src/mndConsumer.c | 11 +++++++---- source/dnode/mnode/impl/src/mndDb.c | 8 +++++--- source/dnode/mnode/impl/src/mndDnode.c | 8 +++++--- source/dnode/mnode/impl/src/mndFunc.c | 8 +++++--- source/dnode/mnode/impl/src/mndMnode.c | 8 +++++--- source/dnode/mnode/impl/src/mndQnode.c | 8 +++++--- source/dnode/mnode/impl/src/mndSma.c | 8 +++++--- source/dnode/mnode/impl/src/mndSnode.c | 8 +++++--- source/dnode/mnode/impl/src/mndStb.c | 16 ++++++++++------ source/dnode/mnode/impl/src/mndStream.c | 11 ++++++----- source/dnode/mnode/impl/src/mndSubscribe.c | 11 ++++++----- source/dnode/mnode/impl/src/mndTopic.c | 11 ++++++----- source/dnode/mnode/impl/src/mndUser.c | 16 ++++++++++------ source/dnode/mnode/impl/src/mndVgroup.c | 8 +++++--- tests/script/tsim/user/privilege_db.sim | 5 +++++ 17 files changed, 101 insertions(+), 61 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndAcct.c b/source/dnode/mnode/impl/src/mndAcct.c index ffa5dc6d0b..ce2ec7b23a 100644 --- a/source/dnode/mnode/impl/src/mndAcct.c +++ b/source/dnode/mnode/impl/src/mndAcct.c @@ -147,6 +147,8 @@ _OVER: static SSdbRow *mndAcctActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; + SAcctObj *pAcct = NULL; + SSdbRow *pRow = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; @@ -156,10 +158,10 @@ static SSdbRow *mndAcctActionDecode(SSdbRaw *pRaw) { goto _OVER; } - SSdbRow *pRow = sdbAllocRow(sizeof(SAcctObj)); + pRow = sdbAllocRow(sizeof(SAcctObj)); if (pRow == NULL) goto _OVER; - SAcctObj *pAcct = sdbGetRowObj(pRow); + pAcct = sdbGetRowObj(pRow); if (pAcct == NULL) goto _OVER; int32_t dataPos = 0; @@ -186,7 +188,7 @@ static SSdbRow *mndAcctActionDecode(SSdbRaw *pRaw) { _OVER: if (terrno != 0) { - mError("acct:%s, failed to decode from raw:%p since %s", pAcct->acct, pRaw, terrstr()); + mError("acct:%s, failed to decode from raw:%p since %s", pAcct == NULL ? "null" : pAcct->acct, pRaw, terrstr()); taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndCluster.c b/source/dnode/mnode/impl/src/mndCluster.c index 348c8f4cb8..ca03207d2b 100644 --- a/source/dnode/mnode/impl/src/mndCluster.c +++ b/source/dnode/mnode/impl/src/mndCluster.c @@ -157,6 +157,8 @@ _OVER: static SSdbRow *mndClusterActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; + SClusterObj *pCluster = NULL; + SSdbRow *pRow = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; @@ -166,10 +168,10 @@ static SSdbRow *mndClusterActionDecode(SSdbRaw *pRaw) { goto _OVER; } - SSdbRow *pRow = sdbAllocRow(sizeof(SClusterObj)); + pRow = sdbAllocRow(sizeof(SClusterObj)); if (pRow == NULL) goto _OVER; - SClusterObj *pCluster = sdbGetRowObj(pRow); + pCluster = sdbGetRowObj(pRow); if (pCluster == NULL) goto _OVER; int32_t dataPos = 0; @@ -184,7 +186,8 @@ static SSdbRow *mndClusterActionDecode(SSdbRaw *pRaw) { _OVER: if (terrno != 0) { - mError("cluster:%" PRId64 ", failed to decode from raw:%p since %s", pCluster->id, pRaw, terrstr()); + mError("cluster:%" PRId64 ", failed to decode from raw:%p since %s", pCluster == NULL ? 0 : pCluster->id, pRaw, + terrstr()); taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndConsumer.c b/source/dnode/mnode/impl/src/mndConsumer.c index 4397ea0751..76bff9a70f 100644 --- a/source/dnode/mnode/impl/src/mndConsumer.c +++ b/source/dnode/mnode/impl/src/mndConsumer.c @@ -712,7 +712,9 @@ CM_ENCODE_OVER: SSdbRow *mndConsumerActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; - void *buf = NULL; + SSdbRow *pRow = NULL; + SMqConsumerObj *pConsumer = NULL; + void *buf = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto CM_DECODE_OVER; @@ -722,10 +724,10 @@ SSdbRow *mndConsumerActionDecode(SSdbRaw *pRaw) { goto CM_DECODE_OVER; } - SSdbRow *pRow = sdbAllocRow(sizeof(SMqConsumerObj)); + pRow = sdbAllocRow(sizeof(SMqConsumerObj)); if (pRow == NULL) goto CM_DECODE_OVER; - SMqConsumerObj *pConsumer = sdbGetRowObj(pRow); + pConsumer = sdbGetRowObj(pRow); if (pConsumer == NULL) goto CM_DECODE_OVER; int32_t dataPos = 0; @@ -745,7 +747,8 @@ SSdbRow *mndConsumerActionDecode(SSdbRaw *pRaw) { CM_DECODE_OVER: taosMemoryFreeClear(buf); if (terrno != TSDB_CODE_SUCCESS) { - mError("consumer:%" PRId64 ", failed to decode from raw:%p since %s", pConsumer->consumerId, pRaw, terrstr()); + mError("consumer:%" PRId64 ", failed to decode from raw:%p since %s", pConsumer == NULL ? 0 : pConsumer->consumerId, + pRaw, terrstr()); taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index c5d5687ade..5fa86dffe2 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -147,6 +147,8 @@ _OVER: static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; + SSdbRow *pRow = NULL; + SDbObj *pDb = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; @@ -156,10 +158,10 @@ static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) { goto _OVER; } - SSdbRow *pRow = sdbAllocRow(sizeof(SDbObj)); + pRow = sdbAllocRow(sizeof(SDbObj)); if (pRow == NULL) goto _OVER; - SDbObj *pDb = sdbGetRowObj(pRow); + pDb = sdbGetRowObj(pRow); if (pDb == NULL) goto _OVER; int32_t dataPos = 0; @@ -232,7 +234,7 @@ static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) { _OVER: if (terrno != 0) { - mError("db:%s, failed to decode from raw:%p since %s", pDb->name, pRaw, terrstr()); + mError("db:%s, failed to decode from raw:%p since %s", pDb == NULL ? "null" : pDb->name, pRaw, terrstr()); taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index 2a3ecf1924..8939182658 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -154,8 +154,9 @@ _OVER: } static SSdbRow *mndDnodeActionDecode(SSdbRaw *pRaw) { - SSdbRow *pRow = NULL; terrno = TSDB_CODE_OUT_OF_MEMORY; + SSdbRow *pRow = NULL; + SDnodeObj *pDnode = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; @@ -166,7 +167,8 @@ static SSdbRow *mndDnodeActionDecode(SSdbRaw *pRaw) { pRow = sdbAllocRow(sizeof(SDnodeObj)); if (pRow == NULL) goto _OVER; - SDnodeObj *pDnode = sdbGetRowObj(pRow); + + pDnode = sdbGetRowObj(pRow); if (pDnode == NULL) goto _OVER; int32_t dataPos = 0; @@ -181,7 +183,7 @@ static SSdbRow *mndDnodeActionDecode(SSdbRaw *pRaw) { _OVER: if (terrno != 0) { - mError("dnode:%d, failed to decode from raw:%p since %s", pDnode->id, pRaw, terrstr()); + mError("dnode:%d, failed to decode from raw:%p since %s", pDnode == NULL ? 0 : pDnode->id, pRaw, terrstr()); taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndFunc.c b/source/dnode/mnode/impl/src/mndFunc.c index c9b22fad3a..31f31a15ba 100644 --- a/source/dnode/mnode/impl/src/mndFunc.c +++ b/source/dnode/mnode/impl/src/mndFunc.c @@ -101,6 +101,8 @@ _OVER: static SSdbRow *mndFuncActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; + SSdbRow *pRow = NULL; + SFuncObj *pFunc = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; @@ -110,10 +112,10 @@ static SSdbRow *mndFuncActionDecode(SSdbRaw *pRaw) { goto _OVER; } - SSdbRow *pRow = sdbAllocRow(sizeof(SFuncObj)); + pRow = sdbAllocRow(sizeof(SFuncObj)); if (pRow == NULL) goto _OVER; - SFuncObj *pFunc = sdbGetRowObj(pRow); + pFunc = sdbGetRowObj(pRow); if (pFunc == NULL) goto _OVER; int32_t dataPos = 0; @@ -148,7 +150,7 @@ static SSdbRow *mndFuncActionDecode(SSdbRaw *pRaw) { _OVER: if (terrno != 0) { - mError("func:%s, failed to decode from raw:%p since %s", pFunc->name, pRaw, terrstr()); + mError("func:%s, failed to decode from raw:%p since %s", pFunc == NULL ? "null" : pFunc->name, pRaw, terrstr()); taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c index 7c86a5be22..2620100b6c 100644 --- a/source/dnode/mnode/impl/src/mndMnode.c +++ b/source/dnode/mnode/impl/src/mndMnode.c @@ -142,6 +142,8 @@ _OVER: static SSdbRow *mndMnodeActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; + SSdbRow *pRow = NULL; + SMnodeObj *pObj = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) return NULL; @@ -151,10 +153,10 @@ static SSdbRow *mndMnodeActionDecode(SSdbRaw *pRaw) { goto _OVER; } - SSdbRow *pRow = sdbAllocRow(sizeof(SMnodeObj)); + pRow = sdbAllocRow(sizeof(SMnodeObj)); if (pRow == NULL) goto _OVER; - SMnodeObj *pObj = sdbGetRowObj(pRow); + pObj = sdbGetRowObj(pRow); if (pObj == NULL) goto _OVER; int32_t dataPos = 0; @@ -167,7 +169,7 @@ static SSdbRow *mndMnodeActionDecode(SSdbRaw *pRaw) { _OVER: if (terrno != 0) { - mError("mnode:%d, failed to decode from raw:%p since %s", pObj->id, pRaw, terrstr()); + mError("mnode:%d, failed to decode from raw:%p since %s", pObj == NULL ? 0 : pObj->id, pRaw, terrstr()); taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndQnode.c b/source/dnode/mnode/impl/src/mndQnode.c index 434e6fbc52..26e7f72cf7 100644 --- a/source/dnode/mnode/impl/src/mndQnode.c +++ b/source/dnode/mnode/impl/src/mndQnode.c @@ -100,6 +100,8 @@ _OVER: static SSdbRow *mndQnodeActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; + SSdbRow *pRow = NULL; + SQnodeObj *pObj = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; @@ -109,10 +111,10 @@ static SSdbRow *mndQnodeActionDecode(SSdbRaw *pRaw) { goto _OVER; } - SSdbRow *pRow = sdbAllocRow(sizeof(SQnodeObj)); + pRow = sdbAllocRow(sizeof(SQnodeObj)); if (pRow == NULL) goto _OVER; - SQnodeObj *pObj = sdbGetRowObj(pRow); + pObj = sdbGetRowObj(pRow); if (pObj == NULL) goto _OVER; int32_t dataPos = 0; @@ -125,7 +127,7 @@ static SSdbRow *mndQnodeActionDecode(SSdbRaw *pRaw) { _OVER: if (terrno != 0) { - mError("qnode:%d, failed to decode from raw:%p since %s", pObj->id, pRaw, terrstr()); + mError("qnode:%d, failed to decode from raw:%p since %s", pObj == NULL ? 0 : pObj->id, pRaw, terrstr()); taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c index 698c07d9bc..7be2d48c70 100644 --- a/source/dnode/mnode/impl/src/mndSma.c +++ b/source/dnode/mnode/impl/src/mndSma.c @@ -132,6 +132,8 @@ _OVER: static SSdbRow *mndSmaActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; + SSdbRow *pRow = NULL; + SSmaObj *pSma = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; @@ -141,10 +143,10 @@ static SSdbRow *mndSmaActionDecode(SSdbRaw *pRaw) { goto _OVER; } - SSdbRow *pRow = sdbAllocRow(sizeof(SSmaObj)); + pRow = sdbAllocRow(sizeof(SSmaObj)); if (pRow == NULL) goto _OVER; - SSmaObj *pSma = sdbGetRowObj(pRow); + pSma = sdbGetRowObj(pRow); if (pSma == NULL) goto _OVER; int32_t dataPos = 0; @@ -200,7 +202,7 @@ static SSdbRow *mndSmaActionDecode(SSdbRaw *pRaw) { _OVER: if (terrno != 0) { - mError("sma:%s, failed to decode from raw:%p since %s", pSma->name, pRaw, terrstr()); + mError("sma:%s, failed to decode from raw:%p since %s", pSma == NULL ? "null" : pSma->name, pRaw, terrstr()); taosMemoryFreeClear(pSma->expr); taosMemoryFreeClear(pSma->tagsFilter); taosMemoryFreeClear(pSma->sql); diff --git a/source/dnode/mnode/impl/src/mndSnode.c b/source/dnode/mnode/impl/src/mndSnode.c index 7753e5b127..a31801f376 100644 --- a/source/dnode/mnode/impl/src/mndSnode.c +++ b/source/dnode/mnode/impl/src/mndSnode.c @@ -105,6 +105,8 @@ _OVER: static SSdbRow *mndSnodeActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; + SSdbRow *pRow = NULL; + SSnodeObj *pObj = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; @@ -114,10 +116,10 @@ static SSdbRow *mndSnodeActionDecode(SSdbRaw *pRaw) { goto _OVER; } - SSdbRow *pRow = sdbAllocRow(sizeof(SSnodeObj)); + pRow = sdbAllocRow(sizeof(SSnodeObj)); if (pRow == NULL) goto _OVER; - SSnodeObj *pObj = sdbGetRowObj(pRow); + pObj = sdbGetRowObj(pRow); if (pObj == NULL) goto _OVER; int32_t dataPos = 0; @@ -130,7 +132,7 @@ static SSdbRow *mndSnodeActionDecode(SSdbRaw *pRaw) { _OVER: if (terrno != 0) { - mError("snode:%d, failed to decode from raw:%p since %s", pObj->id, pRaw, terrstr()); + mError("snode:%d, failed to decode from raw:%p since %s", pObj == NULL ? 0 : pObj->id, pRaw, terrstr()); taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndStb.c b/source/dnode/mnode/impl/src/mndStb.c index 6dad7d74c8..2ed4fde509 100644 --- a/source/dnode/mnode/impl/src/mndStb.c +++ b/source/dnode/mnode/impl/src/mndStb.c @@ -162,6 +162,8 @@ _OVER: static SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; + SSdbRow *pRow = NULL; + SStbObj *pStb = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; @@ -171,10 +173,10 @@ static SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) { goto _OVER; } - SSdbRow *pRow = sdbAllocRow(sizeof(SStbObj)); + pRow = sdbAllocRow(sizeof(SStbObj)); if (pRow == NULL) goto _OVER; - SStbObj *pStb = sdbGetRowObj(pRow); + pStb = sdbGetRowObj(pRow); if (pStb == NULL) goto _OVER; int32_t dataPos = 0; @@ -254,10 +256,12 @@ static SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) { _OVER: if (terrno != 0) { - mError("stb:%s, failed to decode from raw:%p since %s", pStb->name, pRaw, terrstr()); - taosMemoryFreeClear(pStb->pColumns); - taosMemoryFreeClear(pStb->pTags); - taosMemoryFreeClear(pStb->comment); + mError("stb:%s, failed to decode from raw:%p since %s", pStb == NULL ? "null" : pStb->name, pRaw, terrstr()); + if (pStb != NULL) { + taosMemoryFreeClear(pStb->pColumns); + taosMemoryFreeClear(pStb->pTags); + taosMemoryFreeClear(pStb->comment); + } taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c index d8cf7a837e..44ff8733fd 100644 --- a/source/dnode/mnode/impl/src/mndStream.c +++ b/source/dnode/mnode/impl/src/mndStream.c @@ -120,7 +120,9 @@ STREAM_ENCODE_OVER: SSdbRow *mndStreamActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; - void *buf = NULL; + SSdbRow *pRow = NULL; + SStreamObj *pStream = NULL; + void *buf = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto STREAM_DECODE_OVER; @@ -130,11 +132,10 @@ SSdbRow *mndStreamActionDecode(SSdbRaw *pRaw) { goto STREAM_DECODE_OVER; } - int32_t size = sizeof(SStreamObj); - SSdbRow *pRow = sdbAllocRow(size); + pRow = sdbAllocRow(sizeof(SStreamObj)); if (pRow == NULL) goto STREAM_DECODE_OVER; - SStreamObj *pStream = sdbGetRowObj(pRow); + pStream = sdbGetRowObj(pRow); if (pStream == NULL) goto STREAM_DECODE_OVER; int32_t tlen; @@ -157,7 +158,7 @@ SSdbRow *mndStreamActionDecode(SSdbRaw *pRaw) { STREAM_DECODE_OVER: taosMemoryFreeClear(buf); if (terrno != TSDB_CODE_SUCCESS) { - mError("stream:%s, failed to decode from raw:%p since %s", pStream->name, pRaw, terrstr()); + mError("stream:%s, failed to decode from raw:%p since %s", pStream == NULL ? "null" : pStream->name, pRaw, terrstr()); taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndSubscribe.c b/source/dnode/mnode/impl/src/mndSubscribe.c index ffb46e5f1b..3cf5e17cd3 100644 --- a/source/dnode/mnode/impl/src/mndSubscribe.c +++ b/source/dnode/mnode/impl/src/mndSubscribe.c @@ -743,7 +743,9 @@ SUB_ENCODE_OVER: static SSdbRow *mndSubActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; - void *buf = NULL; + SSdbRow *pRow = NULL; + SMqSubscribeObj *pSub = NULL; + void *buf = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto SUB_DECODE_OVER; @@ -753,11 +755,10 @@ static SSdbRow *mndSubActionDecode(SSdbRaw *pRaw) { goto SUB_DECODE_OVER; } - int32_t size = sizeof(SMqSubscribeObj); - SSdbRow *pRow = sdbAllocRow(size); + pRow = sdbAllocRow(sizeof(SMqSubscribeObj)); if (pRow == NULL) goto SUB_DECODE_OVER; - SMqSubscribeObj *pSub = sdbGetRowObj(pRow); + pSub = sdbGetRowObj(pRow); if (pSub == NULL) goto SUB_DECODE_OVER; int32_t dataPos = 0; @@ -777,7 +778,7 @@ static SSdbRow *mndSubActionDecode(SSdbRaw *pRaw) { SUB_DECODE_OVER: taosMemoryFreeClear(buf); if (terrno != TSDB_CODE_SUCCESS) { - mError("subscribe:%s, failed to decode from raw:%p since %s", pSub->key, pRaw, terrstr()); + mError("subscribe:%s, failed to decode from raw:%p since %s", pSub == NULL ? "null" : pSub->key, pRaw, terrstr()); taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c index aabb2e5087..eea74c6dd8 100644 --- a/source/dnode/mnode/impl/src/mndTopic.c +++ b/source/dnode/mnode/impl/src/mndTopic.c @@ -152,8 +152,10 @@ TOPIC_ENCODE_OVER: SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; + SSdbRow *pRow = NULL; + SMqTopicObj *pTopic = NULL; + void *buf = NULL; - void *buf = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto TOPIC_DECODE_OVER; @@ -162,11 +164,10 @@ SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) { goto TOPIC_DECODE_OVER; } - int32_t size = sizeof(SMqTopicObj); - SSdbRow *pRow = sdbAllocRow(size); + pRow = sdbAllocRow(sizeof(SMqTopicObj)); if (pRow == NULL) goto TOPIC_DECODE_OVER; - SMqTopicObj *pTopic = sdbGetRowObj(pRow); + pTopic = sdbGetRowObj(pRow); if (pTopic == NULL) goto TOPIC_DECODE_OVER; int32_t len; @@ -251,7 +252,7 @@ SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) { TOPIC_DECODE_OVER: taosMemoryFreeClear(buf); if (terrno != TSDB_CODE_SUCCESS) { - mError("topic:%s, failed to decode from raw:%p since %s", pTopic->name, pRaw, terrstr()); + mError("topic:%s, failed to decode from raw:%p since %s", pTopic == NULL ? "null" : pTopic->name, pRaw, terrstr()); taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndUser.c b/source/dnode/mnode/impl/src/mndUser.c index fd0a04f2e7..5f34adce77 100644 --- a/source/dnode/mnode/impl/src/mndUser.c +++ b/source/dnode/mnode/impl/src/mndUser.c @@ -182,6 +182,8 @@ _OVER: static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; + SSdbRow *pRow = NULL; + SUserObj *pUser = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; @@ -191,10 +193,10 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { goto _OVER; } - SSdbRow *pRow = sdbAllocRow(sizeof(SUserObj)); + pRow = sdbAllocRow(sizeof(SUserObj)); if (pRow == NULL) goto _OVER; - SUserObj *pUser = sdbGetRowObj(pRow); + pUser = sdbGetRowObj(pRow); if (pUser == NULL) goto _OVER; int32_t dataPos = 0; @@ -254,10 +256,12 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { _OVER: if (terrno != 0) { - mError("user:%s, failed to decode from raw:%p since %s", pUser->user, pRaw, terrstr()); - taosHashCleanup(pUser->readDbs); - taosHashCleanup(pUser->writeDbs); - taosHashCleanup(pUser->topics); + mError("user:%s, failed to decode from raw:%p since %s", pUser == NULL ? "null" : pUser->user, pRaw, terrstr()); + if (pUser != NULL) { + taosHashCleanup(pUser->readDbs); + taosHashCleanup(pUser->writeDbs); + taosHashCleanup(pUser->topics); + } taosMemoryFreeClear(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index d06853e470..99ea661eb7 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -113,6 +113,8 @@ _OVER: SSdbRow *mndVgroupActionDecode(SSdbRaw *pRaw) { terrno = TSDB_CODE_OUT_OF_MEMORY; + SSdbRow *pRow = NULL; + SVgObj *pVgroup = NULL; int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER; @@ -122,10 +124,10 @@ SSdbRow *mndVgroupActionDecode(SSdbRaw *pRaw) { goto _OVER; } - SSdbRow *pRow = sdbAllocRow(sizeof(SVgObj)); + pRow = sdbAllocRow(sizeof(SVgObj)); if (pRow == NULL) goto _OVER; - SVgObj *pVgroup = sdbGetRowObj(pRow); + pVgroup = sdbGetRowObj(pRow); if (pVgroup == NULL) goto _OVER; int32_t dataPos = 0; @@ -152,7 +154,7 @@ SSdbRow *mndVgroupActionDecode(SSdbRaw *pRaw) { _OVER: if (terrno != 0) { - mError("vgId:%d, failed to decode from raw:%p since %s", pVgroup->vgId, pRaw, terrstr()); + mError("vgId:%d, failed to decode from raw:%p since %s", pVgroup == NULL ? 0 : pVgroup->vgId, pRaw, terrstr()); taosMemoryFreeClear(pRow); return NULL; } diff --git a/tests/script/tsim/user/privilege_db.sim b/tests/script/tsim/user/privilege_db.sim index 83933e0e47..79e3754c2f 100644 --- a/tests/script/tsim/user/privilege_db.sim +++ b/tests/script/tsim/user/privilege_db.sim @@ -5,6 +5,10 @@ sql connect print =============== create db sql create database d1 vgroups 1; +sql use d1 +sql create table stb (ts timestamp, i int) tags (j int) +sql create topic topic_1 as select ts, i from stb + sql create database d2 vgroups 1; sql create database d3 vgroups 1; sql select * from information_schema.ins_databases @@ -89,5 +93,6 @@ sql_error drop database d2; sql_error create stable d1.st (ts timestamp, i int) tags (j int) sql create stable d2.st (ts timestamp, i int) tags (j int) +sql_error create topic topic_2 as select ts, i from stb system sh/exec.sh -n dnode1 -s stop -x SIGINT From 0b3d749228f4b478b89a92bc946da4ced3785834 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Thu, 1 Dec 2022 16:12:22 +0800 Subject: [PATCH 62/77] refactor(sync): put heartbeat-reply msg into sync-ctrl-queue --- source/dnode/mgmt/mgmt_mnode/src/mmHandle.c | 2 +- source/dnode/mgmt/mgmt_vnode/src/vmHandle.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c index ceb452c551..16fe6c1b91 100644 --- a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c +++ b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c @@ -196,7 +196,7 @@ SArray *mmGetMsgHandles() { if (dmSetMgmtHandle(pArray, TDMT_SYNC_PRE_SNAPSHOT, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_PRE_SNAPSHOT_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT, mmPutMsgToSyncCtrlQueue, 1) == NULL) goto _OVER; - if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER; + if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT_REPLY, mmPutMsgToSyncCtrlQueue, 1) == NULL) goto _OVER; code = 0; diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c index 743beb7f82..e15d7ac3df 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c @@ -464,7 +464,7 @@ SArray *vmGetMsgHandles() { if (dmSetMgmtHandle(pArray, TDMT_SYNC_PRE_SNAPSHOT_REPLY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER; if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT, vmPutMsgToSyncCtrlQueue, 0) == NULL) goto _OVER; - if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT_REPLY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER; + if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT_REPLY, vmPutMsgToSyncCtrlQueue, 0) == NULL) goto _OVER; code = 0; From eed84cd94daa3418f1dfc9c292f7b016ea954647 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 1 Dec 2022 16:21:36 +0800 Subject: [PATCH 63/77] fix:enable test casese for sml --- 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 6d8de0b79b..6c5c1718b2 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 f97b46877dd70a302d9fadb33f1fd2d5c85f91ac Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Thu, 1 Dec 2022 17:11:22 +0800 Subject: [PATCH 64/77] test:modify testcase that deletes dataDir when starting old taosd --- tests/system-test/0-others/compatibility.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index 7f52c754cf..287dffa7bd 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -62,7 +62,7 @@ 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/" - + dataPath = cPath + "/../data/" packageName = "TDengine-server-"+ BASEVERSION + "-Linux-x64.tar.gz" packageTPath = packageName.split("-Linux-")[0] my_file = Path(f"{packagePath}/{packageName}") @@ -71,10 +71,10 @@ class TDTestCase: 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 " ) + 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} & " ) + print(f"start taosd: rm -rf {dataPath}/* && nohup taosd -c {cPath} & ") + os.system(f"rm -rf {dataPath}/* && nohup taosd -c {cPath} & " ) sleep(5) @@ -85,8 +85,8 @@ class TDTestCase: def run(self): - bPath=self.getBuildPath() - cPath=self.getCfgPath() + bPath = self.getBuildPath() + cPath = self.getCfgPath() dbname = "test" stb = f"{dbname}.meters" self.installTaosd(bPath,cPath) @@ -94,6 +94,7 @@ class TDTestCase: tableNumbers=100 recordNumbers1=100 recordNumbers2=1000 + # tdsqlF=tdCom.newTdSql() # print(tdsqlF) # tdsqlF.query(f"SELECT SERVER_VERSION();") @@ -105,6 +106,7 @@ class TDTestCase: # oldClientVersion=tdsqlF.queryResult[0][0] # tdLog.info(f"Base client version is {oldClientVersion}") # 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 ") From 9029a0e45fd3828342c321dc64c469c5911b5e20 Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Thu, 1 Dec 2022 17:13:42 +0800 Subject: [PATCH 65/77] test:modify testcase that deletes dataDir when starting old taosd --- tests/system-test/0-others/compatibility.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index 287dffa7bd..cd4acae438 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -78,7 +78,6 @@ class TDTestCase: sleep(5) - def buildTaosd(self,bPath): # os.system(f"mv {bPath}/build_bak {bPath}/build ") os.system(f" cd {bPath} && make install ") From 7ad0226e32968d5c467091bec6e9d167826197ff Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 1 Dec 2022 18:04:13 +0800 Subject: [PATCH 66/77] fix: add debug code info --- source/libs/scheduler/src/schTask.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/source/libs/scheduler/src/schTask.c b/source/libs/scheduler/src/schTask.c index 289fb35032..c8b8db367f 100644 --- a/source/libs/scheduler/src/schTask.c +++ b/source/libs/scheduler/src/schTask.c @@ -391,6 +391,8 @@ int32_t schChkUpdateRedirectCtx(SSchJob *pJob, SSchTask *pTask, SEpSet *pEpSet) int64_t leftTime = tsMaxRetryWaitTime - lastTime; pTask->delayExecMs = leftTime < pCtx->periodMs ? leftTime : pCtx->periodMs; + pCtx->roundTimes = 0; + goto _return; } @@ -407,7 +409,7 @@ _return: int32_t schDoTaskRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf *pData, int32_t rspCode) { int32_t code = 0; - SCH_TASK_DLOG("task will be redirected now, status:%s", SCH_GET_TASK_STATUS_STR(pTask)); + SCH_TASK_DLOG("task will be redirected now, status:%s, code:%s", SCH_GET_TASK_STATUS_STR(pTask), tstrerror(rspCode)); if (NULL == pData) { pTask->retryTimes = 0; @@ -433,8 +435,8 @@ int32_t schDoTaskRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf *pData, int32 } else if (SYNC_SELF_LEADER_REDIRECT_ERROR(rspCode)) { SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx); SEp *pEp = &addr->epSet.eps[addr->epSet.inUse]; - SCH_TASK_DLOG("task retry node %d current ep, idx:%d/%d,%s:%d", addr->nodeId, addr->epSet.inUse, - addr->epSet.numOfEps, pEp->fqdn, pEp->port); + SCH_TASK_DLOG("task retry node %d current ep, idx:%d/%d,%s:%d, code:%s", addr->nodeId, addr->epSet.inUse, + addr->epSet.numOfEps, pEp->fqdn, pEp->port, tstrerror(rspCode)); } else { SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx); SCH_SWITCH_EPSET(addr); From 3f4ba9a792e0f89adafeba9fd98c0c2236162fcf Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Thu, 1 Dec 2022 18:15:59 +0800 Subject: [PATCH 67/77] fix(sync): delete duplicate code --- source/libs/sync/src/syncMain.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 76cce97aad..f102095ce2 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -2558,10 +2558,6 @@ int32_t syncNodeOnHeartbeatReplyOld(SSyncNode* ths, const SRpcMsg* pRpcMsg) { char tbuf[40] = {0}; TRACE_TO_STR(trace, tbuf); - 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, tbuf); From 43841322efdba2f22f9a3c39cf0a3821f407ca4d Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Thu, 1 Dec 2022 19:11:10 +0800 Subject: [PATCH 68/77] fix: taosbenchmark set config (#18616) * test: update taos-tools 63b1c71 * test: update taos-tools da2ee67 * test: update taos-tools 823fae5 --- 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 ed2ec0b6da..db727907b7 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 d5df76d + GIT_TAG 823fae5 SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE From c0c1e0daddfa33b230acee003c613f8ba0c5eea7 Mon Sep 17 00:00:00 2001 From: facetosea <25808407@qq.com> Date: Thu, 1 Dec 2022 19:25:49 +0800 Subject: [PATCH 69/77] fix:compile error --- source/os/src/osSemaphore.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/os/src/osSemaphore.c b/source/os/src/osSemaphore.c index 3a375732b2..2f947d3252 100644 --- a/source/os/src/osSemaphore.c +++ b/source/os/src/osSemaphore.c @@ -75,7 +75,7 @@ int32_t tsem_wait(tsem_t* sem) { return ret; } -int32_t tsem_timewait(tsem_t* sem, int64_t milis) { +int32_t tsem_timewait(tsem_t* sem, int64_t ms) { struct timespec ts; taosClockGetTime(0, &ts); From 03d62e478f4dbac374f2cd15f35f8241d25a6750 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Thu, 1 Dec 2022 22:17:57 +0800 Subject: [PATCH 70/77] fix: get prevLogTerm of index zero as 0 only when firstVer is zero --- source/libs/sync/src/syncPipeline.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 03306af925..f0be976402 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -74,7 +74,7 @@ SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, S SyncTerm prevLogTerm = -1; terrno = TSDB_CODE_SUCCESS; - if (prevIndex == -1) return 0; + if (prevIndex == -1 && pNode->pLogStore->syncLogBeginIndex(pNode->pLogStore) == 0) return 0; if (prevIndex > pBuf->matchIndex) { terrno = TSDB_CODE_WAL_LOG_NOT_EXIST; @@ -691,7 +691,6 @@ int32_t syncLogReplMgrProcessReplyInRecoveryMode(SSyncLogReplMgr* pMgr, SSyncNod 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) { From 3424b184d30b75a8430d352a5238da0fe092ed28 Mon Sep 17 00:00:00 2001 From: Liu Jicong Date: Thu, 1 Dec 2022 04:08:06 +0800 Subject: [PATCH 71/77] refactor(stream): distributed checkpoint --- include/common/tglobal.h | 1 + include/common/tmsg.h | 15 ++ include/common/tmsgdef.h | 10 +- include/libs/stream/tstream.h | 91 +++++--- source/common/src/tglobal.c | 1 + source/common/src/tmsg.c | 25 +++ source/dnode/mnode/impl/inc/mndDef.h | 13 +- source/dnode/mnode/impl/src/mndDef.c | 6 + source/dnode/mnode/impl/src/mndMain.c | 40 +++- source/dnode/mnode/impl/src/mndStream.c | 236 ++++++++++++++------- source/dnode/mnode/impl/src/mndSubscribe.c | 26 +-- source/dnode/snode/src/snode.c | 2 +- source/dnode/vnode/src/tq/tq.c | 2 +- source/libs/stream/inc/streamInc.h | 6 +- source/libs/stream/src/streamCheckpoint.c | 194 +++++++++++++++++ source/libs/stream/src/streamMeta.c | 31 +-- source/libs/stream/src/streamRecover.c | 43 ---- 17 files changed, 528 insertions(+), 214 deletions(-) create mode 100644 source/libs/stream/src/streamCheckpoint.c diff --git a/include/common/tglobal.h b/include/common/tglobal.h index ed0f5cd31d..5260713560 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -136,6 +136,7 @@ extern int64_t tsWalFsyncDataSizeLimit; // internal extern int32_t tsTransPullupInterval; extern int32_t tsMqRebalanceInterval; +extern int32_t tsStreamCheckpointTickInterval; extern int32_t tsTtlUnit; extern int32_t tsTtlPushInterval; extern int32_t tsGrantHBInterval; diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 80590a25c0..b6db704a7e 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -1144,6 +1144,13 @@ typedef struct { int32_t tSerializeSMTimerMsg(void* buf, int32_t bufLen, SMTimerReq* pReq); int32_t tDeserializeSMTimerMsg(void* buf, int32_t bufLen, SMTimerReq* pReq); +typedef struct { + int64_t tick; +} SMStreamTickReq; + +int32_t tSerializeSMStreamTickMsg(void* buf, int32_t bufLen, SMStreamTickReq* pReq); +int32_t tDeserializeSMStreamTickMsg(void* buf, int32_t bufLen, SMStreamTickReq* pReq); + typedef struct { int32_t id; uint16_t port; // node sync Port @@ -1744,6 +1751,8 @@ typedef struct { int64_t watermark; int32_t numOfTags; SArray* pTags; // array of SField + // 3.0.20 + int64_t checkpointFreq; // ms } SCMCreateStreamReq; typedef struct { @@ -1943,6 +1952,12 @@ typedef struct { SHashObj* rebSubHash; // SHashObj } SMqDoRebalanceMsg; +typedef struct { + int64_t streamId; + int64_t checkpointId; + char streamName[TSDB_STREAM_FNAME_LEN]; +} SMStreamDoCheckpointMsg; + typedef struct { int64_t status; } SMVSubscribeRsp; diff --git a/include/common/tmsgdef.h b/include/common/tmsgdef.h index e80766d249..7833bdf139 100644 --- a/include/common/tmsgdef.h +++ b/include/common/tmsgdef.h @@ -172,6 +172,8 @@ enum { TD_DEF_MSG_TYPE(TDMT_MND_SERVER_VERSION, "server-version", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_UPTIME_TIMER, "uptime-timer", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_TMQ_LOST_CONSUMER_CLEAR, "lost-consumer-clear", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_MND_STREAM_CHECKPOINT_TIMER, "stream-checkpoint-tmr", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_MND_STREAM_BEGIN_CHECKPOINT, "stream-begin-checkpoint", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_MND_MAX_MSG, "mnd-max", NULL, NULL) TD_NEW_MSG_SEG(TDMT_VND_MSG) @@ -241,8 +243,11 @@ enum { TD_DEF_MSG_TYPE(TDMT_STREAM_TASK_DISPATCH, "stream-task-dispatch", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_STREAM_UNUSED1, "stream-unused1", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_STREAM_RETRIEVE, "stream-retrieve", NULL, NULL) - TD_DEF_MSG_TYPE(TDMT_STREAM_RECOVER_FINISH, "vnode-stream-finish", NULL, NULL) - TD_DEF_MSG_TYPE(TDMT_STREAM_TASK_CHECK, "vnode-stream-task-check", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_STREAM_RECOVER_FINISH, "stream-recover-finish", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_STREAM_TASK_CHECK, "stream-task-check", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_STREAM_TASK_CHECKPOINT, "stream-checkpoint", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_STREAM_TASK_REPORT_CHECKPOINT, "stream-report-checkpoint", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_STREAM_TASK_RESTORE_CHECKPOINT, "stream-restore-checkpoint", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_STREAM_MAX_MSG, "stream-max", NULL, NULL) TD_NEW_MSG_SEG(TDMT_MON_MSG) @@ -282,6 +287,7 @@ enum { TD_DEF_MSG_TYPE(TDMT_VND_STREAM_TRIGGER, "vnode-stream-trigger", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_STREAM_RECOVER_NONBLOCKING_STAGE, "vnode-stream-recover1", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_STREAM_RECOVER_BLOCKING_STAGE, "vnode-stream-recover2", NULL, NULL) + TD_DEF_MSG_TYPE(TDMT_VND_STREAM_CHECK_POINT_SOURCE, "vnode-stream-checkpoint-source", NULL, NULL) TD_DEF_MSG_TYPE(TDMT_VND_STREAM_MAX_MSG, "vnd-stream-max", NULL, NULL) TD_NEW_MSG_SEG(TDMT_VND_TMQ_MSG) diff --git a/include/libs/stream/tstream.h b/include/libs/stream/tstream.h index 4099551188..0196dcb0a8 100644 --- a/include/libs/stream/tstream.h +++ b/include/libs/stream/tstream.h @@ -275,31 +275,6 @@ typedef struct { SEpSet epSet; } SStreamChildEpInfo; -typedef struct { - int32_t srcNodeId; - int32_t srcChildId; - int64_t stateSaveVer; - int64_t stateProcessedVer; -} SStreamCheckpointInfo; - -typedef struct { - int64_t streamId; - int64_t checkTs; - int32_t checkpointId; // incremental - int32_t taskId; - SArray* checkpointVer; // SArray -} SStreamMultiVgCheckpointInfo; - -typedef struct { - int32_t taskId; - int32_t checkpointId; // incremental -} SStreamCheckpointKey; - -typedef struct { - int32_t taskId; - SArray* checkpointVer; -} SStreamRecoveringState; - typedef struct SStreamTask { int64_t streamId; int32_t taskId; @@ -364,6 +339,10 @@ typedef struct SStreamTask { int64_t checkReqId; SArray* checkReqIds; // shuffle int32_t refCnt; + + int64_t checkpointingId; + int32_t checkpointAlignCnt; + } SStreamTask; int32_t tEncodeStreamEpInfo(SEncoder* pEncoder, const SStreamChildEpInfo* pInfo); @@ -509,6 +488,60 @@ typedef struct { int32_t tEncodeSStreamRecoverFinishReq(SEncoder* pEncoder, const SStreamRecoverFinishReq* pReq); int32_t tDecodeSStreamRecoverFinishReq(SDecoder* pDecoder, SStreamRecoverFinishReq* pReq); +typedef struct { + int64_t streamId; + int64_t checkpointId; + int32_t taskId; + int32_t nodeId; + int64_t expireTime; +} SStreamCheckpointSourceReq; + +typedef struct { + int64_t streamId; + int64_t checkpointId; + int32_t taskId; + int32_t nodeId; + int64_t expireTime; +} SStreamCheckpointSourceRsp; + +int32_t tEncodeSStreamCheckpointSourceReq(SEncoder* pEncoder, const SStreamCheckpointSourceReq* pReq); +int32_t tDecodeSStreamCheckpointSourceReq(SDecoder* pDecoder, SStreamCheckpointSourceReq* pReq); + +int32_t tEncodeSStreamCheckpointSourceRsp(SEncoder* pEncoder, const SStreamCheckpointSourceRsp* pRsp); +int32_t tDecodeSStreamCheckpointSourceRsp(SDecoder* pDecoder, SStreamCheckpointSourceRsp* pRsp); + +typedef struct { + SMsgHead msgHead; + int64_t streamId; + int64_t checkpointId; + int32_t downstreamTaskId; + int32_t downstreamNodeId; + int32_t upstreamTaskId; + int32_t upstreamNodeId; + int32_t childId; + int64_t expireTime; + int8_t taskLevel; +} SStreamCheckpointReq; + +typedef struct { + SMsgHead msgHead; + int64_t streamId; + int64_t checkpointId; + int32_t downstreamTaskId; + int32_t downstreamNodeId; + int32_t upstreamTaskId; + int32_t upstreamNodeId; + int32_t childId; + int64_t expireTime; + int8_t taskLevel; +} SStreamCheckpointRsp; + +int32_t tEncodeSStreamCheckpointReq(SEncoder* pEncoder, const SStreamCheckpointReq* pReq); +int32_t tDecodeSStreamCheckpointReq(SDecoder* pDecoder, SStreamCheckpointReq* pReq); + +int32_t tEncodeSStreamCheckpointRsp(SEncoder* pEncoder, const SStreamCheckpointRsp* pRsp); +int32_t tDecodeSStreamCheckpointRsp(SDecoder* pDecoder, SStreamCheckpointRsp* pRsp); + typedef struct { int64_t streamId; int32_t downstreamTaskId; @@ -598,18 +631,22 @@ void streamMetaClose(SStreamMeta* streamMeta); int32_t streamMetaAddTask(SStreamMeta* pMeta, int64_t ver, SStreamTask* pTask); int32_t streamMetaAddSerializedTask(SStreamMeta* pMeta, int64_t startVer, char* msg, int32_t msgLen); -int32_t streamMetaRemoveTask(SStreamMeta* pMeta, int32_t taskId); SStreamTask* streamMetaGetTask(SStreamMeta* pMeta, int32_t taskId); SStreamTask* streamMetaAcquireTask(SStreamMeta* pMeta, int32_t taskId); void streamMetaReleaseTask(SStreamMeta* pMeta, SStreamTask* pTask); -void streamMetaRemoveTask1(SStreamMeta* pMeta, int32_t taskId); +void streamMetaRemoveTask(SStreamMeta* pMeta, int32_t taskId); int32_t streamMetaBegin(SStreamMeta* pMeta); int32_t streamMetaCommit(SStreamMeta* pMeta); int32_t streamMetaRollBack(SStreamMeta* pMeta); int32_t streamLoadTasks(SStreamMeta* pMeta); +// checkpoint +int32_t streamProcessCheckpointSourceReq(SStreamMeta* pMeta, SStreamTask* pTask, SStreamCheckpointSourceReq* pReq); +int32_t streamProcessCheckpointReq(SStreamMeta* pMeta, SStreamTask* pTask, SStreamCheckpointReq* pReq); +int32_t streamProcessCheckpointRsp(SStreamMeta* pMeta, SStreamTask* pTask, SStreamCheckpointRsp* pRsp); + #ifdef __cplusplus } #endif diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index b6c039f375..0d802f6362 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -166,6 +166,7 @@ int64_t tsWalFsyncDataSizeLimit = (100 * 1024 * 1024L); // internal int32_t tsTransPullupInterval = 2; int32_t tsMqRebalanceInterval = 2; +int32_t tsStreamCheckpointTickInterval = 1; int32_t tsTtlUnit = 86400; int32_t tsTtlPushInterval = 86400; int32_t tsGrantHBInterval = 60; diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index c7e98415d1..b264b578fc 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -3738,6 +3738,31 @@ int32_t tDeserializeSMTimerMsg(void *buf, int32_t bufLen, SMTimerReq *pReq) { return 0; } +int32_t tSerializeSMStreamTickMsg(void *buf, int32_t bufLen, SMStreamTickReq *pReq) { + SEncoder encoder = {0}; + tEncoderInit(&encoder, buf, bufLen); + + if (tStartEncode(&encoder) < 0) return -1; + if (tEncodeI64(&encoder, pReq->tick) < 0) return -1; + tEndEncode(&encoder); + + int32_t tlen = encoder.pos; + tEncoderClear(&encoder); + return tlen; +} + +int32_t tDeserializeSMStreamTickMsg(void *buf, int32_t bufLen, SMStreamTickReq *pReq) { + SDecoder decoder = {0}; + tDecoderInit(&decoder, buf, bufLen); + + if (tStartDecode(&decoder) < 0) return -1; + if (tDecodeI64(&decoder, &pReq->tick) < 0) return -1; + tEndDecode(&decoder); + + tDecoderClear(&decoder); + return 0; +} + int32_t tEncodeSReplica(SEncoder *pEncoder, SReplica *pReplica) { if (tEncodeI32(pEncoder, pReplica->id) < 0) return -1; if (tEncodeU16(pEncoder, pReplica->port) < 0) return -1; diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index 04ac5aba49..8e97cb0a23 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -635,6 +635,10 @@ typedef struct { SArray* tasks; // SArray> SSchemaWrapper outputSchema; SSchemaWrapper tagSchema; + + // 3.0.20 + int64_t checkpointFreq; // ms + int64_t currentTick; // do not serialize } SStreamObj; int32_t tEncodeSStreamObj(SEncoder* pEncoder, const SStreamObj* pObj); @@ -648,15 +652,6 @@ typedef struct { SArray* childInfo; // SArray } SStreamCheckpointObj; -#if 0 -typedef struct { - int64_t uid; - int64_t streamId; - int8_t status; - int8_t stage; -} SStreamRecoverObj; -#endif - #ifdef __cplusplus } #endif diff --git a/source/dnode/mnode/impl/src/mndDef.c b/source/dnode/mnode/impl/src/mndDef.c index 2e984212a1..67283c5fce 100644 --- a/source/dnode/mnode/impl/src/mndDef.c +++ b/source/dnode/mnode/impl/src/mndDef.c @@ -76,6 +76,9 @@ int32_t tEncodeSStreamObj(SEncoder *pEncoder, const SStreamObj *pObj) { if (tEncodeSSchemaWrapper(pEncoder, &pObj->outputSchema) < 0) return -1; + // 3.0.20 + if (tEncodeI64(pEncoder, pObj->checkpointFreq) < 0) return -1; + tEndEncode(pEncoder); return pEncoder->pos; } @@ -139,6 +142,9 @@ int32_t tDecodeSStreamObj(SDecoder *pDecoder, SStreamObj *pObj) { if (tDecodeSSchemaWrapper(pDecoder, &pObj->outputSchema) < 0) return -1; + // 3.0.20 + if (tDecodeI64(pDecoder, &pObj->checkpointFreq) < 0) return -1; + tEndDecode(pDecoder); return 0; } diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index 2d888d2ff7..1d207dafed 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -85,6 +85,21 @@ static void *mndBuildTimerMsg(int32_t *pContLen) { return pReq; } +static void *mndBuildCheckpointTickMsg(int32_t *pContLen, int64_t sec) { + SMStreamTickReq timerReq = { + .tick = sec, + }; + + int32_t contLen = tSerializeSMStreamTickMsg(NULL, 0, &timerReq); + if (contLen <= 0) return NULL; + void *pReq = rpcMallocCont(contLen); + if (pReq == NULL) return NULL; + + tSerializeSMStreamTickMsg(pReq, contLen, &timerReq); + *pContLen = contLen; + return pReq; +} + static void mndPullupTrans(SMnode *pMnode) { int32_t contLen = 0; void *pReq = mndBuildTimerMsg(&contLen); @@ -105,7 +120,24 @@ static void mndCalMqRebalance(SMnode *pMnode) { int32_t contLen = 0; void *pReq = mndBuildTimerMsg(&contLen); if (pReq != NULL) { - SRpcMsg rpcMsg = {.msgType = TDMT_MND_TMQ_TIMER, .pCont = pReq, .contLen = contLen}; + SRpcMsg rpcMsg = { + .msgType = TDMT_MND_TMQ_TIMER, + .pCont = pReq, + .contLen = contLen, + }; + tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg); + } +} + +static void mndStreamCheckpointTick(SMnode *pMnode, int64_t sec) { + int32_t contLen = 0; + void *pReq = mndBuildCheckpointTickMsg(&contLen, sec); + if (pReq != NULL) { + SRpcMsg rpcMsg = { + .msgType = TDMT_MND_STREAM_CHECKPOINT_TIMER, + .pCont = pReq, + .contLen = contLen, + }; tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg); } } @@ -220,6 +252,12 @@ static void *mndThreadFp(void *param) { mndCalMqRebalance(pMnode); } +#if 0 + if (sec % tsStreamCheckpointTickInterval == 0) { + mndStreamCheckpointTick(pMnode, sec); + } +#endif + if (sec % tsTelemInterval == (TMIN(60, (tsTelemInterval - 1)))) { mndPullupTelem(pMnode); } diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c index d8cf7a837e..53028caf93 100644 --- a/source/dnode/mnode/impl/src/mndStream.c +++ b/source/dnode/mnode/impl/src/mndStream.c @@ -36,6 +36,8 @@ static int32_t mndStreamActionDelete(SSdb *pSdb, SStreamObj *pStream); static int32_t mndStreamActionUpdate(SSdb *pSdb, SStreamObj *pStream, SStreamObj *pNewStream); static int32_t mndProcessCreateStreamReq(SRpcMsg *pReq); static int32_t mndProcessDropStreamReq(SRpcMsg *pReq); +static int32_t mndProcessStreamCheckpointTmr(SRpcMsg *pReq); +static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq); /*static int32_t mndProcessRecoverStreamReq(SRpcMsg *pReq);*/ static int32_t mndProcessStreamMetaReq(SRpcMsg *pReq); static int32_t mndGetStreamMeta(SRpcMsg *pReq, SShowObj *pShow, STableMetaRsp *pMeta); @@ -62,6 +64,10 @@ int32_t mndInitStream(SMnode *pMnode) { mndSetMsgHandle(pMnode, TDMT_STREAM_TASK_DEPLOY_RSP, mndTransProcessRsp); mndSetMsgHandle(pMnode, TDMT_STREAM_TASK_DROP_RSP, mndTransProcessRsp); + mndSetMsgHandle(pMnode, TDMT_MND_STREAM_CHECKPOINT_TIMER, mndProcessStreamCheckpointTmr); + mndSetMsgHandle(pMnode, TDMT_MND_STREAM_BEGIN_CHECKPOINT, mndProcessStreamDoCheckpoint); + mndSetMsgHandle(pMnode, TDMT_STREAM_TASK_REPORT_CHECKPOINT, mndTransProcessRsp); + mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STREAMS, mndRetrieveStream); mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STREAMS, mndCancelGetNextStream); mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STREAM_TASKS, mndRetrieveStreamTask); @@ -679,6 +685,164 @@ _OVER: tFreeStreamObj(&streamObj); return code; } +static int32_t mndProcessStreamCheckpointTmr(SRpcMsg *pReq) { + SMnode *pMnode = pReq->info.node; + SSdb *pSdb = pMnode->pSdb; + void *pIter = NULL; + SStreamObj *pStream = NULL; + + // iterate all stream obj + while (1) { + pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream); + if (pIter == NULL) break; + // incr tick + int64_t currentTick = atomic_add_fetch_64(&pStream->currentTick, 1); + // if >= checkpointFreq, build msg TDMT_MND_STREAM_BEGIN_CHECKPOINT, put into write q + if (currentTick >= pStream->checkpointFreq) { + atomic_store_64(&pStream->currentTick, 0); + SMStreamDoCheckpointMsg *pMsg = rpcMallocCont(sizeof(SMStreamDoCheckpointMsg)); + + pMsg->streamId = pStream->uid; + pMsg->checkpointId = tGenIdPI64(); + memcpy(pMsg->streamName, pStream->name, TSDB_STREAM_FNAME_LEN); + + SRpcMsg rpcMsg = { + .msgType = TDMT_MND_STREAM_BEGIN_CHECKPOINT, + .pCont = pMsg, + .contLen = sizeof(SMStreamDoCheckpointMsg), + }; + + tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg); + } + } + + return 0; +} + +static int32_t mndBuildStreamCheckpointSourceReq(void **pBuf, int32_t *pLen, const SStreamTask *pTask, + SMStreamDoCheckpointMsg *pMsg) { + SStreamCheckpointSourceReq req = {0}; + req.checkpointId = pMsg->checkpointId; + req.nodeId = pTask->nodeId; + req.expireTime = -1; + req.streamId = pTask->streamId; + req.taskId = pTask->taskId; + + int32_t code; + int32_t blen; + + tEncodeSize(tEncodeSStreamCheckpointSourceReq, &req, blen, code); + if (code < 0) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } + + int32_t tlen = sizeof(SMsgHead) + blen; + + void *buf = taosMemoryMalloc(tlen); + if (buf == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } + + void *abuf = POINTER_SHIFT(buf, sizeof(SMsgHead)); + SEncoder encoder; + tEncoderInit(&encoder, abuf, tlen); + tEncodeSStreamCheckpointSourceReq(&encoder, &req); + + SMsgHead *pMsgHead = (SMsgHead *)buf; + pMsgHead->contLen = htonl(tlen); + pMsgHead->vgId = htonl(pTask->nodeId); + + tEncoderClear(&encoder); + + *pBuf = buf; + *pLen = tlen; + + return 0; +} + +static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq) { + SMnode *pMnode = pReq->info.node; + SSdb *pSdb = pMnode->pSdb; + + SMStreamDoCheckpointMsg *pMsg = (SMStreamDoCheckpointMsg *)pReq->pCont; + + SStreamObj *pStream = mndAcquireStream(pMnode, pMsg->streamName); + + if (pStream == NULL || pStream->uid != pMsg->streamId) { + mError("start checkpointing failed since stream %s not found", pMsg->streamName); + return -1; + } + + // build new transaction: + STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "stream-checkpoint"); + if (pTrans == NULL) return -1; + mndTransSetDbName(pTrans, pStream->sourceDb, pStream->targetDb); + taosRLockLatch(&pStream->lock); + // 1. redo action: broadcast checkpoint source msg for all source vg + int32_t totLevel = taosArrayGetSize(pStream->tasks); + for (int32_t i = 0; i < totLevel; i++) { + SArray *pLevel = taosArrayGetP(pStream->tasks, i); + SStreamTask *pTask = taosArrayGetP(pLevel, 0); + if (pTask->taskLevel == TASK_LEVEL__SOURCE) { + int32_t sz = taosArrayGetSize(pLevel); + for (int32_t j = 0; j < sz; j++) { + SStreamTask *pTask = taosArrayGetP(pLevel, j); + ASSERT(pTask->nodeId > 0); + SVgObj *pVgObj = mndAcquireVgroup(pMnode, pTask->nodeId); + if (pVgObj == NULL) { + ASSERT(0); + taosRUnLockLatch(&pStream->lock); + mndReleaseStream(pMnode, pStream); + mndTransDrop(pTrans); + return -1; + } + + void *buf; + int32_t tlen; + if (mndBuildStreamCheckpointSourceReq(&buf, &tlen, pTask, pMsg) < 0) { + taosRUnLockLatch(&pStream->lock); + mndReleaseStream(pMnode, pStream); + mndTransDrop(pTrans); + return -1; + } + + STransAction action = {0}; + action.epSet = mndGetVgroupEpset(pMnode, pVgObj); + action.pCont = buf; + action.contLen = tlen; + action.msgType = TDMT_VND_STREAM_CHECK_POINT_SOURCE; + + mndReleaseVgroup(pMnode, pVgObj); + + if (mndTransAppendRedoAction(pTrans, &action) != 0) { + taosMemoryFree(buf); + taosRUnLockLatch(&pStream->lock); + mndReleaseStream(pMnode, pStream); + mndTransDrop(pTrans); + return -1; + } + } + } + } + // 2. reset tick + atomic_store_64(&pStream->currentTick, 0); + // 3. commit log: stream checkpoint info + taosRUnLockLatch(&pStream->lock); + + if (mndTransPrepare(pMnode, pTrans) != 0) { + mError("failed to prepare trans rebalance since %s", terrstr()); + mndTransDrop(pTrans); + mndReleaseStream(pMnode, pStream); + return -1; + } + + mndReleaseStream(pMnode, pStream); + mndTransDrop(pTrans); + + return 0; +} static int32_t mndProcessDropStreamReq(SRpcMsg *pReq) { SMnode *pMnode = pReq->info.node; @@ -747,71 +911,6 @@ static int32_t mndProcessDropStreamReq(SRpcMsg *pReq) { return TSDB_CODE_ACTION_IN_PROGRESS; } -#if 0 -static int32_t mndProcessRecoverStreamReq(SRpcMsg *pReq) { - SMnode *pMnode = pReq->info.node; - SStreamObj *pStream = NULL; - /*SDbObj *pDb = NULL;*/ - /*SUserObj *pUser = NULL;*/ - - SMRecoverStreamReq recoverReq = {0}; - if (tDeserializeSMRecoverStreamReq(pReq->pCont, pReq->contLen, &recoverReq) < 0) { - ASSERT(0); - terrno = TSDB_CODE_INVALID_MSG; - return -1; - } - - pStream = mndAcquireStream(pMnode, recoverReq.name); - - if (pStream == NULL) { - if (recoverReq.igNotExists) { - mInfo("stream:%s, not exist, ignore not exist is set", recoverReq.name); - sdbRelease(pMnode->pSdb, pStream); - return 0; - } else { - terrno = TSDB_CODE_MND_STREAM_NOT_EXIST; - return -1; - } - } - - if (mndCheckDbPrivilegeByName(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pStream->targetDb) != 0) { - return -1; - } - - STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_NOTHING, pReq); - if (pTrans == NULL) { - mError("stream:%s, failed to recover since %s", recoverReq.name, terrstr()); - sdbRelease(pMnode->pSdb, pStream); - return -1; - } - mInfo("trans:%d, used to drop stream:%s", pTrans->id, recoverReq.name); - - // broadcast to recover all tasks - if (mndRecoverStreamTasks(pMnode, pTrans, pStream) < 0) { - mError("stream:%s, failed to recover task since %s", recoverReq.name, terrstr()); - sdbRelease(pMnode->pSdb, pStream); - return -1; - } - - // update stream status - if (mndSetStreamRecover(pMnode, pTrans, pStream) < 0) { - sdbRelease(pMnode->pSdb, pStream); - return -1; - } - - if (mndTransPrepare(pMnode, pTrans) != 0) { - mError("trans:%d, failed to prepare recover stream trans since %s", pTrans->id, terrstr()); - sdbRelease(pMnode->pSdb, pStream); - mndTransDrop(pTrans); - return -1; - } - - sdbRelease(pMnode->pSdb, pStream); - - return TSDB_CODE_ACTION_IN_PROGRESS; -} -#endif - int32_t mndDropStreamByDb(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) { SSdb *pSdb = pMnode->pSdb; void *pIter = NULL; @@ -846,13 +945,6 @@ int32_t mndDropStreamByDb(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) { } } -#if 0 - if (mndSetDropOffsetStreamLogs(pMnode, pTrans, pStream) < 0) { - sdbRelease(pSdb, pStream); - goto END; - } -#endif - sdbRelease(pSdb, pStream); } diff --git a/source/dnode/mnode/impl/src/mndSubscribe.c b/source/dnode/mnode/impl/src/mndSubscribe.c index ffb46e5f1b..98078f1c60 100644 --- a/source/dnode/mnode/impl/src/mndSubscribe.c +++ b/source/dnode/mnode/impl/src/mndSubscribe.c @@ -440,9 +440,9 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR } static int32_t mndPersistRebResult(SMnode *pMnode, SRpcMsg *pMsg, const SMqRebOutputObj *pOutput) { - STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pMsg, "persist-reb"); - mndTransSetDbName(pTrans, pOutput->pSub->dbName, NULL); + STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pMsg, "tmq-reb"); if (pTrans == NULL) return -1; + mndTransSetDbName(pTrans, pOutput->pSub->dbName, NULL); // make txn: // 1. redo action: action to all vg @@ -523,28 +523,6 @@ static int32_t mndPersistRebResult(SMnode *pMnode, SRpcMsg *pMsg, const SMqRebOu tDeleteSMqConsumerObj(pConsumerNew); taosMemoryFree(pConsumerNew); } -#if 0 - if (consumerNum) { - char topic[TSDB_TOPIC_FNAME_LEN]; - char cgroup[TSDB_CGROUP_LEN]; - mndSplitSubscribeKey(pOutput->pSub->key, topic, cgroup, true); - SMqTopicObj *pTopic = mndAcquireTopic(pMnode, topic); - if (pTopic) { - // TODO make topic complete - SMqTopicObj topicObj = {0}; - memcpy(&topicObj, pTopic, sizeof(SMqTopicObj)); - topicObj.refConsumerCnt = pTopic->refConsumerCnt - consumerNum; - // TODO is that correct? - pTopic->refConsumerCnt = topicObj.refConsumerCnt; - mInfo("subscribe topic %s unref %d consumer cgroup %s, refcnt %d", pTopic->name, consumerNum, cgroup, - topicObj.refConsumerCnt); - if (mndSetTopicCommitLogs(pMnode, pTrans, &topicObj) != 0) { - ASSERT(0); - goto REB_FAIL; - } - } - } -#endif // 4. TODO commit log: modification log diff --git a/source/dnode/snode/src/snode.c b/source/dnode/snode/src/snode.c index aa55204ae5..b133226ed3 100644 --- a/source/dnode/snode/src/snode.c +++ b/source/dnode/snode/src/snode.c @@ -168,7 +168,7 @@ int32_t sndProcessTaskDeployReq(SSnode *pSnode, char *msg, int32_t msgLen) { int32_t sndProcessTaskDropReq(SSnode *pSnode, char *msg, int32_t msgLen) { SVDropStreamTaskReq *pReq = (SVDropStreamTaskReq *)msg; - streamMetaRemoveTask1(pSnode->pMeta, pReq->taskId); + streamMetaRemoveTask(pSnode->pMeta, pReq->taskId); return 0; } diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index 3d9ebec4c9..003b387838 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -1425,7 +1425,7 @@ int32_t tqProcessTaskDispatchRsp(STQ* pTq, SRpcMsg* pMsg) { int32_t tqProcessTaskDropReq(STQ* pTq, int64_t version, char* msg, int32_t msgLen) { SVDropStreamTaskReq* pReq = (SVDropStreamTaskReq*)msg; - streamMetaRemoveTask1(pTq->pStreamMeta, pReq->taskId); + streamMetaRemoveTask(pTq->pStreamMeta, pReq->taskId); return 0; } diff --git a/source/libs/stream/inc/streamInc.h b/source/libs/stream/inc/streamInc.h index 5ff49502df..66496f11f8 100644 --- a/source/libs/stream/inc/streamInc.h +++ b/source/libs/stream/inc/streamInc.h @@ -17,7 +17,6 @@ #define _STREAM_INC_H_ #include "executor.h" -#include "tref.h" #include "tstream.h" #ifdef __cplusplus @@ -25,9 +24,8 @@ extern "C" { #endif typedef struct { - int8_t inited; - int32_t refPool; - void* timer; + int8_t inited; + void* timer; } SStreamGlobalEnv; static SStreamGlobalEnv streamEnv; diff --git a/source/libs/stream/src/streamCheckpoint.c b/source/libs/stream/src/streamCheckpoint.c new file mode 100644 index 0000000000..efd19074da --- /dev/null +++ b/source/libs/stream/src/streamCheckpoint.c @@ -0,0 +1,194 @@ +/* + * 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 "streamInc.h" + +int32_t tEncodeSStreamCheckpointSourceReq(SEncoder* pEncoder, const SStreamCheckpointSourceReq* pReq) { + if (tStartEncode(pEncoder) < 0) return -1; + if (tEncodeI64(pEncoder, pReq->streamId) < 0) return -1; + if (tEncodeI64(pEncoder, pReq->checkpointId) < 0) return -1; + if (tEncodeI32(pEncoder, pReq->taskId) < 0) return -1; + if (tEncodeI32(pEncoder, pReq->nodeId) < 0) return -1; + if (tEncodeI64(pEncoder, pReq->expireTime) < 0) return -1; + tEndEncode(pEncoder); + return pEncoder->pos; +} + +int32_t tDecodeSStreamCheckpointSourceReq(SDecoder* pDecoder, SStreamCheckpointSourceReq* pReq) { + if (tStartDecode(pDecoder) < 0) return -1; + if (tDecodeI64(pDecoder, &pReq->streamId) < 0) return -1; + if (tDecodeI64(pDecoder, &pReq->checkpointId) < 0) return -1; + if (tDecodeI32(pDecoder, &pReq->taskId) < 0) return -1; + if (tDecodeI32(pDecoder, &pReq->nodeId) < 0) return -1; + if (tDecodeI64(pDecoder, &pReq->expireTime) < 0) return -1; + tEndDecode(pDecoder); + return 0; +} + +int32_t tEncodeSStreamCheckpointSourceRsp(SEncoder* pEncoder, const SStreamCheckpointSourceRsp* pRsp) { + if (tStartEncode(pEncoder) < 0) return -1; + if (tEncodeI64(pEncoder, pRsp->streamId) < 0) return -1; + if (tEncodeI64(pEncoder, pRsp->checkpointId) < 0) return -1; + if (tEncodeI32(pEncoder, pRsp->taskId) < 0) return -1; + if (tEncodeI32(pEncoder, pRsp->nodeId) < 0) return -1; + if (tEncodeI64(pEncoder, pRsp->expireTime) < 0) return -1; + tEndEncode(pEncoder); + return pEncoder->pos; +} + +int32_t tDecodeSStreamCheckpointSourceRsp(SDecoder* pDecoder, SStreamCheckpointSourceRsp* pRsp) { + if (tStartDecode(pDecoder) < 0) return -1; + if (tDecodeI64(pDecoder, &pRsp->streamId) < 0) return -1; + if (tDecodeI64(pDecoder, &pRsp->checkpointId) < 0) return -1; + if (tDecodeI32(pDecoder, &pRsp->taskId) < 0) return -1; + if (tDecodeI32(pDecoder, &pRsp->nodeId) < 0) return -1; + if (tDecodeI64(pDecoder, &pRsp->expireTime) < 0) return -1; + tEndDecode(pDecoder); + return 0; +} + +int32_t tEncodeSStreamCheckpointReq(SEncoder* pEncoder, const SStreamCheckpointReq* pReq) { + if (tStartEncode(pEncoder) < 0) return -1; + if (tEncodeI64(pEncoder, pReq->streamId) < 0) return -1; + if (tEncodeI64(pEncoder, pReq->checkpointId) < 0) return -1; + if (tEncodeI32(pEncoder, pReq->downstreamTaskId) < 0) return -1; + if (tEncodeI32(pEncoder, pReq->downstreamNodeId) < 0) return -1; + if (tEncodeI64(pEncoder, pReq->upstreamTaskId) < 0) return -1; + if (tEncodeI64(pEncoder, pReq->upstreamNodeId) < 0) return -1; + if (tEncodeI32(pEncoder, pReq->childId) < 0) return -1; + if (tEncodeI64(pEncoder, pReq->expireTime) < 0) return -1; + if (tEncodeI8(pEncoder, pReq->taskLevel) < 0) return -1; + tEndEncode(pEncoder); + return pEncoder->pos; +} + +int32_t tDecodeSStreamCheckpointReq(SDecoder* pDecoder, SStreamCheckpointReq* pReq) { + if (tStartDecode(pDecoder) < 0) return -1; + if (tDecodeI64(pDecoder, &pReq->streamId) < 0) return -1; + if (tDecodeI64(pDecoder, &pReq->checkpointId) < 0) return -1; + if (tDecodeI32(pDecoder, &pReq->downstreamTaskId) < 0) return -1; + if (tDecodeI32(pDecoder, &pReq->downstreamNodeId) < 0) return -1; + if (tDecodeI32(pDecoder, &pReq->upstreamTaskId) < 0) return -1; + if (tDecodeI32(pDecoder, &pReq->upstreamNodeId) < 0) return -1; + if (tDecodeI32(pDecoder, &pReq->childId) < 0) return -1; + if (tDecodeI64(pDecoder, &pReq->expireTime) < 0) return -1; + if (tDecodeI8(pDecoder, &pReq->taskLevel) < 0) return -1; + tEndDecode(pDecoder); + return 0; +} + +int32_t tEncodeSStreamCheckpointRsp(SEncoder* pEncoder, const SStreamCheckpointRsp* pRsp) { + if (tStartEncode(pEncoder) < 0) return -1; + if (tEncodeI64(pEncoder, pRsp->streamId) < 0) return -1; + if (tEncodeI64(pEncoder, pRsp->checkpointId) < 0) return -1; + if (tEncodeI32(pEncoder, pRsp->downstreamTaskId) < 0) return -1; + if (tEncodeI32(pEncoder, pRsp->downstreamNodeId) < 0) return -1; + if (tEncodeI64(pEncoder, pRsp->upstreamTaskId) < 0) return -1; + if (tEncodeI64(pEncoder, pRsp->upstreamNodeId) < 0) return -1; + if (tEncodeI32(pEncoder, pRsp->childId) < 0) return -1; + if (tEncodeI64(pEncoder, pRsp->expireTime) < 0) return -1; + if (tEncodeI8(pEncoder, pRsp->taskLevel) < 0) return -1; + tEndEncode(pEncoder); + return pEncoder->pos; +} + +int32_t tDecodeSStreamCheckpointRsp(SDecoder* pDecoder, SStreamCheckpointRsp* pRsp) { + if (tStartDecode(pDecoder) < 0) return -1; + if (tDecodeI64(pDecoder, &pRsp->streamId) < 0) return -1; + if (tDecodeI64(pDecoder, &pRsp->checkpointId) < 0) return -1; + if (tDecodeI32(pDecoder, &pRsp->downstreamTaskId) < 0) return -1; + if (tDecodeI32(pDecoder, &pRsp->downstreamNodeId) < 0) return -1; + if (tDecodeI32(pDecoder, &pRsp->upstreamTaskId) < 0) return -1; + if (tDecodeI32(pDecoder, &pRsp->upstreamNodeId) < 0) return -1; + if (tDecodeI32(pDecoder, &pRsp->childId) < 0) return -1; + if (tDecodeI64(pDecoder, &pRsp->expireTime) < 0) return -1; + if (tDecodeI8(pDecoder, &pRsp->taskLevel) < 0) return -1; + tEndDecode(pDecoder); + return 0; +} + +static int32_t streamAlignCheckpoint(SStreamTask* pTask, int64_t checkpointId, int32_t childId) { + if (pTask->checkpointingId == 0) { + pTask->checkpointingId = checkpointId; + pTask->checkpointAlignCnt = taosArrayGetSize(pTask->childEpInfo); + } + + ASSERT(pTask->checkpointingId == checkpointId); + + return atomic_sub_fetch_32(&pTask->checkpointAlignCnt, 1); +} + +static int32_t streamDoCheckpoint(SStreamMeta* pMeta, SStreamTask* pTask, int64_t checkpointId) { + // commit tdb state + streamStateCommit(pTask->pState); + // commit non-tdb state + // copy and save new state + // report to mnode + // send checkpoint req to downstream + return 0; +} + +static int32_t streamDoSourceCheckpoint(SStreamMeta* pMeta, SStreamTask* pTask, int64_t checkpointId) { + // ref wal + // set status checkpointing + // do checkpoint + return 0; +} +int32_t streamProcessCheckpointSourceReq(SStreamMeta* pMeta, SStreamTask* pTask, SStreamCheckpointSourceReq* pReq) { + int32_t code; + int64_t checkpointId = pReq->checkpointId; + + code = streamDoSourceCheckpoint(pMeta, pTask, checkpointId); + if (code < 0) { + // rsp error + return -1; + } + + return 0; +} + +int32_t streamProcessCheckpointReq(SStreamMeta* pMeta, SStreamTask* pTask, SStreamCheckpointReq* pReq) { + int32_t code; + int64_t checkpointId = pReq->checkpointId; + int32_t childId = pReq->childId; + + if (taosArrayGetSize(pTask->childEpInfo) > 0) { + code = streamAlignCheckpoint(pTask, checkpointId, childId); + if (code > 0) { + return 0; + } + if (code < 0) { + ASSERT(0); + return -1; + } + } + + code = streamDoCheckpoint(pMeta, pTask, checkpointId); + if (code < 0) { + // rsp error + return -1; + } + + // send rsp to all children + + return 0; +} + +int32_t streamProcessCheckpointRsp(SStreamMeta* pMeta, SStreamTask* pTask, SStreamCheckpointRsp* pRsp) { + // recover step2, scan from wal + // unref wal + // set status normal + return 0; +} diff --git a/source/libs/stream/src/streamMeta.c b/source/libs/stream/src/streamMeta.c index a864814a74..fc6e1668ba 100644 --- a/source/libs/stream/src/streamMeta.c +++ b/source/libs/stream/src/streamMeta.c @@ -202,7 +202,7 @@ void streamMetaReleaseTask(SStreamMeta* pMeta, SStreamTask* pTask) { } } -void streamMetaRemoveTask1(SStreamMeta* pMeta, int32_t taskId) { +void streamMetaRemoveTask(SStreamMeta* pMeta, int32_t taskId) { SStreamTask** ppTask = (SStreamTask**)taosHashGet(pMeta->pTasks, &taskId, sizeof(int32_t)); if (ppTask) { SStreamTask* pTask = *ppTask; @@ -219,35 +219,6 @@ void streamMetaRemoveTask1(SStreamMeta* pMeta, int32_t taskId) { } } -int32_t streamMetaRemoveTask(SStreamMeta* pMeta, int32_t taskId) { - SStreamTask** ppTask = (SStreamTask**)taosHashGet(pMeta->pTasks, &taskId, sizeof(int32_t)); - if (ppTask) { - SStreamTask* pTask = *ppTask; - taosHashRemove(pMeta->pTasks, &taskId, sizeof(int32_t)); - atomic_store_8(&pTask->taskStatus, TASK_STATUS__DROPPING); - - if (tdbTbDelete(pMeta->pTaskDb, &taskId, sizeof(int32_t), &pMeta->txn) < 0) { - /*return -1;*/ - } - - if (pTask->triggerParam != 0) { - taosTmrStop(pTask->timer); - } - - while (1) { - int8_t schedStatus = - atomic_val_compare_exchange_8(&pTask->schedStatus, TASK_SCHED_STATUS__INACTIVE, TASK_SCHED_STATUS__DROPPING); - if (schedStatus != TASK_SCHED_STATUS__ACTIVE) { - tFreeSStreamTask(pTask); - break; - } - taosMsleep(10); - } - } - - return 0; -} - int32_t streamMetaBegin(SStreamMeta* pMeta) { if (tdbTxnOpen(&pMeta->txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) { diff --git a/source/libs/stream/src/streamRecover.c b/source/libs/stream/src/streamRecover.c index 7eee95a580..6889a870d1 100644 --- a/source/libs/stream/src/streamRecover.c +++ b/source/libs/stream/src/streamRecover.c @@ -325,46 +325,3 @@ int32_t tDecodeSStreamRecoverFinishReq(SDecoder* pDecoder, SStreamRecoverFinishR tEndDecode(pDecoder); return 0; } - -int32_t tEncodeSStreamCheckpointInfo(SEncoder* pEncoder, const SStreamCheckpointInfo* pCheckpoint) { - if (tEncodeI32(pEncoder, pCheckpoint->srcNodeId) < 0) return -1; - if (tEncodeI32(pEncoder, pCheckpoint->srcChildId) < 0) return -1; - if (tEncodeI64(pEncoder, pCheckpoint->stateProcessedVer) < 0) return -1; - return 0; -} - -int32_t tDecodeSStreamCheckpointInfo(SDecoder* pDecoder, SStreamCheckpointInfo* pCheckpoint) { - if (tDecodeI32(pDecoder, &pCheckpoint->srcNodeId) < 0) return -1; - if (tDecodeI32(pDecoder, &pCheckpoint->srcChildId) < 0) return -1; - if (tDecodeI64(pDecoder, &pCheckpoint->stateProcessedVer) < 0) return -1; - return 0; -} - -int32_t tEncodeSStreamMultiVgCheckpointInfo(SEncoder* pEncoder, const SStreamMultiVgCheckpointInfo* pCheckpoint) { - if (tEncodeI64(pEncoder, pCheckpoint->streamId) < 0) return -1; - if (tEncodeI64(pEncoder, pCheckpoint->checkTs) < 0) return -1; - if (tEncodeI32(pEncoder, pCheckpoint->checkpointId) < 0) return -1; - if (tEncodeI32(pEncoder, pCheckpoint->taskId) < 0) return -1; - int32_t sz = taosArrayGetSize(pCheckpoint->checkpointVer); - if (tEncodeI32(pEncoder, sz) < 0) return -1; - for (int32_t i = 0; i < sz; i++) { - SStreamCheckpointInfo* pOneVgCkpoint = taosArrayGet(pCheckpoint->checkpointVer, i); - if (tEncodeSStreamCheckpointInfo(pEncoder, pOneVgCkpoint) < 0) return -1; - } - return 0; -} - -int32_t tDecodeSStreamMultiVgCheckpointInfo(SDecoder* pDecoder, SStreamMultiVgCheckpointInfo* pCheckpoint) { - if (tDecodeI64(pDecoder, &pCheckpoint->streamId) < 0) return -1; - if (tDecodeI64(pDecoder, &pCheckpoint->checkTs) < 0) return -1; - if (tDecodeI32(pDecoder, &pCheckpoint->checkpointId) < 0) return -1; - if (tDecodeI32(pDecoder, &pCheckpoint->taskId) < 0) return -1; - int32_t sz; - if (tDecodeI32(pDecoder, &sz) < 0) return -1; - for (int32_t i = 0; i < sz; i++) { - SStreamCheckpointInfo oneVgCheckpoint; - if (tDecodeSStreamCheckpointInfo(pDecoder, &oneVgCheckpoint) < 0) return -1; - taosArrayPush(pCheckpoint->checkpointVer, &oneVgCheckpoint); - } - return 0; -} From ffb1d52e55500a498501b2c5aee2a881f9d76952 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Fri, 2 Dec 2022 07:57:22 +0800 Subject: [PATCH 72/77] fix: compatility after update stream --- source/dnode/mnode/impl/inc/mndDef.h | 2 +- source/dnode/mnode/impl/src/mndDef.c | 7 ++++--- source/dnode/mnode/impl/src/mndStream.c | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index 8e97cb0a23..ad40c10822 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -642,7 +642,7 @@ typedef struct { } SStreamObj; int32_t tEncodeSStreamObj(SEncoder* pEncoder, const SStreamObj* pObj); -int32_t tDecodeSStreamObj(SDecoder* pDecoder, SStreamObj* pObj); +int32_t tDecodeSStreamObj(SDecoder* pDecoder, SStreamObj* pObj, int32_t sver); void tFreeStreamObj(SStreamObj* pObj); typedef struct { diff --git a/source/dnode/mnode/impl/src/mndDef.c b/source/dnode/mnode/impl/src/mndDef.c index 67283c5fce..b5c2fb05b3 100644 --- a/source/dnode/mnode/impl/src/mndDef.c +++ b/source/dnode/mnode/impl/src/mndDef.c @@ -83,7 +83,7 @@ int32_t tEncodeSStreamObj(SEncoder *pEncoder, const SStreamObj *pObj) { return pEncoder->pos; } -int32_t tDecodeSStreamObj(SDecoder *pDecoder, SStreamObj *pObj) { +int32_t tDecodeSStreamObj(SDecoder *pDecoder, SStreamObj *pObj, int32_t sver) { if (tStartDecode(pDecoder) < 0) return -1; if (tDecodeCStrTo(pDecoder, pObj->name) < 0) return -1; @@ -143,8 +143,9 @@ int32_t tDecodeSStreamObj(SDecoder *pDecoder, SStreamObj *pObj) { if (tDecodeSSchemaWrapper(pDecoder, &pObj->outputSchema) < 0) return -1; // 3.0.20 - if (tDecodeI64(pDecoder, &pObj->checkpointFreq) < 0) return -1; - + if (sver >= 2) { + if (tDecodeI64(pDecoder, &pObj->checkpointFreq) < 0) return -1; + } tEndDecode(pDecoder); return 0; } diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c index 53028caf93..5fa27fd062 100644 --- a/source/dnode/mnode/impl/src/mndStream.c +++ b/source/dnode/mnode/impl/src/mndStream.c @@ -28,7 +28,7 @@ #include "parser.h" #include "tname.h" -#define MND_STREAM_VER_NUMBER 1 +#define MND_STREAM_VER_NUMBER 2 #define MND_STREAM_RESERVE_SIZE 64 static int32_t mndStreamActionInsert(SSdb *pSdb, SStreamObj *pStream); @@ -131,7 +131,7 @@ SSdbRow *mndStreamActionDecode(SSdbRaw *pRaw) { int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto STREAM_DECODE_OVER; - if (sver != MND_STREAM_VER_NUMBER) { + if (sver != 1 && sver != 2) { terrno = TSDB_CODE_SDB_INVALID_DATA_VER; goto STREAM_DECODE_OVER; } @@ -152,7 +152,7 @@ SSdbRow *mndStreamActionDecode(SSdbRaw *pRaw) { SDecoder decoder; tDecoderInit(&decoder, buf, tlen + 1); - if (tDecodeSStreamObj(&decoder, pStream) < 0) { + if (tDecodeSStreamObj(&decoder, pStream, 2) < 0) { tDecoderClear(&decoder); goto STREAM_DECODE_OVER; } From 99657ccf788d42976a9c0a1d4549f314a6f56681 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Fri, 2 Dec 2022 08:00:10 +0800 Subject: [PATCH 73/77] fix: compatibility after update stream --- source/dnode/mnode/impl/src/mndStream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c index 6ac8db80c7..7ee688d220 100644 --- a/source/dnode/mnode/impl/src/mndStream.c +++ b/source/dnode/mnode/impl/src/mndStream.c @@ -153,7 +153,7 @@ SSdbRow *mndStreamActionDecode(SSdbRaw *pRaw) { SDecoder decoder; tDecoderInit(&decoder, buf, tlen + 1); - if (tDecodeSStreamObj(&decoder, pStream, 2) < 0) { + if (tDecodeSStreamObj(&decoder, pStream, sver) < 0) { tDecoderClear(&decoder); goto STREAM_DECODE_OVER; } From db42ec46bfbf2ac4e416ef7735393eed844d3fb4 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Fri, 2 Dec 2022 10:05:52 +0800 Subject: [PATCH 74/77] refact: adust error code while dnode startup --- include/libs/qcom/query.h | 7 +++-- include/util/taoserror.h | 29 +++++++++++++++---- source/dnode/mgmt/mgmt_dnode/src/dmWorker.c | 1 + source/dnode/mgmt/node_mgmt/src/dmTransport.c | 13 +++++++-- source/dnode/mnode/impl/src/mndMain.c | 12 -------- source/util/src/terror.c | 5 ++++ 6 files changed, 44 insertions(+), 23 deletions(-) diff --git a/include/libs/qcom/query.h b/include/libs/qcom/query.h index f51aa88485..a97368ffee 100644 --- a/include/libs/qcom/query.h +++ b/include/libs/qcom/query.h @@ -264,11 +264,12 @@ extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t #define SYNC_SELF_LEADER_REDIRECT_ERROR(_code) ((_code) == TSDB_CODE_SYN_NOT_LEADER || (_code) == TSDB_CODE_SYN_INTERNAL_ERROR) #define SYNC_OTHER_LEADER_REDIRECT_ERROR(_code) (false) // used later -#define NEED_REDIRECT_ERROR(_code) \ - ((_code) == TSDB_CODE_RPC_REDIRECT || (_code) == TSDB_CODE_RPC_NETWORK_UNAVAIL || \ +#define NEED_REDIRECT_ERROR(_code) \ + ((_code) == TSDB_CODE_RPC_REDIRECT || (_code) == TSDB_CODE_RPC_NETWORK_UNAVAIL || \ (_code) == TSDB_CODE_NODE_NOT_DEPLOYED || SYNC_UNKNOWN_LEADER_REDIRECT_ERROR(_code) || \ SYNC_SELF_LEADER_REDIRECT_ERROR(_code) || SYNC_OTHER_LEADER_REDIRECT_ERROR(_code) || \ - (_code) == TSDB_CODE_APP_NOT_READY || (_code) == TSDB_CODE_RPC_BROKEN_LINK) + (_code) == TSDB_CODE_APP_NOT_READY || (_code) == TSDB_CODE_RPC_BROKEN_LINK || \ + (_code) == TSDB_CODE_APP_IS_STARTING || (_code) == TSDB_CODE_APP_IS_STOPPING) #define NEED_CLIENT_RM_TBLMETA_REQ(_type) \ ((_type) == TDMT_VND_CREATE_TABLE || (_type) == TDMT_MND_CREATE_STB || (_type) == TDMT_VND_DROP_TABLE || \ diff --git a/include/util/taoserror.h b/include/util/taoserror.h index 25d37020cc..6f9fa7623d 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -40,21 +40,37 @@ int32_t* taosGetErrno(); #define TSDB_CODE_FAILED -1 // unknown or needn't tell detail error // rpc +// #define TSDB_CODE_RPC_ACTION_IN_PROGRESS TAOS_DEF_ERROR_CODE(0, 0x0001) //2.x +// #define TSDB_CODE_RPC_AUTH_REQUIRED TAOS_DEF_ERROR_CODE(0, 0x0002) //2.x #define TSDB_CODE_RPC_AUTH_FAILURE TAOS_DEF_ERROR_CODE(0, 0x0003) #define TSDB_CODE_RPC_REDIRECT TAOS_DEF_ERROR_CODE(0, 0x0004) +// #define TSDB_CODE_RPC_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0005) //2.x +// #define TSDB_CODE_RPC_ALREADY_PROCESSED TAOS_DEF_ERROR_CODE(0, 0x0006) //2.x +// #define TSDB_CODE_RPC_LAST_SESSION_NOT_FINI. TAOS_DEF_ERROR_CODE(0, 0x0007) //2.x +// #define TSDB_CODE_RPC_MISMATCHED_LINK_ID TAOS_DEF_ERROR_CODE(0, 0x0008) //2.x +// #define TSDB_CODE_RPC_TOO_SLOW TAOS_DEF_ERROR_CODE(0, 0x0009) //2.x +// #define TSDB_CODE_RPC_MAX_SESSIONS TAOS_DEF_ERROR_CODE(0, 0x000A) //2.x #define TSDB_CODE_RPC_NETWORK_UNAVAIL TAOS_DEF_ERROR_CODE(0, 0x000B) +// #define TSDB_CODE_RPC_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x000C) //2.x +// #define TSDB_CODE_RPC_UNEXPECTED_RESPONSE TAOS_DEF_ERROR_CODE(0, 0x000D) //2.x +// #define TSDB_CODE_RPC_INVALID_VALUE TAOS_DEF_ERROR_CODE(0, 0x000E) //2.x +// #define TSDB_CODE_RPC_INVALID_TRAN_ID TAOS_DEF_ERROR_CODE(0, 0x000F) //2.x +// #define TSDB_CODE_RPC_INVALID_SESSION_ID TAOS_DEF_ERROR_CODE(0, 0x0010) //2.x +// #define TSDB_CODE_RPC_INVALID_MSG_TYPE TAOS_DEF_ERROR_CODE(0, 0x0011) //2.x +// #define TSDB_CODE_RPC_INVALID_RESPONSE_TYPE TAOS_DEF_ERROR_CODE(0, 0x0012) //2.x +#define TSDB_CODE_TIME_UNSYNCED TAOS_DEF_ERROR_CODE(0, 0x0013) +#define TSDB_CODE_APP_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0014) #define TSDB_CODE_RPC_FQDN_ERROR TAOS_DEF_ERROR_CODE(0, 0x0015) +// #define TSDB_CODE_RPC_INVALID_VERSION TAOS_DEF_ERROR_CODE(0, 0x0016) //2.x #define TSDB_CODE_RPC_PORT_EADDRINUSE TAOS_DEF_ERROR_CODE(0, 0x0017) #define TSDB_CODE_RPC_BROKEN_LINK TAOS_DEF_ERROR_CODE(0, 0x0018) #define TSDB_CODE_RPC_TIMEOUT TAOS_DEF_ERROR_CODE(0, 0x0019) //common & util -#define TSDB_CODE_TIME_UNSYNCED TAOS_DEF_ERROR_CODE(0, 0x0013) -#define TSDB_CODE_APP_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0014) - #define TSDB_CODE_OPS_NOT_SUPPORT TAOS_DEF_ERROR_CODE(0, 0x0100) #define TSDB_CODE_MEMORY_CORRUPTED TAOS_DEF_ERROR_CODE(0, 0x0101) #define TSDB_CODE_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0102) +// #define TSDB_CODE_COM_INVALID_CFG_MSG TAOS_DEF_ERROR_CODE(0, 0x0103) // 2.x #define TSDB_CODE_FILE_CORRUPTED TAOS_DEF_ERROR_CODE(0, 0x0104) #define TSDB_CODE_REF_NO_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0105) #define TSDB_CODE_REF_FULL TAOS_DEF_ERROR_CODE(0, 0x0106) @@ -69,7 +85,7 @@ int32_t* taosGetErrno(); #define TSDB_CODE_OUT_OF_SHM_MEM TAOS_DEF_ERROR_CODE(0, 0x0113) #define TSDB_CODE_INVALID_SHM_ID TAOS_DEF_ERROR_CODE(0, 0x0114) #define TSDB_CODE_INVALID_MSG TAOS_DEF_ERROR_CODE(0, 0x0115) -#define TSDB_CODE_INVALID_MSG_LEN TAOS_DEF_ERROR_CODE(0, 0x0116) +#define TSDB_CODE_INVALID_MSG_LEN TAOS_DEF_ERROR_CODE(0, 0x0116) // #define TSDB_CODE_INVALID_PTR TAOS_DEF_ERROR_CODE(0, 0x0117) #define TSDB_CODE_INVALID_PARA TAOS_DEF_ERROR_CODE(0, 0x0118) #define TSDB_CODE_INVALID_CFG TAOS_DEF_ERROR_CODE(0, 0x0119) @@ -81,7 +97,7 @@ int32_t* taosGetErrno(); #define TSDB_CODE_CHECKSUM_ERROR TAOS_DEF_ERROR_CODE(0, 0x011F) #define TSDB_CODE_COMPRESS_ERROR TAOS_DEF_ERROR_CODE(0, 0x0120) -#define TSDB_CODE_MSG_NOT_PROCESSED TAOS_DEF_ERROR_CODE(0, 0x0121) +#define TSDB_CODE_MSG_NOT_PROCESSED TAOS_DEF_ERROR_CODE(0, 0x0121) // #define TSDB_CODE_CFG_NOT_FOUND TAOS_DEF_ERROR_CODE(0, 0x0122) #define TSDB_CODE_REPEAT_INIT TAOS_DEF_ERROR_CODE(0, 0x0123) #define TSDB_CODE_DUP_KEY TAOS_DEF_ERROR_CODE(0, 0x0124) @@ -94,6 +110,9 @@ int32_t* taosGetErrno(); #define TSDB_CODE_NO_DISKSPACE TAOS_DEF_ERROR_CODE(0, 0x012B) #define TSDB_CODE_TIMEOUT_ERROR TAOS_DEF_ERROR_CODE(0, 0x012C) +#define TSDB_CODE_APP_IS_STARTING TAOS_DEF_ERROR_CODE(0, 0x0130) // +#define TSDB_CODE_APP_IS_STOPPING TAOS_DEF_ERROR_CODE(0, 0x0131) // + //client #define TSDB_CODE_TSC_INVALID_OPERATION TAOS_DEF_ERROR_CODE(0, 0x0200) #define TSDB_CODE_TSC_INVALID_QHANDLE TAOS_DEF_ERROR_CODE(0, 0x0201) diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c index 07a612bb35..30ef7b9542 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c @@ -144,6 +144,7 @@ static void dmProcessMgmtQueue(SQueueInfo *pInfo, SRpcMsg *pMsg) { break; default: terrno = TSDB_CODE_MSG_NOT_PROCESSED; + dGError("msg:%p, not processed in mgmt queue", pMsg); break; } diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c index 95656fd76c..1bd7846d1c 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c +++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c @@ -51,13 +51,15 @@ static inline void dmSendRedirectRsp(SRpcMsg *pMsg, const SEpSet *pNewEpSet) { } int32_t dmProcessNodeMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg) { + const STraceId *trace = &pMsg->info.traceId; + NodeMsgFp msgFp = pWrapper->msgFps[TMSG_INDEX(pMsg->msgType)]; if (msgFp == NULL) { terrno = TSDB_CODE_MSG_NOT_PROCESSED; + dGError("msg:%p, not processed since no handler", pMsg); return -1; } - const STraceId *trace = &pMsg->info.traceId; dGTrace("msg:%p, will be processed by %s", pMsg, pWrapper->name); pMsg->info.wrapper = pWrapper; return (*msgFp)(pWrapper->pMgmt, pMsg); @@ -99,18 +101,23 @@ static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) { dmProcessServerStartupStatus(pDnode, pRpc); return; } else { - terrno = TSDB_CODE_APP_NOT_READY; + if (pDnode->status == DND_STAT_INIT) { + terrno = TSDB_CODE_APP_IS_STARTING; + } else { + terrno = TSDB_CODE_APP_IS_STOPPING; + } goto _OVER; } } - if (IsReq(pRpc) && pRpc->pCont == NULL) { + if (pRpc->pCont == NULL && (IsReq(pRpc) || pRpc->contLen != 0)) { dGError("msg:%p, type:%s pCont is NULL", pRpc, TMSG_INFO(pRpc->msgType)); terrno = TSDB_CODE_INVALID_MSG_LEN; goto _OVER; } if (pHandle->defaultNtype == NODE_END) { + dGError("msg:%p, type:%s not processed since no handle", pRpc, TMSG_INFO(pRpc->msgType)); terrno = TSDB_CODE_MSG_NOT_PROCESSED; goto _OVER; } diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index 9f4c2e048f..d46ae7aaa9 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -644,17 +644,6 @@ static int32_t mndCheckMnodeState(SRpcMsg *pMsg) { return -1; } -static int32_t mndCheckMsgContent(SRpcMsg *pMsg) { - if (!IsReq(pMsg)) return 0; - if (pMsg->contLen != 0 && pMsg->pCont != NULL) return 0; - - const STraceId *trace = &pMsg->info.traceId; - mGError("msg:%p, failed to check msg, cont:%p contLen:%d, app:%p type:%s", pMsg, pMsg->pCont, pMsg->contLen, - pMsg->info.ahandle, TMSG_INFO(pMsg->msgType)); - terrno = TSDB_CODE_INVALID_MSG_LEN; - return -1; -} - int32_t mndProcessRpcMsg(SRpcMsg *pMsg) { SMnode *pMnode = pMsg->info.node; const STraceId *trace = &pMsg->info.traceId; @@ -666,7 +655,6 @@ int32_t mndProcessRpcMsg(SRpcMsg *pMsg) { return -1; } - if (mndCheckMsgContent(pMsg) != 0) return -1; if (mndCheckMnodeState(pMsg) != 0) return -1; mGTrace("msg:%p, start to process in mnode, app:%p type:%s", pMsg, pMsg->info.ahandle, TMSG_INFO(pMsg->msgType)); diff --git a/source/util/src/terror.c b/source/util/src/terror.c index 2025f196f2..3e8c016a74 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -67,6 +67,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_REF_ID_REMOVED, "Ref ID is removed") TAOS_DEFINE_ERROR(TSDB_CODE_REF_INVALID_ID, "Invalid Ref ID") TAOS_DEFINE_ERROR(TSDB_CODE_REF_ALREADY_EXIST, "Ref is already there") TAOS_DEFINE_ERROR(TSDB_CODE_REF_NOT_EXIST, "Ref is not there") + TAOS_DEFINE_ERROR(TSDB_CODE_APP_ERROR, "Unexpected generic error") TAOS_DEFINE_ERROR(TSDB_CODE_ACTION_IN_PROGRESS, "Action in progress") TAOS_DEFINE_ERROR(TSDB_CODE_OUT_OF_RANGE, "Out of range") @@ -83,6 +84,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_VERSION_NUMBER, "Invalid version numbe TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_VERSION_STRING, "Invalid version string") TAOS_DEFINE_ERROR(TSDB_CODE_VERSION_NOT_COMPATIBLE, "Version not compatible") TAOS_DEFINE_ERROR(TSDB_CODE_CHECKSUM_ERROR, "Checksum error") + TAOS_DEFINE_ERROR(TSDB_CODE_COMPRESS_ERROR, "Failed to compress msg") TAOS_DEFINE_ERROR(TSDB_CODE_MSG_NOT_PROCESSED, "Message not processed") TAOS_DEFINE_ERROR(TSDB_CODE_CFG_NOT_FOUND, "Config not found") @@ -97,6 +99,9 @@ TAOS_DEFINE_ERROR(TSDB_CODE_NOT_FOUND, "Not found") TAOS_DEFINE_ERROR(TSDB_CODE_NO_DISKSPACE, "Out of disk space") TAOS_DEFINE_ERROR(TSDB_CODE_TIMEOUT_ERROR, "Operation timeout") +TAOS_DEFINE_ERROR(TSDB_CODE_APP_IS_STARTING, "Database is starting up") +TAOS_DEFINE_ERROR(TSDB_CODE_APP_IS_STOPPING, "Database is closing down") + //client TAOS_DEFINE_ERROR(TSDB_CODE_TSC_INVALID_OPERATION, "Invalid operation") TAOS_DEFINE_ERROR(TSDB_CODE_TSC_INVALID_QHANDLE, "Invalid qhandle") From 64a2bd481cb259825e3bd993102ee679f1e9fd50 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Fri, 2 Dec 2022 10:30:23 +0800 Subject: [PATCH 75/77] fix: check subquery time series error --- source/libs/parser/src/parTranslater.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index d2d97f7b90..15682a2cfe 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -750,8 +750,8 @@ static bool isPrimaryKeyImpl(SNode* pExpr) { return (PRIMARYKEY_TIMESTAMP_COL_ID == ((SColumnNode*)pExpr)->colId); } else if (QUERY_NODE_FUNCTION == nodeType(pExpr)) { SFunctionNode* pFunc = (SFunctionNode*)pExpr; - if (FUNCTION_TYPE_SELECT_VALUE == pFunc->funcType || FUNCTION_TYPE_FIRST == pFunc->funcType || - FUNCTION_TYPE_LAST == pFunc->funcType) { + if (FUNCTION_TYPE_SELECT_VALUE == pFunc->funcType || FUNCTION_TYPE_GROUP_KEY == pFunc->funcType || + FUNCTION_TYPE_FIRST == pFunc->funcType || FUNCTION_TYPE_LAST == pFunc->funcType) { return isPrimaryKeyImpl(nodesListGetNode(pFunc->pParameterList, 0)); } else if (FUNCTION_TYPE_WSTART == pFunc->funcType || FUNCTION_TYPE_WEND == pFunc->funcType) { return true; From dafc1ac826da01b26f51b6d1b4e5549b7365c3df Mon Sep 17 00:00:00 2001 From: sunpeng Date: Fri, 2 Dec 2022 12:03:01 +0800 Subject: [PATCH 76/77] doc: update grafana version in English doc and modifythe way grafana plugin installed in application doc (#18635) --- docs/en/20-third-party/01-grafana.mdx | 2 +- docs/en/25-application/01-telegraf.md | 10 ++-------- docs/en/25-application/02-collectd.md | 10 ++-------- docs/zh/25-application/01-telegraf.md | 10 ++-------- docs/zh/25-application/02-collectd.md | 10 ++-------- 5 files changed, 9 insertions(+), 33 deletions(-) diff --git a/docs/en/20-third-party/01-grafana.mdx b/docs/en/20-third-party/01-grafana.mdx index e0fbefd5a8..ca32ce8afc 100644 --- a/docs/en/20-third-party/01-grafana.mdx +++ b/docs/en/20-third-party/01-grafana.mdx @@ -76,7 +76,7 @@ sudo -u grafana grafana-cli plugins install tdengine-datasource You can also download zip files from [GitHub](https://github.com/taosdata/grafanaplugin/releases/tag/latest) or [Grafana](https://grafana.com/grafana/plugins/tdengine-datasource/?tab=installation) and install manually. The commands are as follows: ```bash -GF_VERSION=3.2.2 +GF_VERSION=3.2.7 # from GitHub wget https://github.com/taosdata/grafanaplugin/releases/download/v$GF_VERSION/tdengine-datasource-$GF_VERSION.zip # from Grafana diff --git a/docs/en/25-application/01-telegraf.md b/docs/en/25-application/01-telegraf.md index f700326449..65fb08ee67 100644 --- a/docs/en/25-application/01-telegraf.md +++ b/docs/en/25-application/01-telegraf.md @@ -38,15 +38,9 @@ Download the latest TDengine-server from the [Downloads](http://tdengine.com/en/ ## Data Connection Setup -### Download TDengine plug-in to grafana plug-in directory +### Install Grafana Plugin and Configure Data Source -```bash -1. wget -c https://github.com/taosdata/grafanaplugin/releases/download/v3.1.3/tdengine-datasource-3.1.3.zip -2. sudo unzip tdengine-datasource-3.1.3.zip -d /var/lib/grafana/plugins/ -3. sudo chown grafana:grafana -R /var/lib/grafana/plugins/tdengine -4. echo -e "[plugins]\nallow_loading_unsigned_plugins = tdengine-datasource\n" | sudo tee -a /etc/grafana/grafana.ini -5. sudo systemctl restart grafana-server.service -``` +Please refer to [Install Grafana Plugin and Configure Data Source](/third-party/grafana/#install-grafana-plugin-and-configure-data-source) ### Modify /etc/telegraf/telegraf.conf diff --git a/docs/en/25-application/02-collectd.md b/docs/en/25-application/02-collectd.md index 692cd8d929..97412b2309 100644 --- a/docs/en/25-application/02-collectd.md +++ b/docs/en/25-application/02-collectd.md @@ -41,15 +41,9 @@ Download the latest TDengine-server from the [Downloads](http://tdengine.com/en/ ## Data Connection Setup -### Copy the TDengine plugin to the grafana plugin directory +### Install Grafana Plugin and Configure Data Source -```bash -1. wget -c https://github.com/taosdata/grafanaplugin/releases/download/v3.1.3/tdengine-datasource-3.1.3.zip -2. sudo unzip tdengine-datasource-3.1.3.zip -d /var/lib/grafana/plugins/ -3. sudo chown grafana:grafana -R /var/lib/grafana/plugins/tdengine -4. echo -e "[plugins]\nallow_loading_unsigned_plugins = tdengine-datasource\n" | sudo tee -a /etc/grafana/grafana.ini -5. sudo systemctl restart grafana-server.service -``` +Please refer to [Install Grafana Plugin and Configure Data Source](/third-party/grafana/#install-grafana-plugin-and-configure-data-source) ### Configure collectd diff --git a/docs/zh/25-application/01-telegraf.md b/docs/zh/25-application/01-telegraf.md index 6338264d17..ec263d7792 100644 --- a/docs/zh/25-application/01-telegraf.md +++ b/docs/zh/25-application/01-telegraf.md @@ -39,15 +39,9 @@ IT 运维监测数据通常都是对时间特性比较敏感的数据,例如 ## 数据链路设置 -### 下载 TDengine 插件到 Grafana 插件目录 +### 安装 Grafana Plugin 并配置数据源 -```bash -1. wget -c https://github.com/taosdata/grafanaplugin/releases/download/v3.1.3/tdengine-datasource-3.1.3.zip -2. sudo unzip tdengine-datasource-3.1.3.zip -d /var/lib/grafana/plugins/ -3. sudo chown grafana:grafana -R /var/lib/grafana/plugins/tdengine -4. echo -e "[plugins]\nallow_loading_unsigned_plugins = tdengine-datasource\n" | sudo tee -a /etc/grafana/grafana.ini -5. sudo systemctl restart grafana-server.service -``` +请参考[安装 Grafana Plugin 并配置数据源](/third-party/grafana/#%E5%AE%89%E8%A3%85-grafana-plugin-%E5%B9%B6%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E6%BA%90)。 ### 修改 /etc/telegraf/telegraf.conf diff --git a/docs/zh/25-application/02-collectd.md b/docs/zh/25-application/02-collectd.md index c6230f48ab..8b39a6431d 100644 --- a/docs/zh/25-application/02-collectd.md +++ b/docs/zh/25-application/02-collectd.md @@ -41,15 +41,9 @@ IT 运维监测数据通常都是对时间特性比较敏感的数据,例如 ## 数据链路设置 -### 复制 TDengine 插件到 grafana 插件目录 +### 安装 Grafana Plugin 并配置数据源 -```bash -1. wget -c https://github.com/taosdata/grafanaplugin/releases/download/v3.1.3/tdengine-datasource-3.1.3.zip -2. sudo unzip tdengine-datasource-3.1.3.zip -d /var/lib/grafana/plugins/ -3. sudo chown grafana:grafana -R /var/lib/grafana/plugins/tdengine -4. echo -e "[plugins]\nallow_loading_unsigned_plugins = tdengine-datasource\n" | sudo tee -a /etc/grafana/grafana.ini -5. sudo systemctl restart grafana-server.service -``` +请参考[安装 Grafana Plugin 并配置数据源](/third-party/grafana/#%E5%AE%89%E8%A3%85-grafana-plugin-%E5%B9%B6%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E6%BA%90)。 ### 配置 collectd From 4f8c04cf79aca8bbe14a9ebb953717e27e9dd9c8 Mon Sep 17 00:00:00 2001 From: sunpeng Date: Fri, 2 Dec 2022 12:47:19 +0800 Subject: [PATCH 77/77] doc: writting from kafka (#18626) * doc: writting from kafka * rename file * docs: typo fix Co-authored-by: Shuduo Sang --- .../03-insert-data/20-kafka-writting.mdx | 46 +++++ ...influxdb-line.mdx => 30-influxdb-line.mdx} | 0 ...tsdb-telnet.mdx => 40-opentsdb-telnet.mdx} | 0 ...opentsdb-json.mdx => 50-opentsdb-json.mdx} | 0 .../{05-high-volume.md => 60-high-volume.md} | 0 .../07-develop/03-insert-data/_py_kafka.mdx | 60 ++++++ docs/examples/python/kafka_example.py | 192 ++++++++++++++++++ .../03-insert-data/20-kafka-writting.mdx | 47 +++++ ...influxdb-line.mdx => 30-influxdb-line.mdx} | 0 ...tsdb-telnet.mdx => 40-opentsdb-telnet.mdx} | 0 ...opentsdb-json.mdx => 50-opentsdb-json.mdx} | 0 .../{05-high-volume.md => 60-high-volume.md} | 0 .../07-develop/03-insert-data/_py_kafka.mdx | 60 ++++++ 13 files changed, 405 insertions(+) create mode 100644 docs/en/07-develop/03-insert-data/20-kafka-writting.mdx rename docs/en/07-develop/03-insert-data/{02-influxdb-line.mdx => 30-influxdb-line.mdx} (100%) rename docs/en/07-develop/03-insert-data/{03-opentsdb-telnet.mdx => 40-opentsdb-telnet.mdx} (100%) rename docs/en/07-develop/03-insert-data/{04-opentsdb-json.mdx => 50-opentsdb-json.mdx} (100%) rename docs/en/07-develop/03-insert-data/{05-high-volume.md => 60-high-volume.md} (100%) create mode 100644 docs/en/07-develop/03-insert-data/_py_kafka.mdx create mode 100644 docs/examples/python/kafka_example.py create mode 100644 docs/zh/07-develop/03-insert-data/20-kafka-writting.mdx rename docs/zh/07-develop/03-insert-data/{02-influxdb-line.mdx => 30-influxdb-line.mdx} (100%) rename docs/zh/07-develop/03-insert-data/{03-opentsdb-telnet.mdx => 40-opentsdb-telnet.mdx} (100%) rename docs/zh/07-develop/03-insert-data/{04-opentsdb-json.mdx => 50-opentsdb-json.mdx} (100%) rename docs/zh/07-develop/03-insert-data/{05-high-volume.md => 60-high-volume.md} (100%) create mode 100644 docs/zh/07-develop/03-insert-data/_py_kafka.mdx diff --git a/docs/en/07-develop/03-insert-data/20-kafka-writting.mdx b/docs/en/07-develop/03-insert-data/20-kafka-writting.mdx new file mode 100644 index 0000000000..ffb969a8a6 --- /dev/null +++ b/docs/en/07-develop/03-insert-data/20-kafka-writting.mdx @@ -0,0 +1,46 @@ +--- +title: Write from Kafka +--- + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import PyKafka from "./_py_kafka.mdx"; + +## About Kafka + +Apache Kafka is an open-source distributed event streaming platform, used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications. For the key concepts of kafka, please refer to [kafka documentation](https://kafka.apache.org/documentation/#gettingStarted). + +### kafka topic + +Messages in Kafka are organized by topics. A topic may have one or more partitions. We can manage kafka topics through `kafka-topics`. + +create a topic named `kafka-events`: + +``` +bin/kafka-topics.sh --create --topic kafka-events --bootstrap-server localhost:9092 +``` + +Alter `kafka-events` topic to set partitions to 3: + +``` +bin/kafka-topics.sh --alter --topic kafka-events --partitions 3 --bootstrap-server=localhost:9092 +``` + +Show all topics and partitions in Kafka: + +``` +bin/kafka-topics.sh --bootstrap-server=localhost:9092 --describe +``` + +## Insert into TDengine + +We can write data into TDengine via SQL or Schemaless. For more information, please refer to [Insert Using SQL](/develop/insert-data/sql-writing/) or [High Performance Writing](/develop/insert-data/high-volume/) or [Schemaless Writing](/reference/schemaless/). + +## Examples + + + + + + + diff --git a/docs/en/07-develop/03-insert-data/02-influxdb-line.mdx b/docs/en/07-develop/03-insert-data/30-influxdb-line.mdx similarity index 100% rename from docs/en/07-develop/03-insert-data/02-influxdb-line.mdx rename to docs/en/07-develop/03-insert-data/30-influxdb-line.mdx diff --git a/docs/en/07-develop/03-insert-data/03-opentsdb-telnet.mdx b/docs/en/07-develop/03-insert-data/40-opentsdb-telnet.mdx similarity index 100% rename from docs/en/07-develop/03-insert-data/03-opentsdb-telnet.mdx rename to docs/en/07-develop/03-insert-data/40-opentsdb-telnet.mdx diff --git a/docs/en/07-develop/03-insert-data/04-opentsdb-json.mdx b/docs/en/07-develop/03-insert-data/50-opentsdb-json.mdx similarity index 100% rename from docs/en/07-develop/03-insert-data/04-opentsdb-json.mdx rename to docs/en/07-develop/03-insert-data/50-opentsdb-json.mdx diff --git a/docs/en/07-develop/03-insert-data/05-high-volume.md b/docs/en/07-develop/03-insert-data/60-high-volume.md similarity index 100% rename from docs/en/07-develop/03-insert-data/05-high-volume.md rename to docs/en/07-develop/03-insert-data/60-high-volume.md diff --git a/docs/en/07-develop/03-insert-data/_py_kafka.mdx b/docs/en/07-develop/03-insert-data/_py_kafka.mdx new file mode 100644 index 0000000000..dc43a0d415 --- /dev/null +++ b/docs/en/07-develop/03-insert-data/_py_kafka.mdx @@ -0,0 +1,60 @@ +### python Kafka 客户端 + +For python kafka client, please refer to [kafka client](https://cwiki.apache.org/confluence/display/KAFKA/Clients#Clients-Python). In this document, we use [kafka-python](http://github.com/dpkp/kafka-python). + +### consume from Kafka + +The simple way to consume messages from Kafka is to read messages one by one. The demo is as follows: + +``` +from kafka import KafkaConsumer +consumer = KafkaConsumer('my_favorite_topic') +for msg in consumer: + print (msg) +``` + +For higher performance, we can consume message from kafka in batch. The demo is as follows: + +``` +from kafka import KafkaConsumer +consumer = KafkaConsumer('my_favorite_topic') +while True: + msgs = consumer.poll(timeout_ms=500, max_records=1000) + if msgs: + print (msgs) +``` + +### multi-threading + +For more higher performance we can process data from kafka in multi-thread. We can use python's ThreadPoolExecutor to achieve multithreading. The demo is as follows: + +``` +from concurrent.futures import ThreadPoolExecutor, Future +pool = ThreadPoolExecutor(max_workers=10) +pool.submit(...) +``` + +### multi-process + +For more higher performance, sometimes we use multiprocessing. In this case, the number of Kafka Consumers should not be greater than the number of Kafka Topic Partitions. The demo is as follows: + +``` +from multiprocessing import Process + +ps = [] +for i in range(5): + p = Process(target=Consumer().consume()) + p.start() + ps.append(p) + +for p in ps: + p.join() +``` + +In addition to python's built-in multithreading and multiprocessing library, we can also use the third-party library gunicorn. + +### Examples + +```py +{{#include docs/examples/python/kafka_example.py}} +``` diff --git a/docs/examples/python/kafka_example.py b/docs/examples/python/kafka_example.py new file mode 100644 index 0000000000..735059eec0 --- /dev/null +++ b/docs/examples/python/kafka_example.py @@ -0,0 +1,192 @@ +#! encoding = utf-8 +import json +import time +from json import JSONDecodeError +from typing import Callable +import logging +from concurrent.futures import ThreadPoolExecutor, Future + +import taos +from kafka import KafkaConsumer +from kafka.consumer.fetcher import ConsumerRecord + + +class Consumer(object): + DEFAULT_CONFIGS = { + 'kafka_brokers': 'localhost:9092', + 'kafka_topic': 'python_kafka', + 'kafka_group_id': 'taos', + 'taos_host': 'localhost', + 'taos_user': 'root', + 'taos_password': 'taosdata', + 'taos_database': 'power', + 'taos_port': 6030, + 'timezone': None, + 'clean_after_testing': False, + 'bath_consume': True, + 'batch_size': 1000, + 'async_model': True, + 'workers': 10 + } + + LOCATIONS = ['California.SanFrancisco', 'California.LosAngles', 'California.SanDiego', 'California.SanJose', + 'California.PaloAlto', 'California.Campbell', 'California.MountainView', 'California.Sunnyvale', + 'California.SantaClara', 'California.Cupertino'] + + CREATE_DATABASE_SQL = 'create database if not exists {} keep 365 duration 10 buffer 16 wal_level 1' + USE_DATABASE_SQL = 'use {}' + DROP_TABLE_SQL = 'drop table if exists meters' + DROP_DATABASE_SQL = 'drop database if exists {}' + CREATE_STABLE_SQL = 'create stable meters (ts timestamp, current float, voltage int, phase float) ' \ + 'tags (location binary(64), groupId int)' + CREATE_TABLE_SQL = 'create table if not exists {} using meters tags (\'{}\', {})' + INSERT_SQL_HEADER = "insert into " + INSERT_PART_SQL = 'power.{} values (\'{}\', {}, {}, {})' + + def __init__(self, **configs): + self.config: dict = self.DEFAULT_CONFIGS + self.config.update(configs) + self.consumer = KafkaConsumer( + self.config.get('kafka_topic'), # topic + bootstrap_servers=self.config.get('kafka_brokers'), + group_id=self.config.get('kafka_group_id'), + ) + self.taos = taos.connect( + host=self.config.get('taos_host'), + user=self.config.get('taos_user'), + password=self.config.get('taos_password'), + port=self.config.get('taos_port'), + timezone=self.config.get('timezone'), + ) + if self.config.get('async_model'): + self.pool = ThreadPoolExecutor(max_workers=self.config.get('workers')) + self.tasks: list[Future] = [] + # tags and table mapping # key: {location}_{groupId} value: + self.tag_table_mapping = {} + i = 0 + for location in self.LOCATIONS: + for j in range(1, 11): + table_name = 'd{}'.format(i) + self._cache_table(location=location, group_id=j, table_name=table_name) + i += 1 + + def init_env(self): + # create database and table + self.taos.execute(self.DROP_DATABASE_SQL.format(self.config.get('taos_database'))) + self.taos.execute(self.CREATE_DATABASE_SQL.format(self.config.get('taos_database'))) + self.taos.execute(self.USE_DATABASE_SQL.format(self.config.get('taos_database'))) + self.taos.execute(self.DROP_TABLE_SQL) + self.taos.execute(self.CREATE_STABLE_SQL) + for tags, table_name in self.tag_table_mapping.items(): + location, group_id = _get_location_and_group(tags) + self.taos.execute(self.CREATE_TABLE_SQL.format(table_name, location, group_id)) + + def consume(self): + logging.warning('## start consumer topic-[%s]', self.config.get('kafka_topic')) + try: + if self.config.get('bath_consume'): + self._run_batch(self._to_taos_batch) + else: + self._run(self._to_taos) + except KeyboardInterrupt: + logging.warning("## caught keyboard interrupt, stopping") + finally: + self.stop() + + def stop(self): + # close consumer + if self.consumer is not None: + self.consumer.commit() + self.consumer.close() + + # multi thread + if self.config.get('async_model'): + for task in self.tasks: + while not task.done(): + pass + if self.pool is not None: + self.pool.shutdown() + + # clean data + if self.config.get('clean_after_testing'): + self.taos.execute(self.DROP_TABLE_SQL) + self.taos.execute(self.DROP_DATABASE_SQL.format(self.config.get('taos_database'))) + # close taos + if self.taos is not None: + self.taos.close() + + def _run(self, f: Callable[[ConsumerRecord], bool]): + for message in self.consumer: + if self.config.get('async_model'): + self.pool.submit(f(message)) + else: + f(message) + + def _run_batch(self, f: Callable[[list[list[ConsumerRecord]]], None]): + while True: + messages = self.consumer.poll(timeout_ms=500, max_records=self.config.get('batch_size')) + if messages: + if self.config.get('async_model'): + self.pool.submit(f, messages.values()) + else: + f(list(messages.values())) + if not messages: + time.sleep(0.1) + + def _to_taos(self, message: ConsumerRecord) -> bool: + sql = self.INSERT_SQL_HEADER + self._build_sql(message.value) + if len(sql) == 0: # decode error, skip + return True + logging.info('## insert sql %s', sql) + return self.taos.execute(sql=sql) == 1 + + def _to_taos_batch(self, messages: list[list[ConsumerRecord]]): + sql = self._build_sql_batch(messages=messages) + if len(sql) == 0: # decode error, skip + return + self.taos.execute(sql=sql) + + def _build_sql(self, msg_value: str) -> str: + try: + data = json.loads(msg_value) + except JSONDecodeError as e: + logging.error('## decode message [%s] error ', msg_value, e) + return '' + location = data.get('location') + group_id = data.get('groupId') + ts = data.get('ts') + current = data.get('current') + voltage = data.get('voltage') + phase = data.get('phase') + + table_name = self._get_table_name(location=location, group_id=group_id) + return self.INSERT_PART_SQL.format(table_name, ts, current, voltage, phase) + + def _build_sql_batch(self, messages: list[list[ConsumerRecord]]) -> str: + sql_list = [] + for partition_messages in messages: + for message in partition_messages: + sql_list.append(self._build_sql(message.value)) + + return self.INSERT_SQL_HEADER + ' '.join(sql_list) + + def _cache_table(self, location: str, group_id: int, table_name: str): + self.tag_table_mapping[_tag_table_mapping_key(location=location, group_id=group_id)] = table_name + + def _get_table_name(self, location: str, group_id: int) -> str: + return self.tag_table_mapping.get(_tag_table_mapping_key(location=location, group_id=group_id)) + + +def _tag_table_mapping_key(location: str, group_id: int): + return '{}_{}'.format(location, group_id) + + +def _get_location_and_group(key: str) -> (str, int): + fields = key.split('_') + return fields[0], fields[1] + + +if __name__ == '__main__': + consumer = Consumer(async_model=True) + consumer.init_env() + consumer.consume() \ No newline at end of file diff --git a/docs/zh/07-develop/03-insert-data/20-kafka-writting.mdx b/docs/zh/07-develop/03-insert-data/20-kafka-writting.mdx new file mode 100644 index 0000000000..32d3c2e5cb --- /dev/null +++ b/docs/zh/07-develop/03-insert-data/20-kafka-writting.mdx @@ -0,0 +1,47 @@ +--- +title: 从 Kafka 写入 +--- + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import PyKafka from "./_py_kafka.mdx"; + +## Kafka 介绍 + +Apache Kafka 是开源的分布式消息分发平台,被广泛应用于高性能数据管道、流式数据分析、数据集成和事件驱动类型的应用程序。Kafka 包含 Producer、Consumer 和 Topic,其中 Producer 是向 Kafka 发送消息的进程,Consumer 是从 Kafka 消费消息的进程。Kafka 相关概念可以参考[官方文档](https://kafka.apache.org/documentation/#gettingStarted)。 + + +### kafka topic + +Kafka 的消息按 topic 组织,每个 topic 会有一到多个 partition。可以通过 kafka 的 `kafka-topics` 管理 topic。 + +创建名为 `kafka-events` 的topic: + +``` +bin/kafka-topics.sh --create --topic kafka-events --bootstrap-server localhost:9092 +``` + +修改 `kafka-events` 的 partition 数量为 3: + +``` +bin/kafka-topics.sh --alter --topic kafka-events --partitions 3 --bootstrap-server=localhost:9092 +``` + +展示所有的 topic 和 partition: + +``` +bin/kafka-topics.sh --bootstrap-server=localhost:9092 --describe +``` + +## 写入 TDengine + +TDengine 支持 Sql 方式和 Schemaless 方式的数据写入,Sql 方式数据写入可以参考 [TDengine SQL 写入](/develop/insert-data/sql-writing/) 和 [TDengine 高效写入](/develop/insert-data/high-volume/)。Schemaless 方式数据写入可以参考 [TDengine Schemaless 写入](/reference/schemaless/) 文档。 + +## 示例代码 + + + + + + + diff --git a/docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx b/docs/zh/07-develop/03-insert-data/30-influxdb-line.mdx similarity index 100% rename from docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx rename to docs/zh/07-develop/03-insert-data/30-influxdb-line.mdx diff --git a/docs/zh/07-develop/03-insert-data/03-opentsdb-telnet.mdx b/docs/zh/07-develop/03-insert-data/40-opentsdb-telnet.mdx similarity index 100% rename from docs/zh/07-develop/03-insert-data/03-opentsdb-telnet.mdx rename to docs/zh/07-develop/03-insert-data/40-opentsdb-telnet.mdx diff --git a/docs/zh/07-develop/03-insert-data/04-opentsdb-json.mdx b/docs/zh/07-develop/03-insert-data/50-opentsdb-json.mdx similarity index 100% rename from docs/zh/07-develop/03-insert-data/04-opentsdb-json.mdx rename to docs/zh/07-develop/03-insert-data/50-opentsdb-json.mdx diff --git a/docs/zh/07-develop/03-insert-data/05-high-volume.md b/docs/zh/07-develop/03-insert-data/60-high-volume.md similarity index 100% rename from docs/zh/07-develop/03-insert-data/05-high-volume.md rename to docs/zh/07-develop/03-insert-data/60-high-volume.md diff --git a/docs/zh/07-develop/03-insert-data/_py_kafka.mdx b/docs/zh/07-develop/03-insert-data/_py_kafka.mdx new file mode 100644 index 0000000000..cd7edf557d --- /dev/null +++ b/docs/zh/07-develop/03-insert-data/_py_kafka.mdx @@ -0,0 +1,60 @@ +### python Kafka 客户端 + +Kafka 的 python 客户端可以参考文档 [kafka client](https://cwiki.apache.org/confluence/display/KAFKA/Clients#Clients-Python)。推荐使用 [confluent-kafka-python](https://github.com/confluentinc/confluent-kafka-python) 和 [kafka-python](http://github.com/dpkp/kafka-python)。以下示例以 [kafka-python](http://github.com/dpkp/kafka-python) 为例。 + +### 从 Kafka 消费数据 + +Kafka 客户端采用 pull 的方式从 Kafka 消费数据,可以采用单条消费的方式或批量消费的方式读取数据。使用 [kafka-python](http://github.com/dpkp/kafka-python) 客户端单条消费数据的示例如下: + +``` +from kafka import KafkaConsumer +consumer = KafkaConsumer('my_favorite_topic') +for msg in consumer: + print (msg) +``` + +单条消费的方式在数据流量大的情况下往往存在性能瓶颈,导致 Kafka 消息积压,更推荐使用批量消费的方式消费数据。使用 [kafka-python](http://github.com/dpkp/kafka-python) 客户端批量消费数据的示例如下: + +``` +from kafka import KafkaConsumer +consumer = KafkaConsumer('my_favorite_topic') +while True: + msgs = consumer.poll(timeout_ms=500, max_records=1000) + if msgs: + print (msgs) +``` + +### Python 多线程 + +为了提高数据写入效率,通常采用多线程的方式写入数据,可以使用 python 线程池 ThreadPoolExecutor 实现多线程。示例代码如下: + +``` +from concurrent.futures import ThreadPoolExecutor, Future +pool = ThreadPoolExecutor(max_workers=10) +pool.submit(...) +``` + +### Python 多进程 + +单个python进程不能充分发挥多核 CPU 的性能,有时候我们会选择多进程的方式。在多进程的情况下,需要注意,Kafka Consumer 的数量应该小于等于 Kafka Topic Partition 数量。Python 多进程示例代码如下: + +``` +from multiprocessing import Process + +ps = [] +for i in range(5): + p = Process(target=Consumer().consume()) + p.start() + ps.append(p) + +for p in ps: + p.join() +``` + +除了 Python 内置的多线程和多进程方式,还可以通过第三方库 gunicorn 实现并发。 + +### 完整示例 + +```py +{{#include docs/examples/python/kafka_example.py}} +```