dmchen/trans-improve-show
This commit is contained in:
parent
05075cb2a0
commit
623017b16d
|
@ -61,6 +61,7 @@ extern "C" {
|
|||
#define TSDB_INS_TABLE_MACHINES "ins_machines"
|
||||
#define TSDB_INS_TABLE_ENCRYPTIONS "ins_encryptions"
|
||||
#define TSDB_INS_TABLE_TSMAS "ins_tsmas"
|
||||
#define TSDB_INS_TABLE_TRANSACTION_DETAILS "ins_transaction_details"
|
||||
|
||||
#define TSDB_PERFORMANCE_SCHEMA_DB "performance_schema"
|
||||
#define TSDB_PERFS_TABLE_SMAS "perf_smas"
|
||||
|
|
|
@ -161,6 +161,7 @@ typedef enum _mgmt_table {
|
|||
TSDB_MGMT_TABLE_USER_FULL,
|
||||
TSDB_MGMT_TABLE_ANODE,
|
||||
TSDB_MGMT_TABLE_ANODE_FULL,
|
||||
TSDB_MGMT_TABLE_TRANSACTION_DETAIL,
|
||||
TSDB_MGMT_TABLE_MAX,
|
||||
} EShowType;
|
||||
|
||||
|
@ -387,6 +388,7 @@ typedef enum ENodeType {
|
|||
QUERY_NODE_SHOW_VIEWS_STMT,
|
||||
QUERY_NODE_SHOW_COMPACTS_STMT,
|
||||
QUERY_NODE_SHOW_COMPACT_DETAILS_STMT,
|
||||
QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT,
|
||||
QUERY_NODE_SHOW_GRANTS_FULL_STMT,
|
||||
QUERY_NODE_SHOW_GRANTS_LOGS_STMT,
|
||||
QUERY_NODE_SHOW_CLUSTER_MACHINES_STMT,
|
||||
|
@ -2231,7 +2233,7 @@ typedef struct {
|
|||
char user[TSDB_USER_LEN];
|
||||
char filterTb[TSDB_TABLE_NAME_LEN]; // for ins_columns
|
||||
int64_t showId;
|
||||
int64_t compactId; // for compact
|
||||
int64_t compactId1; // for compact
|
||||
bool withFull; // for show users full
|
||||
} SRetrieveTableReq;
|
||||
|
||||
|
|
|
@ -404,6 +404,11 @@ typedef struct SShowCompactDetailsStmt {
|
|||
SNode* pCompactId;
|
||||
} SShowCompactDetailsStmt;
|
||||
|
||||
typedef struct SShowTransactionDetailsStmt {
|
||||
ENodeType type;
|
||||
SNode* pTransactionId;
|
||||
} SShowTransactionDetailsStmt;
|
||||
|
||||
typedef enum EIndexType { INDEX_TYPE_SMA = 1, INDEX_TYPE_FULLTEXT, INDEX_TYPE_NORMAL } EIndexType;
|
||||
|
||||
typedef struct SIndexOptions {
|
||||
|
|
|
@ -407,6 +407,7 @@ int32_t taosGetErrSize();
|
|||
#define TSDB_CODE_MND_TRANS_CTX_SWITCH TAOS_DEF_ERROR_CODE(0, 0x03D8)
|
||||
#define TSDB_CODE_MND_TRANS_CONFLICT_COMPACT TAOS_DEF_ERROR_CODE(0, 0x03D9)
|
||||
#define TSDB_CODE_MND_TRANS_UNKNOW_ERROR TAOS_DEF_ERROR_CODE(0, 0x03DF)
|
||||
#define TSDB_CODE_MND_TRANS_NOT_ABLE_TO_kILLED TAOS_DEF_ERROR_CODE(0, 0x03D2)
|
||||
|
||||
// mnode-mq
|
||||
#define TSDB_CODE_MND_TOPIC_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x03E0)
|
||||
|
|
|
@ -349,7 +349,7 @@ typedef enum ELogicConditionType {
|
|||
|
||||
#define TSDB_TRANS_STAGE_LEN 12
|
||||
#define TSDB_TRANS_TYPE_LEN 16
|
||||
#define TSDB_TRANS_ERROR_LEN 512
|
||||
#define TSDB_TRANS_ERROR_LEN 512000
|
||||
|
||||
#define TSDB_STEP_NAME_LEN 32
|
||||
#define TSDB_STEP_DESC_LEN 128
|
||||
|
|
|
@ -314,6 +314,8 @@ static const SSysDbTableSchema transSchema[] = {
|
|||
{.name = "oper", .bytes = TSDB_TRANS_OPER_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
|
||||
{.name = "db", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
|
||||
{.name = "stable", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
|
||||
{.name = "killable", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
|
||||
{.name = "kill_mnode", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
|
||||
{.name = "failed_times", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false},
|
||||
{.name = "last_exec_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false},
|
||||
{.name = "last_action_info", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||
|
@ -399,6 +401,15 @@ static const SSysDbTableSchema userCompactsDetailSchema[] = {
|
|||
{.name = "start_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false},
|
||||
};
|
||||
|
||||
static const SSysDbTableSchema userTransactionDetailSchema[] = {
|
||||
{.name = "transaction_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false},
|
||||
{.name = "vgroup_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false},
|
||||
{.name = "dnode_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false},
|
||||
{.name = "number_fileset", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false},
|
||||
{.name = "finished", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false},
|
||||
{.name = "start_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false},
|
||||
};
|
||||
|
||||
static const SSysDbTableSchema anodesSchema[] = {
|
||||
{.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = false},
|
||||
{.name = "url", .bytes = TSDB_ANAL_ANODE_URL_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
|
||||
|
@ -489,6 +500,7 @@ static const SSysTableMeta infosMeta[] = {
|
|||
{TSDB_INS_TABLE_TSMAS, tsmaSchema, tListLen(tsmaSchema), false},
|
||||
{TSDB_INS_TABLE_ANODES, anodesSchema, tListLen(anodesSchema), true},
|
||||
{TSDB_INS_TABLE_ANODES_FULL, anodesFullSchema, tListLen(anodesFullSchema), true},
|
||||
{TSDB_INS_TABLE_TRANSACTION_DETAILS, userTransactionDetailSchema, tListLen(userTransactionDetailSchema), false},
|
||||
};
|
||||
|
||||
static const SSysDbTableSchema connectionsSchema[] = {
|
||||
|
|
|
@ -5732,7 +5732,7 @@ int32_t tSerializeSRetrieveTableReq(void *buf, int32_t bufLen, SRetrieveTableReq
|
|||
TAOS_CHECK_EXIT(tEncodeCStr(&encoder, pReq->tb));
|
||||
TAOS_CHECK_EXIT(tEncodeCStr(&encoder, pReq->filterTb));
|
||||
TAOS_CHECK_EXIT(tEncodeCStr(&encoder, pReq->user));
|
||||
TAOS_CHECK_EXIT(tEncodeI64(&encoder, pReq->compactId));
|
||||
TAOS_CHECK_EXIT(tEncodeI64(&encoder, pReq->compactId1));
|
||||
TAOS_CHECK_EXIT(tEncodeI8(&encoder, pReq->withFull));
|
||||
tEndEncode(&encoder);
|
||||
|
||||
|
@ -5760,9 +5760,9 @@ int32_t tDeserializeSRetrieveTableReq(void *buf, int32_t bufLen, SRetrieveTableR
|
|||
TAOS_CHECK_EXIT(tDecodeCStrTo(&decoder, pReq->filterTb));
|
||||
TAOS_CHECK_EXIT(tDecodeCStrTo(&decoder, pReq->user));
|
||||
if (!tDecodeIsEnd(&decoder)) {
|
||||
TAOS_CHECK_EXIT(tDecodeI64(&decoder, &pReq->compactId));
|
||||
TAOS_CHECK_EXIT(tDecodeI64(&decoder, &pReq->compactId1));
|
||||
} else {
|
||||
pReq->compactId = -1;
|
||||
pReq->compactId1 = -1;
|
||||
}
|
||||
if (!tDecodeIsEnd(&decoder)) {
|
||||
TAOS_CHECK_EXIT(tDecodeI8(&decoder, (int8_t *)&pReq->withFull));
|
||||
|
|
|
@ -526,6 +526,7 @@ int32_t dmProcessRetrieve(SDnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
|||
if (tDeserializeSRetrieveTableReq(pMsg->pCont, pMsg->contLen, &retrieveReq) != 0) {
|
||||
return TSDB_CODE_INVALID_MSG;
|
||||
}
|
||||
dInfo("retrieve table:%s, user:%s, compactId:%" PRId64, retrieveReq.tb, retrieveReq.user, retrieveReq.compactId1);
|
||||
#if 0
|
||||
if (strcmp(retrieveReq.user, TSDB_DEFAULT_USER) != 0) {
|
||||
code = TSDB_CODE_MND_NO_RIGHTS;
|
||||
|
|
|
@ -133,6 +133,12 @@ typedef enum {
|
|||
TRN_EXEC_SERIAL = 1,
|
||||
} ETrnExec;
|
||||
|
||||
typedef enum {
|
||||
TRN_KILL_MODE_SKIP = 0,
|
||||
TRN_KILL_MODE_INTERUPT = 1,
|
||||
//TRN_KILL_MODE_ROLLBACK = 2,
|
||||
} ETrnKillMode;
|
||||
|
||||
typedef enum {
|
||||
DND_REASON_ONLINE = 0,
|
||||
DND_REASON_STATUS_MSG_TIMEOUT,
|
||||
|
@ -201,6 +207,8 @@ typedef struct {
|
|||
SRWLatch lockRpcArray;
|
||||
int64_t mTraceId;
|
||||
TdThreadMutex mutex;
|
||||
bool ableToBeKilled;
|
||||
ETrnKillMode killMode;
|
||||
} STrans;
|
||||
|
||||
typedef struct {
|
||||
|
|
|
@ -54,6 +54,8 @@ typedef struct {
|
|||
SSdbRaw *pRaw;
|
||||
|
||||
int64_t mTraceId;
|
||||
int64_t startTime;
|
||||
int64_t endTime;
|
||||
} STransAction;
|
||||
|
||||
typedef void (*TransCbFp)(SMnode *pMnode, void *param, int32_t paramLen);
|
||||
|
@ -80,6 +82,8 @@ void mndTransSetCb(STrans *pTrans, ETrnFunc startFunc, ETrnFunc stopFunc, voi
|
|||
void mndTransSetDbName(STrans *pTrans, const char *dbname, const char *stbname);
|
||||
void mndTransAddArbGroupId(STrans *pTrans, int32_t groupId);
|
||||
void mndTransSetSerial(STrans *pTrans);
|
||||
void mndTransSetBeKilled(STrans *pTrans, bool ableToBeKilled);
|
||||
void mndTransSetKillMode(STrans *pTrans, ETrnKillMode killMode);
|
||||
void mndTransSetParallel(STrans *pTrans);
|
||||
void mndTransSetChangeless(STrans *pTrans);
|
||||
void mndTransSetOper(STrans *pTrans, EOperType oper);
|
||||
|
|
|
@ -45,6 +45,8 @@ int32_t mndRetrieveCompactDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB
|
|||
char *sep = NULL;
|
||||
SDbObj *pDb = NULL;
|
||||
|
||||
mInfo("retrieve compact detail");
|
||||
|
||||
if (strlen(pShow->db) > 0) {
|
||||
sep = strchr(pShow->db, '.');
|
||||
if (sep &&
|
||||
|
|
|
@ -995,7 +995,7 @@ static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) {
|
|||
TAOS_CHECK_GOTO(mndAcquireUser(pMnode, pReq->info.conn.user, &pUser), &lino, _OVER);
|
||||
|
||||
TAOS_CHECK_GOTO(mndCreateDb(pMnode, pReq, &createReq, pUser, dnodeList), &lino, _OVER);
|
||||
if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
|
||||
//if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
|
||||
|
||||
SName name = {0};
|
||||
if (tNameFromString(&name, createReq.db, T_NAME_ACCT | T_NAME_DB) < 0)
|
||||
|
@ -1236,6 +1236,7 @@ static int32_t mndAlterDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pOld, SDbObj *p
|
|||
TAOS_RETURN(code);
|
||||
}
|
||||
mInfo("trans:%d, used to alter db:%s", pTrans->id, pOld->name);
|
||||
mInfo("trans:%d, used to alter db, ableToBeKilled:%d, killMode:%d", pTrans->id, pTrans->ableToBeKilled, pTrans->killMode);
|
||||
|
||||
mndTransSetDbName(pTrans, pOld->name, NULL);
|
||||
TAOS_CHECK_GOTO(mndTransCheckConflict(pMnode, pTrans), NULL, _OVER);
|
||||
|
@ -1243,6 +1244,8 @@ static int32_t mndAlterDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pOld, SDbObj *p
|
|||
TAOS_CHECK_GOTO(mndSetAlterDbPrepareLogs(pMnode, pTrans, pOld, pNew), NULL, _OVER);
|
||||
TAOS_CHECK_GOTO(mndSetAlterDbCommitLogs(pMnode, pTrans, pOld, pNew), NULL, _OVER);
|
||||
TAOS_CHECK_GOTO(mndSetAlterDbRedoActions(pMnode, pTrans, pOld, pNew), NULL, _OVER);
|
||||
|
||||
mInfo("trans:%d, used to alter db, ableToBeKilled:%d, killMode:%d", pTrans->id, pTrans->ableToBeKilled, pTrans->killMode);
|
||||
TAOS_CHECK_GOTO(mndTransPrepare(pMnode, pTrans), NULL, _OVER);
|
||||
code = 0;
|
||||
|
||||
|
|
|
@ -132,6 +132,8 @@ static int32_t convertToRetrieveType(char *name, int32_t len) {
|
|||
type = TSDB_MGMT_TABLE_COMPACT;
|
||||
} else if (strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, len) == 0) {
|
||||
type = TSDB_MGMT_TABLE_COMPACT_DETAIL;
|
||||
} else if (strncasecmp(name, TSDB_INS_TABLE_TRANSACTION_DETAILS, len) == 0) {
|
||||
type = TSDB_MGMT_TABLE_TRANSACTION_DETAIL;
|
||||
} else if (strncasecmp(name, TSDB_INS_TABLE_GRANTS_FULL, len) == 0) {
|
||||
type = TSDB_MGMT_TABLE_GRANTS_FULL;
|
||||
} else if (strncasecmp(name, TSDB_INS_TABLE_GRANTS_LOGS, len) == 0) {
|
||||
|
@ -232,7 +234,7 @@ static int32_t mndProcessRetrieveSysTableReq(SRpcMsg *pReq) {
|
|||
SRetrieveTableReq retrieveReq = {0};
|
||||
TAOS_CHECK_RETURN(tDeserializeSRetrieveTableReq(pReq->pCont, pReq->contLen, &retrieveReq));
|
||||
|
||||
mDebug("process to retrieve systable req db:%s, tb:%s", retrieveReq.db, retrieveReq.tb);
|
||||
mDebug("process to retrieve systable req db:%s, tb:%s, compactId:%" PRId64, retrieveReq.db, retrieveReq.tb, retrieveReq.compactId1);
|
||||
|
||||
if (retrieveReq.showId == 0) {
|
||||
STableMetaRsp *pMeta = taosHashGet(pMnode->infosMeta, retrieveReq.tb, strlen(retrieveReq.tb));
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
#define TRANS_VER1_NUMBER 1
|
||||
#define TRANS_VER2_NUMBER 2
|
||||
#define TRANS_VER3_NUMBER 3
|
||||
#define TRANS_ARRAY_SIZE 8
|
||||
#define TRANS_RESERVE_SIZE 44
|
||||
|
||||
|
@ -63,7 +64,7 @@ static int32_t mndProcessKillTransReq(SRpcMsg *pReq);
|
|||
|
||||
static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
|
||||
static void mndCancelGetNextTrans(SMnode *pMnode, void *pIter);
|
||||
|
||||
static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
|
||||
static int32_t tsMaxTransId = 0;
|
||||
|
||||
int32_t mndInitTrans(SMnode *pMnode) {
|
||||
|
@ -82,6 +83,7 @@ int32_t mndInitTrans(SMnode *pMnode) {
|
|||
|
||||
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_TRANS, mndRetrieveTrans);
|
||||
mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_TRANS, mndCancelGetNextTrans);
|
||||
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_TRANSACTION_DETAIL, mndRetrieveTransDetail);
|
||||
return sdbSetTable(pMnode->pSdb, table);
|
||||
}
|
||||
|
||||
|
@ -149,7 +151,7 @@ SSdbRaw *mndTransEncode(STrans *pTrans) {
|
|||
int32_t code = 0;
|
||||
int32_t lino = 0;
|
||||
terrno = TSDB_CODE_INVALID_MSG;
|
||||
int8_t sver = taosArrayGetSize(pTrans->prepareActions) ? TRANS_VER2_NUMBER : TRANS_VER1_NUMBER;
|
||||
int8_t sver = TRANS_VER3_NUMBER;
|
||||
|
||||
int32_t rawDataLen = sizeof(STrans) + TRANS_RESERVE_SIZE + pTrans->paramLen;
|
||||
rawDataLen += mndTransGetActionsSize(pTrans->prepareActions);
|
||||
|
@ -213,6 +215,11 @@ SSdbRaw *mndTransEncode(STrans *pTrans) {
|
|||
pIter = taosHashIterate(pTrans->arbGroupIds, pIter);
|
||||
}
|
||||
|
||||
if (sver > TRANS_VER1_NUMBER) {
|
||||
SDB_SET_INT8(pRaw, dataPos, pTrans->ableToBeKilled, _OVER)
|
||||
SDB_SET_INT32(pRaw, dataPos, pTrans->killMode, _OVER)
|
||||
}
|
||||
|
||||
SDB_SET_RESERVE(pRaw, dataPos, TRANS_RESERVE_SIZE, _OVER)
|
||||
SDB_SET_DATALEN(pRaw, dataPos, _OVER)
|
||||
|
||||
|
@ -303,7 +310,7 @@ SSdbRow *mndTransDecode(SSdbRaw *pRaw) {
|
|||
|
||||
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
|
||||
|
||||
if (sver != TRANS_VER1_NUMBER && sver != TRANS_VER2_NUMBER) {
|
||||
if (sver > TRANS_VER3_NUMBER) {
|
||||
terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
|
||||
goto _OVER;
|
||||
}
|
||||
|
@ -382,6 +389,15 @@ SSdbRow *mndTransDecode(SSdbRaw *pRaw) {
|
|||
if ((terrno = taosHashPut(pTrans->arbGroupIds, &arbGroupId, sizeof(int32_t), NULL, 0)) != 0) goto _OVER;
|
||||
}
|
||||
|
||||
if (sver > TRANS_VER2_NUMBER) {
|
||||
int8_t ableKill = 0;
|
||||
int8_t killMode = 0;
|
||||
SDB_GET_INT8(pRaw, dataPos, &ableKill, _OVER)
|
||||
SDB_GET_INT8(pRaw, dataPos, &killMode, _OVER)
|
||||
pTrans->ableToBeKilled = ableKill;
|
||||
pTrans->killMode = killMode;
|
||||
}
|
||||
|
||||
SDB_GET_RESERVE(pRaw, dataPos, TRANS_RESERVE_SIZE, _OVER)
|
||||
|
||||
terrno = 0;
|
||||
|
@ -629,6 +645,7 @@ STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, ETrnConflct conflict,
|
|||
pTrans->policy = policy;
|
||||
pTrans->conflict = conflict;
|
||||
pTrans->exec = TRN_EXEC_PARALLEL;
|
||||
pTrans->ableToBeKilled = false;
|
||||
pTrans->createdTime = taosGetTimestampMs();
|
||||
pTrans->prepareActions = taosArrayInit(TRANS_ARRAY_SIZE, sizeof(STransAction));
|
||||
pTrans->redoActions = taosArrayInit(TRANS_ARRAY_SIZE, sizeof(STransAction));
|
||||
|
@ -797,6 +814,13 @@ void mndTransAddArbGroupId(STrans *pTrans, int32_t groupId) {
|
|||
|
||||
void mndTransSetSerial(STrans *pTrans) { pTrans->exec = TRN_EXEC_SERIAL; }
|
||||
|
||||
void mndTransSetBeKilled(STrans *pTrans, bool ableToBeKilled) { pTrans->ableToBeKilled = ableToBeKilled; }
|
||||
|
||||
void mndTransSetKillMode(STrans *pTrans, ETrnKillMode killMode) {
|
||||
pTrans->ableToBeKilled = true;
|
||||
pTrans->killMode = killMode;
|
||||
}
|
||||
|
||||
void mndTransSetParallel(STrans *pTrans) { pTrans->exec = TRN_EXEC_PARALLEL; }
|
||||
|
||||
void mndTransSetChangeless(STrans *pTrans) { pTrans->changeless = true; }
|
||||
|
@ -1048,6 +1072,39 @@ int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) {
|
|||
return TSDB_CODE_INVALID_PARA;
|
||||
}
|
||||
|
||||
mInfo("trans:%d, action list:", pTrans->id);
|
||||
int32_t index = 0;
|
||||
for (int32_t i = 0; i < taosArrayGetSize(pTrans->prepareActions); ++i, ++index) {
|
||||
STransAction *pAction = taosArrayGet(pTrans->prepareActions, i);
|
||||
mInfo("trans:%d, action:%d, %s:%d sdbType:%s, sdbStatus:%s", pTrans->id, index,
|
||||
mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status));
|
||||
}
|
||||
|
||||
for (int32_t i = 0; i < taosArrayGetSize(pTrans->redoActions); ++i, ++index) {
|
||||
STransAction *pAction = taosArrayGet(pTrans->redoActions, i);
|
||||
mInfo("trans:%d, action:%d, %s:%d msgType:%s", pTrans->id, index,
|
||||
mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType));;
|
||||
}
|
||||
|
||||
for (int32_t i = 0; i < taosArrayGetSize(pTrans->commitActions); ++i, ++index) {
|
||||
STransAction *pAction = taosArrayGet(pTrans->commitActions, i);
|
||||
mInfo("trans:%d, action:%d, %s:%d sdbType:%s, sdbStatus:%s", pTrans->id, index,
|
||||
mndTransStr(pAction->stage), i, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status));
|
||||
}
|
||||
|
||||
for (int32_t i = 0; i < taosArrayGetSize(pTrans->undoActions); ++i, ++index) {
|
||||
STransAction *pAction = taosArrayGet(pTrans->undoActions, i);
|
||||
if(pAction->actionType == TRANS_ACTION_MSG){
|
||||
mInfo("trans:%d, action:%d, %s:%d msgType:%s", pTrans->id, index,
|
||||
mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType));;
|
||||
}
|
||||
else{
|
||||
mInfo("trans:%d, action:%d, %s:%d sdbType:%s, sdbStatus:%s", pTrans->id, index,
|
||||
mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TAOS_CHECK_RETURN(mndTransCheckConflict(pMnode, pTrans));
|
||||
|
||||
TAOS_CHECK_RETURN(mndTransCheckParallelActions(pMnode, pTrans));
|
||||
|
@ -1265,6 +1322,7 @@ int32_t mndTransProcessRsp(SRpcMsg *pRsp) {
|
|||
if (pAction != NULL) {
|
||||
pAction->msgReceived = 1;
|
||||
pAction->errCode = pRsp->code;
|
||||
pAction->endTime = taosGetTimestampMs();
|
||||
pTrans->lastErrorNo = pRsp->code;
|
||||
|
||||
mInfo("trans:%d, %s:%d response is received, received code:0x%x(%s), accept:0x%x(%s) retry:0x%x(%s)", transId,
|
||||
|
@ -1371,6 +1429,9 @@ static int32_t mndTransSendSingleMsg(SMnode *pMnode, STrans *pTrans, STransActio
|
|||
pAction->msgSent = 1;
|
||||
// pAction->msgReceived = 0;
|
||||
pAction->errCode = TSDB_CODE_ACTION_IN_PROGRESS;
|
||||
if(pAction->startTime == 0){
|
||||
pAction->startTime = taosGetTimestampMs();
|
||||
}
|
||||
mInfo("trans:%d, %s:%d is sent, %s", pTrans->id, mndTransStr(pAction->stage), pAction->id, detail);
|
||||
|
||||
mndSetTransLastAction(pTrans, pAction);
|
||||
|
@ -1919,6 +1980,11 @@ int32_t mndKillTrans(SMnode *pMnode, STrans *pTrans) {
|
|||
TAOS_RETURN(TSDB_CODE_MND_TRANS_INVALID_STAGE);
|
||||
}
|
||||
|
||||
if(pTrans->ableToBeKilled == false){
|
||||
return TSDB_CODE_MND_TRANS_NOT_ABLE_TO_kILLED;
|
||||
}
|
||||
|
||||
if(pTrans->killMode == TRN_KILL_MODE_SKIP){
|
||||
for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) {
|
||||
STransAction *pAction = taosArrayGet(pArray, i);
|
||||
mInfo("trans:%d, %s:%d set processed for kill msg received, errCode from %s to success", pTrans->id,
|
||||
|
@ -1927,6 +1993,13 @@ int32_t mndKillTrans(SMnode *pMnode, STrans *pTrans) {
|
|||
pAction->msgReceived = 1;
|
||||
pAction->errCode = 0;
|
||||
}
|
||||
}
|
||||
else if(pTrans->killMode == TRN_KILL_MODE_INTERUPT){
|
||||
pTrans->stage = TRN_STAGE_PRE_FINISH;
|
||||
}
|
||||
else{
|
||||
return TSDB_CODE_MND_TRANS_NOT_ABLE_TO_kILLED;
|
||||
}
|
||||
|
||||
mndTransExecute(pMnode, pTrans);
|
||||
return 0;
|
||||
|
@ -2039,6 +2112,18 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl
|
|||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)stbname, false), pTrans, &lino, _OVER);
|
||||
|
||||
const char *killableStr = pTrans->ableToBeKilled ? "yes" : "no";
|
||||
char killableVstr[10 + VARSTR_HEADER_SIZE] = {0};
|
||||
STR_WITH_MAXSIZE_TO_VARSTR(killableVstr, killableStr, 24);
|
||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||
colDataSetVal(pColInfo, numOfRows, (const char *)killableVstr, false);
|
||||
|
||||
const char *killModeStr = pTrans->killMode == TRN_KILL_MODE_SKIP ? "skip" : "interrupt";
|
||||
char killModeVstr[10 + VARSTR_HEADER_SIZE] = {0};
|
||||
STR_WITH_MAXSIZE_TO_VARSTR(killModeVstr, killModeStr, 24);
|
||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||
colDataSetVal(pColInfo, numOfRows, (const char *)killModeVstr, false);
|
||||
|
||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pTrans->failedTimes, false), pTrans, &lino,
|
||||
_OVER);
|
||||
|
@ -2047,7 +2132,6 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl
|
|||
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)&pTrans->lastExecTime, false), pTrans, &lino,
|
||||
_OVER);
|
||||
|
||||
char lastInfo[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||
char detail[TSDB_TRANS_ERROR_LEN + 1] = {0};
|
||||
int32_t len = tsnprintf(detail, sizeof(detail), "action:%d code:0x%x(%s) ", pTrans->lastAction,
|
||||
pTrans->lastErrorNo & 0xFFFF, tstrerror(pTrans->lastErrorNo));
|
||||
|
@ -2056,9 +2140,73 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl
|
|||
len += tsnprintf(detail + len, sizeof(detail) - len, "msgType:%s numOfEps:%d inUse:%d ",
|
||||
TMSG_INFO(pTrans->lastMsgType), epset.numOfEps, epset.inUse);
|
||||
for (int32_t i = 0; i < pTrans->lastEpset.numOfEps; ++i) {
|
||||
len += tsnprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port);
|
||||
len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u \n", i, epset.eps[i].fqdn, epset.eps[i].port);
|
||||
}
|
||||
}
|
||||
|
||||
int32_t index = 0;
|
||||
if(pTrans->stage == TRN_STAGE_PREPARE){
|
||||
for (int32_t i = 0; i < taosArrayGetSize(pTrans->prepareActions); ++i, ++index) {
|
||||
STransAction *pAction = taosArrayGet(pTrans->prepareActions, i);
|
||||
len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index,
|
||||
mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status));
|
||||
}
|
||||
}
|
||||
|
||||
if(pTrans->stage == TRN_STAGE_REDO_ACTION){
|
||||
for (int32_t i = 0; i < taosArrayGetSize(pTrans->redoActions); ++i, ++index) {
|
||||
STransAction *pAction = taosArrayGet(pTrans->redoActions, i);
|
||||
if(pAction->actionType == TRANS_ACTION_MSG){
|
||||
char bufStart[40] = {0};
|
||||
taosFormatUtcTime(bufStart, sizeof(bufStart), pAction->startTime, TSDB_TIME_PRECISION_MILLI);
|
||||
|
||||
char endStart[40] = {0};
|
||||
taosFormatUtcTime(endStart, sizeof(endStart), pAction->endTime, TSDB_TIME_PRECISION_MILLI);
|
||||
len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d msgType:%s,"
|
||||
"sent:%d, received:%d, startTime:%s, endTime:%s, ", index,
|
||||
mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType),
|
||||
pAction->msgSent, pAction->msgReceived, bufStart, endStart);
|
||||
|
||||
SEpSet epset = pAction->epSet;
|
||||
if (epset.numOfEps > 0) {
|
||||
len += snprintf(detail + len, sizeof(detail) - len, "numOfEps:%d inUse:%d ",
|
||||
epset.numOfEps, epset.inUse);
|
||||
for (int32_t i = 0; i < epset.numOfEps; ++i) {
|
||||
len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port);
|
||||
}
|
||||
}
|
||||
|
||||
len += snprintf(detail + len, sizeof(detail) - len, ", errCode:0x%x(%s)\n", pAction->errCode & 0xFFFF, tstrerror(pAction->errCode));
|
||||
}
|
||||
else{
|
||||
len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s, written:%d\n", index,
|
||||
mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status),
|
||||
pAction->rawWritten);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(pTrans->stage == TRN_STAGE_COMMIT_ACTION){
|
||||
for (int32_t i = 0; i < taosArrayGetSize(pTrans->commitActions); ++i, ++index) {
|
||||
STransAction *pAction = taosArrayGet(pTrans->commitActions, i);
|
||||
len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index,
|
||||
mndTransStr(pAction->stage), i, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status));
|
||||
}
|
||||
|
||||
for (int32_t i = 0; i < taosArrayGetSize(pTrans->undoActions); ++i, ++index) {
|
||||
STransAction *pAction = taosArrayGet(pTrans->undoActions, i);
|
||||
if(pAction->actionType == TRANS_ACTION_MSG){
|
||||
len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d msgType:%s\n", index,
|
||||
mndTransStr(pAction->stage), pAction->id, TMSG_INFO(pAction->msgType));;
|
||||
}
|
||||
else{
|
||||
len += snprintf(detail + len, sizeof(detail) - len, "action:%d, %s:%d sdbType:%s, sdbStatus:%s\n", index,
|
||||
mndTransStr(pAction->stage), pAction->id, sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
char lastInfo[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||
STR_WITH_MAXSIZE_TO_VARSTR(lastInfo, detail, pShow->pMeta->pSchemas[cols].bytes);
|
||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)lastInfo, false), pTrans, &lino, _OVER);
|
||||
|
@ -2073,6 +2221,28 @@ _OVER:
|
|||
return numOfRows;
|
||||
}
|
||||
|
||||
|
||||
static int32_t mndRetrieveTransDetail(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
|
||||
SMnode *pMnode = pReq->info.node;
|
||||
SSdb *pSdb = pMnode->pSdb;
|
||||
int32_t numOfRows = 0;
|
||||
STrans *pTrans = NULL;
|
||||
int32_t cols = 0;
|
||||
int32_t code = 0;
|
||||
int32_t lino = 0;
|
||||
|
||||
mInfo("start to mndRetrieveTransDetail");
|
||||
|
||||
while (numOfRows < rows) {
|
||||
pShow->pIter = sdbFetch(pSdb, SDB_TRANS, pShow->pIter, (void **)&pTrans);
|
||||
if (pShow->pIter == NULL) break;
|
||||
|
||||
|
||||
|
||||
}
|
||||
return numOfRows;
|
||||
}
|
||||
|
||||
static void mndCancelGetNextTrans(SMnode *pMnode, void *pIter) {
|
||||
SSdb *pSdb = pMnode->pSdb;
|
||||
sdbCancelFetchByType(pSdb, pIter, SDB_TRANS);
|
||||
|
|
|
@ -2752,12 +2752,15 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb
|
|||
|
||||
mndTransSetSerial(pTrans);
|
||||
|
||||
if (pNewVgroup->replica == 1 && pNewDb->cfg.replications == 3) {
|
||||
if (pNewDb->cfg.replications == 3) {
|
||||
mndTransSetKillMode(pTrans, TRN_KILL_MODE_INTERUPT);
|
||||
mInfo("db:%s, vgId:%d, will add 2 vnodes, vn:0 dnode:%d", pVgroup->dbName, pVgroup->vgId,
|
||||
pVgroup->vnodeGid[0].dnodeId);
|
||||
|
||||
// add second
|
||||
if (pNewVgroup->replica == 1){
|
||||
TAOS_CHECK_RETURN(mndAddVnodeToVgroup(pMnode, pTrans, pNewVgroup, pArray));
|
||||
}
|
||||
|
||||
// learner stage
|
||||
pNewVgroup->vnodeGid[0].nodeRole = TAOS_SYNC_ROLE_VOTER;
|
||||
|
@ -2776,7 +2779,9 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb
|
|||
TAOS_CHECK_RETURN(mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, pNewVgroup));
|
||||
|
||||
// add third
|
||||
TAOS_CHECK_RETURN(mndAddVnodeToVgroup(pMnode, pTrans, pNewVgroup, pArray));
|
||||
if (pNewVgroup->replica == 2){
|
||||
TAOS_CHECK_RETURN (mndAddVnodeToVgroup(pMnode, pTrans, pNewVgroup, pArray));
|
||||
}
|
||||
|
||||
pNewVgroup->vnodeGid[0].nodeRole = TAOS_SYNC_ROLE_VOTER;
|
||||
pNewVgroup->vnodeGid[1].nodeRole = TAOS_SYNC_ROLE_VOTER;
|
||||
|
@ -2788,7 +2793,8 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb
|
|||
TAOS_CHECK_RETURN(mndAddCreateVnodeAction(pMnode, pTrans, pNewDb, pNewVgroup, &pNewVgroup->vnodeGid[2]));
|
||||
|
||||
TAOS_CHECK_RETURN(mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, pNewVgroup));
|
||||
} else if (pNewVgroup->replica == 3 && pNewDb->cfg.replications == 1) {
|
||||
} else if (pNewDb->cfg.replications == 1) {
|
||||
mndTransSetKillMode(pTrans, TRN_KILL_MODE_INTERUPT);
|
||||
mInfo("db:%s, vgId:%d, will remove 2 vnodes, vn:0 dnode:%d vn:1 dnode:%d vn:2 dnode:%d", pVgroup->dbName,
|
||||
pVgroup->vgId, pVgroup->vnodeGid[0].dnodeId, pVgroup->vnodeGid[1].dnodeId, pVgroup->vnodeGid[2].dnodeId);
|
||||
|
||||
|
@ -2807,7 +2813,7 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb
|
|||
TAOS_CHECK_RETURN(
|
||||
mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, pNewVgroup, pNewVgroup->vnodeGid[0].dnodeId));
|
||||
TAOS_CHECK_RETURN(mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, pNewVgroup));
|
||||
} else if (pNewVgroup->replica == 1 && pNewDb->cfg.replications == 2) {
|
||||
} else if (pNewDb->cfg.replications == 2) {
|
||||
mInfo("db:%s, vgId:%d, will add 1 vnode, vn:0 dnode:%d", pVgroup->dbName, pVgroup->vgId,
|
||||
pVgroup->vnodeGid[0].dnodeId);
|
||||
|
||||
|
|
|
@ -2067,7 +2067,8 @@ static int32_t doSysTableScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes)
|
|||
if (pInfo->showRewrite) {
|
||||
getDBNameFromCondition(pInfo->pCondition, dbName);
|
||||
if (strncasecmp(name, TSDB_INS_TABLE_COMPACTS, TSDB_TABLE_FNAME_LEN) != 0 &&
|
||||
strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, TSDB_TABLE_FNAME_LEN) != 0) {
|
||||
strncasecmp(name, TSDB_INS_TABLE_COMPACT_DETAILS, TSDB_TABLE_FNAME_LEN) != 0 &&
|
||||
strncasecmp(name, TSDB_INS_TABLE_TRANSACTION_DETAILS, TSDB_TABLE_FNAME_LEN) != 0) {
|
||||
TAOS_UNUSED(tsnprintf(pInfo->req.db, sizeof(pInfo->req.db), "%d.%s", pInfo->accountId, dbName));
|
||||
}
|
||||
} else if (strncasecmp(name, TSDB_INS_TABLE_COLS, TSDB_TABLE_FNAME_LEN) == 0) {
|
||||
|
|
|
@ -290,6 +290,8 @@ const char* nodesNodeName(ENodeType type) {
|
|||
return "ShowCompactsStmt";
|
||||
case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT:
|
||||
return "ShowCompactDetailsStmt";
|
||||
case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT:
|
||||
return "ShowTransactionDetailsStmt";
|
||||
case QUERY_NODE_SHOW_GRANTS_FULL_STMT:
|
||||
return "ShowGrantsFullStmt";
|
||||
case QUERY_NODE_SHOW_GRANTS_LOGS_STMT:
|
||||
|
|
|
@ -604,6 +604,8 @@ int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut) {
|
|||
code = makeNode(type, sizeof(SShowCompactsStmt), &pNode); break;
|
||||
case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT:
|
||||
code = makeNode(type, sizeof(SShowCompactDetailsStmt), &pNode); break;
|
||||
case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT:
|
||||
code = makeNode(type, sizeof(SShowTransactionDetailsStmt), &pNode); break;
|
||||
case QUERY_NODE_KILL_QUERY_STMT:
|
||||
code = makeNode(type, sizeof(SKillQueryStmt), &pNode); break;
|
||||
case QUERY_NODE_KILL_TRANSACTION_STMT:
|
||||
|
@ -1338,6 +1340,11 @@ void nodesDestroyNode(SNode* pNode) {
|
|||
nodesDestroyNode(pStmt->pCompactId);
|
||||
break;
|
||||
}
|
||||
case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT: {
|
||||
SShowTransactionDetailsStmt* pStmt = (SShowTransactionDetailsStmt*)pNode;
|
||||
nodesDestroyNode(pStmt->pTransactionId);
|
||||
break;
|
||||
}
|
||||
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
|
||||
taosMemoryFreeClear(((SShowCreateDatabaseStmt*)pNode)->pCfg);
|
||||
break;
|
||||
|
|
|
@ -312,6 +312,7 @@ SNode* createCreateViewStmt(SAstCreateContext* pCxt, bool orReplace, SNode* pVie
|
|||
SNode* createDropViewStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pView);
|
||||
SNode* createShowCompactDetailsStmt(SAstCreateContext* pCxt, SNode* pCompactIdNode);
|
||||
SNode* createShowCompactsStmt(SAstCreateContext* pCxt, ENodeType type);
|
||||
SNode* createShowTransactionDetailsStmt(SAstCreateContext* pCxt, SNode* pTransactionIdNode);
|
||||
|
||||
SNode* createCreateTSMAStmt(SAstCreateContext* pCxt, bool ignoreExists, SToken* tsmaName, SNode* pOptions,
|
||||
SNode* pRealTable, SNode* pInterval);
|
||||
|
|
|
@ -562,6 +562,7 @@ cmd ::= SHOW BNODES.
|
|||
cmd ::= SHOW SNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SNODES_STMT); }
|
||||
cmd ::= SHOW CLUSTER. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CLUSTER_STMT); }
|
||||
cmd ::= SHOW TRANSACTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TRANSACTIONS_STMT); }
|
||||
cmd ::= SHOW TRANSACTION NK_INTEGER(A). { pCxt->pRootNode = createShowTransactionDetailsStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &A)); }
|
||||
cmd ::= SHOW TABLE DISTRIBUTED full_table_name(A). { pCxt->pRootNode = createShowTableDistributedStmt(pCxt, A); }
|
||||
cmd ::= SHOW CONSUMERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); }
|
||||
cmd ::= SHOW SUBSCRIPTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); }
|
||||
|
|
|
@ -2812,6 +2812,18 @@ _err:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
SNode* createShowTransactionDetailsStmt(SAstCreateContext* pCxt, SNode* pTransactionIdNode) {
|
||||
CHECK_PARSER_STATUS(pCxt);
|
||||
SShowTransactionDetailsStmt* pStmt = NULL;
|
||||
pCxt->errCode = nodesMakeNode(QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, (SNode**)&pStmt);
|
||||
CHECK_MAKE_NODE(pStmt);
|
||||
pStmt->pTransactionId = pTransactionIdNode;
|
||||
return (SNode*)pStmt;
|
||||
_err:
|
||||
nodesDestroyNode(pTransactionIdNode);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int32_t getIpV4RangeFromWhitelistItem(char* ipRange, SIpV4Range* pIpRange) {
|
||||
int32_t code = TSDB_CODE_SUCCESS;
|
||||
char* ipCopy = taosStrdup(ipRange);
|
||||
|
|
|
@ -754,6 +754,12 @@ static int32_t collectMetaKeyFromShowCompactDetails(SCollectMetaKeyCxt* pCxt, SS
|
|||
return code;
|
||||
}
|
||||
|
||||
static int32_t collectMetaKeyFromShowTransactionDetails(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
||||
int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB,
|
||||
TSDB_INS_TABLE_TRANSACTION_DETAILS, pCxt->pMetaCache);
|
||||
return code;
|
||||
}
|
||||
|
||||
static int32_t collectMetaKeyFromShowGrantsFull(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
||||
return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_GRANTS_FULL,
|
||||
pCxt->pMetaCache);
|
||||
|
@ -1055,6 +1061,8 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
|
|||
return collectMetaKeyFromShowCompacts(pCxt, (SShowStmt*)pStmt);
|
||||
case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT:
|
||||
return collectMetaKeyFromShowCompactDetails(pCxt, (SShowStmt*)pStmt);
|
||||
case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT:
|
||||
return collectMetaKeyFromShowTransactionDetails(pCxt, (SShowStmt*)pStmt);
|
||||
case QUERY_NODE_SHOW_GRANTS_FULL_STMT:
|
||||
return collectMetaKeyFromShowGrantsFull(pCxt, (SShowStmt*)pStmt);
|
||||
case QUERY_NODE_SHOW_GRANTS_LOGS_STMT:
|
||||
|
|
|
@ -319,6 +319,12 @@ static const SSysTableShowAdapter sysTableShowAdapter[] = {
|
|||
.numOfShowCols = 1,
|
||||
.pShowCols = {"*"}
|
||||
},
|
||||
{ .showType = QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT,
|
||||
.pDbName = TSDB_INFORMATION_SCHEMA_DB,
|
||||
.pTableName = TSDB_INS_TABLE_TRANSACTION_DETAILS,
|
||||
.numOfShowCols = 1,
|
||||
.pShowCols = {"*"}
|
||||
},
|
||||
{ .showType = QUERY_NODE_SHOW_GRANTS_FULL_STMT,
|
||||
.pDbName = TSDB_INFORMATION_SCHEMA_DB,
|
||||
.pTableName = TSDB_INS_TABLE_GRANTS_FULL,
|
||||
|
@ -15690,6 +15696,24 @@ static int32_t rewriteShowCompactDetailsStmt(STranslateContext* pCxt, SQuery* pQ
|
|||
return code;
|
||||
}
|
||||
|
||||
static int32_t rewriteShowTransactionDetailsStmt(STranslateContext* pCxt, SQuery* pQuery) {
|
||||
SShowTransactionDetailsStmt* pShow = (SShowTransactionDetailsStmt*)(pQuery->pRoot);
|
||||
SSelectStmt* pStmt = NULL;
|
||||
int32_t code = createSelectStmtForShow(QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT, &pStmt);
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
if (NULL != pShow->pTransactionId) {
|
||||
code = createOperatorNode(OP_TYPE_EQUAL, "transaction_id", pShow->pTransactionId, &pStmt->pWhere);
|
||||
}
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
pCxt->showRewrite = true;
|
||||
pQuery->showRewrite = true;
|
||||
nodesDestroyNode(pQuery->pRoot);
|
||||
pQuery->pRoot = (SNode*)pStmt;
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
static int32_t createParWhenThenNode(SNode* pWhen, SNode* pThen, SNode** ppResWhenThen) {
|
||||
SWhenThenNode* pWThen = NULL;
|
||||
int32_t code = nodesMakeNode(QUERY_NODE_WHEN_THEN, (SNode**)&pWThen);
|
||||
|
@ -16262,6 +16286,9 @@ static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) {
|
|||
case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT:
|
||||
code = rewriteShowCompactDetailsStmt(pCxt, pQuery);
|
||||
break;
|
||||
case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT:
|
||||
code = rewriteShowTransactionDetailsStmt(pCxt, pQuery);
|
||||
break;
|
||||
case QUERY_NODE_SHOW_DB_ALIVE_STMT:
|
||||
case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
|
||||
code = rewriteShowAliveStmt(pCxt, pQuery);
|
||||
|
|
|
@ -322,6 +322,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_SYNC_TIMEOUT, "Sync timeout While ex
|
|||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_CTX_SWITCH, "Wrong transaction execution context")
|
||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_CONFLICT_COMPACT, "Transaction not completed due to conflict with compact")
|
||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_UNKNOW_ERROR, "Unknown transaction error")
|
||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_NOT_ABLE_TO_kILLED, "The transaction is not able to be killed")
|
||||
|
||||
// mnode-mq
|
||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOPIC_ALREADY_EXIST, "Topic already exists")
|
||||
|
|
Loading…
Reference in New Issue