diff --git a/src/client/src/tscLocal.c b/src/client/src/tscLocal.c index d501927a344a..898ca253aac2 100644 --- a/src/client/src/tscLocal.c +++ b/src/client/src/tscLocal.c @@ -910,7 +910,7 @@ static int32_t tscProcessServStatus(SSqlObj *pSql) { pSql->res.code = pHb->res.code; } - if (pSql->res.code == TSDB_CODE_RPC_NETWORK_UNAVAIL) { + if (pSql->res.code == TSDB_CODE_RPC_NETWORK_UNAVAIL || pSql->res.code == TSDB_CODE_RPC_VGROUP_NOT_CONNECTED) { taosReleaseRef(tscObjRef, pObj->hbrid); return pSql->res.code; } @@ -920,7 +920,7 @@ static int32_t tscProcessServStatus(SSqlObj *pSql) { taosReleaseRef(tscObjRef, pObj->hbrid); } - if (pSql->res.code == TSDB_CODE_RPC_NETWORK_UNAVAIL) { + if (pSql->res.code == TSDB_CODE_RPC_NETWORK_UNAVAIL || pSql->res.code == TSDB_CODE_RPC_VGROUP_NOT_CONNECTED) { return pSql->res.code; } diff --git a/src/client/src/tscParseLineProtocol.c b/src/client/src/tscParseLineProtocol.c index 68610d8486c0..542dc5c65273 100644 --- a/src/client/src/tscParseLineProtocol.c +++ b/src/client/src/tscParseLineProtocol.c @@ -974,6 +974,7 @@ static void insertCallback(void *param, TAOS_RES *res, int32_t notUsedCode) { || code == TSDB_CODE_VND_INVALID_VGROUP_ID || code == TSDB_CODE_TDB_TABLE_RECONFIGURE || code == TSDB_CODE_APP_NOT_READY + || code == TSDB_CODE_RPC_VGROUP_NOT_CONNECTED || code == TSDB_CODE_RPC_NETWORK_UNAVAIL) && batch->tryTimes < TSDB_MAX_REPLICA) { batch->tryAgain = true; } @@ -985,7 +986,7 @@ static void insertCallback(void *param, TAOS_RES *res, int32_t notUsedCode) { } } - if (code == TSDB_CODE_APP_NOT_READY || code == TSDB_CODE_RPC_NETWORK_UNAVAIL) { + if (code == TSDB_CODE_APP_NOT_READY || code == TSDB_CODE_RPC_NETWORK_UNAVAIL || code == TSDB_CODE_RPC_VGROUP_NOT_CONNECTED) { if (batch->tryAgain) { batch->sleep = true; } diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index 203538fbf41e..db68f77a18b7 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -509,6 +509,7 @@ bool shouldRewTableMeta(SSqlObj* pSql, SRpcMsg* rpcMsg) { rpcMsg->code != TSDB_CODE_VND_INVALID_VGROUP_ID && rpcMsg->code != TSDB_CODE_QRY_INVALID_SCHEMA_VERSION && rpcMsg->code != TSDB_CODE_RPC_NETWORK_UNAVAIL && + rpcMsg->code != TSDB_CODE_RPC_VGROUP_NOT_CONNECTED && rpcMsg->code != TSDB_CODE_APP_NOT_READY ) { return false; } diff --git a/src/client/src/tscSubquery.c b/src/client/src/tscSubquery.c index 33883a1ab0cb..3392424b4593 100644 --- a/src/client/src/tscSubquery.c +++ b/src/client/src/tscSubquery.c @@ -3462,6 +3462,7 @@ static bool needRetryInsert(SSqlObj* pParentObj) { if (code != TSDB_CODE_TDB_TABLE_RECONFIGURE && code != TSDB_CODE_TDB_INVALID_TABLE_ID && code != TSDB_CODE_VND_INVALID_VGROUP_ID && code != TSDB_CODE_RPC_NETWORK_UNAVAIL && + code != TSDB_CODE_RPC_VGROUP_NOT_CONNECTED && code != TSDB_CODE_APP_NOT_READY) { pParentObj->res.code = code; ret = false; diff --git a/src/inc/taoserror.h b/src/inc/taoserror.h index 40f1c3096ea0..f8080ca6e5d1 100644 --- a/src/inc/taoserror.h +++ b/src/inc/taoserror.h @@ -61,6 +61,7 @@ int32_t* taosGetErrno(); #define TSDB_CODE_RPC_FQDN_ERROR TAOS_DEF_ERROR_CODE(0, 0x0015) //"Unable to resolve FQDN" #define TSDB_CODE_RPC_INVALID_VERSION TAOS_DEF_ERROR_CODE(0, 0x0016) //"Invalid app version" #define TSDB_CODE_RPC_SHORTCUT TAOS_DEF_ERROR_CODE(0, 0x0017) //"Shortcut" +#define TSDB_CODE_RPC_VGROUP_NOT_CONNECTED TAOS_DEF_ERROR_CODE(0, 0x0018) //"Vgroup could not be connected" //common & util #define TSDB_CODE_COM_OPS_NOT_SUPPORT TAOS_DEF_ERROR_CODE(0, 0x0100) //"Operation not supported" diff --git a/src/rpc/src/rpcMain.c b/src/rpc/src/rpcMain.c index 5c385410080f..6e81f5dcbb22 100644 --- a/src/rpc/src/rpcMain.c +++ b/src/rpc/src/rpcMain.c @@ -1515,6 +1515,12 @@ static void rpcProcessConnError(void *param, void *id) { rpcMsg.pCont = NULL; rpcMsg.contLen = 0; + if( pContext->numOfTry >= pContext->epSet.numOfEps && rpcMsg.code == TSDB_CODE_RPC_NETWORK_UNAVAIL) { + if(pContext->msgType == TSDB_MSG_TYPE_SUBMIT || pContext->msgType == TSDB_MSG_TYPE_QUERY) { + rpcMsg.code = TSDB_CODE_RPC_VGROUP_NOT_CONNECTED; + } + } + tWarn("%s %p, connection error. notify client query over. numOfTry=%d msgType=%d", pRpc->label, pContext->ahandle, pContext->numOfTry, pContext->msgType); rpcNotifyClient(pContext, &rpcMsg); } else { diff --git a/src/util/src/terror.c b/src/util/src/terror.c index b0420166a3c9..4852fe653f38 100644 --- a/src/util/src/terror.c +++ b/src/util/src/terror.c @@ -69,6 +69,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_APP_NOT_READY, "Database not ready") TAOS_DEFINE_ERROR(TSDB_CODE_RPC_FQDN_ERROR, "Unable to resolve FQDN") TAOS_DEFINE_ERROR(TSDB_CODE_RPC_INVALID_VERSION, "Invalid app version") TAOS_DEFINE_ERROR(TSDB_CODE_RPC_SHORTCUT, "Shortcut") +TAOS_DEFINE_ERROR(TSDB_CODE_RPC_VGROUP_NOT_CONNECTED, "Vgroup could not be connected") //common & util TAOS_DEFINE_ERROR(TSDB_CODE_COM_OPS_NOT_SUPPORT, "Operation not supported") diff --git a/src/vnode/src/vnodeRead.c b/src/vnode/src/vnodeRead.c index e8495cac6d7d..a492ca7beafb 100644 --- a/src/vnode/src/vnodeRead.c +++ b/src/vnode/src/vnodeRead.c @@ -145,7 +145,8 @@ int32_t vnodeWriteToRQueue(void *vparam, void *pCont, int32_t contLen, int8_t qt atomic_add_fetch_32(&pVnode->queuedRMsg, 1); - if (pRead->code == TSDB_CODE_RPC_NETWORK_UNAVAIL || pRead->msgType == TSDB_MSG_TYPE_FETCH) { + if (pRead->code == TSDB_CODE_RPC_NETWORK_UNAVAIL || pRead->code == TSDB_CODE_RPC_VGROUP_NOT_CONNECTED || + pRead->msgType == TSDB_MSG_TYPE_FETCH) { vTrace("vgId:%d, write into vfetch queue, refCount:%d queued:%d", pVnode->vgId, pVnode->refCount, pVnode->queuedRMsg); return taosWriteQitem(pVnode->fqueue, qtype, pRead); @@ -229,7 +230,7 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SVReadMsg *pRead) { memset(pRet, 0, sizeof(SRspRet)); // qHandle needs to be freed correctly - if (pRead->code == TSDB_CODE_RPC_NETWORK_UNAVAIL) { + if (pRead->code == TSDB_CODE_RPC_NETWORK_UNAVAIL || pRead->code == TSDB_CODE_RPC_VGROUP_NOT_CONNECTED) { vError("error rpc msg in query, %s", tstrerror(pRead->code)); }