enh: display the ertransaction error reason
This commit is contained in:
parent
a15f46d0f5
commit
5f74daa5e4
|
@ -253,8 +253,7 @@ typedef enum ELogicConditionType {
|
||||||
|
|
||||||
#define TSDB_TRANS_STAGE_LEN 12
|
#define TSDB_TRANS_STAGE_LEN 12
|
||||||
#define TSDB_TRANS_TYPE_LEN 16
|
#define TSDB_TRANS_TYPE_LEN 16
|
||||||
#define TSDB_TRANS_ERROR_LEN 64
|
#define TSDB_TRANS_ERROR_LEN 512
|
||||||
#define TSDB_TRANS_DESC_LEN 128
|
|
||||||
|
|
||||||
#define TSDB_STEP_NAME_LEN 32
|
#define TSDB_STEP_NAME_LEN 32
|
||||||
#define TSDB_STEP_DESC_LEN 128
|
#define TSDB_STEP_DESC_LEN 128
|
||||||
|
|
|
@ -215,7 +215,6 @@ static const SSysDbTableSchema transSchema[] = {
|
||||||
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
{.name = "stage", .bytes = TSDB_TRANS_STAGE_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "stage", .bytes = TSDB_TRANS_STAGE_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "db", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "db", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "type", .bytes = TSDB_TRANS_TYPE_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
|
||||||
{.name = "failed_times", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "failed_times", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "last_exec_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "last_exec_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
{.name = "last_error", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "last_error", .bytes = (TSDB_TRANS_ERROR_LEN - 1) + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
|
|
|
@ -119,9 +119,11 @@ typedef struct {
|
||||||
SArray* commitActions;
|
SArray* commitActions;
|
||||||
int64_t createdTime;
|
int64_t createdTime;
|
||||||
int64_t lastExecTime;
|
int64_t lastExecTime;
|
||||||
|
int32_t lastErrorAction;
|
||||||
|
int32_t lastErrorNo;
|
||||||
|
tmsg_t lastErrorMsgType;
|
||||||
|
SEpSet lastErrorEpset;
|
||||||
char dbname[TSDB_DB_FNAME_LEN];
|
char dbname[TSDB_DB_FNAME_LEN];
|
||||||
char lastError[TSDB_TRANS_ERROR_LEN];
|
|
||||||
char desc[TSDB_TRANS_DESC_LEN];
|
|
||||||
int32_t startFunc;
|
int32_t startFunc;
|
||||||
int32_t stopFunc;
|
int32_t stopFunc;
|
||||||
int32_t paramLen;
|
int32_t paramLen;
|
||||||
|
|
|
@ -813,9 +813,6 @@ void mndTransProcessRsp(SRpcMsg *pRsp) {
|
||||||
if (pAction != NULL) {
|
if (pAction != NULL) {
|
||||||
pAction->msgReceived = 1;
|
pAction->msgReceived = 1;
|
||||||
pAction->errCode = pRsp->code;
|
pAction->errCode = pRsp->code;
|
||||||
if (pAction->errCode != 0) {
|
|
||||||
tstrncpy(pTrans->lastError, tstrerror(pAction->errCode), TSDB_TRANS_ERROR_LEN);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mDebug("trans:%d, %s:%d response is received, code:0x%x, accept:0x%x", transId, mndTransStr(pAction->stage), action,
|
mDebug("trans:%d, %s:%d response is received, code:0x%x, accept:0x%x", transId, mndTransStr(pAction->stage), action,
|
||||||
|
@ -924,24 +921,36 @@ static int32_t mndTransExecuteActions(SMnode *pMnode, STrans *pTrans, SArray *pA
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfExecuted = 0;
|
int32_t numOfExecuted = 0;
|
||||||
int32_t errCode = 0;
|
int32_t errCode = 0;
|
||||||
|
STransAction *pErrAction = NULL;
|
||||||
for (int32_t action = 0; action < numOfActions; ++action) {
|
for (int32_t action = 0; action < numOfActions; ++action) {
|
||||||
STransAction *pAction = taosArrayGet(pArray, action);
|
STransAction *pAction = taosArrayGet(pArray, action);
|
||||||
if (pAction->msgReceived || pAction->rawWritten) {
|
if (pAction->msgReceived || pAction->rawWritten) {
|
||||||
numOfExecuted++;
|
numOfExecuted++;
|
||||||
if (pAction->errCode != 0 && pAction->errCode != pAction->acceptableCode) {
|
if (pAction->errCode != 0 && pAction->errCode != pAction->acceptableCode) {
|
||||||
errCode = pAction->errCode;
|
errCode = pAction->errCode;
|
||||||
|
pErrAction = pAction;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numOfExecuted == numOfActions) {
|
if (numOfExecuted == numOfActions) {
|
||||||
if (errCode == 0) {
|
if (errCode == 0) {
|
||||||
|
pTrans->lastErrorAction = 0;
|
||||||
|
pTrans->lastErrorNo = 0;
|
||||||
|
pTrans->lastErrorMsgType = 0;
|
||||||
|
memset(&pTrans->lastErrorEpset, 0, sizeof(pTrans->lastErrorEpset));
|
||||||
mDebug("trans:%d, all %d actions execute successfully", pTrans->id, numOfActions);
|
mDebug("trans:%d, all %d actions execute successfully", pTrans->id, numOfActions);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
mError("trans:%d, all %d actions executed, code:0x%x", pTrans->id, numOfActions, errCode & 0XFFFF);
|
mError("trans:%d, all %d actions executed, code:0x%x", pTrans->id, numOfActions, errCode & 0XFFFF);
|
||||||
|
if (pErrAction != NULL) {
|
||||||
|
pTrans->lastErrorMsgType = pErrAction->msgType;
|
||||||
|
pTrans->lastErrorAction = pErrAction->id;
|
||||||
|
pTrans->lastErrorNo = pErrAction->errCode;
|
||||||
|
pTrans->lastErrorEpset = pErrAction->epSet;
|
||||||
|
}
|
||||||
mndTransResetActions(pMnode, pTrans, pArray);
|
mndTransResetActions(pMnode, pTrans, pArray);
|
||||||
terrno = errCode;
|
terrno = errCode;
|
||||||
return errCode;
|
return errCode;
|
||||||
|
@ -976,7 +985,7 @@ static int32_t mndTransExecuteCommitActions(SMnode *pMnode, STrans *pTrans) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndTransExecuteRedoActionsNoParallel(SMnode *pMnode, STrans *pTrans) {
|
static int32_t mndTransExecuteRedoActionsSerial(SMnode *pMnode, STrans *pTrans) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int32_t numOfActions = taosArrayGetSize(pTrans->redoActions);
|
int32_t numOfActions = taosArrayGetSize(pTrans->redoActions);
|
||||||
if (numOfActions == 0) return code;
|
if (numOfActions == 0) return code;
|
||||||
|
@ -1003,6 +1012,18 @@ static int32_t mndTransExecuteRedoActionsNoParallel(SMnode *pMnode, STrans *pTra
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (code == 0) {
|
||||||
|
pTrans->lastErrorAction = 0;
|
||||||
|
pTrans->lastErrorNo = 0;
|
||||||
|
pTrans->lastErrorMsgType = 0;
|
||||||
|
memset(&pTrans->lastErrorEpset, 0, sizeof(pTrans->lastErrorEpset));
|
||||||
|
} else {
|
||||||
|
pTrans->lastErrorMsgType = pAction->msgType;
|
||||||
|
pTrans->lastErrorAction = action;
|
||||||
|
pTrans->lastErrorNo = pAction->errCode;
|
||||||
|
pTrans->lastErrorEpset = pAction->epSet;
|
||||||
|
}
|
||||||
|
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
pTrans->redoActionPos++;
|
pTrans->redoActionPos++;
|
||||||
mDebug("trans:%d, %s:%d is executed and need sync to other mnodes", pTrans->id, mndTransStr(pAction->stage),
|
mDebug("trans:%d, %s:%d is executed and need sync to other mnodes", pTrans->id, mndTransStr(pAction->stage),
|
||||||
|
@ -1037,7 +1058,7 @@ static bool mndTransPerformRedoActionStage(SMnode *pMnode, STrans *pTrans) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (pTrans->exec == TRN_EXEC_SERIAL) {
|
if (pTrans->exec == TRN_EXEC_SERIAL) {
|
||||||
code = mndTransExecuteRedoActionsNoParallel(pMnode, pTrans);
|
code = mndTransExecuteRedoActionsSerial(pMnode, pTrans);
|
||||||
} else {
|
} else {
|
||||||
code = mndTransExecuteRedoActions(pMnode, pTrans);
|
code = mndTransExecuteRedoActions(pMnode, pTrans);
|
||||||
}
|
}
|
||||||
|
@ -1347,11 +1368,6 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, numOfRows, (const char *)dbname, false);
|
colDataAppend(pColInfo, numOfRows, (const char *)dbname, false);
|
||||||
|
|
||||||
char type[TSDB_TRANS_TYPE_LEN + VARSTR_HEADER_SIZE] = {0};
|
|
||||||
STR_WITH_MAXSIZE_TO_VARSTR(type, "todo", pShow->pMeta->pSchemas[cols].bytes);
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
|
||||||
colDataAppend(pColInfo, numOfRows, (const char *)type, false);
|
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, numOfRows, (const char *)&pTrans->failedTimes, false);
|
colDataAppend(pColInfo, numOfRows, (const char *)&pTrans->failedTimes, false);
|
||||||
|
|
||||||
|
@ -1359,7 +1375,20 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl
|
||||||
colDataAppend(pColInfo, numOfRows, (const char *)&pTrans->lastExecTime, false);
|
colDataAppend(pColInfo, numOfRows, (const char *)&pTrans->lastExecTime, false);
|
||||||
|
|
||||||
char lastError[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0};
|
char lastError[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
STR_WITH_MAXSIZE_TO_VARSTR(lastError, pTrans->lastError, pShow->pMeta->pSchemas[cols].bytes);
|
char detail[TSDB_TRANS_ERROR_LEN] = {0};
|
||||||
|
if (pTrans->lastErrorNo != 0) {
|
||||||
|
int32_t len = snprintf(detail, sizeof(detail), "action:%d errno:0x%x(%s) ", pTrans->lastErrorAction,
|
||||||
|
pTrans->lastErrorNo & 0xFFFF, tstrerror(pTrans->lastErrorNo));
|
||||||
|
SEpSet epset = pTrans->lastErrorEpset;
|
||||||
|
if (epset.numOfEps > 0) {
|
||||||
|
len += snprintf(detail + len, sizeof(detail) - len, "msgType:%s numOfEps:%d inUse:%d ",
|
||||||
|
TMSG_INFO(pTrans->lastErrorMsgType), epset.numOfEps, epset.inUse);
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < pTrans->lastErrorEpset.numOfEps; ++i) {
|
||||||
|
len += snprintf(detail + len, sizeof(detail) - len, "ep:%d-%s:%u ", i, epset.eps[i].fqdn, epset.eps[i].port);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(lastError, detail, pShow->pMeta->pSchemas[cols].bytes);
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, numOfRows, (const char *)lastError, false);
|
colDataAppend(pColInfo, numOfRows, (const char *)lastError, false);
|
||||||
|
|
||||||
|
|
|
@ -76,14 +76,6 @@ if $data[0][3] != d1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
if $data[0][4] != todo then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
|
|
||||||
if $data[0][7] != @Unable to establish connection@ then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
|
|
||||||
sql_error create database d1 vgroups 2;
|
sql_error create database d1 vgroups 2;
|
||||||
|
|
||||||
print =============== start dnode2
|
print =============== start dnode2
|
||||||
|
@ -125,15 +117,7 @@ endi
|
||||||
if $data[0][3] != d2 then
|
if $data[0][3] != d2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
return
|
||||||
if $data[0][4] != todo then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
|
|
||||||
if $data[0][7] != @Unable to establish connection@ then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
|
|
||||||
sql_error create database d2 vgroups 2;
|
sql_error create database d2 vgroups 2;
|
||||||
|
|
||||||
print =============== kill transaction
|
print =============== kill transaction
|
||||||
|
|
Loading…
Reference in New Issue