Merge branch 'develop' into feature/TD-1413
This commit is contained in:
commit
e96516ff5a
|
@ -130,11 +130,11 @@ typedef struct STopBotInfo {
|
||||||
} STopBotInfo;
|
} STopBotInfo;
|
||||||
|
|
||||||
// leastsquares do not apply to super table
|
// leastsquares do not apply to super table
|
||||||
typedef struct SLeastsquareInfo {
|
typedef struct SLeastsquaresInfo {
|
||||||
double mat[2][3];
|
double mat[2][3];
|
||||||
double startVal;
|
double startVal;
|
||||||
int64_t num;
|
int64_t num;
|
||||||
} SLeastsquareInfo;
|
} SLeastsquaresInfo;
|
||||||
|
|
||||||
typedef struct SAPercentileInfo {
|
typedef struct SAPercentileInfo {
|
||||||
SHistogramInfo *pHisto;
|
SHistogramInfo *pHisto;
|
||||||
|
@ -316,7 +316,7 @@ int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionI
|
||||||
*interBytes = (int16_t)sizeof(SPercentileInfo);
|
*interBytes = (int16_t)sizeof(SPercentileInfo);
|
||||||
} else if (functionId == TSDB_FUNC_LEASTSQR) {
|
} else if (functionId == TSDB_FUNC_LEASTSQR) {
|
||||||
*type = TSDB_DATA_TYPE_BINARY;
|
*type = TSDB_DATA_TYPE_BINARY;
|
||||||
*bytes = TSDB_AVG_FUNCTION_INTER_BUFFER_SIZE; // string
|
*bytes = MAX(TSDB_AVG_FUNCTION_INTER_BUFFER_SIZE, sizeof(SLeastsquaresInfo)); // string
|
||||||
*interBytes = *bytes;
|
*interBytes = *bytes;
|
||||||
} else if (functionId == TSDB_FUNC_FIRST_DST || functionId == TSDB_FUNC_LAST_DST) {
|
} else if (functionId == TSDB_FUNC_FIRST_DST || functionId == TSDB_FUNC_LAST_DST) {
|
||||||
*type = TSDB_DATA_TYPE_BINARY;
|
*type = TSDB_DATA_TYPE_BINARY;
|
||||||
|
@ -681,7 +681,7 @@ static int32_t firstFuncRequired(SQLFunctionCtx *pCtx, TSKEY start, TSKEY end, i
|
||||||
}
|
}
|
||||||
|
|
||||||
// no result for first query, data block is required
|
// no result for first query, data block is required
|
||||||
if (GET_RES_INFO(pCtx)->numOfRes <= 0) {
|
if (GET_RES_INFO(pCtx) == NULL || GET_RES_INFO(pCtx)->numOfRes <= 0) {
|
||||||
return BLK_DATA_ALL_NEEDED;
|
return BLK_DATA_ALL_NEEDED;
|
||||||
} else {
|
} else {
|
||||||
return BLK_DATA_NO_NEEDED;
|
return BLK_DATA_NO_NEEDED;
|
||||||
|
@ -693,7 +693,7 @@ static int32_t lastFuncRequired(SQLFunctionCtx *pCtx, TSKEY start, TSKEY end, in
|
||||||
return BLK_DATA_NO_NEEDED;
|
return BLK_DATA_NO_NEEDED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GET_RES_INFO(pCtx)->numOfRes <= 0) {
|
if (GET_RES_INFO(pCtx) == NULL || GET_RES_INFO(pCtx)->numOfRes <= 0) {
|
||||||
return BLK_DATA_ALL_NEEDED;
|
return BLK_DATA_ALL_NEEDED;
|
||||||
} else {
|
} else {
|
||||||
return BLK_DATA_NO_NEEDED;
|
return BLK_DATA_NO_NEEDED;
|
||||||
|
@ -2756,7 +2756,7 @@ static bool leastsquares_function_setup(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
||||||
SLeastsquareInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
// 2*3 matrix
|
// 2*3 matrix
|
||||||
pInfo->startVal = pCtx->param[0].dKey;
|
pInfo->startVal = pCtx->param[0].dKey;
|
||||||
|
@ -2783,7 +2783,7 @@ static bool leastsquares_function_setup(SQLFunctionCtx *pCtx) {
|
||||||
|
|
||||||
static void leastsquares_function(SQLFunctionCtx *pCtx) {
|
static void leastsquares_function(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
||||||
SLeastsquareInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
double(*param)[3] = pInfo->mat;
|
double(*param)[3] = pInfo->mat;
|
||||||
double x = pInfo->startVal;
|
double x = pInfo->startVal;
|
||||||
|
@ -2853,40 +2853,40 @@ static void leastsquares_function_f(SQLFunctionCtx *pCtx, int32_t index) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
SLeastsquareInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
double(*param)[3] = pInfo->mat;
|
double(*param)[3] = pInfo->mat;
|
||||||
|
|
||||||
switch (pCtx->inputType) {
|
switch (pCtx->inputType) {
|
||||||
case TSDB_DATA_TYPE_INT: {
|
case TSDB_DATA_TYPE_INT: {
|
||||||
int32_t *p = pData;
|
int32_t *p = pData;
|
||||||
LEASTSQR_CAL(param, pInfo->startVal, p, index, pCtx->param[1].dKey);
|
LEASTSQR_CAL(param, pInfo->startVal, p, 0, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
int8_t *p = pData;
|
int8_t *p = pData;
|
||||||
LEASTSQR_CAL(param, pInfo->startVal, p, index, pCtx->param[1].dKey);
|
LEASTSQR_CAL(param, pInfo->startVal, p, 0, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
int16_t *p = pData;
|
int16_t *p = pData;
|
||||||
LEASTSQR_CAL(param, pInfo->startVal, p, index, pCtx->param[1].dKey);
|
LEASTSQR_CAL(param, pInfo->startVal, p, 0, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
int64_t *p = pData;
|
int64_t *p = pData;
|
||||||
LEASTSQR_CAL(param, pInfo->startVal, p, index, pCtx->param[1].dKey);
|
LEASTSQR_CAL(param, pInfo->startVal, p, 0, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
float *p = pData;
|
float *p = pData;
|
||||||
LEASTSQR_CAL(param, pInfo->startVal, p, index, pCtx->param[1].dKey);
|
LEASTSQR_CAL(param, pInfo->startVal, p, 0, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
double *p = pData;
|
double *p = pData;
|
||||||
LEASTSQR_CAL(param, pInfo->startVal, p, index, pCtx->param[1].dKey);
|
LEASTSQR_CAL(param, pInfo->startVal, p, 0, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -2904,15 +2904,10 @@ static void leastsquares_function_f(SQLFunctionCtx *pCtx, int32_t index) {
|
||||||
static void leastsquares_finalizer(SQLFunctionCtx *pCtx) {
|
static void leastsquares_finalizer(SQLFunctionCtx *pCtx) {
|
||||||
// no data in query
|
// no data in query
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
||||||
SLeastsquareInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
if (pInfo->num == 0) {
|
if (pInfo->num == 0) {
|
||||||
if (pCtx->outputType == TSDB_DATA_TYPE_BINARY || pCtx->outputType == TSDB_DATA_TYPE_NCHAR) {
|
setNull(pCtx->aOutputBuf, pCtx->outputType, pCtx->outputBytes);
|
||||||
setVardataNull(pCtx->aOutputBuf, pCtx->outputType);
|
|
||||||
} else {
|
|
||||||
setNull(pCtx->aOutputBuf, pCtx->outputType, pCtx->outputBytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1454,13 +1454,13 @@ static void addPrimaryTsColIntoResult(SQueryInfo* pQueryInfo) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SColumnIndex index = {0};
|
|
||||||
|
|
||||||
// set the constant column value always attached to first table.
|
// set the constant column value always attached to first table.
|
||||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
||||||
SSchema* pSchema = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, PRIMARYKEY_TIMESTAMP_COL_INDEX);
|
SSchema* pSchema = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, PRIMARYKEY_TIMESTAMP_COL_INDEX);
|
||||||
|
|
||||||
// add the timestamp column into the output columns
|
// add the timestamp column into the output columns
|
||||||
|
SColumnIndex index = {0}; // primary timestamp column info
|
||||||
int32_t numOfCols = (int32_t)tscSqlExprNumOfExprs(pQueryInfo);
|
int32_t numOfCols = (int32_t)tscSqlExprNumOfExprs(pQueryInfo);
|
||||||
tscAddSpecialColumnForSelect(pQueryInfo, numOfCols, TSDB_FUNC_PRJ, &index, pSchema, TSDB_COL_NORMAL);
|
tscAddSpecialColumnForSelect(pQueryInfo, numOfCols, TSDB_FUNC_PRJ, &index, pSchema, TSDB_COL_NORMAL);
|
||||||
|
|
||||||
|
@ -2432,6 +2432,8 @@ int32_t getTableIndexImpl(SStrToken* pTableToken, SQueryInfo* pQueryInfo, SColum
|
||||||
if (pTableToken->n == 0) { // only one table and no table name prefix in column name
|
if (pTableToken->n == 0) { // only one table and no table name prefix in column name
|
||||||
if (pQueryInfo->numOfTables == 1) {
|
if (pQueryInfo->numOfTables == 1) {
|
||||||
pIndex->tableIndex = 0;
|
pIndex->tableIndex = 0;
|
||||||
|
} else {
|
||||||
|
pIndex->tableIndex = COLUMN_INDEX_INITIAL_VAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -3950,9 +3952,6 @@ static void doExtractExprForSTable(SSqlCmd* pCmd, tSQLExpr** pExpr, SQueryInfo*
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SStrToken t = {0};
|
|
||||||
extractTableNameFromToken(&pLeft->colInfo, &t);
|
|
||||||
|
|
||||||
*pOut = *pExpr;
|
*pOut = *pExpr;
|
||||||
(*pExpr) = NULL;
|
(*pExpr) = NULL;
|
||||||
|
|
||||||
|
@ -4187,7 +4186,7 @@ static void cleanQueryExpr(SCondExpr* pCondExpr) {
|
||||||
static void doAddJoinTagsColumnsIntoTagList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondExpr* pCondExpr) {
|
static void doAddJoinTagsColumnsIntoTagList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondExpr* pCondExpr) {
|
||||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
||||||
if (QUERY_IS_JOIN_QUERY(pQueryInfo->type) && UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
if (QUERY_IS_JOIN_QUERY(pQueryInfo->type) && UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
||||||
SColumnIndex index = {0};
|
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||||
|
|
||||||
if (getColumnIndexByName(pCmd, &pCondExpr->pJoinExpr->pLeft->colInfo, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
if (getColumnIndexByName(pCmd, &pCondExpr->pJoinExpr->pLeft->colInfo, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
||||||
tscError("%p: invalid column name (left)", pQueryInfo);
|
tscError("%p: invalid column name (left)", pQueryInfo);
|
||||||
|
@ -4604,7 +4603,7 @@ int32_t parseOrderbyClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQu
|
||||||
}
|
}
|
||||||
|
|
||||||
SStrToken columnName = {pVar->nLen, pVar->nType, pVar->pz};
|
SStrToken columnName = {pVar->nLen, pVar->nType, pVar->pz};
|
||||||
SColumnIndex index = {0};
|
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||||
|
|
||||||
if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) { // super table query
|
if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) { // super table query
|
||||||
if (getColumnIndexByName(pCmd, &columnName, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
if (getColumnIndexByName(pCmd, &columnName, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -5509,7 +5508,9 @@ void doAddGroupColumnForSubquery(SQueryInfo* pQueryInfo, int32_t tagIndex) {
|
||||||
|
|
||||||
tscAddSpecialColumnForSelect(pQueryInfo, (int32_t)size, TSDB_FUNC_PRJ, &colIndex, pSchema, TSDB_COL_NORMAL);
|
tscAddSpecialColumnForSelect(pQueryInfo, (int32_t)size, TSDB_FUNC_PRJ, &colIndex, pSchema, TSDB_COL_NORMAL);
|
||||||
|
|
||||||
SInternalField* pInfo = tscFieldInfoGetInternalField(&pQueryInfo->fieldsInfo, (int32_t)size);
|
int32_t numOfFields = tscNumOfFields(pQueryInfo);
|
||||||
|
SInternalField* pInfo = tscFieldInfoGetInternalField(&pQueryInfo->fieldsInfo, numOfFields - 1);
|
||||||
|
|
||||||
doLimitOutputNormalColOfGroupby(pInfo->pSqlExpr);
|
doLimitOutputNormalColOfGroupby(pInfo->pSqlExpr);
|
||||||
pInfo->visible = false;
|
pInfo->visible = false;
|
||||||
}
|
}
|
||||||
|
@ -6620,7 +6621,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSQLExpr* pS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (pSqlExpr->nSQLOptr == TK_ID) { // column name, normal column arithmetic expression
|
} else if (pSqlExpr->nSQLOptr == TK_ID) { // column name, normal column arithmetic expression
|
||||||
SColumnIndex index = {0};
|
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||||
int32_t ret = getColumnIndexByName(pCmd, &pSqlExpr->colInfo, pQueryInfo, &index);
|
int32_t ret = getColumnIndexByName(pCmd, &pSqlExpr->colInfo, pQueryInfo, &index);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -89,7 +89,7 @@ public class TSDBDriver extends AbstractTaosDriver {
|
||||||
/**
|
/**
|
||||||
* fetch data from native function in a batch model
|
* fetch data from native function in a batch model
|
||||||
*/
|
*/
|
||||||
public static final String PROPERTY_KEY_BATCH_LOAD = "batch";
|
public static final String PROPERTY_KEY_BATCH_LOAD = "batchfetch";
|
||||||
|
|
||||||
private TSDBDatabaseMetaData dbMetaData = null;
|
private TSDBDatabaseMetaData dbMetaData = null;
|
||||||
|
|
||||||
|
|
|
@ -31,8 +31,6 @@ import java.util.List;
|
||||||
|
|
||||||
public class TSDBResultSetBlockData {
|
public class TSDBResultSetBlockData {
|
||||||
private int numOfRows = 0;
|
private int numOfRows = 0;
|
||||||
private int numOfCols = 0;
|
|
||||||
|
|
||||||
private int rowIndex = 0;
|
private int rowIndex = 0;
|
||||||
|
|
||||||
private List<ColumnMetaData> columnMetaDataList;
|
private List<ColumnMetaData> columnMetaDataList;
|
||||||
|
@ -40,22 +38,20 @@ public class TSDBResultSetBlockData {
|
||||||
|
|
||||||
public TSDBResultSetBlockData(List<ColumnMetaData> colMeta, int numOfCols) {
|
public TSDBResultSetBlockData(List<ColumnMetaData> colMeta, int numOfCols) {
|
||||||
this.columnMetaDataList = colMeta;
|
this.columnMetaDataList = colMeta;
|
||||||
this.setNumOfCols(numOfCols);
|
this.colData = new ArrayList<Object>(numOfCols);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TSDBResultSetBlockData() {
|
public TSDBResultSetBlockData() {
|
||||||
this.colData = new ArrayList<Object>();
|
this.colData = new ArrayList<Object>();
|
||||||
this.setNumOfCols(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clear() {
|
public void clear() {
|
||||||
|
int size = this.colData.size();
|
||||||
if (this.colData != null) {
|
if (this.colData != null) {
|
||||||
this.colData.clear();
|
this.colData.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.numOfCols == 0) {
|
setNumOfCols(size);
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getNumOfRows() {
|
public int getNumOfRows() {
|
||||||
|
@ -67,12 +63,12 @@ public class TSDBResultSetBlockData {
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getNumOfCols() {
|
public int getNumOfCols() {
|
||||||
return numOfCols;
|
return this.colData.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNumOfCols(int numOfCols) {
|
public void setNumOfCols(int numOfCols) {
|
||||||
this.numOfCols = numOfCols;
|
this.colData = new ArrayList<Object>(numOfCols);
|
||||||
this.clear();
|
this.colData.addAll(Collections.nCopies(numOfCols, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasMore() {
|
public boolean hasMore() {
|
||||||
|
|
|
@ -168,7 +168,8 @@ static void *dnodeProcessMReadQueue(void *param) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
dDebug("%p, msg:%s will be processed in mread queue", pRead->rpcMsg.ahandle, taosMsg[pRead->rpcMsg.msgType]);
|
dDebug("msg:%p, app:%p type:%s will be processed in mread queue", pRead->rpcMsg.ahandle, pRead,
|
||||||
|
taosMsg[pRead->rpcMsg.msgType]);
|
||||||
int32_t code = mnodeProcessRead(pRead);
|
int32_t code = mnodeProcessRead(pRead);
|
||||||
dnodeSendRpcMReadRsp(pRead, code);
|
dnodeSendRpcMReadRsp(pRead, code);
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,7 +127,7 @@ void dnodeDispatchToMWriteQueue(SRpcMsg *pMsg) {
|
||||||
dnodeSendRedirectMsg(pMsg, true);
|
dnodeSendRedirectMsg(pMsg, true);
|
||||||
} else {
|
} else {
|
||||||
SMnodeMsg *pWrite = mnodeCreateMsg(pMsg);
|
SMnodeMsg *pWrite = mnodeCreateMsg(pMsg);
|
||||||
dDebug("app:%p:%p, msg:%s is put into mwrite queue:%p", pWrite->rpcMsg.ahandle, pWrite,
|
dDebug("msg:%p, app:%p type:%s is put into mwrite queue:%p", pWrite, pWrite->rpcMsg.ahandle,
|
||||||
taosMsg[pWrite->rpcMsg.msgType], tsMWriteQueue);
|
taosMsg[pWrite->rpcMsg.msgType], tsMWriteQueue);
|
||||||
taosWriteQitem(tsMWriteQueue, TAOS_QTYPE_RPC, pWrite);
|
taosWriteQitem(tsMWriteQueue, TAOS_QTYPE_RPC, pWrite);
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,7 @@ void dnodeDispatchToMWriteQueue(SRpcMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dnodeFreeMWriteMsg(SMnodeMsg *pWrite) {
|
static void dnodeFreeMWriteMsg(SMnodeMsg *pWrite) {
|
||||||
dDebug("app:%p:%p, msg:%s is freed from mwrite queue:%p", pWrite->rpcMsg.ahandle, pWrite,
|
dDebug("msg:%p, app:%p type:%s is freed from mwrite queue:%p", pWrite, pWrite->rpcMsg.ahandle,
|
||||||
taosMsg[pWrite->rpcMsg.msgType], tsMWriteQueue);
|
taosMsg[pWrite->rpcMsg.msgType], tsMWriteQueue);
|
||||||
|
|
||||||
mnodeCleanupMsg(pWrite);
|
mnodeCleanupMsg(pWrite);
|
||||||
|
@ -174,7 +174,7 @@ static void *dnodeProcessMWriteQueue(void *param) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
dDebug("app:%p:%p, msg:%s will be processed in mwrite queue", pWrite->rpcMsg.ahandle, pWrite,
|
dDebug("msg:%p, app:%p type:%s will be processed in mwrite queue", pWrite, pWrite->rpcMsg.ahandle,
|
||||||
taosMsg[pWrite->rpcMsg.msgType]);
|
taosMsg[pWrite->rpcMsg.msgType]);
|
||||||
|
|
||||||
int32_t code = mnodeProcessWrite(pWrite);
|
int32_t code = mnodeProcessWrite(pWrite);
|
||||||
|
@ -188,13 +188,13 @@ void dnodeReprocessMWriteMsg(void *pMsg) {
|
||||||
SMnodeMsg *pWrite = pMsg;
|
SMnodeMsg *pWrite = pMsg;
|
||||||
|
|
||||||
if (!mnodeIsRunning() || tsMWriteQueue == NULL) {
|
if (!mnodeIsRunning() || tsMWriteQueue == NULL) {
|
||||||
dDebug("app:%p:%p, msg:%s is redirected for mnode not running, retry times:%d", pWrite->rpcMsg.ahandle, pWrite,
|
dDebug("msg:%p, app:%p type:%s is redirected for mnode not running, retry times:%d", pWrite, pWrite->rpcMsg.ahandle,
|
||||||
taosMsg[pWrite->rpcMsg.msgType], pWrite->retry);
|
taosMsg[pWrite->rpcMsg.msgType], pWrite->retry);
|
||||||
|
|
||||||
dnodeSendRedirectMsg(pMsg, true);
|
dnodeSendRedirectMsg(pMsg, true);
|
||||||
dnodeFreeMWriteMsg(pWrite);
|
dnodeFreeMWriteMsg(pWrite);
|
||||||
} else {
|
} else {
|
||||||
dDebug("app:%p:%p, msg:%s is reput into mwrite queue:%p, retry times:%d", pWrite->rpcMsg.ahandle, pWrite,
|
dDebug("msg:%p, app:%p type:%s is reput into mwrite queue:%p, retry times:%d", pWrite, pWrite->rpcMsg.ahandle,
|
||||||
taosMsg[pWrite->rpcMsg.msgType], tsMWriteQueue, pWrite->retry);
|
taosMsg[pWrite->rpcMsg.msgType], tsMWriteQueue, pWrite->retry);
|
||||||
|
|
||||||
taosWriteQitem(tsMWriteQueue, TAOS_QTYPE_RPC, pWrite);
|
taosWriteQitem(tsMWriteQueue, TAOS_QTYPE_RPC, pWrite);
|
||||||
|
|
|
@ -216,7 +216,7 @@ static void *dnodeProcessMgmtQueue(void *param) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pMsg = &pMgmt->rpcMsg;
|
pMsg = &pMgmt->rpcMsg;
|
||||||
dDebug("%p, msg:%p:%s will be processed", pMsg->ahandle, pMgmt, taosMsg[pMsg->msgType]);
|
dDebug("msg:%p, ahandle:%p type:%s will be processed", pMgmt, pMsg->ahandle, taosMsg[pMsg->msgType]);
|
||||||
if (dnodeProcessMgmtMsgFp[pMsg->msgType]) {
|
if (dnodeProcessMgmtMsgFp[pMsg->msgType]) {
|
||||||
rsp.code = (*dnodeProcessMgmtMsgFp[pMsg->msgType])(pMsg);
|
rsp.code = (*dnodeProcessMgmtMsgFp[pMsg->msgType])(pMsg);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -175,7 +175,7 @@ static void *dnodeProcessReadQueue(void *pWorker) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
dDebug("%p, msg:%p:%s will be processed in vread queue, qtype:%d", pRead->rpcAhandle, pRead,
|
dDebug("msg:%p, app:%p type:%s will be processed in vread queue, qtype:%d", pRead, pRead->rpcAhandle,
|
||||||
taosMsg[pRead->msgType], qtype);
|
taosMsg[pRead->msgType], qtype);
|
||||||
|
|
||||||
int32_t code = vnodeProcessRead(pVnode, pRead);
|
int32_t code = vnodeProcessRead(pVnode, pRead);
|
||||||
|
|
|
@ -205,8 +205,8 @@ static void *dnodeProcessVWriteQueue(void *wparam) {
|
||||||
bool forceFsync = false;
|
bool forceFsync = false;
|
||||||
for (int32_t i = 0; i < numOfMsgs; ++i) {
|
for (int32_t i = 0; i < numOfMsgs; ++i) {
|
||||||
taosGetQitem(pWorker->qall, &qtype, (void **)&pWrite);
|
taosGetQitem(pWorker->qall, &qtype, (void **)&pWrite);
|
||||||
dTrace("%p, msg:%p:%s will be processed in vwrite queue, qtype:%s hver:%" PRIu64, pWrite->rpcAhandle, pWrite,
|
dTrace("msg:%p, app:%p type:%s will be processed in vwrite queue, qtype:%s hver:%" PRIu64, pWrite,
|
||||||
taosMsg[pWrite->pHead->msgType], qtypeStr[qtype], pWrite->pHead->version);
|
pWrite->rpcAhandle, taosMsg[pWrite->pHead->msgType], qtypeStr[qtype], pWrite->pHead->version);
|
||||||
|
|
||||||
pWrite->code = vnodeProcessWrite(pVnode, pWrite->pHead, qtype, &pWrite->rspRet);
|
pWrite->code = vnodeProcessWrite(pVnode, pWrite->pHead, qtype, &pWrite->rspRet);
|
||||||
if (pWrite->code <= 0) pWrite->processedCount = 1;
|
if (pWrite->code <= 0) pWrite->processedCount = 1;
|
||||||
|
|
|
@ -24,18 +24,18 @@ extern "C" {
|
||||||
#define TAOS_SYNC_MAX_INDEX 0x7FFFFFFF
|
#define TAOS_SYNC_MAX_INDEX 0x7FFFFFFF
|
||||||
|
|
||||||
typedef enum _TAOS_SYNC_ROLE {
|
typedef enum _TAOS_SYNC_ROLE {
|
||||||
TAOS_SYNC_ROLE_OFFLINE,
|
TAOS_SYNC_ROLE_OFFLINE = 0,
|
||||||
TAOS_SYNC_ROLE_UNSYNCED,
|
TAOS_SYNC_ROLE_UNSYNCED = 1,
|
||||||
TAOS_SYNC_ROLE_SYNCING,
|
TAOS_SYNC_ROLE_SYNCING = 2,
|
||||||
TAOS_SYNC_ROLE_SLAVE,
|
TAOS_SYNC_ROLE_SLAVE = 3,
|
||||||
TAOS_SYNC_ROLE_MASTER,
|
TAOS_SYNC_ROLE_MASTER = 4
|
||||||
} ESyncRole;
|
} ESyncRole;
|
||||||
|
|
||||||
typedef enum _TAOS_SYNC_STATUS {
|
typedef enum _TAOS_SYNC_STATUS {
|
||||||
TAOS_SYNC_STATUS_INIT,
|
TAOS_SYNC_STATUS_INIT = 0,
|
||||||
TAOS_SYNC_STATUS_START,
|
TAOS_SYNC_STATUS_START = 1,
|
||||||
TAOS_SYNC_STATUS_FILE,
|
TAOS_SYNC_STATUS_FILE = 2,
|
||||||
TAOS_SYNC_STATUS_CACHE,
|
TAOS_SYNC_STATUS_CACHE = 3
|
||||||
} ESyncStatus;
|
} ESyncStatus;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -20,7 +20,8 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct SMnodeMsg;
|
#include "mnode.h"
|
||||||
|
#include "twal.h"
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SDB_TABLE_CLUSTER = 0,
|
SDB_TABLE_CLUSTER = 0,
|
||||||
|
@ -36,44 +37,46 @@ typedef enum {
|
||||||
} ESdbTable;
|
} ESdbTable;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SDB_KEY_STRING,
|
SDB_KEY_STRING = 0,
|
||||||
SDB_KEY_INT,
|
SDB_KEY_INT = 1,
|
||||||
SDB_KEY_AUTO,
|
SDB_KEY_AUTO = 2,
|
||||||
SDB_KEY_VAR_STRING,
|
SDB_KEY_VAR_STRING = 3,
|
||||||
} ESdbKey;
|
} ESdbKey;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SDB_OPER_GLOBAL,
|
SDB_OPER_GLOBAL = 0,
|
||||||
SDB_OPER_LOCAL
|
SDB_OPER_LOCAL = 1
|
||||||
} ESdbOper;
|
} ESdbOper;
|
||||||
|
|
||||||
typedef struct SSdbOper {
|
typedef struct SSdbRow {
|
||||||
ESdbOper type;
|
ESdbOper type;
|
||||||
int32_t rowSize;
|
int32_t processedCount; // for sync fwd callback
|
||||||
int32_t retCode; // for callback in sdb queue
|
int32_t code; // for callback in sdb queue
|
||||||
int32_t processedCount; // for sync fwd callback
|
int32_t rowSize;
|
||||||
int32_t (*reqFp)(struct SMnodeMsg *pMsg);
|
void * rowData;
|
||||||
int32_t (*writeCb)(struct SMnodeMsg *pMsg, int32_t code);
|
void * pObj;
|
||||||
void * table;
|
void * pTable;
|
||||||
void * pObj;
|
SMnodeMsg *pMsg;
|
||||||
void * rowData;
|
int32_t (*fpReq)(SMnodeMsg *pMsg);
|
||||||
struct SMnodeMsg *pMsg;
|
int32_t (*fpRsp)(SMnodeMsg *pMsg, int32_t code);
|
||||||
} SSdbOper;
|
char reserveForSync[16];
|
||||||
|
SWalHead pHead[];
|
||||||
|
} SSdbRow;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *tableName;
|
char * name;
|
||||||
int32_t hashSessions;
|
int32_t hashSessions;
|
||||||
int32_t maxRowSize;
|
int32_t maxRowSize;
|
||||||
int32_t refCountPos;
|
int32_t refCountPos;
|
||||||
ESdbTable tableId;
|
ESdbTable id;
|
||||||
ESdbKey keyType;
|
ESdbKey keyType;
|
||||||
int32_t (*insertFp)(SSdbOper *pOper);
|
int32_t (*fpInsert)(SSdbRow *pRow);
|
||||||
int32_t (*deleteFp)(SSdbOper *pOper);
|
int32_t (*fpDelete)(SSdbRow *pRow);
|
||||||
int32_t (*updateFp)(SSdbOper *pOper);
|
int32_t (*fpUpdate)(SSdbRow *pRow);
|
||||||
int32_t (*encodeFp)(SSdbOper *pOper);
|
int32_t (*fpEncode)(SSdbRow *pRow);
|
||||||
int32_t (*decodeFp)(SSdbOper *pDesc);
|
int32_t (*fpDecode)(SSdbRow *pRow);
|
||||||
int32_t (*destroyFp)(SSdbOper *pDesc);
|
int32_t (*fpDestroy)(SSdbRow *pRow);
|
||||||
int32_t (*restoredFp)();
|
int32_t (*fpRestored)();
|
||||||
} SSdbTableDesc;
|
} SSdbTableDesc;
|
||||||
|
|
||||||
int32_t sdbInit();
|
int32_t sdbInit();
|
||||||
|
@ -84,20 +87,20 @@ bool sdbIsMaster();
|
||||||
bool sdbIsServing();
|
bool sdbIsServing();
|
||||||
void sdbUpdateMnodeRoles();
|
void sdbUpdateMnodeRoles();
|
||||||
|
|
||||||
int32_t sdbInsertRow(SSdbOper *pOper);
|
int32_t sdbInsertRow(SSdbRow *pRow);
|
||||||
int32_t sdbDeleteRow(SSdbOper *pOper);
|
int32_t sdbDeleteRow(SSdbRow *pRow);
|
||||||
int32_t sdbUpdateRow(SSdbOper *pOper);
|
int32_t sdbUpdateRow(SSdbRow *pRow);
|
||||||
int32_t sdbInsertRowImp(SSdbOper *pOper);
|
int32_t sdbInsertRowToQueue(SSdbRow *pRow);
|
||||||
|
|
||||||
void *sdbGetRow(void *handle, void *key);
|
void *sdbGetRow(void *pTable, void *key);
|
||||||
void *sdbFetchRow(void *handle, void *pIter, void **ppRow);
|
void *sdbFetchRow(void *pTable, void *pIter, void **ppRow);
|
||||||
void sdbFreeIter(void *pIter);
|
void sdbFreeIter(void *pIter);
|
||||||
void sdbIncRef(void *thandle, void *pRow);
|
void sdbIncRef(void *pTable, void *pRow);
|
||||||
void sdbDecRef(void *thandle, void *pRow);
|
void sdbDecRef(void *pTable, void *pRow);
|
||||||
int64_t sdbGetNumOfRows(void *handle);
|
int64_t sdbGetNumOfRows(void *pTable);
|
||||||
int32_t sdbGetId(void *handle);
|
int32_t sdbGetId(void *pTable);
|
||||||
uint64_t sdbGetVersion();
|
uint64_t sdbGetVersion();
|
||||||
bool sdbCheckRowDeleted(void *thandle, void *pRow);
|
bool sdbCheckRowDeleted(void *pTable, void *pRow);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "taoserror.h"
|
#include "taoserror.h"
|
||||||
|
#include "tglobal.h"
|
||||||
#include "dnode.h"
|
#include "dnode.h"
|
||||||
#include "mnodeDef.h"
|
#include "mnodeDef.h"
|
||||||
#include "mnodeInt.h"
|
#include "mnodeInt.h"
|
||||||
|
@ -25,36 +26,34 @@
|
||||||
#include "mnodeUser.h"
|
#include "mnodeUser.h"
|
||||||
#include "mnodeVgroup.h"
|
#include "mnodeVgroup.h"
|
||||||
|
|
||||||
#include "tglobal.h"
|
|
||||||
|
|
||||||
void * tsAcctSdb = NULL;
|
void * tsAcctSdb = NULL;
|
||||||
static int32_t tsAcctUpdateSize;
|
static int32_t tsAcctUpdateSize;
|
||||||
static int32_t mnodeCreateRootAcct();
|
static int32_t mnodeCreateRootAcct();
|
||||||
|
|
||||||
static int32_t mnodeAcctActionDestroy(SSdbOper *pOper) {
|
static int32_t mnodeAcctActionDestroy(SSdbRow *pRow) {
|
||||||
SAcctObj *pAcct = pOper->pObj;
|
SAcctObj *pAcct = pRow->pObj;
|
||||||
pthread_mutex_destroy(&pAcct->mutex);
|
pthread_mutex_destroy(&pAcct->mutex);
|
||||||
tfree(pOper->pObj);
|
tfree(pRow->pObj);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeAcctActionInsert(SSdbOper *pOper) {
|
static int32_t mnodeAcctActionInsert(SSdbRow *pRow) {
|
||||||
SAcctObj *pAcct = pOper->pObj;
|
SAcctObj *pAcct = pRow->pObj;
|
||||||
memset(&pAcct->acctInfo, 0, sizeof(SAcctInfo));
|
memset(&pAcct->acctInfo, 0, sizeof(SAcctInfo));
|
||||||
pAcct->acctInfo.accessState = TSDB_VN_ALL_ACCCESS;
|
pAcct->acctInfo.accessState = TSDB_VN_ALL_ACCCESS;
|
||||||
pthread_mutex_init(&pAcct->mutex, NULL);
|
pthread_mutex_init(&pAcct->mutex, NULL);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeAcctActionDelete(SSdbOper *pOper) {
|
static int32_t mnodeAcctActionDelete(SSdbRow *pRow) {
|
||||||
SAcctObj *pAcct = pOper->pObj;
|
SAcctObj *pAcct = pRow->pObj;
|
||||||
mnodeDropAllUsers(pAcct);
|
mnodeDropAllUsers(pAcct);
|
||||||
mnodeDropAllDbs(pAcct);
|
mnodeDropAllDbs(pAcct);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeAcctActionUpdate(SSdbOper *pOper) {
|
static int32_t mnodeAcctActionUpdate(SSdbRow *pRow) {
|
||||||
SAcctObj *pAcct = pOper->pObj;
|
SAcctObj *pAcct = pRow->pObj;
|
||||||
SAcctObj *pSaved = mnodeGetAcct(pAcct->user);
|
SAcctObj *pSaved = mnodeGetAcct(pAcct->user);
|
||||||
if (pAcct != pSaved) {
|
if (pAcct != pSaved) {
|
||||||
memcpy(pSaved, pAcct, tsAcctUpdateSize);
|
memcpy(pSaved, pAcct, tsAcctUpdateSize);
|
||||||
|
@ -64,19 +63,19 @@ static int32_t mnodeAcctActionUpdate(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeAcctActionEncode(SSdbOper *pOper) {
|
static int32_t mnodeAcctActionEncode(SSdbRow *pRow) {
|
||||||
SAcctObj *pAcct = pOper->pObj;
|
SAcctObj *pAcct = pRow->pObj;
|
||||||
memcpy(pOper->rowData, pAcct, tsAcctUpdateSize);
|
memcpy(pRow->rowData, pAcct, tsAcctUpdateSize);
|
||||||
pOper->rowSize = tsAcctUpdateSize;
|
pRow->rowSize = tsAcctUpdateSize;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeAcctActionDecode(SSdbOper *pOper) {
|
static int32_t mnodeAcctActionDecode(SSdbRow *pRow) {
|
||||||
SAcctObj *pAcct = (SAcctObj *) calloc(1, sizeof(SAcctObj));
|
SAcctObj *pAcct = (SAcctObj *) calloc(1, sizeof(SAcctObj));
|
||||||
if (pAcct == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
if (pAcct == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
||||||
|
|
||||||
memcpy(pAcct, pOper->rowData, tsAcctUpdateSize);
|
memcpy(pAcct, pRow->rowData, tsAcctUpdateSize);
|
||||||
pOper->pObj = pAcct;
|
pRow->pObj = pAcct;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,29 +98,29 @@ int32_t mnodeInitAccts() {
|
||||||
SAcctObj tObj;
|
SAcctObj tObj;
|
||||||
tsAcctUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
tsAcctUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
||||||
|
|
||||||
SSdbTableDesc tableDesc = {
|
SSdbTableDesc desc = {
|
||||||
.tableId = SDB_TABLE_ACCOUNT,
|
.id = SDB_TABLE_ACCOUNT,
|
||||||
.tableName = "accounts",
|
.name = "accounts",
|
||||||
.hashSessions = TSDB_DEFAULT_ACCOUNTS_HASH_SIZE,
|
.hashSessions = TSDB_DEFAULT_ACCOUNTS_HASH_SIZE,
|
||||||
.maxRowSize = tsAcctUpdateSize,
|
.maxRowSize = tsAcctUpdateSize,
|
||||||
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
||||||
.keyType = SDB_KEY_STRING,
|
.keyType = SDB_KEY_STRING,
|
||||||
.insertFp = mnodeAcctActionInsert,
|
.fpInsert = mnodeAcctActionInsert,
|
||||||
.deleteFp = mnodeAcctActionDelete,
|
.fpDelete = mnodeAcctActionDelete,
|
||||||
.updateFp = mnodeAcctActionUpdate,
|
.fpUpdate = mnodeAcctActionUpdate,
|
||||||
.encodeFp = mnodeAcctActionEncode,
|
.fpEncode = mnodeAcctActionEncode,
|
||||||
.decodeFp = mnodeAcctActionDecode,
|
.fpDecode = mnodeAcctActionDecode,
|
||||||
.destroyFp = mnodeAcctActionDestroy,
|
.fpDestroy = mnodeAcctActionDestroy,
|
||||||
.restoredFp = mnodeAcctActionRestored
|
.fpRestored = mnodeAcctActionRestored
|
||||||
};
|
};
|
||||||
|
|
||||||
tsAcctSdb = sdbOpenTable(&tableDesc);
|
tsAcctSdb = sdbOpenTable(&desc);
|
||||||
if (tsAcctSdb == NULL) {
|
if (tsAcctSdb == NULL) {
|
||||||
mError("table:%s, failed to create hash", tableDesc.tableName);
|
mError("table:%s, failed to create hash", desc.name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
mDebug("table:%s, hash is created", tableDesc.tableName);
|
mDebug("table:%s, hash is created", desc.name);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,13 +225,13 @@ static int32_t mnodeCreateRootAcct() {
|
||||||
pAcct->acctId = sdbGetId(tsAcctSdb);
|
pAcct->acctId = sdbGetId(tsAcctSdb);
|
||||||
pAcct->createdTime = taosGetTimestampMs();
|
pAcct->createdTime = taosGetTimestampMs();
|
||||||
|
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsAcctSdb,
|
.pTable = tsAcctSdb,
|
||||||
.pObj = pAcct,
|
.pObj = pAcct,
|
||||||
};
|
};
|
||||||
|
|
||||||
return sdbInsertRow(&oper);
|
return sdbInsertRow(&row);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _ACCT
|
#ifndef _ACCT
|
||||||
|
|
|
@ -32,36 +32,36 @@ static int32_t mnodeCreateCluster();
|
||||||
static int32_t mnodeGetClusterMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn);
|
static int32_t mnodeGetClusterMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn);
|
||||||
static int32_t mnodeRetrieveClusters(SShowObj *pShow, char *data, int32_t rows, void *pConn);
|
static int32_t mnodeRetrieveClusters(SShowObj *pShow, char *data, int32_t rows, void *pConn);
|
||||||
|
|
||||||
static int32_t mnodeClusterActionDestroy(SSdbOper *pOper) {
|
static int32_t mnodeClusterActionDestroy(SSdbRow *pRow) {
|
||||||
tfree(pOper->pObj);
|
tfree(pRow->pObj);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeClusterActionInsert(SSdbOper *pOper) {
|
static int32_t mnodeClusterActionInsert(SSdbRow *pRow) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeClusterActionDelete(SSdbOper *pOper) {
|
static int32_t mnodeClusterActionDelete(SSdbRow *pRow) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeClusterActionUpdate(SSdbOper *pOper) {
|
static int32_t mnodeClusterActionUpdate(SSdbRow *pRow) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeClusterActionEncode(SSdbOper *pOper) {
|
static int32_t mnodeClusterActionEncode(SSdbRow *pRow) {
|
||||||
SClusterObj *pCluster = pOper->pObj;
|
SClusterObj *pCluster = pRow->pObj;
|
||||||
memcpy(pOper->rowData, pCluster, tsClusterUpdateSize);
|
memcpy(pRow->rowData, pCluster, tsClusterUpdateSize);
|
||||||
pOper->rowSize = tsClusterUpdateSize;
|
pRow->rowSize = tsClusterUpdateSize;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeClusterActionDecode(SSdbOper *pOper) {
|
static int32_t mnodeClusterActionDecode(SSdbRow *pRow) {
|
||||||
SClusterObj *pCluster = (SClusterObj *) calloc(1, sizeof(SClusterObj));
|
SClusterObj *pCluster = (SClusterObj *) calloc(1, sizeof(SClusterObj));
|
||||||
if (pCluster == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
if (pCluster == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
||||||
|
|
||||||
memcpy(pCluster, pOper->rowData, tsClusterUpdateSize);
|
memcpy(pCluster, pRow->rowData, tsClusterUpdateSize);
|
||||||
pOper->pObj = pCluster;
|
pRow->pObj = pCluster;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,32 +84,32 @@ int32_t mnodeInitCluster() {
|
||||||
SClusterObj tObj;
|
SClusterObj tObj;
|
||||||
tsClusterUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
tsClusterUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
||||||
|
|
||||||
SSdbTableDesc tableDesc = {
|
SSdbTableDesc desc = {
|
||||||
.tableId = SDB_TABLE_CLUSTER,
|
.id = SDB_TABLE_CLUSTER,
|
||||||
.tableName = "cluster",
|
.name = "cluster",
|
||||||
.hashSessions = TSDB_DEFAULT_CLUSTER_HASH_SIZE,
|
.hashSessions = TSDB_DEFAULT_CLUSTER_HASH_SIZE,
|
||||||
.maxRowSize = tsClusterUpdateSize,
|
.maxRowSize = tsClusterUpdateSize,
|
||||||
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
||||||
.keyType = SDB_KEY_STRING,
|
.keyType = SDB_KEY_STRING,
|
||||||
.insertFp = mnodeClusterActionInsert,
|
.fpInsert = mnodeClusterActionInsert,
|
||||||
.deleteFp = mnodeClusterActionDelete,
|
.fpDelete = mnodeClusterActionDelete,
|
||||||
.updateFp = mnodeClusterActionUpdate,
|
.fpUpdate = mnodeClusterActionUpdate,
|
||||||
.encodeFp = mnodeClusterActionEncode,
|
.fpEncode = mnodeClusterActionEncode,
|
||||||
.decodeFp = mnodeClusterActionDecode,
|
.fpDecode = mnodeClusterActionDecode,
|
||||||
.destroyFp = mnodeClusterActionDestroy,
|
.fpDestroy = mnodeClusterActionDestroy,
|
||||||
.restoredFp = mnodeClusterActionRestored
|
.fpRestored = mnodeClusterActionRestored
|
||||||
};
|
};
|
||||||
|
|
||||||
tsClusterSdb = sdbOpenTable(&tableDesc);
|
tsClusterSdb = sdbOpenTable(&desc);
|
||||||
if (tsClusterSdb == NULL) {
|
if (tsClusterSdb == NULL) {
|
||||||
mError("table:%s, failed to create hash", tableDesc.tableName);
|
mError("table:%s, failed to create hash", desc.name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
mnodeAddShowMetaHandle(TSDB_MGMT_TABLE_CLUSTER, mnodeGetClusterMeta);
|
mnodeAddShowMetaHandle(TSDB_MGMT_TABLE_CLUSTER, mnodeGetClusterMeta);
|
||||||
mnodeAddShowRetrieveHandle(TSDB_MGMT_TABLE_CLUSTER, mnodeRetrieveClusters);
|
mnodeAddShowRetrieveHandle(TSDB_MGMT_TABLE_CLUSTER, mnodeRetrieveClusters);
|
||||||
|
|
||||||
mDebug("table:%s, hash is created", tableDesc.tableName);
|
mDebug("table:%s, hash is created", desc.name);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,13 +145,13 @@ static int32_t mnodeCreateCluster() {
|
||||||
mDebug("uid is %s", pCluster->uid);
|
mDebug("uid is %s", pCluster->uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsClusterSdb,
|
.pTable = tsClusterSdb,
|
||||||
.pObj = pCluster,
|
.pObj = pCluster,
|
||||||
};
|
};
|
||||||
|
|
||||||
return sdbInsertRow(&oper);
|
return sdbInsertRow(&row);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* mnodeGetClusterId() {
|
const char* mnodeGetClusterId() {
|
||||||
|
|
|
@ -56,8 +56,8 @@ static void mnodeDestroyDb(SDbObj *pDb) {
|
||||||
tfree(pDb);
|
tfree(pDb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeDbActionDestroy(SSdbOper *pOper) {
|
static int32_t mnodeDbActionDestroy(SSdbRow *pRow) {
|
||||||
mnodeDestroyDb(pOper->pObj);
|
mnodeDestroyDb(pRow->pObj);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,8 +65,8 @@ int64_t mnodeGetDbNum() {
|
||||||
return sdbGetNumOfRows(tsDbSdb);
|
return sdbGetNumOfRows(tsDbSdb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeDbActionInsert(SSdbOper *pOper) {
|
static int32_t mnodeDbActionInsert(SSdbRow *pRow) {
|
||||||
SDbObj *pDb = pOper->pObj;
|
SDbObj *pDb = pRow->pObj;
|
||||||
SAcctObj *pAcct = mnodeGetAcct(pDb->acct);
|
SAcctObj *pAcct = mnodeGetAcct(pDb->acct);
|
||||||
|
|
||||||
pthread_mutex_init(&pDb->mutex, NULL);
|
pthread_mutex_init(&pDb->mutex, NULL);
|
||||||
|
@ -91,8 +91,8 @@ static int32_t mnodeDbActionInsert(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeDbActionDelete(SSdbOper *pOper) {
|
static int32_t mnodeDbActionDelete(SSdbRow *pRow) {
|
||||||
SDbObj *pDb = pOper->pObj;
|
SDbObj *pDb = pRow->pObj;
|
||||||
SAcctObj *pAcct = mnodeGetAcct(pDb->acct);
|
SAcctObj *pAcct = mnodeGetAcct(pDb->acct);
|
||||||
|
|
||||||
mnodeDropAllChildTables(pDb);
|
mnodeDropAllChildTables(pDb);
|
||||||
|
@ -107,11 +107,11 @@ static int32_t mnodeDbActionDelete(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeDbActionUpdate(SSdbOper *pOper) {
|
static int32_t mnodeDbActionUpdate(SSdbRow *pRow) {
|
||||||
SDbObj *pNew = pOper->pObj;
|
SDbObj *pNew = pRow->pObj;
|
||||||
SDbObj *pDb = mnodeGetDb(pNew->name);
|
SDbObj *pDb = mnodeGetDb(pNew->name);
|
||||||
if (pDb != NULL && pNew != pDb) {
|
if (pDb != NULL && pNew != pDb) {
|
||||||
memcpy(pDb, pNew, pOper->rowSize);
|
memcpy(pDb, pNew, pRow->rowSize);
|
||||||
free(pNew->vgList);
|
free(pNew->vgList);
|
||||||
free(pNew);
|
free(pNew);
|
||||||
}
|
}
|
||||||
|
@ -120,19 +120,19 @@ static int32_t mnodeDbActionUpdate(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeDbActionEncode(SSdbOper *pOper) {
|
static int32_t mnodeDbActionEncode(SSdbRow *pRow) {
|
||||||
SDbObj *pDb = pOper->pObj;
|
SDbObj *pDb = pRow->pObj;
|
||||||
memcpy(pOper->rowData, pDb, tsDbUpdateSize);
|
memcpy(pRow->rowData, pDb, tsDbUpdateSize);
|
||||||
pOper->rowSize = tsDbUpdateSize;
|
pRow->rowSize = tsDbUpdateSize;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeDbActionDecode(SSdbOper *pOper) {
|
static int32_t mnodeDbActionDecode(SSdbRow *pRow) {
|
||||||
SDbObj *pDb = (SDbObj *) calloc(1, sizeof(SDbObj));
|
SDbObj *pDb = (SDbObj *) calloc(1, sizeof(SDbObj));
|
||||||
if (pDb == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
if (pDb == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
||||||
|
|
||||||
memcpy(pDb, pOper->rowData, tsDbUpdateSize);
|
memcpy(pDb, pRow->rowData, tsDbUpdateSize);
|
||||||
pOper->pObj = pDb;
|
pRow->pObj = pDb;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,23 +144,23 @@ int32_t mnodeInitDbs() {
|
||||||
SDbObj tObj;
|
SDbObj tObj;
|
||||||
tsDbUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
tsDbUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
||||||
|
|
||||||
SSdbTableDesc tableDesc = {
|
SSdbTableDesc desc = {
|
||||||
.tableId = SDB_TABLE_DB,
|
.id = SDB_TABLE_DB,
|
||||||
.tableName = "dbs",
|
.name = "dbs",
|
||||||
.hashSessions = TSDB_DEFAULT_DBS_HASH_SIZE,
|
.hashSessions = TSDB_DEFAULT_DBS_HASH_SIZE,
|
||||||
.maxRowSize = tsDbUpdateSize,
|
.maxRowSize = tsDbUpdateSize,
|
||||||
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
||||||
.keyType = SDB_KEY_STRING,
|
.keyType = SDB_KEY_STRING,
|
||||||
.insertFp = mnodeDbActionInsert,
|
.fpInsert = mnodeDbActionInsert,
|
||||||
.deleteFp = mnodeDbActionDelete,
|
.fpDelete = mnodeDbActionDelete,
|
||||||
.updateFp = mnodeDbActionUpdate,
|
.fpUpdate = mnodeDbActionUpdate,
|
||||||
.encodeFp = mnodeDbActionEncode,
|
.fpEncode = mnodeDbActionEncode,
|
||||||
.decodeFp = mnodeDbActionDecode,
|
.fpDecode = mnodeDbActionDecode,
|
||||||
.destroyFp = mnodeDbActionDestroy,
|
.fpDestroy = mnodeDbActionDestroy,
|
||||||
.restoredFp = mnodeDbActionRestored
|
.fpRestored = mnodeDbActionRestored
|
||||||
};
|
};
|
||||||
|
|
||||||
tsDbSdb = sdbOpenTable(&tableDesc);
|
tsDbSdb = sdbOpenTable(&desc);
|
||||||
if (tsDbSdb == NULL) {
|
if (tsDbSdb == NULL) {
|
||||||
mError("failed to init db data");
|
mError("failed to init db data");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -412,16 +412,16 @@ static int32_t mnodeCreateDb(SAcctObj *pAcct, SCreateDbMsg *pCreate, SMnodeMsg *
|
||||||
pMsg->pDb = pDb;
|
pMsg->pDb = pDb;
|
||||||
mnodeIncDbRef(pDb);
|
mnodeIncDbRef(pDb);
|
||||||
|
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsDbSdb,
|
.pTable = tsDbSdb,
|
||||||
.pObj = pDb,
|
.pObj = pDb,
|
||||||
.rowSize = sizeof(SDbObj),
|
.rowSize = sizeof(SDbObj),
|
||||||
.pMsg = pMsg,
|
.pMsg = pMsg,
|
||||||
.writeCb = mnodeCreateDbCb
|
.fpRsp = mnodeCreateDbCb
|
||||||
};
|
};
|
||||||
|
|
||||||
code = sdbInsertRow(&oper);
|
code = sdbInsertRow(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
mError("db:%s, failed to create, reason:%s", pDb->name, tstrerror(code));
|
mError("db:%s, failed to create, reason:%s", pDb->name, tstrerror(code));
|
||||||
pMsg->pDb = NULL;
|
pMsg->pDb = NULL;
|
||||||
|
@ -440,8 +440,8 @@ bool mnodeCheckIsMonitorDB(char *db, char *monitordb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
void mnodePrintVgroups(SDbObj *pDb, char *oper) {
|
void mnodePrintVgroups(SDbObj *pDb, char *row) {
|
||||||
mInfo("db:%s, vgroup link from head, oper:%s", pDb->name, oper);
|
mInfo("db:%s, vgroup link from head, row:%s", pDb->name, row);
|
||||||
SVgObj *pVgroup = pDb->pHead;
|
SVgObj *pVgroup = pDb->pHead;
|
||||||
while (pVgroup != NULL) {
|
while (pVgroup != NULL) {
|
||||||
mInfo("vgId:%d", pVgroup->vgId);
|
mInfo("vgId:%d", pVgroup->vgId);
|
||||||
|
@ -807,13 +807,13 @@ static int32_t mnodeSetDbDropping(SDbObj *pDb) {
|
||||||
if (pDb->status) return TSDB_CODE_SUCCESS;
|
if (pDb->status) return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
pDb->status = true;
|
pDb->status = true;
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsDbSdb,
|
.pTable = tsDbSdb,
|
||||||
.pObj = pDb
|
.pObj = pDb
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t code = sdbUpdateRow(&oper);
|
int32_t code = sdbUpdateRow(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
mError("db:%s, failed to set dropping state, reason:%s", pDb->name, tstrerror(code));
|
mError("db:%s, failed to set dropping state, reason:%s", pDb->name, tstrerror(code));
|
||||||
}
|
}
|
||||||
|
@ -1019,15 +1019,15 @@ static int32_t mnodeAlterDb(SDbObj *pDb, SAlterDbMsg *pAlter, void *pMsg) {
|
||||||
if (memcmp(&newCfg, &pDb->cfg, sizeof(SDbCfg)) != 0) {
|
if (memcmp(&newCfg, &pDb->cfg, sizeof(SDbCfg)) != 0) {
|
||||||
pDb->cfg = newCfg;
|
pDb->cfg = newCfg;
|
||||||
pDb->cfgVersion++;
|
pDb->cfgVersion++;
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsDbSdb,
|
.pTable = tsDbSdb,
|
||||||
.pObj = pDb,
|
.pObj = pDb,
|
||||||
.pMsg = pMsg,
|
.pMsg = pMsg,
|
||||||
.writeCb = mnodeAlterDbCb
|
.fpRsp = mnodeAlterDbCb
|
||||||
};
|
};
|
||||||
|
|
||||||
code = sdbUpdateRow(&oper);
|
code = sdbUpdateRow(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
mError("db:%s, failed to alter, reason:%s", pDb->name, tstrerror(code));
|
mError("db:%s, failed to alter, reason:%s", pDb->name, tstrerror(code));
|
||||||
}
|
}
|
||||||
|
@ -1071,15 +1071,15 @@ static int32_t mnodeDropDb(SMnodeMsg *pMsg) {
|
||||||
SDbObj *pDb = pMsg->pDb;
|
SDbObj *pDb = pMsg->pDb;
|
||||||
mInfo("db:%s, drop db from sdb", pDb->name);
|
mInfo("db:%s, drop db from sdb", pDb->name);
|
||||||
|
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsDbSdb,
|
.pTable = tsDbSdb,
|
||||||
.pObj = pDb,
|
.pObj = pDb,
|
||||||
.pMsg = pMsg,
|
.pMsg = pMsg,
|
||||||
.writeCb = mnodeDropDbCb
|
.fpRsp = mnodeDropDbCb
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t code = sdbDeleteRow(&oper);
|
int32_t code = sdbDeleteRow(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
mError("db:%s, failed to drop, reason:%s", pDb->name, tstrerror(code));
|
mError("db:%s, failed to drop, reason:%s", pDb->name, tstrerror(code));
|
||||||
}
|
}
|
||||||
|
@ -1134,13 +1134,13 @@ void mnodeDropAllDbs(SAcctObj *pAcct) {
|
||||||
|
|
||||||
if (pDb->pAcct == pAcct) {
|
if (pDb->pAcct == pAcct) {
|
||||||
mInfo("db:%s, drop db from sdb for acct:%s is dropped", pDb->name, pAcct->user);
|
mInfo("db:%s, drop db from sdb for acct:%s is dropped", pDb->name, pAcct->user);
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_LOCAL,
|
.type = SDB_OPER_LOCAL,
|
||||||
.table = tsDbSdb,
|
.pTable = tsDbSdb,
|
||||||
.pObj = pDb
|
.pObj = pDb
|
||||||
};
|
};
|
||||||
|
|
||||||
sdbDeleteRow(&oper);
|
sdbDeleteRow(&row);
|
||||||
numOfDbs++;
|
numOfDbs++;
|
||||||
}
|
}
|
||||||
mnodeDecDbRef(pDb);
|
mnodeDecDbRef(pDb);
|
||||||
|
|
|
@ -87,13 +87,13 @@ static char* offlineReason[] = {
|
||||||
"unknown",
|
"unknown",
|
||||||
};
|
};
|
||||||
|
|
||||||
static int32_t mnodeDnodeActionDestroy(SSdbOper *pOper) {
|
static int32_t mnodeDnodeActionDestroy(SSdbRow *pRow) {
|
||||||
tfree(pOper->pObj);
|
tfree(pRow->pObj);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeDnodeActionInsert(SSdbOper *pOper) {
|
static int32_t mnodeDnodeActionInsert(SSdbRow *pRow) {
|
||||||
SDnodeObj *pDnode = pOper->pObj;
|
SDnodeObj *pDnode = pRow->pObj;
|
||||||
if (pDnode->status != TAOS_DN_STATUS_DROPPING) {
|
if (pDnode->status != TAOS_DN_STATUS_DROPPING) {
|
||||||
pDnode->status = TAOS_DN_STATUS_OFFLINE;
|
pDnode->status = TAOS_DN_STATUS_OFFLINE;
|
||||||
pDnode->lastAccess = tsAccessSquence;
|
pDnode->lastAccess = tsAccessSquence;
|
||||||
|
@ -107,8 +107,8 @@ static int32_t mnodeDnodeActionInsert(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeDnodeActionDelete(SSdbOper *pOper) {
|
static int32_t mnodeDnodeActionDelete(SSdbRow *pRow) {
|
||||||
SDnodeObj *pDnode = pOper->pObj;
|
SDnodeObj *pDnode = pRow->pObj;
|
||||||
|
|
||||||
#ifndef _SYNC
|
#ifndef _SYNC
|
||||||
mnodeDropAllDnodeVgroups(pDnode);
|
mnodeDropAllDnodeVgroups(pDnode);
|
||||||
|
@ -121,11 +121,11 @@ static int32_t mnodeDnodeActionDelete(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeDnodeActionUpdate(SSdbOper *pOper) {
|
static int32_t mnodeDnodeActionUpdate(SSdbRow *pRow) {
|
||||||
SDnodeObj *pNew = pOper->pObj;
|
SDnodeObj *pNew = pRow->pObj;
|
||||||
SDnodeObj *pDnode = mnodeGetDnode(pNew->dnodeId);
|
SDnodeObj *pDnode = mnodeGetDnode(pNew->dnodeId);
|
||||||
if (pDnode != NULL && pNew != pDnode) {
|
if (pDnode != NULL && pNew != pDnode) {
|
||||||
memcpy(pDnode, pNew, pOper->rowSize);
|
memcpy(pDnode, pNew, pRow->rowSize);
|
||||||
free(pNew);
|
free(pNew);
|
||||||
}
|
}
|
||||||
mnodeDecDnodeRef(pDnode);
|
mnodeDecDnodeRef(pDnode);
|
||||||
|
@ -134,19 +134,19 @@ static int32_t mnodeDnodeActionUpdate(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeDnodeActionEncode(SSdbOper *pOper) {
|
static int32_t mnodeDnodeActionEncode(SSdbRow *pRow) {
|
||||||
SDnodeObj *pDnode = pOper->pObj;
|
SDnodeObj *pDnode = pRow->pObj;
|
||||||
memcpy(pOper->rowData, pDnode, tsDnodeUpdateSize);
|
memcpy(pRow->rowData, pDnode, tsDnodeUpdateSize);
|
||||||
pOper->rowSize = tsDnodeUpdateSize;
|
pRow->rowSize = tsDnodeUpdateSize;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeDnodeActionDecode(SSdbOper *pOper) {
|
static int32_t mnodeDnodeActionDecode(SSdbRow *pRow) {
|
||||||
SDnodeObj *pDnode = (SDnodeObj *) calloc(1, sizeof(SDnodeObj));
|
SDnodeObj *pDnode = (SDnodeObj *) calloc(1, sizeof(SDnodeObj));
|
||||||
if (pDnode == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
if (pDnode == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
||||||
|
|
||||||
memcpy(pDnode, pOper->rowData, tsDnodeUpdateSize);
|
memcpy(pDnode, pRow->rowData, tsDnodeUpdateSize);
|
||||||
pOper->pObj = pDnode;
|
pRow->pObj = pDnode;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,23 +171,23 @@ int32_t mnodeInitDnodes() {
|
||||||
tsDnodeUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
tsDnodeUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
||||||
pthread_mutex_init(&tsDnodeEpsMutex, NULL);
|
pthread_mutex_init(&tsDnodeEpsMutex, NULL);
|
||||||
|
|
||||||
SSdbTableDesc tableDesc = {
|
SSdbTableDesc desc = {
|
||||||
.tableId = SDB_TABLE_DNODE,
|
.id = SDB_TABLE_DNODE,
|
||||||
.tableName = "dnodes",
|
.name = "dnodes",
|
||||||
.hashSessions = TSDB_DEFAULT_DNODES_HASH_SIZE,
|
.hashSessions = TSDB_DEFAULT_DNODES_HASH_SIZE,
|
||||||
.maxRowSize = tsDnodeUpdateSize,
|
.maxRowSize = tsDnodeUpdateSize,
|
||||||
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
||||||
.keyType = SDB_KEY_AUTO,
|
.keyType = SDB_KEY_AUTO,
|
||||||
.insertFp = mnodeDnodeActionInsert,
|
.fpInsert = mnodeDnodeActionInsert,
|
||||||
.deleteFp = mnodeDnodeActionDelete,
|
.fpDelete = mnodeDnodeActionDelete,
|
||||||
.updateFp = mnodeDnodeActionUpdate,
|
.fpUpdate = mnodeDnodeActionUpdate,
|
||||||
.encodeFp = mnodeDnodeActionEncode,
|
.fpEncode = mnodeDnodeActionEncode,
|
||||||
.decodeFp = mnodeDnodeActionDecode,
|
.fpDecode = mnodeDnodeActionDecode,
|
||||||
.destroyFp = mnodeDnodeActionDestroy,
|
.fpDestroy = mnodeDnodeActionDestroy,
|
||||||
.restoredFp = mnodeDnodeActionRestored
|
.fpRestored = mnodeDnodeActionRestored
|
||||||
};
|
};
|
||||||
|
|
||||||
tsDnodeSdb = sdbOpenTable(&tableDesc);
|
tsDnodeSdb = sdbOpenTable(&desc);
|
||||||
if (tsDnodeSdb == NULL) {
|
if (tsDnodeSdb == NULL) {
|
||||||
mError("failed to init dnodes data");
|
mError("failed to init dnodes data");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -296,13 +296,13 @@ void mnodeDecDnodeRef(SDnodeObj *pDnode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void mnodeUpdateDnode(SDnodeObj *pDnode) {
|
void mnodeUpdateDnode(SDnodeObj *pDnode) {
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsDnodeSdb,
|
.pTable = tsDnodeSdb,
|
||||||
.pObj = pDnode
|
.pObj = pDnode
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t code = sdbUpdateRow(&oper);
|
int32_t code = sdbUpdateRow(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
mError("dnodeId:%d, failed update", pDnode->dnodeId);
|
mError("dnodeId:%d, failed update", pDnode->dnodeId);
|
||||||
}
|
}
|
||||||
|
@ -644,15 +644,15 @@ static int32_t mnodeCreateDnode(char *ep, SMnodeMsg *pMsg) {
|
||||||
tstrncpy(pDnode->dnodeEp, ep, TSDB_EP_LEN);
|
tstrncpy(pDnode->dnodeEp, ep, TSDB_EP_LEN);
|
||||||
taosGetFqdnPortFromEp(ep, pDnode->dnodeFqdn, &pDnode->dnodePort);
|
taosGetFqdnPortFromEp(ep, pDnode->dnodeFqdn, &pDnode->dnodePort);
|
||||||
|
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsDnodeSdb,
|
.pTable = tsDnodeSdb,
|
||||||
.pObj = pDnode,
|
.pObj = pDnode,
|
||||||
.rowSize = sizeof(SDnodeObj),
|
.rowSize = sizeof(SDnodeObj),
|
||||||
.pMsg = pMsg
|
.pMsg = pMsg
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t code = sdbInsertRow(&oper);
|
int32_t code = sdbInsertRow(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
int dnodeId = pDnode->dnodeId;
|
int dnodeId = pDnode->dnodeId;
|
||||||
tfree(pDnode);
|
tfree(pDnode);
|
||||||
|
@ -665,14 +665,14 @@ static int32_t mnodeCreateDnode(char *ep, SMnodeMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mnodeDropDnode(SDnodeObj *pDnode, void *pMsg) {
|
int32_t mnodeDropDnode(SDnodeObj *pDnode, void *pMsg) {
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsDnodeSdb,
|
.pTable = tsDnodeSdb,
|
||||||
.pObj = pDnode,
|
.pObj = pDnode,
|
||||||
.pMsg = pMsg
|
.pMsg = pMsg
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t code = sdbDeleteRow(&oper);
|
int32_t code = sdbDeleteRow(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
mError("dnode:%d, failed to drop from cluster, result:%s", pDnode->dnodeId, tstrerror(code));
|
mError("dnode:%d, failed to drop from cluster, result:%s", pDnode->dnodeId, tstrerror(code));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1141,7 +1141,7 @@ static int32_t mnodeRetrieveVnodes(SShowObj *pShow, char *data, int32_t rows, vo
|
||||||
cols++;
|
cols++;
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
strcpy(pWrite, mnodeGetMnodeRoleStr(pVgid->role));
|
strcpy(pWrite, syncRole[pVgid->role]);
|
||||||
cols++;
|
cols++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ void *mnodeCreateMsg(SRpcMsg *pRpcMsg) {
|
||||||
|
|
||||||
int32_t mnodeInitMsg(SMnodeMsg *pMsg) {
|
int32_t mnodeInitMsg(SMnodeMsg *pMsg) {
|
||||||
if (pMsg->pUser != NULL) {
|
if (pMsg->pUser != NULL) {
|
||||||
mDebug("app:%p:%p, user info already inited", pMsg->rpcMsg.ahandle, pMsg);
|
mTrace("msg:%p, app:%p user info already inited", pMsg, pMsg->rpcMsg.ahandle);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,13 +58,13 @@ static int32_t mnodeRetrieveMnodes(SShowObj *pShow, char *data, int32_t rows, vo
|
||||||
#define mnodeMnodeDestroyLock() pthread_mutex_destroy(&tsMnodeLock)
|
#define mnodeMnodeDestroyLock() pthread_mutex_destroy(&tsMnodeLock)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int32_t mnodeMnodeActionDestroy(SSdbOper *pOper) {
|
static int32_t mnodeMnodeActionDestroy(SSdbRow *pRow) {
|
||||||
tfree(pOper->pObj);
|
tfree(pRow->pObj);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeMnodeActionInsert(SSdbOper *pOper) {
|
static int32_t mnodeMnodeActionInsert(SSdbRow *pRow) {
|
||||||
SMnodeObj *pMnode = pOper->pObj;
|
SMnodeObj *pMnode = pRow->pObj;
|
||||||
SDnodeObj *pDnode = mnodeGetDnode(pMnode->mnodeId);
|
SDnodeObj *pDnode = mnodeGetDnode(pMnode->mnodeId);
|
||||||
if (pDnode == NULL) return TSDB_CODE_MND_DNODE_NOT_EXIST;
|
if (pDnode == NULL) return TSDB_CODE_MND_DNODE_NOT_EXIST;
|
||||||
|
|
||||||
|
@ -76,8 +76,8 @@ static int32_t mnodeMnodeActionInsert(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeMnodeActionDelete(SSdbOper *pOper) {
|
static int32_t mnodeMnodeActionDelete(SSdbRow *pRow) {
|
||||||
SMnodeObj *pMnode = pOper->pObj;
|
SMnodeObj *pMnode = pRow->pObj;
|
||||||
|
|
||||||
SDnodeObj *pDnode = mnodeGetDnode(pMnode->mnodeId);
|
SDnodeObj *pDnode = mnodeGetDnode(pMnode->mnodeId);
|
||||||
if (pDnode == NULL) return TSDB_CODE_MND_DNODE_NOT_EXIST;
|
if (pDnode == NULL) return TSDB_CODE_MND_DNODE_NOT_EXIST;
|
||||||
|
@ -88,30 +88,30 @@ static int32_t mnodeMnodeActionDelete(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeMnodeActionUpdate(SSdbOper *pOper) {
|
static int32_t mnodeMnodeActionUpdate(SSdbRow *pRow) {
|
||||||
SMnodeObj *pMnode = pOper->pObj;
|
SMnodeObj *pMnode = pRow->pObj;
|
||||||
SMnodeObj *pSaved = mnodeGetMnode(pMnode->mnodeId);
|
SMnodeObj *pSaved = mnodeGetMnode(pMnode->mnodeId);
|
||||||
if (pMnode != pSaved) {
|
if (pMnode != pSaved) {
|
||||||
memcpy(pSaved, pMnode, pOper->rowSize);
|
memcpy(pSaved, pMnode, pRow->rowSize);
|
||||||
free(pMnode);
|
free(pMnode);
|
||||||
}
|
}
|
||||||
mnodeDecMnodeRef(pSaved);
|
mnodeDecMnodeRef(pSaved);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeMnodeActionEncode(SSdbOper *pOper) {
|
static int32_t mnodeMnodeActionEncode(SSdbRow *pRow) {
|
||||||
SMnodeObj *pMnode = pOper->pObj;
|
SMnodeObj *pMnode = pRow->pObj;
|
||||||
memcpy(pOper->rowData, pMnode, tsMnodeUpdateSize);
|
memcpy(pRow->rowData, pMnode, tsMnodeUpdateSize);
|
||||||
pOper->rowSize = tsMnodeUpdateSize;
|
pRow->rowSize = tsMnodeUpdateSize;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeMnodeActionDecode(SSdbOper *pOper) {
|
static int32_t mnodeMnodeActionDecode(SSdbRow *pRow) {
|
||||||
SMnodeObj *pMnode = calloc(1, sizeof(SMnodeObj));
|
SMnodeObj *pMnode = calloc(1, sizeof(SMnodeObj));
|
||||||
if (pMnode == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
if (pMnode == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
||||||
|
|
||||||
memcpy(pMnode, pOper->rowData, tsMnodeUpdateSize);
|
memcpy(pMnode, pRow->rowData, tsMnodeUpdateSize);
|
||||||
pOper->pObj = pMnode;
|
pRow->pObj = pMnode;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,23 +137,23 @@ int32_t mnodeInitMnodes() {
|
||||||
SMnodeObj tObj;
|
SMnodeObj tObj;
|
||||||
tsMnodeUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
tsMnodeUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
||||||
|
|
||||||
SSdbTableDesc tableDesc = {
|
SSdbTableDesc desc = {
|
||||||
.tableId = SDB_TABLE_MNODE,
|
.id = SDB_TABLE_MNODE,
|
||||||
.tableName = "mnodes",
|
.name = "mnodes",
|
||||||
.hashSessions = TSDB_DEFAULT_MNODES_HASH_SIZE,
|
.hashSessions = TSDB_DEFAULT_MNODES_HASH_SIZE,
|
||||||
.maxRowSize = tsMnodeUpdateSize,
|
.maxRowSize = tsMnodeUpdateSize,
|
||||||
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
||||||
.keyType = SDB_KEY_INT,
|
.keyType = SDB_KEY_INT,
|
||||||
.insertFp = mnodeMnodeActionInsert,
|
.fpInsert = mnodeMnodeActionInsert,
|
||||||
.deleteFp = mnodeMnodeActionDelete,
|
.fpDelete = mnodeMnodeActionDelete,
|
||||||
.updateFp = mnodeMnodeActionUpdate,
|
.fpUpdate = mnodeMnodeActionUpdate,
|
||||||
.encodeFp = mnodeMnodeActionEncode,
|
.fpEncode = mnodeMnodeActionEncode,
|
||||||
.decodeFp = mnodeMnodeActionDecode,
|
.fpDecode = mnodeMnodeActionDecode,
|
||||||
.destroyFp = mnodeMnodeActionDestroy,
|
.fpDestroy = mnodeMnodeActionDestroy,
|
||||||
.restoredFp = mnodeMnodeActionRestored
|
.fpRestored = mnodeMnodeActionRestored
|
||||||
};
|
};
|
||||||
|
|
||||||
tsMnodeSdb = sdbOpenTable(&tableDesc);
|
tsMnodeSdb = sdbOpenTable(&desc);
|
||||||
if (tsMnodeSdb == NULL) {
|
if (tsMnodeSdb == NULL) {
|
||||||
mError("failed to init mnodes data");
|
mError("failed to init mnodes data");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -192,10 +192,6 @@ void *mnodeGetNextMnode(void *pIter, SMnodeObj **pMnode) {
|
||||||
return sdbFetchRow(tsMnodeSdb, pIter, (void **)pMnode);
|
return sdbFetchRow(tsMnodeSdb, pIter, (void **)pMnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *mnodeGetMnodeRoleStr(int32_t role) {
|
|
||||||
return syncRole[role];
|
|
||||||
}
|
|
||||||
|
|
||||||
void mnodeUpdateMnodeEpSet() {
|
void mnodeUpdateMnodeEpSet() {
|
||||||
mInfo("update mnodes epSet, numOfEps:%d ", mnodeGetMnodesNum());
|
mInfo("update mnodes epSet, numOfEps:%d ", mnodeGetMnodesNum());
|
||||||
|
|
||||||
|
@ -329,11 +325,11 @@ void mnodeCreateMnode(int32_t dnodeId, char *dnodeEp, bool needConfirm) {
|
||||||
pMnode->mnodeId = dnodeId;
|
pMnode->mnodeId = dnodeId;
|
||||||
pMnode->createdTime = taosGetTimestampMs();
|
pMnode->createdTime = taosGetTimestampMs();
|
||||||
|
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsMnodeSdb,
|
.pTable = tsMnodeSdb,
|
||||||
.pObj = pMnode,
|
.pObj = pMnode,
|
||||||
.writeCb = mnodeCreateMnodeCb
|
.fpRsp = mnodeCreateMnodeCb
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
@ -346,7 +342,7 @@ void mnodeCreateMnode(int32_t dnodeId, char *dnodeEp, bool needConfirm) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = sdbInsertRow(&oper);
|
code = sdbInsertRow(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
mError("dnode:%d, failed to create mnode, ep:%s reason:%s", dnodeId, dnodeEp, tstrerror(code));
|
mError("dnode:%d, failed to create mnode, ep:%s reason:%s", dnodeId, dnodeEp, tstrerror(code));
|
||||||
tfree(pMnode);
|
tfree(pMnode);
|
||||||
|
@ -356,8 +352,8 @@ void mnodeCreateMnode(int32_t dnodeId, char *dnodeEp, bool needConfirm) {
|
||||||
void mnodeDropMnodeLocal(int32_t dnodeId) {
|
void mnodeDropMnodeLocal(int32_t dnodeId) {
|
||||||
SMnodeObj *pMnode = mnodeGetMnode(dnodeId);
|
SMnodeObj *pMnode = mnodeGetMnode(dnodeId);
|
||||||
if (pMnode != NULL) {
|
if (pMnode != NULL) {
|
||||||
SSdbOper oper = {.type = SDB_OPER_LOCAL, .table = tsMnodeSdb, .pObj = pMnode};
|
SSdbRow row = {.type = SDB_OPER_LOCAL, .pTable = tsMnodeSdb, .pObj = pMnode};
|
||||||
sdbDeleteRow(&oper);
|
sdbDeleteRow(&row);
|
||||||
mnodeDecMnodeRef(pMnode);
|
mnodeDecMnodeRef(pMnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -371,13 +367,13 @@ int32_t mnodeDropMnode(int32_t dnodeId) {
|
||||||
return TSDB_CODE_MND_DNODE_NOT_EXIST;
|
return TSDB_CODE_MND_DNODE_NOT_EXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsMnodeSdb,
|
.pTable = tsMnodeSdb,
|
||||||
.pObj = pMnode
|
.pObj = pMnode
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t code = sdbDeleteRow(&oper);
|
int32_t code = sdbDeleteRow(&row);
|
||||||
|
|
||||||
sdbDecRef(tsMnodeSdb, pMnode);
|
sdbDecRef(tsMnodeSdb, pMnode);
|
||||||
|
|
||||||
|
@ -469,7 +465,7 @@ static int32_t mnodeRetrieveMnodes(SShowObj *pShow, char *data, int32_t rows, vo
|
||||||
cols++;
|
cols++;
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
char* roles = mnodeGetMnodeRoleStr(pMnode->role);
|
char* roles = syncRole[pMnode->role];
|
||||||
STR_WITH_MAXSIZE_TO_VARSTR(pWrite, roles, pShow->bytes[cols]);
|
STR_WITH_MAXSIZE_TO_VARSTR(pWrite, roles, pShow->bytes[cols]);
|
||||||
cols++;
|
cols++;
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ void mnodeAddPeerRspHandle(uint8_t msgType, void (*fp)(SRpcMsg *rpcMsg)) {
|
||||||
|
|
||||||
int32_t mnodeProcessPeerReq(SMnodeMsg *pMsg) {
|
int32_t mnodeProcessPeerReq(SMnodeMsg *pMsg) {
|
||||||
if (pMsg->rpcMsg.pCont == NULL) {
|
if (pMsg->rpcMsg.pCont == NULL) {
|
||||||
mError("%p, msg:%s in mpeer queue, content is null", pMsg->rpcMsg.ahandle, taosMsg[pMsg->rpcMsg.msgType]);
|
mError("msg:%p, ahandle:%p type:%s in mpeer queue, content is null", pMsg, pMsg->rpcMsg.ahandle, taosMsg[pMsg->rpcMsg.msgType]);
|
||||||
return TSDB_CODE_MND_INVALID_MSG_LEN;
|
return TSDB_CODE_MND_INVALID_MSG_LEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,8 +57,8 @@ int32_t mnodeProcessPeerReq(SMnodeMsg *pMsg) {
|
||||||
rpcRsp->rsp = epSet;
|
rpcRsp->rsp = epSet;
|
||||||
rpcRsp->len = sizeof(SRpcEpSet);
|
rpcRsp->len = sizeof(SRpcEpSet);
|
||||||
|
|
||||||
mDebug("%p, msg:%s in mpeer queue will be redirected, numOfEps:%d inUse:%d", pMsg->rpcMsg.ahandle,
|
mDebug("msg:%p, ahandle:%p type:%s in mpeer queue will be redirected, numOfEps:%d inUse:%d", pMsg,
|
||||||
taosMsg[pMsg->rpcMsg.msgType], epSet->numOfEps, epSet->inUse);
|
pMsg->rpcMsg.ahandle, taosMsg[pMsg->rpcMsg.msgType], epSet->numOfEps, epSet->inUse);
|
||||||
for (int32_t i = 0; i < epSet->numOfEps; ++i) {
|
for (int32_t i = 0; i < epSet->numOfEps; ++i) {
|
||||||
if (strcmp(epSet->fqdn[i], tsLocalFqdn) == 0 && htons(epSet->port[i]) == tsServerPort + TSDB_PORT_DNODEDNODE) {
|
if (strcmp(epSet->fqdn[i], tsLocalFqdn) == 0 && htons(epSet->port[i]) == tsServerPort + TSDB_PORT_DNODEDNODE) {
|
||||||
epSet->inUse = (i + 1) % epSet->numOfEps;
|
epSet->inUse = (i + 1) % epSet->numOfEps;
|
||||||
|
@ -72,7 +72,8 @@ int32_t mnodeProcessPeerReq(SMnodeMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsMnodeProcessPeerMsgFp[pMsg->rpcMsg.msgType] == NULL) {
|
if (tsMnodeProcessPeerMsgFp[pMsg->rpcMsg.msgType] == NULL) {
|
||||||
mError("%p, msg:%s in mpeer queue, not processed", pMsg->rpcMsg.ahandle, taosMsg[pMsg->rpcMsg.msgType]);
|
mError("msg:%p, ahandle:%p type:%s in mpeer queue, not processed", pMsg, pMsg->rpcMsg.ahandle,
|
||||||
|
taosMsg[pMsg->rpcMsg.msgType]);
|
||||||
return TSDB_CODE_MND_MSG_NOT_PROCESSED;
|
return TSDB_CODE_MND_MSG_NOT_PROCESSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,13 +82,14 @@ int32_t mnodeProcessPeerReq(SMnodeMsg *pMsg) {
|
||||||
|
|
||||||
void mnodeProcessPeerRsp(SRpcMsg *pMsg) {
|
void mnodeProcessPeerRsp(SRpcMsg *pMsg) {
|
||||||
if (!sdbIsMaster()) {
|
if (!sdbIsMaster()) {
|
||||||
mError("%p, msg:%s is not processed for it is not master", pMsg->ahandle, taosMsg[pMsg->msgType]);
|
mError("msg:%p, ahandle:%p type:%s is not processed for it is not master", pMsg, pMsg->ahandle,
|
||||||
|
taosMsg[pMsg->msgType]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsMnodeProcessPeerRspFp[pMsg->msgType]) {
|
if (tsMnodeProcessPeerRspFp[pMsg->msgType]) {
|
||||||
(*tsMnodeProcessPeerRspFp[pMsg->msgType])(pMsg);
|
(*tsMnodeProcessPeerRspFp[pMsg->msgType])(pMsg);
|
||||||
} else {
|
} else {
|
||||||
mError("%p, msg:%s is not processed", pMsg->ahandle, taosMsg[pMsg->msgType]);
|
mError("msg:%p, ahandle:%p type:%s is not processed", pMsg, pMsg->ahandle, taosMsg[pMsg->msgType]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ void mnodeAddReadMsgHandle(uint8_t msgType, int32_t (*fp)(SMnodeMsg *pMsg)) {
|
||||||
|
|
||||||
int32_t mnodeProcessRead(SMnodeMsg *pMsg) {
|
int32_t mnodeProcessRead(SMnodeMsg *pMsg) {
|
||||||
if (pMsg->rpcMsg.pCont == NULL) {
|
if (pMsg->rpcMsg.pCont == NULL) {
|
||||||
mError("%p, msg:%s in mread queue, content is null", pMsg->rpcMsg.ahandle, taosMsg[pMsg->rpcMsg.msgType]);
|
mError("msg:%p, app:%p type:%s in mread queue, content is null", pMsg, pMsg->rpcMsg.ahandle, taosMsg[pMsg->rpcMsg.msgType]);
|
||||||
return TSDB_CODE_MND_INVALID_MSG_LEN;
|
return TSDB_CODE_MND_INVALID_MSG_LEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ int32_t mnodeProcessRead(SMnodeMsg *pMsg) {
|
||||||
SRpcEpSet *epSet = rpcMallocCont(sizeof(SRpcEpSet));
|
SRpcEpSet *epSet = rpcMallocCont(sizeof(SRpcEpSet));
|
||||||
mnodeGetMnodeEpSetForShell(epSet);
|
mnodeGetMnodeEpSetForShell(epSet);
|
||||||
|
|
||||||
mDebug("%p, msg:%s in mread queue will be redirected, numOfEps:%d inUse:%d", pMsg->rpcMsg.ahandle,
|
mDebug("msg:%p, app:%p type:%s in mread queue will be redirected, numOfEps:%d inUse:%d", pMsg, pMsg->rpcMsg.ahandle,
|
||||||
taosMsg[pMsg->rpcMsg.msgType], epSet->numOfEps, epSet->inUse);
|
taosMsg[pMsg->rpcMsg.msgType], epSet->numOfEps, epSet->inUse);
|
||||||
for (int32_t i = 0; i < epSet->numOfEps; ++i) {
|
for (int32_t i = 0; i < epSet->numOfEps; ++i) {
|
||||||
if (strcmp(epSet->fqdn[i], tsLocalFqdn) == 0 && htons(epSet->port[i]) == tsServerPort) {
|
if (strcmp(epSet->fqdn[i], tsLocalFqdn) == 0 && htons(epSet->port[i]) == tsServerPort) {
|
||||||
|
@ -70,13 +70,15 @@ int32_t mnodeProcessRead(SMnodeMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsMnodeProcessReadMsgFp[pMsg->rpcMsg.msgType] == NULL) {
|
if (tsMnodeProcessReadMsgFp[pMsg->rpcMsg.msgType] == NULL) {
|
||||||
mError("%p, msg:%s in mread queue, not processed", pMsg->rpcMsg.ahandle, taosMsg[pMsg->rpcMsg.msgType]);
|
mError("msg:%p, app:%p type:%s in mread queue, not processed", pMsg, pMsg->rpcMsg.ahandle,
|
||||||
|
taosMsg[pMsg->rpcMsg.msgType]);
|
||||||
return TSDB_CODE_MND_MSG_NOT_PROCESSED;
|
return TSDB_CODE_MND_MSG_NOT_PROCESSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = mnodeInitMsg(pMsg);
|
int32_t code = mnodeInitMsg(pMsg);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
mError("%p, msg:%s in mread queue, not processed reason:%s", pMsg->rpcMsg.ahandle, taosMsg[pMsg->rpcMsg.msgType], tstrerror(code));
|
mError("msg:%p, app:%p type:%s in mread queue, not processed reason:%s", pMsg, pMsg->rpcMsg.ahandle,
|
||||||
|
taosMsg[pMsg->rpcMsg.msgType], tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -42,13 +42,13 @@ static int32_t mnodeProcessAlterUserMsg(SMnodeMsg *pMsg);
|
||||||
static int32_t mnodeProcessDropUserMsg(SMnodeMsg *pMsg);
|
static int32_t mnodeProcessDropUserMsg(SMnodeMsg *pMsg);
|
||||||
static int32_t mnodeProcessAuthMsg(SMnodeMsg *pMsg);
|
static int32_t mnodeProcessAuthMsg(SMnodeMsg *pMsg);
|
||||||
|
|
||||||
static int32_t mnodeUserActionDestroy(SSdbOper *pOper) {
|
static int32_t mnodeUserActionDestroy(SSdbRow *pRow) {
|
||||||
tfree(pOper->pObj);
|
tfree(pRow->pObj);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeUserActionInsert(SSdbOper *pOper) {
|
static int32_t mnodeUserActionInsert(SSdbRow *pRow) {
|
||||||
SUserObj *pUser = pOper->pObj;
|
SUserObj *pUser = pRow->pObj;
|
||||||
SAcctObj *pAcct = mnodeGetAcct(pUser->acct);
|
SAcctObj *pAcct = mnodeGetAcct(pUser->acct);
|
||||||
|
|
||||||
if (pAcct != NULL) {
|
if (pAcct != NULL) {
|
||||||
|
@ -62,8 +62,8 @@ static int32_t mnodeUserActionInsert(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeUserActionDelete(SSdbOper *pOper) {
|
static int32_t mnodeUserActionDelete(SSdbRow *pRow) {
|
||||||
SUserObj *pUser = pOper->pObj;
|
SUserObj *pUser = pRow->pObj;
|
||||||
SAcctObj *pAcct = mnodeGetAcct(pUser->acct);
|
SAcctObj *pAcct = mnodeGetAcct(pUser->acct);
|
||||||
|
|
||||||
if (pAcct != NULL) {
|
if (pAcct != NULL) {
|
||||||
|
@ -74,8 +74,8 @@ static int32_t mnodeUserActionDelete(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeUserActionUpdate(SSdbOper *pOper) {
|
static int32_t mnodeUserActionUpdate(SSdbRow *pRow) {
|
||||||
SUserObj *pUser = pOper->pObj;
|
SUserObj *pUser = pRow->pObj;
|
||||||
SUserObj *pSaved = mnodeGetUser(pUser->user);
|
SUserObj *pSaved = mnodeGetUser(pUser->user);
|
||||||
if (pUser != pSaved) {
|
if (pUser != pSaved) {
|
||||||
memcpy(pSaved, pUser, tsUserUpdateSize);
|
memcpy(pSaved, pUser, tsUserUpdateSize);
|
||||||
|
@ -85,19 +85,19 @@ static int32_t mnodeUserActionUpdate(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeUserActionEncode(SSdbOper *pOper) {
|
static int32_t mnodeUserActionEncode(SSdbRow *pRow) {
|
||||||
SUserObj *pUser = pOper->pObj;
|
SUserObj *pUser = pRow->pObj;
|
||||||
memcpy(pOper->rowData, pUser, tsUserUpdateSize);
|
memcpy(pRow->rowData, pUser, tsUserUpdateSize);
|
||||||
pOper->rowSize = tsUserUpdateSize;
|
pRow->rowSize = tsUserUpdateSize;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeUserActionDecode(SSdbOper *pOper) {
|
static int32_t mnodeUserActionDecode(SSdbRow *pRow) {
|
||||||
SUserObj *pUser = (SUserObj *)calloc(1, sizeof(SUserObj));
|
SUserObj *pUser = (SUserObj *)calloc(1, sizeof(SUserObj));
|
||||||
if (pUser == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
if (pUser == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
||||||
|
|
||||||
memcpy(pUser, pOper->rowData, tsUserUpdateSize);
|
memcpy(pUser, pRow->rowData, tsUserUpdateSize);
|
||||||
pOper->pObj = pUser;
|
pRow->pObj = pUser;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,25 +150,25 @@ int32_t mnodeInitUsers() {
|
||||||
SUserObj tObj;
|
SUserObj tObj;
|
||||||
tsUserUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
tsUserUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
||||||
|
|
||||||
SSdbTableDesc tableDesc = {
|
SSdbTableDesc desc = {
|
||||||
.tableId = SDB_TABLE_USER,
|
.id = SDB_TABLE_USER,
|
||||||
.tableName = "users",
|
.name = "users",
|
||||||
.hashSessions = TSDB_DEFAULT_USERS_HASH_SIZE,
|
.hashSessions = TSDB_DEFAULT_USERS_HASH_SIZE,
|
||||||
.maxRowSize = tsUserUpdateSize,
|
.maxRowSize = tsUserUpdateSize,
|
||||||
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
||||||
.keyType = SDB_KEY_STRING,
|
.keyType = SDB_KEY_STRING,
|
||||||
.insertFp = mnodeUserActionInsert,
|
.fpInsert = mnodeUserActionInsert,
|
||||||
.deleteFp = mnodeUserActionDelete,
|
.fpDelete = mnodeUserActionDelete,
|
||||||
.updateFp = mnodeUserActionUpdate,
|
.fpUpdate = mnodeUserActionUpdate,
|
||||||
.encodeFp = mnodeUserActionEncode,
|
.fpEncode = mnodeUserActionEncode,
|
||||||
.decodeFp = mnodeUserActionDecode,
|
.fpDecode = mnodeUserActionDecode,
|
||||||
.destroyFp = mnodeUserActionDestroy,
|
.fpDestroy = mnodeUserActionDestroy,
|
||||||
.restoredFp = mnodeUserActionRestored
|
.fpRestored = mnodeUserActionRestored
|
||||||
};
|
};
|
||||||
|
|
||||||
tsUserSdb = sdbOpenTable(&tableDesc);
|
tsUserSdb = sdbOpenTable(&desc);
|
||||||
if (tsUserSdb == NULL) {
|
if (tsUserSdb == NULL) {
|
||||||
mError("table:%s, failed to create hash", tableDesc.tableName);
|
mError("table:%s, failed to create hash", desc.name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,7 +179,7 @@ int32_t mnodeInitUsers() {
|
||||||
mnodeAddShowRetrieveHandle(TSDB_MGMT_TABLE_USER, mnodeRetrieveUsers);
|
mnodeAddShowRetrieveHandle(TSDB_MGMT_TABLE_USER, mnodeRetrieveUsers);
|
||||||
mnodeAddPeerMsgHandle(TSDB_MSG_TYPE_DM_AUTH, mnodeProcessAuthMsg);
|
mnodeAddPeerMsgHandle(TSDB_MSG_TYPE_DM_AUTH, mnodeProcessAuthMsg);
|
||||||
|
|
||||||
mDebug("table:%s, hash is created", tableDesc.tableName);
|
mDebug("table:%s, hash is created", desc.name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,14 +205,14 @@ void mnodeDecUserRef(SUserObj *pUser) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeUpdateUser(SUserObj *pUser, void *pMsg) {
|
static int32_t mnodeUpdateUser(SUserObj *pUser, void *pMsg) {
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsUserSdb,
|
.pTable = tsUserSdb,
|
||||||
.pObj = pUser,
|
.pObj = pUser,
|
||||||
.pMsg = pMsg
|
.pMsg = pMsg
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t code = sdbUpdateRow(&oper);
|
int32_t code = sdbUpdateRow(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
mError("user:%s, failed to alter by %s, reason:%s", pUser->user, mnodeGetUserFromMsg(pMsg), tstrerror(code));
|
mError("user:%s, failed to alter by %s, reason:%s", pUser->user, mnodeGetUserFromMsg(pMsg), tstrerror(code));
|
||||||
} else {
|
} else {
|
||||||
|
@ -259,15 +259,15 @@ int32_t mnodeCreateUser(SAcctObj *pAcct, char *name, char *pass, void *pMsg) {
|
||||||
pUser->superAuth = 1;
|
pUser->superAuth = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsUserSdb,
|
.pTable = tsUserSdb,
|
||||||
.pObj = pUser,
|
.pObj = pUser,
|
||||||
.rowSize = sizeof(SUserObj),
|
.rowSize = sizeof(SUserObj),
|
||||||
.pMsg = pMsg
|
.pMsg = pMsg
|
||||||
};
|
};
|
||||||
|
|
||||||
code = sdbInsertRow(&oper);
|
code = sdbInsertRow(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
mError("user:%s, failed to create by %s, reason:%s", pUser->user, mnodeGetUserFromMsg(pMsg), tstrerror(code));
|
mError("user:%s, failed to create by %s, reason:%s", pUser->user, mnodeGetUserFromMsg(pMsg), tstrerror(code));
|
||||||
tfree(pUser);
|
tfree(pUser);
|
||||||
|
@ -279,14 +279,14 @@ int32_t mnodeCreateUser(SAcctObj *pAcct, char *name, char *pass, void *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeDropUser(SUserObj *pUser, void *pMsg) {
|
static int32_t mnodeDropUser(SUserObj *pUser, void *pMsg) {
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsUserSdb,
|
.pTable = tsUserSdb,
|
||||||
.pObj = pUser,
|
.pObj = pUser,
|
||||||
.pMsg = pMsg
|
.pMsg = pMsg
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t code = sdbDeleteRow(&oper);
|
int32_t code = sdbDeleteRow(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
mError("user:%s, failed to drop by %s, reason:%s", pUser->user, mnodeGetUserFromMsg(pMsg), tstrerror(code));
|
mError("user:%s, failed to drop by %s, reason:%s", pUser->user, mnodeGetUserFromMsg(pMsg), tstrerror(code));
|
||||||
} else {
|
} else {
|
||||||
|
@ -562,12 +562,12 @@ void mnodeDropAllUsers(SAcctObj *pAcct) {
|
||||||
if (pUser == NULL) break;
|
if (pUser == NULL) break;
|
||||||
|
|
||||||
if (strncmp(pUser->acct, pAcct->user, acctNameLen) == 0) {
|
if (strncmp(pUser->acct, pAcct->user, acctNameLen) == 0) {
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_LOCAL,
|
.type = SDB_OPER_LOCAL,
|
||||||
.table = tsUserSdb,
|
.pTable = tsUserSdb,
|
||||||
.pObj = pUser,
|
.pObj = pUser,
|
||||||
};
|
};
|
||||||
sdbDeleteRow(&oper);
|
sdbDeleteRow(&row);
|
||||||
numOfUsers++;
|
numOfUsers++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -72,13 +72,13 @@ static void mnodeDestroyVgroup(SVgObj *pVgroup) {
|
||||||
tfree(pVgroup);
|
tfree(pVgroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeVgroupActionDestroy(SSdbOper *pOper) {
|
static int32_t mnodeVgroupActionDestroy(SSdbRow *pRow) {
|
||||||
mnodeDestroyVgroup(pOper->pObj);
|
mnodeDestroyVgroup(pRow->pObj);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeVgroupActionInsert(SSdbOper *pOper) {
|
static int32_t mnodeVgroupActionInsert(SSdbRow *pRow) {
|
||||||
SVgObj *pVgroup = pOper->pObj;
|
SVgObj *pVgroup = pRow->pObj;
|
||||||
|
|
||||||
// refer to db
|
// refer to db
|
||||||
SDbObj *pDb = mnodeGetDb(pVgroup->dbName);
|
SDbObj *pDb = mnodeGetDb(pVgroup->dbName);
|
||||||
|
@ -115,8 +115,8 @@ static int32_t mnodeVgroupActionInsert(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeVgroupActionDelete(SSdbOper *pOper) {
|
static int32_t mnodeVgroupActionDelete(SSdbRow *pRow) {
|
||||||
SVgObj *pVgroup = pOper->pObj;
|
SVgObj *pVgroup = pRow->pObj;
|
||||||
|
|
||||||
if (pVgroup->pDb == NULL) {
|
if (pVgroup->pDb == NULL) {
|
||||||
mError("vgId:%d, db:%s is not exist while insert into hash", pVgroup->vgId, pVgroup->dbName);
|
mError("vgId:%d, db:%s is not exist while insert into hash", pVgroup->vgId, pVgroup->dbName);
|
||||||
|
@ -137,8 +137,8 @@ static int32_t mnodeVgroupActionDelete(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeVgroupActionUpdate(SSdbOper *pOper) {
|
static int32_t mnodeVgroupActionUpdate(SSdbRow *pRow) {
|
||||||
SVgObj *pNew = pOper->pObj;
|
SVgObj *pNew = pRow->pObj;
|
||||||
SVgObj *pVgroup = mnodeGetVgroup(pNew->vgId);
|
SVgObj *pVgroup = mnodeGetVgroup(pNew->vgId);
|
||||||
|
|
||||||
if (pVgroup != pNew) {
|
if (pVgroup != pNew) {
|
||||||
|
@ -176,25 +176,25 @@ static int32_t mnodeVgroupActionUpdate(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeVgroupActionEncode(SSdbOper *pOper) {
|
static int32_t mnodeVgroupActionEncode(SSdbRow *pRow) {
|
||||||
SVgObj *pVgroup = pOper->pObj;
|
SVgObj *pVgroup = pRow->pObj;
|
||||||
memcpy(pOper->rowData, pVgroup, tsVgUpdateSize);
|
memcpy(pRow->rowData, pVgroup, tsVgUpdateSize);
|
||||||
SVgObj *pTmpVgroup = pOper->rowData;
|
SVgObj *pTmpVgroup = pRow->rowData;
|
||||||
for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
|
for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
|
||||||
pTmpVgroup->vnodeGid[i].pDnode = NULL;
|
pTmpVgroup->vnodeGid[i].pDnode = NULL;
|
||||||
pTmpVgroup->vnodeGid[i].role = 0;
|
pTmpVgroup->vnodeGid[i].role = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pOper->rowSize = tsVgUpdateSize;
|
pRow->rowSize = tsVgUpdateSize;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeVgroupActionDecode(SSdbOper *pOper) {
|
static int32_t mnodeVgroupActionDecode(SSdbRow *pRow) {
|
||||||
SVgObj *pVgroup = (SVgObj *) calloc(1, sizeof(SVgObj));
|
SVgObj *pVgroup = (SVgObj *) calloc(1, sizeof(SVgObj));
|
||||||
if (pVgroup == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
if (pVgroup == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
||||||
|
|
||||||
memcpy(pVgroup, pOper->rowData, tsVgUpdateSize);
|
memcpy(pVgroup, pRow->rowData, tsVgUpdateSize);
|
||||||
pOper->pObj = pVgroup;
|
pRow->pObj = pVgroup;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,23 +206,23 @@ int32_t mnodeInitVgroups() {
|
||||||
SVgObj tObj;
|
SVgObj tObj;
|
||||||
tsVgUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
tsVgUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
||||||
|
|
||||||
SSdbTableDesc tableDesc = {
|
SSdbTableDesc desc = {
|
||||||
.tableId = SDB_TABLE_VGROUP,
|
.id = SDB_TABLE_VGROUP,
|
||||||
.tableName = "vgroups",
|
.name = "vgroups",
|
||||||
.hashSessions = TSDB_DEFAULT_VGROUPS_HASH_SIZE,
|
.hashSessions = TSDB_DEFAULT_VGROUPS_HASH_SIZE,
|
||||||
.maxRowSize = tsVgUpdateSize,
|
.maxRowSize = tsVgUpdateSize,
|
||||||
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
||||||
.keyType = SDB_KEY_AUTO,
|
.keyType = SDB_KEY_AUTO,
|
||||||
.insertFp = mnodeVgroupActionInsert,
|
.fpInsert = mnodeVgroupActionInsert,
|
||||||
.deleteFp = mnodeVgroupActionDelete,
|
.fpDelete = mnodeVgroupActionDelete,
|
||||||
.updateFp = mnodeVgroupActionUpdate,
|
.fpUpdate = mnodeVgroupActionUpdate,
|
||||||
.encodeFp = mnodeVgroupActionEncode,
|
.fpEncode = mnodeVgroupActionEncode,
|
||||||
.decodeFp = mnodeVgroupActionDecode,
|
.fpDecode = mnodeVgroupActionDecode,
|
||||||
.destroyFp = mnodeVgroupActionDestroy,
|
.fpDestroy = mnodeVgroupActionDestroy,
|
||||||
.restoredFp = mnodeVgroupActionRestored,
|
.fpRestored = mnodeVgroupActionRestored,
|
||||||
};
|
};
|
||||||
|
|
||||||
tsVgroupSdb = sdbOpenTable(&tableDesc);
|
tsVgroupSdb = sdbOpenTable(&desc);
|
||||||
if (tsVgroupSdb == NULL) {
|
if (tsVgroupSdb == NULL) {
|
||||||
mError("failed to init vgroups data");
|
mError("failed to init vgroups data");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -253,13 +253,13 @@ SVgObj *mnodeGetVgroup(int32_t vgId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void mnodeUpdateVgroup(SVgObj *pVgroup) {
|
void mnodeUpdateVgroup(SVgObj *pVgroup) {
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsVgroupSdb,
|
.pTable = tsVgroupSdb,
|
||||||
.pObj = pVgroup
|
.pObj = pVgroup
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t code = sdbUpdateRow(&oper);
|
int32_t code = sdbUpdateRow(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
mError("vgId:%d, failed to update vgroup", pVgroup->vgId);
|
mError("vgId:%d, failed to update vgroup", pVgroup->vgId);
|
||||||
}
|
}
|
||||||
|
@ -421,7 +421,7 @@ int32_t mnodeGetAvailableVgroup(SMnodeMsg *pMsg, SVgObj **ppVgroup, int32_t *pSi
|
||||||
|
|
||||||
int32_t sid = taosAllocateId(pVgroup->idPool);
|
int32_t sid = taosAllocateId(pVgroup->idPool);
|
||||||
if (sid <= 0) {
|
if (sid <= 0) {
|
||||||
mDebug("app:%p:%p, db:%s, no enough sid in vgId:%d", pMsg->rpcMsg.ahandle, pMsg, pDb->name, pVgroup->vgId);
|
mDebug("msg:%p, app:%p db:%s, no enough sid in vgId:%d", pMsg, pMsg->rpcMsg.ahandle, pDb->name, pVgroup->vgId);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -442,8 +442,8 @@ int32_t mnodeGetAvailableVgroup(SMnodeMsg *pMsg, SVgObj **ppVgroup, int32_t *pSi
|
||||||
|
|
||||||
int32_t code = TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
int32_t code = TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
||||||
if (pDb->numOfVgroups < maxVgroupsPerDb) {
|
if (pDb->numOfVgroups < maxVgroupsPerDb) {
|
||||||
mDebug("app:%p:%p, db:%s, try to create a new vgroup, numOfVgroups:%d maxVgroupsPerDb:%d", pMsg->rpcMsg.ahandle,
|
mDebug("msg:%p, app:%p db:%s, try to create a new vgroup, numOfVgroups:%d maxVgroupsPerDb:%d", pMsg,
|
||||||
pMsg, pDb->name, pDb->numOfVgroups, maxVgroupsPerDb);
|
pMsg->rpcMsg.ahandle, pDb->name, pDb->numOfVgroups, maxVgroupsPerDb);
|
||||||
pthread_mutex_unlock(&pDb->mutex);
|
pthread_mutex_unlock(&pDb->mutex);
|
||||||
code = mnodeCreateVgroup(pMsg);
|
code = mnodeCreateVgroup(pMsg);
|
||||||
if (code == TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code == TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
|
@ -455,8 +455,8 @@ int32_t mnodeGetAvailableVgroup(SMnodeMsg *pMsg, SVgObj **ppVgroup, int32_t *pSi
|
||||||
|
|
||||||
if (pDb->numOfVgroups < 1) {
|
if (pDb->numOfVgroups < 1) {
|
||||||
pthread_mutex_unlock(&pDb->mutex);
|
pthread_mutex_unlock(&pDb->mutex);
|
||||||
mDebug("app:%p:%p, db:%s, failed create new vgroup since:%s, numOfVgroups:%d maxVgroupsPerDb:%d ",
|
mDebug("msg:%p, app:%p db:%s, failed create new vgroup since:%s, numOfVgroups:%d maxVgroupsPerDb:%d ", pMsg,
|
||||||
pMsg->rpcMsg.ahandle, pMsg, pDb->name, tstrerror(code), pDb->numOfVgroups, maxVgroupsPerDb);
|
pMsg->rpcMsg.ahandle, pDb->name, tstrerror(code), pDb->numOfVgroups, maxVgroupsPerDb);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,7 +474,7 @@ int32_t mnodeGetAvailableVgroup(SMnodeMsg *pMsg, SVgObj **ppVgroup, int32_t *pSi
|
||||||
|
|
||||||
int32_t sid = taosAllocateId(pVgroup->idPool);
|
int32_t sid = taosAllocateId(pVgroup->idPool);
|
||||||
if (sid <= 0) {
|
if (sid <= 0) {
|
||||||
mError("app:%p:%p, db:%s, no enough sid in vgId:%d", pMsg->rpcMsg.ahandle, pMsg, pDb->name, pVgroup->vgId);
|
mError("msg:%p, app:%p db:%s, no enough sid in vgId:%d", pMsg, pMsg->rpcMsg.ahandle, pDb->name, pVgroup->vgId);
|
||||||
pthread_mutex_unlock(&pDb->mutex);
|
pthread_mutex_unlock(&pDb->mutex);
|
||||||
return TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
return TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
||||||
}
|
}
|
||||||
|
@ -496,10 +496,10 @@ static int32_t mnodeCreateVgroupFp(SMnodeMsg *pMsg) {
|
||||||
SDbObj *pDb = pMsg->pDb;
|
SDbObj *pDb = pMsg->pDb;
|
||||||
assert(pVgroup);
|
assert(pVgroup);
|
||||||
|
|
||||||
mInfo("app:%p:%p, vgId:%d, is created in mnode, db:%s replica:%d", pMsg->rpcMsg.ahandle, pMsg, pVgroup->vgId,
|
mInfo("msg:%p, app:%p vgId:%d, is created in mnode, db:%s replica:%d", pMsg, pMsg->rpcMsg.ahandle, pVgroup->vgId,
|
||||||
pDb->name, pVgroup->numOfVnodes);
|
pDb->name, pVgroup->numOfVnodes);
|
||||||
for (int32_t i = 0; i < pVgroup->numOfVnodes; ++i) {
|
for (int32_t i = 0; i < pVgroup->numOfVnodes; ++i) {
|
||||||
mInfo("app:%p:%p, vgId:%d, index:%d, dnode:%d", pMsg->rpcMsg.ahandle, pMsg, pVgroup->vgId, i,
|
mInfo("msg:%p, app:%p vgId:%d, index:%d, dnode:%d", pMsg, pMsg->rpcMsg.ahandle, pVgroup->vgId, i,
|
||||||
pVgroup->vnodeGid[i].dnodeId);
|
pVgroup->vnodeGid[i].dnodeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,30 +517,30 @@ static int32_t mnodeCreateVgroupCb(SMnodeMsg *pMsg, int32_t code) {
|
||||||
assert(pVgroup);
|
assert(pVgroup);
|
||||||
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
mError("app:%p:%p, vgId:%d, failed to create in sdb, reason:%s", pMsg->rpcMsg.ahandle, pMsg, pVgroup->vgId,
|
mError("msg:%p, app:%p vgId:%d, failed to create in sdb, reason:%s", pMsg, pMsg->rpcMsg.ahandle, pVgroup->vgId,
|
||||||
tstrerror(code));
|
tstrerror(code));
|
||||||
SSdbOper desc = {.type = SDB_OPER_GLOBAL, .pObj = pVgroup, .table = tsVgroupSdb};
|
SSdbRow desc = {.type = SDB_OPER_GLOBAL, .pObj = pVgroup, .pTable = tsVgroupSdb};
|
||||||
sdbDeleteRow(&desc);
|
sdbDeleteRow(&desc);
|
||||||
return code;
|
return code;
|
||||||
} else {
|
} else {
|
||||||
mInfo("app:%p:%p, vgId:%d, is created in sdb, db:%s replica:%d", pMsg->rpcMsg.ahandle, pMsg, pVgroup->vgId,
|
mInfo("msg:%p, app:%p vgId:%d, is created in sdb, db:%s replica:%d", pMsg, pMsg->rpcMsg.ahandle, pVgroup->vgId,
|
||||||
pDb->name, pVgroup->numOfVnodes);
|
pDb->name, pVgroup->numOfVnodes);
|
||||||
pVgroup->status = TAOS_VG_STATUS_READY;
|
pVgroup->status = TAOS_VG_STATUS_READY;
|
||||||
SSdbOper desc = {.type = SDB_OPER_GLOBAL, .pObj = pVgroup, .table = tsVgroupSdb};
|
SSdbRow desc = {.type = SDB_OPER_GLOBAL, .pObj = pVgroup, .pTable = tsVgroupSdb};
|
||||||
(void)sdbUpdateRow(&desc);
|
(void)sdbUpdateRow(&desc);
|
||||||
|
|
||||||
dnodeReprocessMWriteMsg(pMsg);
|
dnodeReprocessMWriteMsg(pMsg);
|
||||||
return TSDB_CODE_MND_ACTION_IN_PROGRESS;
|
return TSDB_CODE_MND_ACTION_IN_PROGRESS;
|
||||||
// if (pVgroup->status == TAOS_VG_STATUS_CREATING || pVgroup->status == TAOS_VG_STATUS_READY) {
|
// if (pVgroup->status == TAOS_VG_STATUS_CREATING || pVgroup->status == TAOS_VG_STATUS_READY) {
|
||||||
// mInfo("app:%p:%p, vgId:%d, is created in sdb, db:%s replica:%d", pMsg->rpcMsg.ahandle, pMsg, pVgroup->vgId,
|
// mInfo("msg:%p, app:%p vgId:%d, is created in sdb, db:%s replica:%d", pMsg, pMsg->rpcMsg.ahandle, pVgroup->vgId,
|
||||||
// pDb->name, pVgroup->numOfVnodes);
|
// pDb->name, pVgroup->numOfVnodes);
|
||||||
// pVgroup->status = TAOS_VG_STATUS_READY;
|
// pVgroup->status = TAOS_VG_STATUS_READY;
|
||||||
// SSdbOper desc = {.type = SDB_OPER_GLOBAL, .pObj = pVgroup, .table = tsVgroupSdb};
|
// SSdbRow desc = {.type = SDB_OPER_GLOBAL, .pObj = pVgroup, .pTable = tsVgroupSdb};
|
||||||
// (void)sdbUpdateRow(&desc);
|
// (void)sdbUpdateRow(&desc);
|
||||||
// dnodeReprocessMWriteMsg(pMsg);
|
// dnodeReprocessMWriteMsg(pMsg);
|
||||||
// return TSDB_CODE_MND_ACTION_IN_PROGRESS;
|
// return TSDB_CODE_MND_ACTION_IN_PROGRESS;
|
||||||
// } else {
|
// } else {
|
||||||
// mError("app:%p:%p, vgId:%d, is created in sdb, db:%s replica:%d, but vgroup is dropping", pMsg->rpcMsg.ahandle,
|
// mError("msg:%p, app:%p vgId:%d, is created in sdb, db:%s replica:%d, but vgroup is dropping", pMsg->rpcMsg.ahandle,
|
||||||
// pMsg, pVgroup->vgId, pDb->name, pVgroup->numOfVnodes);
|
// pMsg, pVgroup->vgId, pDb->name, pVgroup->numOfVnodes);
|
||||||
// return TSDB_CODE_MND_VGROUP_NOT_EXIST;
|
// return TSDB_CODE_MND_VGROUP_NOT_EXIST;
|
||||||
// }
|
// }
|
||||||
|
@ -571,16 +571,16 @@ int32_t mnodeCreateVgroup(SMnodeMsg *pMsg) {
|
||||||
pMsg->pVgroup = pVgroup;
|
pMsg->pVgroup = pVgroup;
|
||||||
mnodeIncVgroupRef(pVgroup);
|
mnodeIncVgroupRef(pVgroup);
|
||||||
|
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsVgroupSdb,
|
.pTable = tsVgroupSdb,
|
||||||
.pObj = pVgroup,
|
.pObj = pVgroup,
|
||||||
.rowSize = sizeof(SVgObj),
|
.rowSize = sizeof(SVgObj),
|
||||||
.pMsg = pMsg,
|
.pMsg = pMsg,
|
||||||
.reqFp = mnodeCreateVgroupFp
|
.fpReq = mnodeCreateVgroupFp
|
||||||
};
|
};
|
||||||
|
|
||||||
code = sdbInsertRow(&oper);
|
code = sdbInsertRow(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
pMsg->pVgroup = NULL;
|
pMsg->pVgroup = NULL;
|
||||||
mnodeDestroyVgroup(pVgroup);
|
mnodeDestroyVgroup(pVgroup);
|
||||||
|
@ -595,12 +595,12 @@ void mnodeDropVgroup(SVgObj *pVgroup, void *ahandle) {
|
||||||
} else {
|
} else {
|
||||||
mDebug("vgId:%d, replica:%d is deleting from sdb", pVgroup->vgId, pVgroup->numOfVnodes);
|
mDebug("vgId:%d, replica:%d is deleting from sdb", pVgroup->vgId, pVgroup->numOfVnodes);
|
||||||
mnodeSendDropVgroupMsg(pVgroup, NULL);
|
mnodeSendDropVgroupMsg(pVgroup, NULL);
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsVgroupSdb,
|
.pTable = tsVgroupSdb,
|
||||||
.pObj = pVgroup
|
.pObj = pVgroup
|
||||||
};
|
};
|
||||||
sdbDeleteRow(&oper);
|
sdbDeleteRow(&row);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -770,7 +770,7 @@ static int32_t mnodeRetrieveVgroups(SShowObj *pShow, char *data, int32_t rows, v
|
||||||
SDnodeObj * pDnode = pVgroup->vnodeGid[i].pDnode;
|
SDnodeObj * pDnode = pVgroup->vnodeGid[i].pDnode;
|
||||||
const char *role = "NULL";
|
const char *role = "NULL";
|
||||||
if (pDnode != NULL) {
|
if (pDnode != NULL) {
|
||||||
role = mnodeGetMnodeRoleStr(pVgroup->vnodeGid[i].role);
|
role = syncRole[pVgroup->vnodeGid[i].role];
|
||||||
}
|
}
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
@ -957,28 +957,28 @@ static void mnodeProcessCreateVnodeRsp(SRpcMsg *rpcMsg) {
|
||||||
if (mnodeMsg->received != mnodeMsg->expected) return;
|
if (mnodeMsg->received != mnodeMsg->expected) return;
|
||||||
|
|
||||||
if (mnodeMsg->received == mnodeMsg->successed) {
|
if (mnodeMsg->received == mnodeMsg->successed) {
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsVgroupSdb,
|
.pTable = tsVgroupSdb,
|
||||||
.pObj = pVgroup,
|
.pObj = pVgroup,
|
||||||
.rowSize = sizeof(SVgObj),
|
.rowSize = sizeof(SVgObj),
|
||||||
.pMsg = mnodeMsg,
|
.pMsg = mnodeMsg,
|
||||||
.writeCb = mnodeCreateVgroupCb
|
.fpRsp = mnodeCreateVgroupCb
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t code = sdbInsertRowImp(&oper);
|
int32_t code = sdbInsertRowToQueue(&row);
|
||||||
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
|
||||||
mnodeMsg->pVgroup = NULL;
|
mnodeMsg->pVgroup = NULL;
|
||||||
mnodeDestroyVgroup(pVgroup);
|
mnodeDestroyVgroup(pVgroup);
|
||||||
dnodeSendRpcMWriteRsp(mnodeMsg, code);
|
dnodeSendRpcMWriteRsp(mnodeMsg, code);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsVgroupSdb,
|
.pTable = tsVgroupSdb,
|
||||||
.pObj = pVgroup
|
.pObj = pVgroup
|
||||||
};
|
};
|
||||||
sdbDeleteRow(&oper);
|
sdbDeleteRow(&row);
|
||||||
dnodeSendRpcMWriteRsp(mnodeMsg, mnodeMsg->code);
|
dnodeSendRpcMWriteRsp(mnodeMsg, mnodeMsg->code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1031,12 +1031,12 @@ static void mnodeProcessDropVnodeRsp(SRpcMsg *rpcMsg) {
|
||||||
|
|
||||||
if (mnodeMsg->received != mnodeMsg->expected) return;
|
if (mnodeMsg->received != mnodeMsg->expected) return;
|
||||||
|
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsVgroupSdb,
|
.pTable = tsVgroupSdb,
|
||||||
.pObj = pVgroup
|
.pObj = pVgroup
|
||||||
};
|
};
|
||||||
int32_t code = sdbDeleteRow(&oper);
|
int32_t code = sdbDeleteRow(&row);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
code = TSDB_CODE_MND_SDB_ERROR;
|
code = TSDB_CODE_MND_SDB_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -1084,12 +1084,12 @@ void mnodeDropAllDnodeVgroups(SDnodeObj *pDropDnode) {
|
||||||
|
|
||||||
if (pVgroup->vnodeGid[0].dnodeId == pDropDnode->dnodeId) {
|
if (pVgroup->vnodeGid[0].dnodeId == pDropDnode->dnodeId) {
|
||||||
mnodeDropAllChildTablesInVgroups(pVgroup);
|
mnodeDropAllChildTablesInVgroups(pVgroup);
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_LOCAL,
|
.type = SDB_OPER_LOCAL,
|
||||||
.table = tsVgroupSdb,
|
.pTable = tsVgroupSdb,
|
||||||
.pObj = pVgroup,
|
.pObj = pVgroup,
|
||||||
};
|
};
|
||||||
sdbDeleteRow(&oper);
|
sdbDeleteRow(&row);
|
||||||
numOfVgroups++;
|
numOfVgroups++;
|
||||||
}
|
}
|
||||||
mnodeDecVgroupRef(pVgroup);
|
mnodeDecVgroupRef(pVgroup);
|
||||||
|
@ -1135,12 +1135,12 @@ void mnodeDropAllDbVgroups(SDbObj *pDropDb) {
|
||||||
if (pVgroup == NULL) break;
|
if (pVgroup == NULL) break;
|
||||||
|
|
||||||
if (pVgroup->pDb == pDropDb) {
|
if (pVgroup->pDb == pDropDb) {
|
||||||
SSdbOper oper = {
|
SSdbRow row = {
|
||||||
.type = SDB_OPER_LOCAL,
|
.type = SDB_OPER_LOCAL,
|
||||||
.table = tsVgroupSdb,
|
.pTable = tsVgroupSdb,
|
||||||
.pObj = pVgroup,
|
.pObj = pVgroup,
|
||||||
};
|
};
|
||||||
sdbDeleteRow(&oper);
|
sdbDeleteRow(&row);
|
||||||
numOfVgroups++;
|
numOfVgroups++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ void mnodeAddWriteMsgHandle(uint8_t msgType, int32_t (*fp)(SMnodeMsg *mnodeMsg))
|
||||||
|
|
||||||
int32_t mnodeProcessWrite(SMnodeMsg *pMsg) {
|
int32_t mnodeProcessWrite(SMnodeMsg *pMsg) {
|
||||||
if (pMsg->rpcMsg.pCont == NULL) {
|
if (pMsg->rpcMsg.pCont == NULL) {
|
||||||
mError("app:%p:%p, msg:%s content is null", pMsg->rpcMsg.ahandle, pMsg, taosMsg[pMsg->rpcMsg.msgType]);
|
mError("msg:%p, app:%p type:%s content is null", pMsg, pMsg->rpcMsg.ahandle, taosMsg[pMsg->rpcMsg.msgType]);
|
||||||
return TSDB_CODE_MND_INVALID_MSG_LEN;
|
return TSDB_CODE_MND_INVALID_MSG_LEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,15 +54,15 @@ int32_t mnodeProcessWrite(SMnodeMsg *pMsg) {
|
||||||
rpcRsp->rsp = epSet;
|
rpcRsp->rsp = epSet;
|
||||||
rpcRsp->len = sizeof(SRpcEpSet);
|
rpcRsp->len = sizeof(SRpcEpSet);
|
||||||
|
|
||||||
mDebug("app:%p:%p, msg:%s in write queue, will be redirected, numOfEps:%d inUse:%d", pMsg->rpcMsg.ahandle, pMsg,
|
mDebug("msg:%p, app:%p type:%s in write queue, will be redirected, numOfEps:%d inUse:%d", pMsg, pMsg->rpcMsg.ahandle,
|
||||||
taosMsg[pMsg->rpcMsg.msgType], epSet->numOfEps, epSet->inUse);
|
taosMsg[pMsg->rpcMsg.msgType], epSet->numOfEps, epSet->inUse);
|
||||||
for (int32_t i = 0; i < epSet->numOfEps; ++i) {
|
for (int32_t i = 0; i < epSet->numOfEps; ++i) {
|
||||||
if (strcmp(epSet->fqdn[i], tsLocalFqdn) == 0 && htons(epSet->port[i]) == tsServerPort) {
|
if (strcmp(epSet->fqdn[i], tsLocalFqdn) == 0 && htons(epSet->port[i]) == tsServerPort) {
|
||||||
epSet->inUse = (i + 1) % epSet->numOfEps;
|
epSet->inUse = (i + 1) % epSet->numOfEps;
|
||||||
mDebug("app:%p:%p, mnode index:%d ep:%s:%d, set inUse to %d", pMsg->rpcMsg.ahandle, pMsg, i, epSet->fqdn[i],
|
mDebug("msg:%p, app:%p mnode index:%d ep:%s:%d, set inUse to %d", pMsg, pMsg->rpcMsg.ahandle, i, epSet->fqdn[i],
|
||||||
htons(epSet->port[i]), epSet->inUse);
|
htons(epSet->port[i]), epSet->inUse);
|
||||||
} else {
|
} else {
|
||||||
mDebug("app:%p:%p, mnode index:%d ep:%s:%d", pMsg->rpcMsg.ahandle, pMsg, i, epSet->fqdn[i],
|
mDebug("msg:%p, app:%p mnode index:%d ep:%s:%d", pMsg, pMsg->rpcMsg.ahandle, i, epSet->fqdn[i],
|
||||||
htons(epSet->port[i]));
|
htons(epSet->port[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -71,19 +71,19 @@ int32_t mnodeProcessWrite(SMnodeMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsMnodeProcessWriteMsgFp[pMsg->rpcMsg.msgType] == NULL) {
|
if (tsMnodeProcessWriteMsgFp[pMsg->rpcMsg.msgType] == NULL) {
|
||||||
mError("app:%p:%p, msg:%s not processed", pMsg->rpcMsg.ahandle, pMsg, taosMsg[pMsg->rpcMsg.msgType]);
|
mError("msg:%p, app:%p type:%s not processed", pMsg, pMsg->rpcMsg.ahandle, taosMsg[pMsg->rpcMsg.msgType]);
|
||||||
return TSDB_CODE_MND_MSG_NOT_PROCESSED;
|
return TSDB_CODE_MND_MSG_NOT_PROCESSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = mnodeInitMsg(pMsg);
|
int32_t code = mnodeInitMsg(pMsg);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
mError("app:%p:%p, msg:%s not processed, reason:%s", pMsg->rpcMsg.ahandle, pMsg, taosMsg[pMsg->rpcMsg.msgType],
|
mError("msg:%p, app:%p type:%s not processed, reason:%s", pMsg, pMsg->rpcMsg.ahandle, taosMsg[pMsg->rpcMsg.msgType],
|
||||||
tstrerror(code));
|
tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pMsg->pUser->writeAuth) {
|
if (!pMsg->pUser->writeAuth) {
|
||||||
mError("app:%p:%p, msg:%s not processed, no write auth", pMsg->rpcMsg.ahandle, pMsg,
|
mError("msg:%p, app:%p type:%s not processed, no write auth", pMsg, pMsg->rpcMsg.ahandle,
|
||||||
taosMsg[pMsg->rpcMsg.msgType]);
|
taosMsg[pMsg->rpcMsg.msgType]);
|
||||||
return TSDB_CODE_MND_NO_RIGHTS;
|
return TSDB_CODE_MND_NO_RIGHTS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,7 +118,7 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *module;
|
char *module;
|
||||||
bool (*decodeFp)(struct HttpContext *pContext);
|
bool (*fpDecode)(struct HttpContext *pContext);
|
||||||
} HttpDecodeMethod;
|
} HttpDecodeMethod;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -21,11 +21,11 @@
|
||||||
#include "httpHandle.h"
|
#include "httpHandle.h"
|
||||||
|
|
||||||
bool httpDecodeRequest(HttpContext* pContext) {
|
bool httpDecodeRequest(HttpContext* pContext) {
|
||||||
if (pContext->decodeMethod->decodeFp == NULL) {
|
if (pContext->decodeMethod->fpDecode == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (*pContext->decodeMethod->decodeFp)(pContext);
|
return (*pContext->decodeMethod->fpDecode)(pContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -171,11 +171,10 @@ typedef struct SQuery {
|
||||||
|
|
||||||
typedef struct SQueryRuntimeEnv {
|
typedef struct SQueryRuntimeEnv {
|
||||||
jmp_buf env;
|
jmp_buf env;
|
||||||
SResultRow* pResultRow; // todo refactor to merge with SWindowResInfo
|
|
||||||
SQuery* pQuery;
|
SQuery* pQuery;
|
||||||
SQLFunctionCtx* pCtx;
|
SQLFunctionCtx* pCtx;
|
||||||
int32_t numOfRowsPerPage;
|
int32_t numOfRowsPerPage;
|
||||||
uint16_t offset[TSDB_MAX_COLUMNS];
|
uint16_t* offset;
|
||||||
uint16_t scanFlag; // denotes reversed scan of data or not
|
uint16_t scanFlag; // denotes reversed scan of data or not
|
||||||
SFillInfo* pFillInfo;
|
SFillInfo* pFillInfo;
|
||||||
SWindowResInfo windowResInfo;
|
SWindowResInfo windowResInfo;
|
||||||
|
|
|
@ -34,7 +34,7 @@ int32_t initWindowResInfo(SWindowResInfo* pWindowResInfo, int32_t size, int32_t
|
||||||
|
|
||||||
void cleanupTimeWindowInfo(SWindowResInfo* pWindowResInfo);
|
void cleanupTimeWindowInfo(SWindowResInfo* pWindowResInfo);
|
||||||
void resetTimeWindowInfo(SQueryRuntimeEnv* pRuntimeEnv, SWindowResInfo* pWindowResInfo);
|
void resetTimeWindowInfo(SQueryRuntimeEnv* pRuntimeEnv, SWindowResInfo* pWindowResInfo);
|
||||||
void clearFirstNTimeWindow(SQueryRuntimeEnv *pRuntimeEnv, int32_t num);
|
void clearFirstNWindowRes(SQueryRuntimeEnv *pRuntimeEnv, int32_t num);
|
||||||
|
|
||||||
void clearClosedTimeWindow(SQueryRuntimeEnv* pRuntimeEnv);
|
void clearClosedTimeWindow(SQueryRuntimeEnv* pRuntimeEnv);
|
||||||
int32_t numOfClosedTimeWindow(SWindowResInfo* pWindowResInfo);
|
int32_t numOfClosedTimeWindow(SWindowResInfo* pWindowResInfo);
|
||||||
|
|
|
@ -177,7 +177,7 @@ static void getNextTimeWindow(SQuery* pQuery, STimeWindow* tw) {
|
||||||
static int32_t mergeIntoGroupResultImpl(SQInfo *pQInfo, SArray *group);
|
static int32_t mergeIntoGroupResultImpl(SQInfo *pQInfo, SArray *group);
|
||||||
|
|
||||||
static void setResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult);
|
static void setResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult);
|
||||||
static void setWindowResOutputBufInitCtx(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult);
|
static void setResultRowOutputBufInitCtx(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult);
|
||||||
static void resetMergeResultBuf(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx *pCtx, SResultRow *pRow);
|
static void resetMergeResultBuf(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx *pCtx, SResultRow *pRow);
|
||||||
static bool functionNeedToExecute(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx *pCtx, int32_t functionId);
|
static bool functionNeedToExecute(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx *pCtx, int32_t functionId);
|
||||||
|
|
||||||
|
@ -618,7 +618,7 @@ static int32_t setWindowOutputBufByKey(SQueryRuntimeEnv *pRuntimeEnv, SWindowRes
|
||||||
|
|
||||||
// set time window for current result
|
// set time window for current result
|
||||||
pResultRow->win = (*win);
|
pResultRow->win = (*win);
|
||||||
setWindowResOutputBufInitCtx(pRuntimeEnv, pResultRow);
|
setResultRowOutputBufInitCtx(pRuntimeEnv, pResultRow);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -660,7 +660,13 @@ static FORCE_INLINE int32_t getForwardStepsInBlock(int32_t numOfRows, __block_se
|
||||||
*/
|
*/
|
||||||
static int32_t doCheckQueryCompleted(SQueryRuntimeEnv *pRuntimeEnv, TSKEY lastKey, SWindowResInfo *pWindowResInfo) {
|
static int32_t doCheckQueryCompleted(SQueryRuntimeEnv *pRuntimeEnv, TSKEY lastKey, SWindowResInfo *pWindowResInfo) {
|
||||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||||
if (pRuntimeEnv->scanFlag != MASTER_SCAN || (!QUERY_IS_INTERVAL_QUERY(pQuery))) {
|
if (pRuntimeEnv->scanFlag != MASTER_SCAN) {
|
||||||
|
return pWindowResInfo->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for group by normal column query, close time window and return.
|
||||||
|
if (!QUERY_IS_INTERVAL_QUERY(pQuery)) {
|
||||||
|
closeAllTimeWindow(pWindowResInfo);
|
||||||
return pWindowResInfo->size;
|
return pWindowResInfo->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1251,7 +1257,7 @@ static bool functionNeedToExecute(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx
|
||||||
return QUERY_IS_ASC_QUERY(pQuery);
|
return QUERY_IS_ASC_QUERY(pQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo add comments
|
// denote the order type
|
||||||
if ((functionId == TSDB_FUNC_LAST_DST || functionId == TSDB_FUNC_LAST)) {
|
if ((functionId == TSDB_FUNC_LAST_DST || functionId == TSDB_FUNC_LAST)) {
|
||||||
return pCtx->param[0].i64Key == pQuery->order.order;
|
return pCtx->param[0].i64Key == pQuery->order.order;
|
||||||
}
|
}
|
||||||
|
@ -1448,7 +1454,7 @@ static int32_t tableApplyFunctionsOnBlock(SQueryRuntimeEnv *pRuntimeEnv, SDataBl
|
||||||
|
|
||||||
// interval query with limit applied
|
// interval query with limit applied
|
||||||
int32_t numOfRes = 0;
|
int32_t numOfRes = 0;
|
||||||
if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
|
if (QUERY_IS_INTERVAL_QUERY(pQuery) || pRuntimeEnv->groupbyNormalCol) {
|
||||||
numOfRes = doCheckQueryCompleted(pRuntimeEnv, lastKey, pWindowResInfo);
|
numOfRes = doCheckQueryCompleted(pRuntimeEnv, lastKey, pWindowResInfo);
|
||||||
} else {
|
} else {
|
||||||
numOfRes = (int32_t)getNumOfResult(pRuntimeEnv);
|
numOfRes = (int32_t)getNumOfResult(pRuntimeEnv);
|
||||||
|
@ -1621,10 +1627,10 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int16_t order
|
||||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||||
|
|
||||||
pRuntimeEnv->pCtx = (SQLFunctionCtx *)calloc(pQuery->numOfOutput, sizeof(SQLFunctionCtx));
|
pRuntimeEnv->pCtx = (SQLFunctionCtx *)calloc(pQuery->numOfOutput, sizeof(SQLFunctionCtx));
|
||||||
|
pRuntimeEnv->offset = calloc(pQuery->numOfOutput, sizeof(int16_t));
|
||||||
pRuntimeEnv->rowCellInfoOffset = calloc(pQuery->numOfOutput, sizeof(int32_t));
|
pRuntimeEnv->rowCellInfoOffset = calloc(pQuery->numOfOutput, sizeof(int32_t));
|
||||||
pRuntimeEnv->pResultRow = getNewResultRow(pRuntimeEnv->pool);
|
|
||||||
|
|
||||||
if (pRuntimeEnv->pResultRow == NULL || pRuntimeEnv->pCtx == NULL || pRuntimeEnv->rowCellInfoOffset == NULL) {
|
if (pRuntimeEnv->offset == NULL || pRuntimeEnv->pCtx == NULL || pRuntimeEnv->rowCellInfoOffset == NULL) {
|
||||||
goto _clean;
|
goto _clean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1664,15 +1670,15 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int16_t order
|
||||||
assert(isValidDataType(pCtx->inputType));
|
assert(isValidDataType(pCtx->inputType));
|
||||||
pCtx->ptsOutputBuf = NULL;
|
pCtx->ptsOutputBuf = NULL;
|
||||||
|
|
||||||
pCtx->outputBytes = pQuery->pExpr1[i].bytes;
|
pCtx->outputBytes = pQuery->pExpr1[i].bytes;
|
||||||
pCtx->outputType = pQuery->pExpr1[i].type;
|
pCtx->outputType = pQuery->pExpr1[i].type;
|
||||||
|
|
||||||
pCtx->order = pQuery->order.order;
|
pCtx->order = pQuery->order.order;
|
||||||
pCtx->functionId = pSqlFuncMsg->functionId;
|
pCtx->functionId = pSqlFuncMsg->functionId;
|
||||||
pCtx->stableQuery = pRuntimeEnv->stableQuery;
|
pCtx->stableQuery = pRuntimeEnv->stableQuery;
|
||||||
pCtx->interBufBytes = pQuery->pExpr1[i].interBytes;
|
pCtx->interBufBytes = pQuery->pExpr1[i].interBytes;
|
||||||
|
|
||||||
pCtx->numOfParams = pSqlFuncMsg->numOfParams;
|
pCtx->numOfParams = pSqlFuncMsg->numOfParams;
|
||||||
for (int32_t j = 0; j < pCtx->numOfParams; ++j) {
|
for (int32_t j = 0; j < pCtx->numOfParams; ++j) {
|
||||||
int16_t type = pSqlFuncMsg->arg[j].argType;
|
int16_t type = pSqlFuncMsg->arg[j].argType;
|
||||||
int16_t bytes = pSqlFuncMsg->arg[j].argBytes;
|
int16_t bytes = pSqlFuncMsg->arg[j].argBytes;
|
||||||
|
@ -1720,6 +1726,8 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int16_t order
|
||||||
|
|
||||||
_clean:
|
_clean:
|
||||||
tfree(pRuntimeEnv->pCtx);
|
tfree(pRuntimeEnv->pCtx);
|
||||||
|
tfree(pRuntimeEnv->offset);
|
||||||
|
tfree(pRuntimeEnv->rowCellInfoOffset);
|
||||||
|
|
||||||
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
@ -1769,6 +1777,8 @@ static void teardownQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv) {
|
||||||
doFreeQueryHandle(pQInfo);
|
doFreeQueryHandle(pQInfo);
|
||||||
|
|
||||||
pRuntimeEnv->pTSBuf = tsBufDestroy(pRuntimeEnv->pTSBuf);
|
pRuntimeEnv->pTSBuf = tsBufDestroy(pRuntimeEnv->pTSBuf);
|
||||||
|
|
||||||
|
tfree(pRuntimeEnv->offset);
|
||||||
tfree(pRuntimeEnv->keyBuf);
|
tfree(pRuntimeEnv->keyBuf);
|
||||||
tfree(pRuntimeEnv->rowCellInfoOffset);
|
tfree(pRuntimeEnv->rowCellInfoOffset);
|
||||||
|
|
||||||
|
@ -2409,7 +2419,7 @@ static void ensureOutputBufferSimple(SQueryRuntimeEnv* pRuntimeEnv, int32_t capa
|
||||||
assert(bytes > 0 && capacity > 0);
|
assert(bytes > 0 && capacity > 0);
|
||||||
|
|
||||||
char *tmp = realloc(pQuery->sdata[i], bytes * capacity + sizeof(tFilePage));
|
char *tmp = realloc(pQuery->sdata[i], bytes * capacity + sizeof(tFilePage));
|
||||||
if (tmp == NULL) { // todo handle the oom
|
if (tmp == NULL) {
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
} else {
|
} else {
|
||||||
pQuery->sdata[i] = (tFilePage *)tmp;
|
pQuery->sdata[i] = (tFilePage *)tmp;
|
||||||
|
@ -2440,7 +2450,7 @@ static void ensureOutputBuffer(SQueryRuntimeEnv* pRuntimeEnv, SDataBlockInfo* pB
|
||||||
assert(bytes > 0 && newSize > 0);
|
assert(bytes > 0 && newSize > 0);
|
||||||
|
|
||||||
char *tmp = realloc(pQuery->sdata[i], bytes * newSize + sizeof(tFilePage));
|
char *tmp = realloc(pQuery->sdata[i], bytes * newSize + sizeof(tFilePage));
|
||||||
if (tmp == NULL) { // todo handle the oom
|
if (tmp == NULL) {
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
} else {
|
} else {
|
||||||
memset(tmp + sizeof(tFilePage) + bytes * pRec->rows, 0, (size_t)((newSize - pRec->rows) * bytes));
|
memset(tmp + sizeof(tFilePage) + bytes * pRec->rows, 0, (size_t)((newSize - pRec->rows) * bytes));
|
||||||
|
@ -3331,7 +3341,10 @@ int32_t initResultRow(SResultRow *pResultRow) {
|
||||||
|
|
||||||
void resetCtxOutputBuf(SQueryRuntimeEnv *pRuntimeEnv) {
|
void resetCtxOutputBuf(SQueryRuntimeEnv *pRuntimeEnv) {
|
||||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||||
SResultRow* pRow = pRuntimeEnv->pResultRow;
|
|
||||||
|
int32_t groupIndex = 0;
|
||||||
|
int32_t uid = 0;
|
||||||
|
SResultRow* pRow = doPrepareResultRowFromKey(pRuntimeEnv, &pRuntimeEnv->windowResInfo, (char *)&groupIndex, sizeof(groupIndex), true, uid);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
||||||
SQLFunctionCtx *pCtx = &pRuntimeEnv->pCtx[i];
|
SQLFunctionCtx *pCtx = &pRuntimeEnv->pCtx[i];
|
||||||
|
@ -3826,7 +3839,7 @@ void setResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setWindowResOutputBufInitCtx(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult) {
|
void setResultRowOutputBufInitCtx(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult) {
|
||||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||||
|
|
||||||
// Note: pResult->pos[i]->num == 0, there is only fixed number of results for each group
|
// Note: pResult->pos[i]->num == 0, there is only fixed number of results for each group
|
||||||
|
@ -4613,12 +4626,6 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, void *tsdb, int32_t vgId, bo
|
||||||
tsBufSetTraverseOrder(pRuntimeEnv->pTSBuf, order);
|
tsBufSetTraverseOrder(pRuntimeEnv->pTSBuf, order);
|
||||||
}
|
}
|
||||||
|
|
||||||
// create runtime environment
|
|
||||||
code = setupQueryRuntimeEnv(pRuntimeEnv, pQuery->order.order);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t ps = DEFAULT_PAGE_SIZE;
|
int32_t ps = DEFAULT_PAGE_SIZE;
|
||||||
int32_t rowsize = 0;
|
int32_t rowsize = 0;
|
||||||
getIntermediateBufInfo(pRuntimeEnv, &ps, &rowsize);
|
getIntermediateBufInfo(pRuntimeEnv, &ps, &rowsize);
|
||||||
|
@ -4650,7 +4657,7 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, void *tsdb, int32_t vgId, bo
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (pRuntimeEnv->groupbyNormalCol || QUERY_IS_INTERVAL_QUERY(pQuery)) {
|
} else if (pRuntimeEnv->groupbyNormalCol || QUERY_IS_INTERVAL_QUERY(pQuery) || (!isSTableQuery)) {
|
||||||
int32_t numOfResultRows = getInitialPageNum(pQInfo);
|
int32_t numOfResultRows = getInitialPageNum(pQInfo);
|
||||||
getIntermediateBufInfo(pRuntimeEnv, &ps, &rowsize);
|
getIntermediateBufInfo(pRuntimeEnv, &ps, &rowsize);
|
||||||
code = createDiskbasedResultBuffer(&pRuntimeEnv->pResultBuf, rowsize, ps, TWOMB, pQInfo);
|
code = createDiskbasedResultBuffer(&pRuntimeEnv->pResultBuf, rowsize, ps, TWOMB, pQInfo);
|
||||||
|
@ -4671,6 +4678,12 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, void *tsdb, int32_t vgId, bo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// create runtime environment
|
||||||
|
code = setupQueryRuntimeEnv(pRuntimeEnv, pQuery->order.order);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
if (pQuery->fillType != TSDB_FILL_NONE && !isPointInterpoQuery(pQuery)) {
|
if (pQuery->fillType != TSDB_FILL_NONE && !isPointInterpoQuery(pQuery)) {
|
||||||
SFillColInfo* pColInfo = createFillColInfo(pQuery);
|
SFillColInfo* pColInfo = createFillColInfo(pQuery);
|
||||||
STimeWindow w = TSWINDOW_INITIALIZER;
|
STimeWindow w = TSWINDOW_INITIALIZER;
|
||||||
|
@ -5512,7 +5525,7 @@ static void tableIntervalProcessImpl(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start)
|
||||||
int32_t numOfClosed = numOfClosedTimeWindow(&pRuntimeEnv->windowResInfo);
|
int32_t numOfClosed = numOfClosedTimeWindow(&pRuntimeEnv->windowResInfo);
|
||||||
|
|
||||||
int32_t c = (int32_t)(MIN(numOfClosed, pQuery->limit.offset));
|
int32_t c = (int32_t)(MIN(numOfClosed, pQuery->limit.offset));
|
||||||
clearFirstNTimeWindow(pRuntimeEnv, c);
|
clearFirstNWindowRes(pRuntimeEnv, c);
|
||||||
pQuery->limit.offset -= c;
|
pQuery->limit.offset -= c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5533,10 +5546,12 @@ static void tableIntervalProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo) {
|
||||||
TSKEY newStartKey = TSKEY_INITIAL_VAL;
|
TSKEY newStartKey = TSKEY_INITIAL_VAL;
|
||||||
|
|
||||||
// skip blocks without load the actual data block from file if no filter condition present
|
// skip blocks without load the actual data block from file if no filter condition present
|
||||||
skipTimeInterval(pRuntimeEnv, &newStartKey);
|
if (!pRuntimeEnv->groupbyNormalCol) {
|
||||||
if (pQuery->limit.offset > 0 && pQuery->numOfFilterCols == 0 && pRuntimeEnv->pFillInfo == NULL) {
|
skipTimeInterval(pRuntimeEnv, &newStartKey);
|
||||||
setQueryStatus(pQuery, QUERY_COMPLETED);
|
if (pQuery->limit.offset > 0 && pQuery->numOfFilterCols == 0 && pRuntimeEnv->pFillInfo == NULL) {
|
||||||
return;
|
setQueryStatus(pQuery, QUERY_COMPLETED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -5547,11 +5562,11 @@ static void tableIntervalProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo) {
|
||||||
pQuery->rec.rows = 0;
|
pQuery->rec.rows = 0;
|
||||||
copyFromWindowResToSData(pQInfo, &pRuntimeEnv->windowResInfo);
|
copyFromWindowResToSData(pQInfo, &pRuntimeEnv->windowResInfo);
|
||||||
|
|
||||||
clearFirstNTimeWindow(pRuntimeEnv, pQInfo->groupIndex);
|
clearFirstNWindowRes(pRuntimeEnv, pQInfo->groupIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
// no result generated, abort
|
// no result generated, abort
|
||||||
if (pQuery->rec.rows == 0) {
|
if (pQuery->rec.rows == 0 || pRuntimeEnv->groupbyNormalCol) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5579,10 +5594,21 @@ static void tableIntervalProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo) {
|
||||||
|
|
||||||
// all data scanned, the group by normal column can return
|
// all data scanned, the group by normal column can return
|
||||||
if (pRuntimeEnv->groupbyNormalCol) { // todo refactor with merge interval time result
|
if (pRuntimeEnv->groupbyNormalCol) { // todo refactor with merge interval time result
|
||||||
pQInfo->groupIndex = 0;
|
// maxOutput <= 0, means current query does not generate any results
|
||||||
pQuery->rec.rows = 0;
|
int32_t numOfClosed = numOfClosedTimeWindow(&pRuntimeEnv->windowResInfo);
|
||||||
copyFromWindowResToSData(pQInfo, &pRuntimeEnv->windowResInfo);
|
|
||||||
clearFirstNTimeWindow(pRuntimeEnv, pQInfo->groupIndex);
|
if ((pQuery->limit.offset > 0 && pQuery->limit.offset < numOfClosed) || pQuery->limit.offset == 0) {
|
||||||
|
// skip offset result rows
|
||||||
|
clearFirstNWindowRes(pRuntimeEnv, (int32_t) pQuery->limit.offset);
|
||||||
|
|
||||||
|
pQuery->rec.rows = 0;
|
||||||
|
pQInfo->groupIndex = 0;
|
||||||
|
copyFromWindowResToSData(pQInfo, &pRuntimeEnv->windowResInfo);
|
||||||
|
clearFirstNWindowRes(pRuntimeEnv, pQInfo->groupIndex);
|
||||||
|
|
||||||
|
doSecondaryArithmeticProcess(pQuery);
|
||||||
|
limitResults(pRuntimeEnv);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5612,7 +5638,7 @@ static void tableQueryImpl(SQInfo *pQInfo) {
|
||||||
|
|
||||||
if (pRuntimeEnv->windowResInfo.size > 0) {
|
if (pRuntimeEnv->windowResInfo.size > 0) {
|
||||||
copyFromWindowResToSData(pQInfo, &pRuntimeEnv->windowResInfo);
|
copyFromWindowResToSData(pQInfo, &pRuntimeEnv->windowResInfo);
|
||||||
clearFirstNTimeWindow(pRuntimeEnv, pQInfo->groupIndex);
|
clearFirstNWindowRes(pRuntimeEnv, pQInfo->groupIndex);
|
||||||
|
|
||||||
if (pQuery->rec.rows > 0) {
|
if (pQuery->rec.rows > 0) {
|
||||||
qDebug("QInfo:%p %"PRId64" rows returned from group results, total:%"PRId64"", pQInfo, pQuery->rec.rows, pQuery->rec.total);
|
qDebug("QInfo:%p %"PRId64" rows returned from group results, total:%"PRId64"", pQInfo, pQuery->rec.rows, pQuery->rec.total);
|
||||||
|
|
|
@ -165,7 +165,7 @@ static char* doFlushPageToDisk(SDiskbasedResultBuf* pResultBuf, SPageInfo* pg) {
|
||||||
|
|
||||||
static char* flushPageToDisk(SDiskbasedResultBuf* pResultBuf, SPageInfo* pg) {
|
static char* flushPageToDisk(SDiskbasedResultBuf* pResultBuf, SPageInfo* pg) {
|
||||||
int32_t ret = TSDB_CODE_SUCCESS;
|
int32_t ret = TSDB_CODE_SUCCESS;
|
||||||
assert((int64_t)pResultBuf->numOfPages * pResultBuf->pageSize == pResultBuf->totalBufSize && pResultBuf->numOfPages >= pResultBuf->inMemPages);
|
assert(((int64_t) pResultBuf->numOfPages * pResultBuf->pageSize) == pResultBuf->totalBufSize && pResultBuf->numOfPages >= pResultBuf->inMemPages);
|
||||||
|
|
||||||
if (pResultBuf->file == NULL) {
|
if (pResultBuf->file == NULL) {
|
||||||
if ((ret = createDiskFile(pResultBuf)) != TSDB_CODE_SUCCESS) {
|
if ((ret = createDiskFile(pResultBuf)) != TSDB_CODE_SUCCESS) {
|
||||||
|
|
|
@ -53,7 +53,7 @@ void cleanupTimeWindowInfo(SWindowResInfo *pWindowResInfo) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (pWindowResInfo->capacity == 0) {
|
if (pWindowResInfo->capacity == 0) {
|
||||||
assert(/*pWindowResInfo->hashList == NULL && */pWindowResInfo->pResult == NULL);
|
assert(pWindowResInfo->pResult == NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,10 +64,18 @@ void resetTimeWindowInfo(SQueryRuntimeEnv *pRuntimeEnv, SWindowResInfo *pWindowR
|
||||||
if (pWindowResInfo == NULL || pWindowResInfo->capacity == 0) {
|
if (pWindowResInfo == NULL || pWindowResInfo->capacity == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// assert(pWindowResInfo->size == 1);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pWindowResInfo->size; ++i) {
|
for (int32_t i = 0; i < pWindowResInfo->size; ++i) {
|
||||||
SResultRow *pWindowRes = pWindowResInfo->pResult[i];
|
SResultRow *pWindowRes = pWindowResInfo->pResult[i];
|
||||||
clearResultRow(pRuntimeEnv, pWindowRes);
|
clearResultRow(pRuntimeEnv, pWindowRes);
|
||||||
|
|
||||||
|
int32_t groupIndex = 0;
|
||||||
|
int64_t uid = 0;
|
||||||
|
|
||||||
|
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, &groupIndex, sizeof(groupIndex), uid);
|
||||||
|
taosHashRemove(pRuntimeEnv->pResultRowHashTable, (const char *)pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(sizeof(groupIndex)));
|
||||||
}
|
}
|
||||||
|
|
||||||
pWindowResInfo->curIndex = -1;
|
pWindowResInfo->curIndex = -1;
|
||||||
|
@ -77,7 +85,7 @@ void resetTimeWindowInfo(SQueryRuntimeEnv *pRuntimeEnv, SWindowResInfo *pWindowR
|
||||||
pWindowResInfo->prevSKey = TSKEY_INITIAL_VAL;
|
pWindowResInfo->prevSKey = TSKEY_INITIAL_VAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearFirstNTimeWindow(SQueryRuntimeEnv *pRuntimeEnv, int32_t num) {
|
void clearFirstNWindowRes(SQueryRuntimeEnv *pRuntimeEnv, int32_t num) {
|
||||||
SWindowResInfo *pWindowResInfo = &pRuntimeEnv->windowResInfo;
|
SWindowResInfo *pWindowResInfo = &pRuntimeEnv->windowResInfo;
|
||||||
if (pWindowResInfo == NULL || pWindowResInfo->capacity == 0 || pWindowResInfo->size == 0 || num == 0) {
|
if (pWindowResInfo == NULL || pWindowResInfo->capacity == 0 || pWindowResInfo->size == 0 || num == 0) {
|
||||||
return;
|
return;
|
||||||
|
@ -88,6 +96,11 @@ void clearFirstNTimeWindow(SQueryRuntimeEnv *pRuntimeEnv, int32_t num) {
|
||||||
|
|
||||||
int16_t type = pWindowResInfo->type;
|
int16_t type = pWindowResInfo->type;
|
||||||
STableId* id = TSDB_TABLEID(pRuntimeEnv->pQuery->current->pTable); // uid is always set to be 0.
|
STableId* id = TSDB_TABLEID(pRuntimeEnv->pQuery->current->pTable); // uid is always set to be 0.
|
||||||
|
int64_t uid = id->uid;
|
||||||
|
if (pRuntimeEnv->groupbyNormalCol) {
|
||||||
|
uid = 0;
|
||||||
|
}
|
||||||
|
|
||||||
char *key = NULL;
|
char *key = NULL;
|
||||||
int16_t bytes = -1;
|
int16_t bytes = -1;
|
||||||
|
|
||||||
|
@ -97,14 +110,14 @@ void clearFirstNTimeWindow(SQueryRuntimeEnv *pRuntimeEnv, int32_t num) {
|
||||||
|
|
||||||
// todo refactor
|
// todo refactor
|
||||||
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
key = varDataVal(pResult->key);
|
key = varDataVal(pResult->key);
|
||||||
bytes = varDataLen(pResult->key);
|
bytes = varDataLen(pResult->key);
|
||||||
} else {
|
} else {
|
||||||
key = (char*) &pResult->win.skey;
|
key = (char*) &pResult->win.skey;
|
||||||
bytes = tDataTypeDesc[pWindowResInfo->type].nSize;
|
bytes = tDataTypeDesc[pWindowResInfo->type].nSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, id->uid);
|
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, uid);
|
||||||
taosHashRemove(pRuntimeEnv->pResultRowHashTable, (const char *)pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
|
taosHashRemove(pRuntimeEnv->pResultRowHashTable, (const char *)pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
|
@ -137,14 +150,14 @@ void clearFirstNTimeWindow(SQueryRuntimeEnv *pRuntimeEnv, int32_t num) {
|
||||||
bytes = tDataTypeDesc[pWindowResInfo->type].nSize;
|
bytes = tDataTypeDesc[pWindowResInfo->type].nSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, id->uid);
|
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, uid);
|
||||||
int32_t *p = (int32_t *)taosHashGet(pRuntimeEnv->pResultRowHashTable, (const char *)pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
|
int32_t *p = (int32_t *)taosHashGet(pRuntimeEnv->pResultRowHashTable, (const char *)pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
|
||||||
assert(p != NULL);
|
assert(p != NULL);
|
||||||
|
|
||||||
int32_t v = (*p - num);
|
int32_t v = (*p - num);
|
||||||
assert(v >= 0 && v <= pWindowResInfo->size);
|
assert(v >= 0 && v <= pWindowResInfo->size);
|
||||||
|
|
||||||
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, id->uid);
|
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, uid);
|
||||||
taosHashPut(pRuntimeEnv->pResultRowHashTable, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes), (char *)&v, sizeof(int32_t));
|
taosHashPut(pRuntimeEnv->pResultRowHashTable, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes), (char *)&v, sizeof(int32_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,7 +171,7 @@ void clearClosedTimeWindow(SQueryRuntimeEnv *pRuntimeEnv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfClosed = numOfClosedTimeWindow(pWindowResInfo);
|
int32_t numOfClosed = numOfClosedTimeWindow(pWindowResInfo);
|
||||||
clearFirstNTimeWindow(pRuntimeEnv, numOfClosed);
|
clearFirstNWindowRes(pRuntimeEnv, numOfClosed);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfClosedTimeWindow(SWindowResInfo *pWindowResInfo) {
|
int32_t numOfClosedTimeWindow(SWindowResInfo *pWindowResInfo) {
|
||||||
|
|
|
@ -27,16 +27,20 @@ extern "C" {
|
||||||
#define sDebug(...) { if (sDebugFlag & DEBUG_DEBUG) { taosPrintLog("SYN ", sDebugFlag, __VA_ARGS__); }}
|
#define sDebug(...) { if (sDebugFlag & DEBUG_DEBUG) { taosPrintLog("SYN ", sDebugFlag, __VA_ARGS__); }}
|
||||||
#define sTrace(...) { if (sDebugFlag & DEBUG_TRACE) { taosPrintLog("SYN ", sDebugFlag, __VA_ARGS__); }}
|
#define sTrace(...) { if (sDebugFlag & DEBUG_TRACE) { taosPrintLog("SYN ", sDebugFlag, __VA_ARGS__); }}
|
||||||
|
|
||||||
#define TAOS_SMSG_SYNC_DATA 1
|
typedef enum {
|
||||||
#define TAOS_SMSG_FORWARD 2
|
TAOS_SMSG_SYNC_DATA = 1,
|
||||||
#define TAOS_SMSG_FORWARD_RSP 3
|
TAOS_SMSG_FORWARD = 2,
|
||||||
#define TAOS_SMSG_SYNC_REQ 4
|
TAOS_SMSG_FORWARD_RSP = 3,
|
||||||
#define TAOS_SMSG_SYNC_RSP 5
|
TAOS_SMSG_SYNC_REQ = 4,
|
||||||
#define TAOS_SMSG_SYNC_MUST 6
|
TAOS_SMSG_SYNC_RSP = 5,
|
||||||
#define TAOS_SMSG_STATUS 7
|
TAOS_SMSG_SYNC_MUST = 6,
|
||||||
|
TAOS_SMSG_STATUS = 7
|
||||||
|
} ESyncMsgType;
|
||||||
|
|
||||||
#define SYNC_MAX_SIZE (TSDB_MAX_WAL_SIZE + sizeof(SWalHead) + sizeof(SSyncHead) + 16)
|
#define SYNC_MAX_SIZE (TSDB_MAX_WAL_SIZE + sizeof(SWalHead) + sizeof(SSyncHead) + 16)
|
||||||
#define SYNC_RECV_BUFFER_SIZE (5*1024*1024)
|
#define SYNC_RECV_BUFFER_SIZE (5*1024*1024)
|
||||||
|
#define SYNC_FWD_TIMER 300
|
||||||
|
#define SYNC_ROLE_TIMER 10000
|
||||||
|
|
||||||
#define nodeRole pNode->peerInfo[pNode->selfIndex]->role
|
#define nodeRole pNode->peerInfo[pNode->selfIndex]->role
|
||||||
#define nodeVersion pNode->peerInfo[pNode->selfIndex]->version
|
#define nodeVersion pNode->peerInfo[pNode->selfIndex]->version
|
||||||
|
@ -68,6 +72,9 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int8_t role;
|
int8_t role;
|
||||||
int8_t ack;
|
int8_t ack;
|
||||||
|
int8_t type;
|
||||||
|
int8_t reserved[3];
|
||||||
|
uint16_t tranId;
|
||||||
uint64_t version;
|
uint64_t version;
|
||||||
SPeerStatus peersStatus[];
|
SPeerStatus peersStatus[];
|
||||||
} SPeersStatus;
|
} SPeersStatus;
|
||||||
|
@ -120,12 +127,12 @@ typedef struct SsyncPeer {
|
||||||
int32_t nodeId;
|
int32_t nodeId;
|
||||||
uint32_t ip;
|
uint32_t ip;
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
|
int8_t role;
|
||||||
|
int8_t sstatus; // sync status
|
||||||
char fqdn[TSDB_FQDN_LEN]; // peer ip string
|
char fqdn[TSDB_FQDN_LEN]; // peer ip string
|
||||||
char id[TSDB_EP_LEN + 32]; // peer vgId + end point
|
char id[TSDB_EP_LEN + 32]; // peer vgId + end point
|
||||||
int8_t role;
|
|
||||||
int8_t sstatus; // sync status
|
|
||||||
uint64_t version;
|
uint64_t version;
|
||||||
uint64_t sversion; // track the peer version in retrieve process
|
uint64_t sversion; // track the peer version in retrieve process
|
||||||
int32_t syncFd;
|
int32_t syncFd;
|
||||||
int32_t peerFd; // forward FD
|
int32_t peerFd; // forward FD
|
||||||
int32_t numOfRetrieves; // number of retrieves tried
|
int32_t numOfRetrieves; // number of retrieves tried
|
||||||
|
@ -135,7 +142,7 @@ typedef struct SsyncPeer {
|
||||||
int32_t notifyFd;
|
int32_t notifyFd;
|
||||||
int32_t watchNum;
|
int32_t watchNum;
|
||||||
int32_t *watchFd;
|
int32_t *watchFd;
|
||||||
int8_t refCount; // reference count
|
int32_t refCount; // reference count
|
||||||
struct SSyncNode *pSyncNode;
|
struct SSyncNode *pSyncNode;
|
||||||
} SSyncPeer;
|
} SSyncPeer;
|
||||||
|
|
||||||
|
@ -143,16 +150,16 @@ typedef struct SSyncNode {
|
||||||
char path[TSDB_FILENAME_LEN];
|
char path[TSDB_FILENAME_LEN];
|
||||||
int8_t replica;
|
int8_t replica;
|
||||||
int8_t quorum;
|
int8_t quorum;
|
||||||
|
int8_t selfIndex;
|
||||||
uint32_t vgId;
|
uint32_t vgId;
|
||||||
int64_t rid;
|
int64_t rid;
|
||||||
void *ahandle;
|
void *ahandle;
|
||||||
int8_t selfIndex;
|
|
||||||
SSyncPeer *peerInfo[TAOS_SYNC_MAX_REPLICA+1]; // extra one for arbitrator
|
SSyncPeer *peerInfo[TAOS_SYNC_MAX_REPLICA+1]; // extra one for arbitrator
|
||||||
SSyncPeer *pMaster;
|
SSyncPeer *pMaster;
|
||||||
int8_t refCount;
|
|
||||||
SRecvBuffer *pRecv;
|
SRecvBuffer *pRecv;
|
||||||
SSyncFwds *pSyncFwds; // saved forward info if quorum >1
|
SSyncFwds *pSyncFwds; // saved forward info if quorum >1
|
||||||
void *pFwdTimer;
|
void *pFwdTimer;
|
||||||
|
void *pRoleTimer;
|
||||||
FGetFileInfo getFileInfo;
|
FGetFileInfo getFileInfo;
|
||||||
FGetWalInfo getWalInfo;
|
FGetWalInfo getWalInfo;
|
||||||
FWriteToCache writeToCache;
|
FWriteToCache writeToCache;
|
||||||
|
|
|
@ -13,8 +13,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//#include <stdint.h>
|
#define _DEFAULT_SOURCE
|
||||||
//#include <stdbool.h>
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
|
@ -50,7 +49,7 @@ static int32_t tsSyncRefId = -1;
|
||||||
static void syncProcessSyncRequest(char *pMsg, SSyncPeer *pPeer);
|
static void syncProcessSyncRequest(char *pMsg, SSyncPeer *pPeer);
|
||||||
static void syncRecoverFromMaster(SSyncPeer *pPeer);
|
static void syncRecoverFromMaster(SSyncPeer *pPeer);
|
||||||
static void syncCheckPeerConnection(void *param, void *tmrId);
|
static void syncCheckPeerConnection(void *param, void *tmrId);
|
||||||
static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack);
|
static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack, int8_t type, uint16_t tranId);
|
||||||
static void syncProcessBrokenLink(void *param);
|
static void syncProcessBrokenLink(void *param);
|
||||||
static int32_t syncProcessPeerMsg(void *param, void *buffer);
|
static int32_t syncProcessPeerMsg(void *param, void *buffer);
|
||||||
static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp);
|
static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp);
|
||||||
|
@ -59,6 +58,7 @@ static void syncAddArbitrator(SSyncNode *pNode);
|
||||||
static void syncFreeNode(void *);
|
static void syncFreeNode(void *);
|
||||||
static void syncRemoveConfirmedFwdInfo(SSyncNode *pNode);
|
static void syncRemoveConfirmedFwdInfo(SSyncNode *pNode);
|
||||||
static void syncMonitorFwdInfos(void *param, void *tmrId);
|
static void syncMonitorFwdInfos(void *param, void *tmrId);
|
||||||
|
static void syncMonitorNodeRole(void *param, void *tmrId);
|
||||||
static void syncProcessFwdAck(SSyncNode *pNode, SFwdInfo *pFwdInfo, int32_t code);
|
static void syncProcessFwdAck(SSyncNode *pNode, SFwdInfo *pFwdInfo, int32_t code);
|
||||||
static void syncSaveFwdInfo(SSyncNode *pNode, uint64_t version, void *mhandle);
|
static void syncSaveFwdInfo(SSyncNode *pNode, uint64_t version, void *mhandle);
|
||||||
static void syncRestartPeer(SSyncPeer *pPeer);
|
static void syncRestartPeer(SSyncPeer *pPeer);
|
||||||
|
@ -73,6 +73,32 @@ char* syncRole[] = {
|
||||||
"master"
|
"master"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SYNC_STATUS_BROADCAST,
|
||||||
|
SYNC_STATUS_BROADCAST_RSP,
|
||||||
|
SYNC_STATUS_SETUP_CONN,
|
||||||
|
SYNC_STATUS_SETUP_CONN_RSP,
|
||||||
|
SYNC_STATUS_EXCHANGE_DATA,
|
||||||
|
SYNC_STATUS_EXCHANGE_DATA_RSP,
|
||||||
|
SYNC_STATUS_CHECK_ROLE,
|
||||||
|
SYNC_STATUS_CHECK_ROLE_RSP
|
||||||
|
} ESyncStatusType;
|
||||||
|
|
||||||
|
char *statusType[] = {
|
||||||
|
"broadcast",
|
||||||
|
"broadcast-rsp",
|
||||||
|
"setup-conn",
|
||||||
|
"setup-conn-rsp",
|
||||||
|
"exchange-data",
|
||||||
|
"exchange-data-rsp",
|
||||||
|
"check-role",
|
||||||
|
"check-role-rsp"
|
||||||
|
};
|
||||||
|
|
||||||
|
uint16_t syncGenTranId() {
|
||||||
|
return taosRand() & 0XFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t syncInit() {
|
int32_t syncInit() {
|
||||||
SPoolInfo info;
|
SPoolInfo info;
|
||||||
|
|
||||||
|
@ -145,7 +171,7 @@ void syncCleanUp() {
|
||||||
int64_t syncStart(const SSyncInfo *pInfo) {
|
int64_t syncStart(const SSyncInfo *pInfo) {
|
||||||
const SSyncCfg *pCfg = &pInfo->syncCfg;
|
const SSyncCfg *pCfg = &pInfo->syncCfg;
|
||||||
|
|
||||||
SSyncNode *pNode = (SSyncNode *)calloc(sizeof(SSyncNode), 1);
|
SSyncNode *pNode = calloc(sizeof(SSyncNode), 1);
|
||||||
if (pNode == NULL) {
|
if (pNode == NULL) {
|
||||||
sError("no memory to allocate syncNode");
|
sError("no memory to allocate syncNode");
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
@ -180,8 +206,8 @@ int64_t syncStart(const SSyncInfo *pInfo) {
|
||||||
const SNodeInfo *pNodeInfo = pCfg->nodeInfo + i;
|
const SNodeInfo *pNodeInfo = pCfg->nodeInfo + i;
|
||||||
pNode->peerInfo[i] = syncAddPeer(pNode, pNodeInfo);
|
pNode->peerInfo[i] = syncAddPeer(pNode, pNodeInfo);
|
||||||
if (pNode->peerInfo[i] == NULL) {
|
if (pNode->peerInfo[i] == NULL) {
|
||||||
sError("vgId:%d, node:%d fqdn:%s port:%u is not configured, stop taosd", pNode->vgId, pNodeInfo->nodeId, pNodeInfo->nodeFqdn,
|
sError("vgId:%d, node:%d fqdn:%s port:%u is not configured, stop taosd", pNode->vgId, pNodeInfo->nodeId,
|
||||||
pNodeInfo->nodePort);
|
pNodeInfo->nodeFqdn, pNodeInfo->nodePort);
|
||||||
syncStop(pNode->rid);
|
syncStop(pNode->rid);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -211,9 +237,16 @@ int64_t syncStart(const SSyncInfo *pInfo) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pNode->pFwdTimer = taosTmrStart(syncMonitorFwdInfos, 300, (void *)pNode->rid, tsSyncTmrCtrl);
|
pNode->pFwdTimer = taosTmrStart(syncMonitorFwdInfos, SYNC_FWD_TIMER, (void *)pNode->rid, tsSyncTmrCtrl);
|
||||||
if (pNode->pFwdTimer == NULL) {
|
if (pNode->pFwdTimer == NULL) {
|
||||||
sError("vgId:%d, failed to allocate timer", pNode->vgId);
|
sError("vgId:%d, failed to allocate fwd timer", pNode->vgId);
|
||||||
|
syncStop(pNode->rid);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pNode->pRoleTimer = taosTmrStart(syncMonitorNodeRole, SYNC_ROLE_TIMER, (void *)pNode->rid, tsSyncTmrCtrl);
|
||||||
|
if (pNode->pRoleTimer == NULL) {
|
||||||
|
sError("vgId:%d, failed to allocate role timer", pNode->vgId);
|
||||||
syncStop(pNode->rid);
|
syncStop(pNode->rid);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -240,6 +273,7 @@ void syncStop(int64_t rid) {
|
||||||
|
|
||||||
if (tsVgIdHash) taosHashRemove(tsVgIdHash, (const char *)&pNode->vgId, sizeof(int32_t));
|
if (tsVgIdHash) taosHashRemove(tsVgIdHash, (const char *)&pNode->vgId, sizeof(int32_t));
|
||||||
if (pNode->pFwdTimer) taosTmrStop(pNode->pFwdTimer);
|
if (pNode->pFwdTimer) taosTmrStop(pNode->pFwdTimer);
|
||||||
|
if (pNode->pRoleTimer) taosTmrStop(pNode->pRoleTimer);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pNode->replica; ++i) {
|
for (int32_t i = 0; i < pNode->replica; ++i) {
|
||||||
pPeer = pNode->peerInfo[i];
|
pPeer = pNode->peerInfo[i];
|
||||||
|
@ -319,12 +353,10 @@ int32_t syncReconfig(int64_t rid, const SSyncCfg *pNewCfg) {
|
||||||
|
|
||||||
pthread_mutex_unlock(&(pNode->mutex));
|
pthread_mutex_unlock(&(pNode->mutex));
|
||||||
|
|
||||||
sInfo("vgId:%d, %d replicas are configured, quorum:%d role:%s", pNode->vgId, pNode->replica, pNode->quorum,
|
sInfo("vgId:%d, %d replicas are configured, quorum:%d", pNode->vgId, pNode->replica, pNode->quorum);
|
||||||
syncRole[nodeRole]);
|
|
||||||
syncBroadcastStatus(pNode);
|
syncBroadcastStatus(pNode);
|
||||||
|
|
||||||
taosReleaseRef(tsSyncRefId, rid);
|
taosReleaseRef(tsSyncRefId, rid);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -356,10 +388,10 @@ void syncConfirmForward(int64_t rid, uint64_t version, int32_t code) {
|
||||||
pFwdRsp->code = code;
|
pFwdRsp->code = code;
|
||||||
|
|
||||||
int32_t msgLen = sizeof(SSyncHead) + sizeof(SFwdRsp);
|
int32_t msgLen = sizeof(SSyncHead) + sizeof(SFwdRsp);
|
||||||
int32_t retLen = write(pPeer->peerFd, msg, msgLen);
|
int32_t retLen = taosWriteMsg(pPeer->peerFd, msg, msgLen);
|
||||||
|
|
||||||
if (retLen == msgLen) {
|
if (retLen == msgLen) {
|
||||||
sDebug("%s, forward-rsp is sent, code:%x hver:%" PRIu64, pPeer->id, code, version);
|
sTrace("%s, forward-rsp is sent, code:%x hver:%" PRIu64, pPeer->id, code, version);
|
||||||
} else {
|
} else {
|
||||||
sDebug("%s, failed to send forward ack, restart", pPeer->id);
|
sDebug("%s, failed to send forward ack, restart", pPeer->id);
|
||||||
syncRestartConnection(pPeer);
|
syncRestartConnection(pPeer);
|
||||||
|
@ -369,6 +401,7 @@ void syncConfirmForward(int64_t rid, uint64_t version, int32_t code) {
|
||||||
taosReleaseRef(tsSyncRefId, rid);
|
taosReleaseRef(tsSyncRefId, rid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
void syncRecover(int64_t rid) {
|
void syncRecover(int64_t rid) {
|
||||||
SSyncPeer *pPeer;
|
SSyncPeer *pPeer;
|
||||||
|
|
||||||
|
@ -385,7 +418,7 @@ void syncRecover(int64_t rid) {
|
||||||
pthread_mutex_lock(&(pNode->mutex));
|
pthread_mutex_lock(&(pNode->mutex));
|
||||||
|
|
||||||
for (int32_t i = 0; i < pNode->replica; ++i) {
|
for (int32_t i = 0; i < pNode->replica; ++i) {
|
||||||
pPeer = (SSyncPeer *)pNode->peerInfo[i];
|
pPeer = pNode->peerInfo[i];
|
||||||
if (pPeer->peerFd >= 0) {
|
if (pPeer->peerFd >= 0) {
|
||||||
syncRestartConnection(pPeer);
|
syncRestartConnection(pPeer);
|
||||||
}
|
}
|
||||||
|
@ -395,6 +428,7 @@ void syncRecover(int64_t rid) {
|
||||||
|
|
||||||
taosReleaseRef(tsSyncRefId, rid);
|
taosReleaseRef(tsSyncRefId, rid);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int32_t syncGetNodesRole(int64_t rid, SNodesRole *pNodesRole) {
|
int32_t syncGetNodesRole(int64_t rid, SNodesRole *pNodesRole) {
|
||||||
SSyncNode *pNode = taosAcquireRef(tsSyncRefId, rid);
|
SSyncNode *pNode = taosAcquireRef(tsSyncRefId, rid);
|
||||||
|
@ -449,10 +483,10 @@ static void syncFreeNode(void *param) {
|
||||||
tfree(pNode);
|
tfree(pNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncAddPeerRef(SSyncPeer *pPeer) { atomic_add_fetch_8(&pPeer->refCount, 1); }
|
void syncAddPeerRef(SSyncPeer *pPeer) { atomic_add_fetch_32(&pPeer->refCount, 1); }
|
||||||
|
|
||||||
int32_t syncDecPeerRef(SSyncPeer *pPeer) {
|
int32_t syncDecPeerRef(SSyncPeer *pPeer) {
|
||||||
if (atomic_sub_fetch_8(&pPeer->refCount, 1) == 0) {
|
if (atomic_sub_fetch_32(&pPeer->refCount, 1) == 0) {
|
||||||
taosReleaseRef(tsSyncRefId, pPeer->pSyncNode->rid);
|
taosReleaseRef(tsSyncRefId, pPeer->pSyncNode->rid);
|
||||||
|
|
||||||
sDebug("%s, resource is freed", pPeer->id);
|
sDebug("%s, resource is freed", pPeer->id);
|
||||||
|
@ -510,7 +544,7 @@ static SSyncPeer *syncAddPeer(SSyncNode *pNode, const SNodeInfo *pInfo) {
|
||||||
if (pPeer->nodeId == 0 || (ret > 0) || (ret == 0 && pPeer->port > tsSyncPort)) {
|
if (pPeer->nodeId == 0 || (ret > 0) || (ret == 0 && pPeer->port > tsSyncPort)) {
|
||||||
int32_t checkMs = 100 + (pNode->vgId * 10) % 100;
|
int32_t checkMs = 100 + (pNode->vgId * 10) % 100;
|
||||||
if (pNode->vgId > 1) checkMs = tsStatusInterval * 1000 + checkMs;
|
if (pNode->vgId > 1) checkMs = tsStatusInterval * 1000 + checkMs;
|
||||||
sDebug("%s, start to check peer connection after %d ms", pPeer->id, checkMs);
|
sDebug("%s, check peer connection after %d ms", pPeer->id, checkMs);
|
||||||
taosTmrReset(syncCheckPeerConnection, checkMs, pPeer, tsSyncTmrCtrl, &pPeer->timer);
|
taosTmrReset(syncCheckPeerConnection, checkMs, pPeer, tsSyncTmrCtrl, &pPeer->timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -524,7 +558,7 @@ void syncBroadcastStatus(SSyncNode *pNode) {
|
||||||
for (int32_t i = 0; i < pNode->replica; ++i) {
|
for (int32_t i = 0; i < pNode->replica; ++i) {
|
||||||
if (i == pNode->selfIndex) continue;
|
if (i == pNode->selfIndex) continue;
|
||||||
pPeer = pNode->peerInfo[i];
|
pPeer = pNode->peerInfo[i];
|
||||||
syncSendPeersStatusMsgToPeer(pPeer, 1);
|
syncSendPeersStatusMsgToPeer(pPeer, 1, SYNC_STATUS_BROADCAST, syncGenTranId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -544,8 +578,6 @@ static void syncChooseMaster(SSyncNode *pNode) {
|
||||||
int32_t index = -1;
|
int32_t index = -1;
|
||||||
int32_t replica = pNode->replica;
|
int32_t replica = pNode->replica;
|
||||||
|
|
||||||
sDebug("vgId:%d, choose master", pNode->vgId);
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pNode->replica; ++i) {
|
for (int32_t i = 0; i < pNode->replica; ++i) {
|
||||||
if (pNode->peerInfo[i]->role != TAOS_SYNC_ROLE_OFFLINE) {
|
if (pNode->peerInfo[i]->role != TAOS_SYNC_ROLE_OFFLINE) {
|
||||||
onlineNum++;
|
onlineNum++;
|
||||||
|
@ -611,11 +643,11 @@ static void syncChooseMaster(SSyncNode *pNode) {
|
||||||
|
|
||||||
static SSyncPeer *syncCheckMaster(SSyncNode *pNode) {
|
static SSyncPeer *syncCheckMaster(SSyncNode *pNode) {
|
||||||
int32_t onlineNum = 0;
|
int32_t onlineNum = 0;
|
||||||
int32_t index = -1;
|
int32_t masterIndex = -1;
|
||||||
int32_t replica = pNode->replica;
|
int32_t replica = pNode->replica;
|
||||||
|
|
||||||
for (int32_t i = 0; i < pNode->replica; ++i) {
|
for (int32_t index = 0; index < pNode->replica; ++index) {
|
||||||
if (pNode->peerInfo[i]->role != TAOS_SYNC_ROLE_OFFLINE) {
|
if (pNode->peerInfo[index]->role != TAOS_SYNC_ROLE_OFFLINE) {
|
||||||
onlineNum++;
|
onlineNum++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -630,18 +662,17 @@ static SSyncPeer *syncCheckMaster(SSyncNode *pNode) {
|
||||||
if (onlineNum <= replica * 0.5) {
|
if (onlineNum <= replica * 0.5) {
|
||||||
if (nodeRole != TAOS_SYNC_ROLE_UNSYNCED) {
|
if (nodeRole != TAOS_SYNC_ROLE_UNSYNCED) {
|
||||||
nodeRole = TAOS_SYNC_ROLE_UNSYNCED;
|
nodeRole = TAOS_SYNC_ROLE_UNSYNCED;
|
||||||
// pNode->peerInfo[pNode->selfIndex]->role = nodeRole;
|
|
||||||
(*pNode->notifyRole)(pNode->ahandle, nodeRole);
|
(*pNode->notifyRole)(pNode->ahandle, nodeRole);
|
||||||
sInfo("vgId:%d, change to unsynced state, online:%d replica:%d", pNode->vgId, onlineNum, replica);
|
sInfo("vgId:%d, self change to unsynced state, online:%d replica:%d", pNode->vgId, onlineNum, replica);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int32_t i = 0; i < pNode->replica; ++i) {
|
for (int32_t index = 0; index < pNode->replica; ++index) {
|
||||||
SSyncPeer *pTemp = pNode->peerInfo[i];
|
SSyncPeer *pTemp = pNode->peerInfo[index];
|
||||||
if (pTemp->role != TAOS_SYNC_ROLE_MASTER) continue;
|
if (pTemp->role != TAOS_SYNC_ROLE_MASTER) continue;
|
||||||
if (index < 0) {
|
if (masterIndex < 0) {
|
||||||
index = i;
|
masterIndex = index;
|
||||||
} else { // multiple masters, it shall not happen
|
} else { // multiple masters, it shall not happen
|
||||||
if (i == pNode->selfIndex) {
|
if (masterIndex == pNode->selfIndex) {
|
||||||
sError("%s, peer is master, work as slave instead", pTemp->id);
|
sError("%s, peer is master, work as slave instead", pTemp->id);
|
||||||
nodeRole = TAOS_SYNC_ROLE_SLAVE;
|
nodeRole = TAOS_SYNC_ROLE_SLAVE;
|
||||||
(*pNode->notifyRole)(pNode->ahandle, nodeRole);
|
(*pNode->notifyRole)(pNode->ahandle, nodeRole);
|
||||||
|
@ -650,77 +681,80 @@ static SSyncPeer *syncCheckMaster(SSyncNode *pNode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SSyncPeer *pMaster = (index >= 0) ? pNode->peerInfo[index] : NULL;
|
SSyncPeer *pMaster = (masterIndex >= 0) ? pNode->peerInfo[masterIndex] : NULL;
|
||||||
return pMaster;
|
return pMaster;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t syncValidateMaster(SSyncPeer *pPeer) {
|
static int32_t syncValidateMaster(SSyncPeer *pPeer) {
|
||||||
SSyncNode *pNode = pPeer->pSyncNode;
|
SSyncNode *pNode = pPeer->pSyncNode;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (nodeRole == TAOS_SYNC_ROLE_MASTER && nodeVersion < pPeer->version) {
|
if (nodeRole == TAOS_SYNC_ROLE_MASTER && nodeVersion < pPeer->version) {
|
||||||
sDebug("%s, slave has higher version, restart all connections!!!", pPeer->id);
|
sDebug("%s, peer has higher sver:%" PRIu64 ", restart all peer connections", pPeer->id, pPeer->version);
|
||||||
nodeRole = TAOS_SYNC_ROLE_UNSYNCED;
|
nodeRole = TAOS_SYNC_ROLE_UNSYNCED;
|
||||||
(*pNode->notifyRole)(pNode->ahandle, nodeRole);
|
(*pNode->notifyRole)(pNode->ahandle, nodeRole);
|
||||||
code = -1;
|
code = -1;
|
||||||
|
|
||||||
for (int32_t i = 0; i < pNode->replica; ++i) {
|
for (int32_t index = 0; index < pNode->replica; ++index) {
|
||||||
if (i == pNode->selfIndex) continue;
|
if (index == pNode->selfIndex) continue;
|
||||||
syncRestartPeer(pNode->peerInfo[i]);
|
syncRestartPeer(pNode->peerInfo[index]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void syncCheckRole(SSyncPeer *pPeer, SPeerStatus peersStatus[], int8_t newRole) {
|
static void syncCheckRole(SSyncPeer *pPeer, SPeerStatus* peersStatus, int8_t newPeerRole) {
|
||||||
SSyncNode *pNode = pPeer->pSyncNode;
|
SSyncNode *pNode = pPeer->pSyncNode;
|
||||||
int8_t peerOldRole = pPeer->role;
|
int8_t oldPeerRole = pPeer->role;
|
||||||
int8_t selfOldRole = nodeRole;
|
int8_t oldSelfRole = nodeRole;
|
||||||
int8_t i, syncRequired = 0;
|
int8_t syncRequired = 0;
|
||||||
|
|
||||||
// pNode->peerInfo[pNode->selfIndex]->version = nodeVersion;
|
pPeer->role = newPeerRole;
|
||||||
pPeer->role = newRole;
|
sDebug("%s, peer role:%s change to %s", pPeer->id, syncRole[oldPeerRole], syncRole[newPeerRole]);
|
||||||
|
|
||||||
sDebug("%s, own role:%s, new peer role:%s", pPeer->id, syncRole[nodeRole], syncRole[pPeer->role]);
|
|
||||||
|
|
||||||
SSyncPeer *pMaster = syncCheckMaster(pNode);
|
SSyncPeer *pMaster = syncCheckMaster(pNode);
|
||||||
|
|
||||||
if (pMaster) {
|
if (pMaster) {
|
||||||
// master is there
|
// master is there
|
||||||
pNode->pMaster = pMaster;
|
pNode->pMaster = pMaster;
|
||||||
sDebug("%s, it is the master, ver:%" PRIu64, pMaster->id, pMaster->version);
|
sDebug("%s, it is the master, sver:%" PRIu64, pMaster->id, pMaster->version);
|
||||||
|
|
||||||
if (syncValidateMaster(pPeer) < 0) return;
|
if (syncValidateMaster(pPeer) < 0) return;
|
||||||
|
|
||||||
if (nodeRole == TAOS_SYNC_ROLE_UNSYNCED) {
|
if (nodeRole == TAOS_SYNC_ROLE_UNSYNCED) {
|
||||||
if (nodeVersion < pMaster->version) {
|
if (nodeVersion < pMaster->version) {
|
||||||
|
sDebug("%s, is master, sync required, self sver:%" PRIu64, pMaster->id, nodeVersion);
|
||||||
syncRequired = 1;
|
syncRequired = 1;
|
||||||
} else {
|
} else {
|
||||||
sInfo("%s is master, work as slave, ver:%" PRIu64, pMaster->id, pMaster->version);
|
sInfo("%s, is master, work as slave, self sver:%" PRIu64, pMaster->id, nodeVersion);
|
||||||
nodeRole = TAOS_SYNC_ROLE_SLAVE;
|
nodeRole = TAOS_SYNC_ROLE_SLAVE;
|
||||||
(*pNode->notifyRole)(pNode->ahandle, nodeRole);
|
(*pNode->notifyRole)(pNode->ahandle, nodeRole);
|
||||||
}
|
}
|
||||||
} else if (nodeRole == TAOS_SYNC_ROLE_SLAVE && pMaster == pPeer) {
|
} else if (nodeRole == TAOS_SYNC_ROLE_SLAVE && pMaster == pPeer) {
|
||||||
// nodeVersion = pMaster->version;
|
sDebug("%s, is master, continue work as slave, self sver:%" PRIu64, pMaster->id, nodeVersion);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// master not there, if all peer's state and version are consistent, choose the master
|
// master not there, if all peer's state and version are consistent, choose the master
|
||||||
int32_t consistent = 0;
|
int32_t consistent = 0;
|
||||||
if (peersStatus) {
|
int32_t index = 0;
|
||||||
for (i = 0; i < pNode->replica; ++i) {
|
if (peersStatus != NULL) {
|
||||||
SSyncPeer *pTemp = pNode->peerInfo[i];
|
for (index = 0; index < pNode->replica; ++index) {
|
||||||
if (pTemp->role != peersStatus[i].role) break;
|
SSyncPeer *pTemp = pNode->peerInfo[index];
|
||||||
if ((pTemp->role != TAOS_SYNC_ROLE_OFFLINE) && (pTemp->version != peersStatus[i].version)) break;
|
if (pTemp->role != peersStatus[index].role) break;
|
||||||
|
if ((pTemp->role != TAOS_SYNC_ROLE_OFFLINE) && (pTemp->version != peersStatus[index].version)) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i >= pNode->replica) consistent = 1;
|
if (index >= pNode->replica) consistent = 1;
|
||||||
} else {
|
} else {
|
||||||
if (pNode->replica == 2) consistent = 1;
|
if (pNode->replica == 2) consistent = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (consistent) {
|
if (consistent) {
|
||||||
|
sDebug("vgId:%d, choose master", pNode->vgId);
|
||||||
syncChooseMaster(pNode);
|
syncChooseMaster(pNode);
|
||||||
|
} else {
|
||||||
|
sDebug("vgId:%d, version inconsistent, cannot choose master", pNode->vgId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -728,7 +762,8 @@ static void syncCheckRole(SSyncPeer *pPeer, SPeerStatus peersStatus[], int8_t ne
|
||||||
syncRecoverFromMaster(pMaster);
|
syncRecoverFromMaster(pMaster);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (peerOldRole != newRole || nodeRole != selfOldRole) {
|
if (oldPeerRole != newPeerRole || nodeRole != oldSelfRole) {
|
||||||
|
sDebug("vgId:%d, roles changed, broadcast status", pNode->vgId);
|
||||||
syncBroadcastStatus(pNode);
|
syncBroadcastStatus(pNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -738,7 +773,7 @@ static void syncCheckRole(SSyncPeer *pPeer, SPeerStatus peersStatus[], int8_t ne
|
||||||
}
|
}
|
||||||
|
|
||||||
static void syncRestartPeer(SSyncPeer *pPeer) {
|
static void syncRestartPeer(SSyncPeer *pPeer) {
|
||||||
sDebug("%s, restart connection", pPeer->id);
|
sDebug("%s, restart peer connection", pPeer->id);
|
||||||
|
|
||||||
syncClosePeerConn(pPeer);
|
syncClosePeerConn(pPeer);
|
||||||
|
|
||||||
|
@ -746,6 +781,7 @@ static void syncRestartPeer(SSyncPeer *pPeer) {
|
||||||
|
|
||||||
int32_t ret = strcmp(pPeer->fqdn, tsNodeFqdn);
|
int32_t ret = strcmp(pPeer->fqdn, tsNodeFqdn);
|
||||||
if (ret > 0 || (ret == 0 && pPeer->port > tsSyncPort)) {
|
if (ret > 0 || (ret == 0 && pPeer->port > tsSyncPort)) {
|
||||||
|
sDebug("%s, check peer connection in 1000 ms", pPeer->id);
|
||||||
taosTmrReset(syncCheckPeerConnection, tsSyncTimer * 1000, pPeer, tsSyncTmrCtrl, &pPeer->timer);
|
taosTmrReset(syncCheckPeerConnection, tsSyncTimer * 1000, pPeer, tsSyncTmrCtrl, &pPeer->timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -784,7 +820,7 @@ static void syncProcessSyncRequest(char *msg, SSyncPeer *pPeer) {
|
||||||
pthread_attr_destroy(&thattr);
|
pthread_attr_destroy(&thattr);
|
||||||
|
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
sError("%s, failed to create sync thread(%s)", pPeer->id, strerror(errno));
|
sError("%s, failed to create sync thread since %s", pPeer->id, strerror(errno));
|
||||||
syncDecPeerRef(pPeer);
|
syncDecPeerRef(pPeer);
|
||||||
} else {
|
} else {
|
||||||
pPeer->sstatus = TAOS_SYNC_STATUS_START;
|
pPeer->sstatus = TAOS_SYNC_STATUS_START;
|
||||||
|
@ -840,7 +876,7 @@ static void syncRecoverFromMaster(SSyncPeer *pPeer) {
|
||||||
firstPkt.port = tsSyncPort;
|
firstPkt.port = tsSyncPort;
|
||||||
taosTmrReset(syncNotStarted, tsSyncTimer * 1000, pPeer, tsSyncTmrCtrl, &pPeer->timer);
|
taosTmrReset(syncNotStarted, tsSyncTimer * 1000, pPeer, tsSyncTmrCtrl, &pPeer->timer);
|
||||||
|
|
||||||
if (write(pPeer->peerFd, &firstPkt, sizeof(firstPkt)) != sizeof(firstPkt)) {
|
if (taosWriteMsg(pPeer->peerFd, &firstPkt, sizeof(firstPkt)) != sizeof(firstPkt)) {
|
||||||
sError("%s, failed to send sync-req to peer", pPeer->id);
|
sError("%s, failed to send sync-req to peer", pPeer->id);
|
||||||
} else {
|
} else {
|
||||||
nodeSStatus = TAOS_SYNC_STATUS_START;
|
nodeSStatus = TAOS_SYNC_STATUS_START;
|
||||||
|
@ -854,7 +890,7 @@ static void syncProcessFwdResponse(char *cont, SSyncPeer *pPeer) {
|
||||||
SSyncFwds *pSyncFwds = pNode->pSyncFwds;
|
SSyncFwds *pSyncFwds = pNode->pSyncFwds;
|
||||||
SFwdInfo * pFwdInfo;
|
SFwdInfo * pFwdInfo;
|
||||||
|
|
||||||
sDebug("%s, forward-rsp is received, code:%x ver:%" PRIu64, pPeer->id, pFwdRsp->code, pFwdRsp->version);
|
sTrace("%s, forward-rsp is received, code:%x hver:%" PRIu64, pPeer->id, pFwdRsp->code, pFwdRsp->version);
|
||||||
SFwdInfo *pFirst = pSyncFwds->fwdInfo + pSyncFwds->first;
|
SFwdInfo *pFirst = pSyncFwds->fwdInfo + pSyncFwds->first;
|
||||||
|
|
||||||
if (pFirst->version <= pFwdRsp->version && pSyncFwds->fwds > 0) {
|
if (pFirst->version <= pFwdRsp->version && pSyncFwds->fwds > 0) {
|
||||||
|
@ -873,7 +909,7 @@ static void syncProcessForwardFromPeer(char *cont, SSyncPeer *pPeer) {
|
||||||
SSyncNode *pNode = pPeer->pSyncNode;
|
SSyncNode *pNode = pPeer->pSyncNode;
|
||||||
SWalHead * pHead = (SWalHead *)cont;
|
SWalHead * pHead = (SWalHead *)cont;
|
||||||
|
|
||||||
sDebug("%s, forward is received, hver:%" PRIu64 ", len:%d", pPeer->id, pHead->version, pHead->len);
|
sTrace("%s, forward is received, hver:%" PRIu64 ", len:%d", pPeer->id, pHead->version, pHead->len);
|
||||||
|
|
||||||
if (nodeRole == TAOS_SYNC_ROLE_SLAVE) {
|
if (nodeRole == TAOS_SYNC_ROLE_SLAVE) {
|
||||||
// nodeVersion = pHead->version;
|
// nodeVersion = pHead->version;
|
||||||
|
@ -891,14 +927,14 @@ static void syncProcessPeersStatusMsg(char *cont, SSyncPeer *pPeer) {
|
||||||
SSyncNode * pNode = pPeer->pSyncNode;
|
SSyncNode * pNode = pPeer->pSyncNode;
|
||||||
SPeersStatus *pPeersStatus = (SPeersStatus *)cont;
|
SPeersStatus *pPeersStatus = (SPeersStatus *)cont;
|
||||||
|
|
||||||
sDebug("%s, status msg is received, self:%s ver:%" PRIu64 " peer:%s ver:%" PRIu64 ", ack:%d", pPeer->id,
|
sDebug("%s, status msg is received, self:%s sver:%" PRIu64 " peer:%s sver:%" PRIu64 ", ack:%d tranId:%u type:%s", pPeer->id,
|
||||||
syncRole[nodeRole], nodeVersion, syncRole[pPeersStatus->role], pPeersStatus->version, pPeersStatus->ack);
|
syncRole[nodeRole], nodeVersion, syncRole[pPeersStatus->role], pPeersStatus->version, pPeersStatus->ack, pPeersStatus->tranId, statusType[pPeersStatus->type]);
|
||||||
|
|
||||||
pPeer->version = pPeersStatus->version;
|
pPeer->version = pPeersStatus->version;
|
||||||
syncCheckRole(pPeer, pPeersStatus->peersStatus, pPeersStatus->role);
|
syncCheckRole(pPeer, pPeersStatus->peersStatus, pPeersStatus->role);
|
||||||
|
|
||||||
if (pPeersStatus->ack) {
|
if (pPeersStatus->ack) {
|
||||||
syncSendPeersStatusMsgToPeer(pPeer, 0);
|
syncSendPeersStatusMsgToPeer(pPeer, 0, pPeersStatus->type + 1, pPeersStatus->tranId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -956,7 +992,7 @@ static int32_t syncProcessPeerMsg(void *param, void *buffer) {
|
||||||
|
|
||||||
#define statusMsgLen sizeof(SSyncHead) + sizeof(SPeersStatus) + sizeof(SPeerStatus) * TAOS_SYNC_MAX_REPLICA
|
#define statusMsgLen sizeof(SSyncHead) + sizeof(SPeersStatus) + sizeof(SPeerStatus) * TAOS_SYNC_MAX_REPLICA
|
||||||
|
|
||||||
static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack) {
|
static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack, int8_t type, uint16_t tranId) {
|
||||||
SSyncNode *pNode = pPeer->pSyncNode;
|
SSyncNode *pNode = pPeer->pSyncNode;
|
||||||
char msg[statusMsgLen] = {0};
|
char msg[statusMsgLen] = {0};
|
||||||
|
|
||||||
|
@ -971,22 +1007,22 @@ static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack) {
|
||||||
pPeersStatus->version = nodeVersion;
|
pPeersStatus->version = nodeVersion;
|
||||||
pPeersStatus->role = nodeRole;
|
pPeersStatus->role = nodeRole;
|
||||||
pPeersStatus->ack = ack;
|
pPeersStatus->ack = ack;
|
||||||
|
pPeersStatus->type = type;
|
||||||
|
pPeersStatus->tranId = tranId;
|
||||||
|
|
||||||
for (int32_t i = 0; i < pNode->replica; ++i) {
|
for (int32_t i = 0; i < pNode->replica; ++i) {
|
||||||
pPeersStatus->peersStatus[i].role = pNode->peerInfo[i]->role;
|
pPeersStatus->peersStatus[i].role = pNode->peerInfo[i]->role;
|
||||||
pPeersStatus->peersStatus[i].version = pNode->peerInfo[i]->version;
|
pPeersStatus->peersStatus[i].version = pNode->peerInfo[i]->version;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t retLen = write(pPeer->peerFd, msg, statusMsgLen);
|
int32_t retLen = taosWriteMsg(pPeer->peerFd, msg, statusMsgLen);
|
||||||
if (retLen == statusMsgLen) {
|
if (retLen == statusMsgLen) {
|
||||||
sDebug("%s, status msg is sent, self:%s ver:%" PRIu64 ", ack:%d", pPeer->id, syncRole[pPeersStatus->role],
|
sDebug("%s, status msg is sent, self:%s sver:%" PRIu64 ", ack:%d tranId:%u type:%s", pPeer->id, syncRole[pPeersStatus->role],
|
||||||
pPeersStatus->version, pPeersStatus->ack);
|
pPeersStatus->version, pPeersStatus->ack, pPeersStatus->tranId, statusType[pPeersStatus->type]);
|
||||||
} else {
|
} else {
|
||||||
sDebug("%s, failed to send status msg, restart", pPeer->id);
|
sDebug("%s, failed to send status msg, restart", pPeer->id);
|
||||||
syncRestartConnection(pPeer);
|
syncRestartConnection(pPeer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void syncSetupPeerConnection(SSyncPeer *pPeer) {
|
static void syncSetupPeerConnection(SSyncPeer *pPeer) {
|
||||||
|
@ -995,13 +1031,13 @@ static void syncSetupPeerConnection(SSyncPeer *pPeer) {
|
||||||
taosTmrStopA(&pPeer->timer);
|
taosTmrStopA(&pPeer->timer);
|
||||||
if (pPeer->peerFd >= 0) {
|
if (pPeer->peerFd >= 0) {
|
||||||
sDebug("%s, send role version to peer", pPeer->id);
|
sDebug("%s, send role version to peer", pPeer->id);
|
||||||
syncSendPeersStatusMsgToPeer(pPeer, 1);
|
syncSendPeersStatusMsgToPeer(pPeer, 1, SYNC_STATUS_SETUP_CONN, syncGenTranId());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t connFd = taosOpenTcpClientSocket(pPeer->ip, pPeer->port, 0);
|
int32_t connFd = taosOpenTcpClientSocket(pPeer->ip, pPeer->port, 0);
|
||||||
if (connFd < 0) {
|
if (connFd < 0) {
|
||||||
sDebug("%s, failed to open tcp socket(%s)", pPeer->id, strerror(errno));
|
sDebug("%s, failed to open tcp socket since %s", pPeer->id, strerror(errno));
|
||||||
taosTmrReset(syncCheckPeerConnection, tsSyncTimer * 1000, pPeer, tsSyncTmrCtrl, &pPeer->timer);
|
taosTmrReset(syncCheckPeerConnection, tsSyncTimer * 1000, pPeer, tsSyncTmrCtrl, &pPeer->timer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1014,15 +1050,15 @@ static void syncSetupPeerConnection(SSyncPeer *pPeer) {
|
||||||
firstPkt.port = tsSyncPort;
|
firstPkt.port = tsSyncPort;
|
||||||
firstPkt.sourceId = pNode->vgId; // tell arbitrator its vgId
|
firstPkt.sourceId = pNode->vgId; // tell arbitrator its vgId
|
||||||
|
|
||||||
if (write(connFd, &firstPkt, sizeof(firstPkt)) == sizeof(firstPkt)) {
|
if (taosWriteMsg(connFd, &firstPkt, sizeof(firstPkt)) == sizeof(firstPkt)) {
|
||||||
sDebug("%s, connection to peer server is setup", pPeer->id);
|
sDebug("%s, connection to peer server is setup", pPeer->id);
|
||||||
pPeer->peerFd = connFd;
|
pPeer->peerFd = connFd;
|
||||||
pPeer->role = TAOS_SYNC_ROLE_UNSYNCED;
|
pPeer->role = TAOS_SYNC_ROLE_UNSYNCED;
|
||||||
pPeer->pConn = taosAllocateTcpConn(tsTcpPool, pPeer, connFd);
|
pPeer->pConn = taosAllocateTcpConn(tsTcpPool, pPeer, connFd);
|
||||||
syncAddPeerRef(pPeer);
|
syncAddPeerRef(pPeer);
|
||||||
} else {
|
} else {
|
||||||
sDebug("try later");
|
sDebug("%s, failed to setup peer connection to server since %s, try later", pPeer->id, strerror(errno));
|
||||||
close(connFd);
|
taosClose(connFd);
|
||||||
taosTmrReset(syncCheckPeerConnection, tsSyncTimer * 1000, pPeer, tsSyncTmrCtrl, &pPeer->timer);
|
taosTmrReset(syncCheckPeerConnection, tsSyncTimer * 1000, pPeer, tsSyncTmrCtrl, &pPeer->timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1069,7 +1105,7 @@ static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
|
||||||
|
|
||||||
SFirstPkt firstPkt;
|
SFirstPkt firstPkt;
|
||||||
if (taosReadMsg(connFd, &firstPkt, sizeof(firstPkt)) != sizeof(firstPkt)) {
|
if (taosReadMsg(connFd, &firstPkt, sizeof(firstPkt)) != sizeof(firstPkt)) {
|
||||||
sError("failed to read peer first pkt from ip:%s(%s)", ipstr, strerror(errno));
|
sError("failed to read peer first pkt from ip:%s since %s", ipstr, strerror(errno));
|
||||||
taosCloseSocket(connFd);
|
taosCloseSocket(connFd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1108,7 +1144,7 @@ static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
|
||||||
pPeer->pConn = taosAllocateTcpConn(tsTcpPool, pPeer, connFd);
|
pPeer->pConn = taosAllocateTcpConn(tsTcpPool, pPeer, connFd);
|
||||||
syncAddPeerRef(pPeer);
|
syncAddPeerRef(pPeer);
|
||||||
sDebug("%s, ready to exchange data", pPeer->id);
|
sDebug("%s, ready to exchange data", pPeer->id);
|
||||||
syncSendPeersStatusMsgToPeer(pPeer, 1);
|
syncSendPeersStatusMsgToPeer(pPeer, 1, SYNC_STATUS_EXCHANGE_DATA, syncGenTranId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1123,7 +1159,7 @@ static void syncProcessBrokenLink(void *param) {
|
||||||
if (taosAcquireRef(tsSyncRefId, pNode->rid) == NULL) return;
|
if (taosAcquireRef(tsSyncRefId, pNode->rid) == NULL) return;
|
||||||
pthread_mutex_lock(&(pNode->mutex));
|
pthread_mutex_lock(&(pNode->mutex));
|
||||||
|
|
||||||
sDebug("%s, TCP link is broken(%s)", pPeer->id, strerror(errno));
|
sDebug("%s, TCP link is broken since %s", pPeer->id, strerror(errno));
|
||||||
pPeer->peerFd = -1;
|
pPeer->peerFd = -1;
|
||||||
|
|
||||||
if (syncDecPeerRef(pPeer) != 0) {
|
if (syncDecPeerRef(pPeer) != 0) {
|
||||||
|
@ -1154,7 +1190,7 @@ static void syncSaveFwdInfo(SSyncNode *pNode, uint64_t version, void *mhandle) {
|
||||||
pFwdInfo->time = time;
|
pFwdInfo->time = time;
|
||||||
|
|
||||||
pSyncFwds->fwds++;
|
pSyncFwds->fwds++;
|
||||||
sDebug("vgId:%d, fwd info is saved, ver:%" PRIu64 " fwds:%d ", pNode->vgId, version, pSyncFwds->fwds);
|
sTrace("vgId:%d, fwd info is saved, hver:%" PRIu64 " fwds:%d ", pNode->vgId, version, pSyncFwds->fwds);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void syncRemoveConfirmedFwdInfo(SSyncNode *pNode) {
|
static void syncRemoveConfirmedFwdInfo(SSyncNode *pNode) {
|
||||||
|
@ -1168,7 +1204,7 @@ static void syncRemoveConfirmedFwdInfo(SSyncNode *pNode) {
|
||||||
pSyncFwds->first = (pSyncFwds->first + 1) % tsMaxFwdInfo;
|
pSyncFwds->first = (pSyncFwds->first + 1) % tsMaxFwdInfo;
|
||||||
pSyncFwds->fwds--;
|
pSyncFwds->fwds--;
|
||||||
if (pSyncFwds->fwds == 0) pSyncFwds->first = pSyncFwds->last;
|
if (pSyncFwds->fwds == 0) pSyncFwds->first = pSyncFwds->last;
|
||||||
// sDebug("vgId:%d, fwd info is removed, ver:%d, fwds:%d",
|
// sDebug("vgId:%d, fwd info is removed, hver:%d, fwds:%d",
|
||||||
// pNode->vgId, pFwdInfo->version, pSyncFwds->fwds);
|
// pNode->vgId, pFwdInfo->version, pSyncFwds->fwds);
|
||||||
memset(pFwdInfo, 0, sizeof(SFwdInfo));
|
memset(pFwdInfo, 0, sizeof(SFwdInfo));
|
||||||
}
|
}
|
||||||
|
@ -1191,14 +1227,33 @@ static void syncProcessFwdAck(SSyncNode *pNode, SFwdInfo *pFwdInfo, int32_t code
|
||||||
}
|
}
|
||||||
|
|
||||||
if (confirm && pFwdInfo->confirmed == 0) {
|
if (confirm && pFwdInfo->confirmed == 0) {
|
||||||
sDebug("vgId:%d, forward is confirmed, ver:%" PRIu64 " code:%x", pNode->vgId, pFwdInfo->version, pFwdInfo->code);
|
sTrace("vgId:%d, forward is confirmed, hver:%" PRIu64 " code:%x", pNode->vgId, pFwdInfo->version, pFwdInfo->code);
|
||||||
(*pNode->confirmForward)(pNode->ahandle, pFwdInfo->mhandle, pFwdInfo->code);
|
(*pNode->confirmForward)(pNode->ahandle, pFwdInfo->mhandle, pFwdInfo->code);
|
||||||
pFwdInfo->confirmed = 1;
|
pFwdInfo->confirmed = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void syncMonitorNodeRole(void *param, void *tmrId) {
|
||||||
|
int64_t rid = (int64_t)param;
|
||||||
|
SSyncNode *pNode = taosAcquireRef(tsSyncRefId, rid);
|
||||||
|
if (pNode == NULL) return;
|
||||||
|
|
||||||
|
for (int32_t index = 0; index < pNode->replica; index++) {
|
||||||
|
if (index == pNode->selfIndex) continue;
|
||||||
|
|
||||||
|
SSyncPeer *pPeer = pNode->peerInfo[index];
|
||||||
|
if (pPeer->role > TAOS_SYNC_ROLE_UNSYNCED && nodeRole > TAOS_SYNC_ROLE_UNSYNCED) continue;
|
||||||
|
if (pPeer->sstatus > TAOS_SYNC_STATUS_INIT || nodeSStatus > TAOS_SYNC_STATUS_INIT) continue;
|
||||||
|
|
||||||
|
syncSendPeersStatusMsgToPeer(pPeer, 1, SYNC_STATUS_CHECK_ROLE, syncGenTranId());
|
||||||
|
}
|
||||||
|
|
||||||
|
pNode->pRoleTimer = taosTmrStart(syncMonitorNodeRole, SYNC_ROLE_TIMER, (void *)pNode->rid, tsSyncTmrCtrl);
|
||||||
|
taosReleaseRef(tsSyncRefId, rid);
|
||||||
|
}
|
||||||
|
|
||||||
static void syncMonitorFwdInfos(void *param, void *tmrId) {
|
static void syncMonitorFwdInfos(void *param, void *tmrId) {
|
||||||
int64_t rid = (int64_t) param;
|
int64_t rid = (int64_t)param;
|
||||||
SSyncNode *pNode = taosAcquireRef(tsSyncRefId, rid);
|
SSyncNode *pNode = taosAcquireRef(tsSyncRefId, rid);
|
||||||
if (pNode == NULL) return;
|
if (pNode == NULL) return;
|
||||||
|
|
||||||
|
@ -1222,7 +1277,7 @@ static void syncMonitorFwdInfos(void *param, void *tmrId) {
|
||||||
pthread_mutex_unlock(&(pNode->mutex));
|
pthread_mutex_unlock(&(pNode->mutex));
|
||||||
}
|
}
|
||||||
|
|
||||||
pNode->pFwdTimer = taosTmrStart(syncMonitorFwdInfos, 300, (void *)pNode->rid, tsSyncTmrCtrl);
|
pNode->pFwdTimer = taosTmrStart(syncMonitorFwdInfos, SYNC_FWD_TIMER, (void *)pNode->rid, tsSyncTmrCtrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosReleaseRef(tsSyncRefId, rid);
|
taosReleaseRef(tsSyncRefId, rid);
|
||||||
|
@ -1237,7 +1292,7 @@ static int32_t syncForwardToPeerImpl(SSyncNode *pNode, void *data, void *mhandle
|
||||||
|
|
||||||
|
|
||||||
if (pWalHead->version > nodeVersion + 1) {
|
if (pWalHead->version > nodeVersion + 1) {
|
||||||
sError("vgId:%d, hver:%" PRIu64 ", inconsistent with ver:%" PRIu64, pNode->vgId, pWalHead->version, nodeVersion);
|
sError("vgId:%d, hver:%" PRIu64 ", inconsistent with sver:%" PRIu64, pNode->vgId, pWalHead->version, nodeVersion);
|
||||||
if (nodeRole == TAOS_SYNC_ROLE_SLAVE) {
|
if (nodeRole == TAOS_SYNC_ROLE_SLAVE) {
|
||||||
sInfo("vgId:%d, restart connection", pNode->vgId);
|
sInfo("vgId:%d, restart connection", pNode->vgId);
|
||||||
for (int32_t i = 0; i < pNode->replica; ++i) {
|
for (int32_t i = 0; i < pNode->replica; ++i) {
|
||||||
|
@ -1280,9 +1335,9 @@ static int32_t syncForwardToPeerImpl(SSyncNode *pNode, void *data, void *mhandle
|
||||||
|
|
||||||
int32_t retLen = write(pPeer->peerFd, pSyncHead, fwdLen);
|
int32_t retLen = write(pPeer->peerFd, pSyncHead, fwdLen);
|
||||||
if (retLen == fwdLen) {
|
if (retLen == fwdLen) {
|
||||||
sDebug("%s, forward is sent, ver:%" PRIu64 " contLen:%d", pPeer->id, pWalHead->version, pWalHead->len);
|
sTrace("%s, forward is sent, hver:%" PRIu64 " contLen:%d", pPeer->id, pWalHead->version, pWalHead->len);
|
||||||
} else {
|
} else {
|
||||||
sError("%s, failed to forward, ver:%" PRIu64 " retLen:%d", pPeer->id, pWalHead->version, retLen);
|
sError("%s, failed to forward, hver:%" PRIu64 " retLen:%d", pPeer->id, pWalHead->version, retLen);
|
||||||
syncRestartConnection(pPeer);
|
syncRestartConnection(pPeer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,9 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
#include "taoserror.h"
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
#include "ttimer.h"
|
#include "ttimer.h"
|
||||||
|
@ -126,7 +128,7 @@ static int32_t syncRestoreFile(SSyncPeer *pPeer, uint64_t *fversion) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
sError("%s, failed to restore %s(%s)", pPeer->id, name, strerror(errno));
|
sError("%s, failed to restore %s since %s", pPeer->id, name, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
@ -140,6 +142,7 @@ static int32_t syncRestoreWal(SSyncPeer *pPeer) {
|
||||||
if (buffer == NULL) return -1;
|
if (buffer == NULL) return -1;
|
||||||
|
|
||||||
SWalHead *pHead = (SWalHead *)buffer;
|
SWalHead *pHead = (SWalHead *)buffer;
|
||||||
|
uint64_t lastVer = 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
ret = taosReadMsg(pPeer->syncFd, pHead, sizeof(SWalHead));
|
ret = taosReadMsg(pPeer->syncFd, pHead, sizeof(SWalHead));
|
||||||
|
@ -153,12 +156,19 @@ static int32_t syncRestoreWal(SSyncPeer *pPeer) {
|
||||||
ret = taosReadMsg(pPeer->syncFd, pHead->cont, pHead->len);
|
ret = taosReadMsg(pPeer->syncFd, pHead->cont, pHead->len);
|
||||||
if (ret < 0) break;
|
if (ret < 0) break;
|
||||||
|
|
||||||
sDebug("%s, restore a record, qtype:wal hver:%" PRIu64, pPeer->id, pHead->version);
|
sTrace("%s, restore a record, qtype:wal len:%d hver:%" PRIu64, pPeer->id, pHead->len, pHead->version);
|
||||||
|
|
||||||
|
if (lastVer == pHead->version) {
|
||||||
|
sError("%s, failed to restore record, same hver:%" PRIu64 ", wal sync failed" PRIu64, pPeer->id, lastVer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
lastVer = pHead->version;
|
||||||
|
|
||||||
(*pNode->writeToCache)(pNode->ahandle, pHead, TAOS_QTYPE_WAL, NULL);
|
(*pNode->writeToCache)(pNode->ahandle, pHead, TAOS_QTYPE_WAL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
sError("%s, failed to restore wal(%s)", pPeer->id, strerror(errno));
|
sError("%s, failed to restore wal from syncFd:%d since %s", pPeer->id, pPeer->syncFd, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
free(buffer);
|
free(buffer);
|
||||||
|
@ -214,7 +224,7 @@ int32_t syncSaveIntoBuffer(SSyncPeer *pPeer, SWalHead *pHead) {
|
||||||
memcpy(pRecv->offset, pHead, len);
|
memcpy(pRecv->offset, pHead, len);
|
||||||
pRecv->offset += len;
|
pRecv->offset += len;
|
||||||
pRecv->forwards++;
|
pRecv->forwards++;
|
||||||
sDebug("%s, fwd is saved into queue, ver:%" PRIu64 " fwds:%d", pPeer->id, pHead->version, pRecv->forwards);
|
sTrace("%s, fwd is saved into queue, hver:%" PRIu64 " fwds:%d", pPeer->id, pHead->version, pRecv->forwards);
|
||||||
} else {
|
} else {
|
||||||
sError("%s, buffer size:%d is too small", pPeer->id, pRecv->bufferSize);
|
sError("%s, buffer size:%d is too small", pPeer->id, pRecv->bufferSize);
|
||||||
pRecv->code = -1; // set error code
|
pRecv->code = -1; // set error code
|
||||||
|
@ -291,7 +301,7 @@ static int32_t syncRestoreDataStepByStep(SSyncPeer *pPeer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void *syncRestoreData(void *param) {
|
void *syncRestoreData(void *param) {
|
||||||
SSyncPeer *pPeer = (SSyncPeer *)param;
|
SSyncPeer *pPeer = param;
|
||||||
SSyncNode *pNode = pPeer->pSyncNode;
|
SSyncNode *pNode = pPeer->pSyncNode;
|
||||||
|
|
||||||
taosBlockSIGPIPE();
|
taosBlockSIGPIPE();
|
||||||
|
@ -300,7 +310,8 @@ void *syncRestoreData(void *param) {
|
||||||
(*pNode->notifyRole)(pNode->ahandle, TAOS_SYNC_ROLE_SYNCING);
|
(*pNode->notifyRole)(pNode->ahandle, TAOS_SYNC_ROLE_SYNCING);
|
||||||
|
|
||||||
if (syncOpenRecvBuffer(pNode) < 0) {
|
if (syncOpenRecvBuffer(pNode) < 0) {
|
||||||
sError("%s, failed to allocate recv buffer", pPeer->id);
|
sError("%s, failed to allocate recv buffer, restart connection", pPeer->id);
|
||||||
|
syncRestartConnection(pPeer);
|
||||||
} else {
|
} else {
|
||||||
if (syncRestoreDataStepByStep(pPeer) == 0) {
|
if (syncRestoreDataStepByStep(pPeer) == 0) {
|
||||||
sInfo("%s, it is synced successfully", pPeer->id);
|
sInfo("%s, it is synced successfully", pPeer->id);
|
||||||
|
|
|
@ -13,10 +13,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#define _DEFAULT_SOURCE
|
||||||
#include <stdbool.h>
|
|
||||||
#include <sys/inotify.h>
|
#include <sys/inotify.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
@ -34,7 +32,7 @@ static int32_t syncAddIntoWatchList(SSyncPeer *pPeer, char *name) {
|
||||||
pPeer->watchNum = 0;
|
pPeer->watchNum = 0;
|
||||||
pPeer->notifyFd = inotify_init1(IN_NONBLOCK);
|
pPeer->notifyFd = inotify_init1(IN_NONBLOCK);
|
||||||
if (pPeer->notifyFd < 0) {
|
if (pPeer->notifyFd < 0) {
|
||||||
sError("%s, failed to init inotify(%s)", pPeer->id, strerror(errno));
|
sError("%s, failed to init inotify since %s", pPeer->id, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,14 +49,14 @@ static int32_t syncAddIntoWatchList(SSyncPeer *pPeer, char *name) {
|
||||||
|
|
||||||
if (*wd >= 0) {
|
if (*wd >= 0) {
|
||||||
if (inotify_rm_watch(pPeer->notifyFd, *wd) < 0) {
|
if (inotify_rm_watch(pPeer->notifyFd, *wd) < 0) {
|
||||||
sError("%s, failed to remove wd:%d(%s)", pPeer->id, *wd, strerror(errno));
|
sError("%s, failed to remove wd:%d since %s", pPeer->id, *wd, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*wd = inotify_add_watch(pPeer->notifyFd, name, IN_MODIFY | IN_DELETE);
|
*wd = inotify_add_watch(pPeer->notifyFd, name, IN_MODIFY | IN_DELETE);
|
||||||
if (*wd == -1) {
|
if (*wd == -1) {
|
||||||
sError("%s, failed to add %s(%s)", pPeer->id, name, strerror(errno));
|
sError("%s, failed to add %s since %s", pPeer->id, name, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
sDebug("%s, monitor %s, wd:%d watchNum:%d", pPeer->id, name, *wd, pPeer->watchNum);
|
sDebug("%s, monitor %s, wd:%d watchNum:%d", pPeer->id, name, *wd, pPeer->watchNum);
|
||||||
|
@ -75,7 +73,7 @@ static int32_t syncAreFilesModified(SSyncPeer *pPeer) {
|
||||||
char buf[2048];
|
char buf[2048];
|
||||||
int32_t len = read(pPeer->notifyFd, buf, sizeof(buf));
|
int32_t len = read(pPeer->notifyFd, buf, sizeof(buf));
|
||||||
if (len < 0 && errno != EAGAIN) {
|
if (len < 0 && errno != EAGAIN) {
|
||||||
sError("%s, failed to read notify FD(%s)", pPeer->id, strerror(errno));
|
sError("%s, failed to read notify FD since %s", pPeer->id, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +159,7 @@ static int32_t syncRetrieveFile(SSyncPeer *pPeer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
sError("%s, failed to retrieve file(%s)", pPeer->id, strerror(errno));
|
sError("%s, failed to retrieve file since %s", pPeer->id, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
@ -201,7 +199,7 @@ static int32_t syncMonitorLastWal(SSyncPeer *pPeer, char *name) {
|
||||||
taosClose(pPeer->notifyFd);
|
taosClose(pPeer->notifyFd);
|
||||||
pPeer->notifyFd = inotify_init1(IN_NONBLOCK);
|
pPeer->notifyFd = inotify_init1(IN_NONBLOCK);
|
||||||
if (pPeer->notifyFd < 0) {
|
if (pPeer->notifyFd < 0) {
|
||||||
sError("%s, failed to init inotify(%s)", pPeer->id, strerror(errno));
|
sError("%s, failed to init inotify since %s", pPeer->id, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,7 +214,7 @@ static int32_t syncMonitorLastWal(SSyncPeer *pPeer, char *name) {
|
||||||
|
|
||||||
*wd = inotify_add_watch(pPeer->notifyFd, name, IN_MODIFY | IN_CLOSE_WRITE);
|
*wd = inotify_add_watch(pPeer->notifyFd, name, IN_MODIFY | IN_CLOSE_WRITE);
|
||||||
if (*wd == -1) {
|
if (*wd == -1) {
|
||||||
sError("%s, failed to watch last wal(%s)", pPeer->id, strerror(errno));
|
sError("%s, failed to watch last wal since %s", pPeer->id, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,7 +225,7 @@ static int32_t syncCheckLastWalChanges(SSyncPeer *pPeer, uint32_t *pEvent) {
|
||||||
char buf[2048];
|
char buf[2048];
|
||||||
int32_t len = read(pPeer->notifyFd, buf, sizeof(buf));
|
int32_t len = read(pPeer->notifyFd, buf, sizeof(buf));
|
||||||
if (len < 0 && errno != EAGAIN) {
|
if (len < 0 && errno != EAGAIN) {
|
||||||
sError("%s, failed to read notify FD(%s)", pPeer->id, strerror(errno));
|
sError("%s, failed to read notify FD since %s", pPeer->id, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,7 +266,7 @@ static int32_t syncRetrieveLastWal(SSyncPeer *pPeer, char *name, uint64_t fversi
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sDebug("%s, last wal is forwarded, ver:%" PRIu64, pPeer->id, pHead->version);
|
sTrace("%s, last wal is forwarded, hver:%" PRIu64, pPeer->id, pHead->version);
|
||||||
int32_t ret = taosWriteMsg(pPeer->syncFd, pHead, wsize);
|
int32_t ret = taosWriteMsg(pPeer->syncFd, pHead, wsize);
|
||||||
if (ret != wsize) break;
|
if (ret != wsize) break;
|
||||||
pPeer->sversion = pHead->version;
|
pPeer->sversion = pHead->version;
|
||||||
|
@ -418,13 +416,13 @@ static int32_t syncRetrieveWal(SSyncPeer *pPeer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
sDebug("%s, wal retrieve is finished", pPeer->id);
|
sInfo("%s, wal retrieve is finished", pPeer->id);
|
||||||
pPeer->sstatus = TAOS_SYNC_STATUS_CACHE;
|
pPeer->sstatus = TAOS_SYNC_STATUS_CACHE;
|
||||||
SWalHead walHead;
|
SWalHead walHead;
|
||||||
memset(&walHead, 0, sizeof(walHead));
|
memset(&walHead, 0, sizeof(walHead));
|
||||||
code = taosWriteMsg(pPeer->syncFd, &walHead, sizeof(walHead));
|
code = taosWriteMsg(pPeer->syncFd, &walHead, sizeof(walHead));
|
||||||
} else {
|
} else {
|
||||||
sError("%s, failed to send wal(%s)", pPeer->id, strerror(errno));
|
sError("%s, failed to send wal since %s", pPeer->id, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
@ -447,7 +445,7 @@ static int32_t syncRetrieveDataStepByStep(SSyncPeer *pPeer) {
|
||||||
|
|
||||||
pPeer->sversion = 0;
|
pPeer->sversion = 0;
|
||||||
pPeer->sstatus = TAOS_SYNC_STATUS_FILE;
|
pPeer->sstatus = TAOS_SYNC_STATUS_FILE;
|
||||||
sDebug("%s, start to retrieve file", pPeer->id);
|
sInfo("%s, start to retrieve file", pPeer->id);
|
||||||
if (syncRetrieveFile(pPeer) < 0) {
|
if (syncRetrieveFile(pPeer) < 0) {
|
||||||
sError("%s, failed to retrieve file", pPeer->id);
|
sError("%s, failed to retrieve file", pPeer->id);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -456,7 +454,7 @@ static int32_t syncRetrieveDataStepByStep(SSyncPeer *pPeer) {
|
||||||
// if no files are synced, there must be wal to sync, sversion must be larger than one
|
// if no files are synced, there must be wal to sync, sversion must be larger than one
|
||||||
if (pPeer->sversion == 0) pPeer->sversion = 1;
|
if (pPeer->sversion == 0) pPeer->sversion = 1;
|
||||||
|
|
||||||
sDebug("%s, start to retrieve wal", pPeer->id);
|
sInfo("%s, start to retrieve wal", pPeer->id);
|
||||||
if (syncRetrieveWal(pPeer) < 0) {
|
if (syncRetrieveWal(pPeer) < 0) {
|
||||||
sError("%s, failed to retrieve wal", pPeer->id);
|
sError("%s, failed to retrieve wal", pPeer->id);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -478,7 +476,7 @@ void *syncRetrieveData(void *param) {
|
||||||
sInfo("%s, sync tcp is setup", pPeer->id);
|
sInfo("%s, sync tcp is setup", pPeer->id);
|
||||||
|
|
||||||
if (syncRetrieveDataStepByStep(pPeer) == 0) {
|
if (syncRetrieveDataStepByStep(pPeer) == 0) {
|
||||||
sDebug("%s, sync retrieve process is successful", pPeer->id);
|
sInfo("%s, sync retrieve process is successful", pPeer->id);
|
||||||
} else {
|
} else {
|
||||||
sError("%s, failed to retrieve data, restart connection", pPeer->id);
|
sError("%s, failed to retrieve data, restart connection", pPeer->id);
|
||||||
syncRestartConnection(pPeer);
|
syncRestartConnection(pPeer);
|
||||||
|
|
|
@ -150,7 +150,7 @@ void *taosAllocateTcpConn(void *param, void *pPeer, int32_t connFd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosFreeTcpConn(void *param) {
|
void taosFreeTcpConn(void *param) {
|
||||||
SConnObj * pConn = (SConnObj *)param;
|
SConnObj * pConn = param;
|
||||||
SThreadObj *pThread = pConn->pThread;
|
SThreadObj *pThread = pConn->pThread;
|
||||||
|
|
||||||
sDebug("%p TCP connection will be closed, fd:%d", pThread, pConn->fd);
|
sDebug("%p TCP connection will be closed, fd:%d", pThread, pConn->fd);
|
||||||
|
|
|
@ -115,14 +115,14 @@ static void arbProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
|
||||||
|
|
||||||
SFirstPkt firstPkt;
|
SFirstPkt firstPkt;
|
||||||
if (taosReadMsg(connFd, &firstPkt, sizeof(firstPkt)) != sizeof(firstPkt)) {
|
if (taosReadMsg(connFd, &firstPkt, sizeof(firstPkt)) != sizeof(firstPkt)) {
|
||||||
sError("failed to read peer first pkt from ip:%s(%s)", ipstr, strerror(errno));
|
sError("failed to read peer first pkt from ip:%s since %s", ipstr, strerror(errno));
|
||||||
taosCloseSocket(connFd);
|
taosCloseSocket(connFd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNodeConn *pNode = (SNodeConn *)calloc(sizeof(SNodeConn), 1);
|
SNodeConn *pNode = calloc(sizeof(SNodeConn), 1);
|
||||||
if (pNode == NULL) {
|
if (pNode == NULL) {
|
||||||
sError("failed to allocate memory(%s)", strerror(errno));
|
sError("failed to allocate memory since %s", strerror(errno));
|
||||||
taosCloseSocket(connFd);
|
taosCloseSocket(connFd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -146,7 +146,7 @@ static void arbProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
|
||||||
static void arbProcessBrokenLink(void *param) {
|
static void arbProcessBrokenLink(void *param) {
|
||||||
SNodeConn *pNode = param;
|
SNodeConn *pNode = param;
|
||||||
|
|
||||||
sDebug("%s, TCP link is broken(%s), close connection", pNode->id, strerror(errno));
|
sDebug("%s, TCP link is broken since %s, close connection", pNode->id, strerror(errno));
|
||||||
tfree(pNode);
|
tfree(pNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -144,9 +144,9 @@ void walFsync(void *handle, bool forceFsync) {
|
||||||
if (pWal == NULL || pWal->fd < 0) return;
|
if (pWal == NULL || pWal->fd < 0) return;
|
||||||
|
|
||||||
if (forceFsync || (pWal->level == TAOS_WAL_FSYNC && pWal->fsyncPeriod == 0)) {
|
if (forceFsync || (pWal->level == TAOS_WAL_FSYNC && pWal->fsyncPeriod == 0)) {
|
||||||
wTrace("vgId:%d, file:%s, do fsync", pWal->vgId, pWal->name);
|
wTrace("vgId:%d, fileId:%" PRId64 ", do fsync", pWal->vgId, pWal->fileId);
|
||||||
if (fsync(pWal->fd) < 0) {
|
if (fsync(pWal->fd) < 0) {
|
||||||
wError("vgId:%d, file:%s, fsync failed since %s", pWal->vgId, pWal->name, strerror(errno));
|
wError("vgId:%d, fileId:%" PRId64 ", fsync failed since %s", pWal->vgId, pWal->fileId, strerror(errno));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,30 +32,44 @@ class TDTestCase:
|
||||||
tdSql.execute("insert into t0 using st tags('beijing') values(%d, 220) (%d, 221) (%d, 225) (%d, 228) (%d, 222)"
|
tdSql.execute("insert into t0 using st tags('beijing') values(%d, 220) (%d, 221) (%d, 225) (%d, 228) (%d, 222)"
|
||||||
% (self.ts, self.ts + 1000000000, self.ts + 2000000000, self.ts + 3000000000, self.ts + 6000000000))
|
% (self.ts, self.ts + 1000000000, self.ts + 2000000000, self.ts + 3000000000, self.ts + 6000000000))
|
||||||
tdSql.execute("insert into t1 using st tags('shanghai') values(%d, 220) (%d, 221) (%d, 225) (%d, 228) (%d, 222)"
|
tdSql.execute("insert into t1 using st tags('shanghai') values(%d, 220) (%d, 221) (%d, 225) (%d, 228) (%d, 222)"
|
||||||
% (self.ts, self.ts + 2000000000, self.ts + 4000000000, self.ts + 5000000000, self.ts + 7000000000))
|
% (self.ts, self.ts + 2000000000, self.ts + 4000000000, self.ts + 5000000000, self.ts + 7000000000))
|
||||||
|
|
||||||
|
|
||||||
tdSql.query("select avg(voltage) from st interval(1n)")
|
tdSql.query("select avg(voltage) from st interval(1n)")
|
||||||
tdSql.checkRows(4)
|
tdSql.checkRows(3)
|
||||||
tdSql.checkData(0, 1, 220.0)
|
tdSql.checkData(0, 0, "2020-07-01 00:00:00")
|
||||||
tdSql.checkData(1, 1, 222.33333333333334)
|
tdSql.checkData(0, 1, 221.4)
|
||||||
tdSql.checkData(2, 1, 227.0)
|
tdSql.checkData(1, 0, "2020-08-01 00:00:00")
|
||||||
tdSql.checkData(3, 1, 222.0)
|
tdSql.checkData(1, 1, 227.0)
|
||||||
|
tdSql.checkData(2, 0, "2020-09-01 00:00:00")
|
||||||
|
tdSql.checkData(2, 1, 222.0)
|
||||||
|
|
||||||
tdSql.query("select avg(voltage) from st interval(1n, 15d)")
|
tdSql.query("select avg(voltage) from st interval(1n, 15d)")
|
||||||
tdSql.checkRows(4)
|
tdSql.checkRows(4)
|
||||||
|
tdSql.checkData(0, 0, "2020-06-16 00:00:00")
|
||||||
tdSql.checkData(0, 1, 220.333333)
|
tdSql.checkData(0, 1, 220.333333)
|
||||||
|
tdSql.checkData(1, 0, "2020-07-16 00:00:00")
|
||||||
tdSql.checkData(1, 1, 224.666666)
|
tdSql.checkData(1, 1, 224.666666)
|
||||||
|
tdSql.checkData(2, 0, "2020-08-16 00:00:00")
|
||||||
tdSql.checkData(2, 1, 225.0)
|
tdSql.checkData(2, 1, 225.0)
|
||||||
|
tdSql.checkData(3, 0, "2020-09-16 00:00:00")
|
||||||
tdSql.checkData(3, 1, 222.0)
|
tdSql.checkData(3, 1, 222.0)
|
||||||
|
|
||||||
tdSql.query("select avg(voltage) from st interval(1n, 15d) group by loc")
|
tdSql.query("select avg(voltage) from st interval(1n, 15d) group by loc")
|
||||||
tdSql.checkRows(7)
|
tdSql.checkRows(7)
|
||||||
|
tdSql.checkData(0, 0, "2020-06-16 00:00:00")
|
||||||
tdSql.checkData(0, 1, 220.5)
|
tdSql.checkData(0, 1, 220.5)
|
||||||
|
tdSql.checkData(1, 0, "2020-07-16 00:00:00")
|
||||||
tdSql.checkData(1, 1, 226.5)
|
tdSql.checkData(1, 1, 226.5)
|
||||||
|
tdSql.checkData(2, 0, "2020-08-16 00:00:00")
|
||||||
tdSql.checkData(2, 1, 222.0)
|
tdSql.checkData(2, 1, 222.0)
|
||||||
|
tdSql.checkData(3, 0, "2020-06-16 00:00:00")
|
||||||
tdSql.checkData(3, 1, 220.0)
|
tdSql.checkData(3, 1, 220.0)
|
||||||
|
tdSql.checkData(4, 0, "2020-07-16 00:00:00")
|
||||||
tdSql.checkData(4, 1, 221.0)
|
tdSql.checkData(4, 1, 221.0)
|
||||||
|
tdSql.checkData(5, 0, "2020-08-16 00:00:00")
|
||||||
tdSql.checkData(5, 1, 226.5)
|
tdSql.checkData(5, 1, 226.5)
|
||||||
|
tdSql.checkData(6, 0, "2020-09-16 00:00:00")
|
||||||
tdSql.checkData(6, 1, 222.0)
|
tdSql.checkData(6, 1, 222.0)
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
|
|
|
@ -55,6 +55,12 @@ class TDTestCase:
|
||||||
tdSql.query("select count(*) from meters")
|
tdSql.query("select count(*) from meters")
|
||||||
tdSql.checkData(0, 0, self.numberOfTables * self.numberOfRecords)
|
tdSql.checkData(0, 0, self.numberOfTables * self.numberOfRecords)
|
||||||
|
|
||||||
|
tdSql.query("select sum(f1) from test.meters interval(1h) sliding(30m)")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
|
||||||
|
tdSql.query("select apercentile(f1, 1) from test.meters interval(10s)")
|
||||||
|
tdSql.checkRows(11)
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
tdLog.success("%s successfully executed" % __file__)
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
|
@ -33,12 +33,19 @@ sql create database if not exists $db keep 36500
|
||||||
sql use $db
|
sql use $db
|
||||||
sql create table $mt (ts timestamp, c1 int, c2 float, c3 bigint, c4 smallint, c5 tinyint, c6 double, c7 bool, c8 binary(10), c9 nchar(9)) TAGS(t1 int, t2 binary(12))
|
sql create table $mt (ts timestamp, c1 int, c2 float, c3 bigint, c4 smallint, c5 tinyint, c6 double, c7 bool, c8 binary(10), c9 nchar(9)) TAGS(t1 int, t2 binary(12))
|
||||||
|
|
||||||
|
$half = $tbNum / 2
|
||||||
|
|
||||||
$i = 0
|
$i = 0
|
||||||
while $i < $tbNum
|
while $i < $half
|
||||||
$tb = $tbPrefix . $i
|
$tb = $tbPrefix . $i
|
||||||
$tg2 = ' . abc
|
$tg2 = ' . abc
|
||||||
$tg2 = $tg2 . '
|
$tg2 = $tg2 . '
|
||||||
|
|
||||||
|
$nextSuffix = $i + $half
|
||||||
|
$tb1 = $tbPrefix . $nextSuffix
|
||||||
|
|
||||||
sql create table $tb using $mt tags( $i , $tg2 )
|
sql create table $tb using $mt tags( $i , $tg2 )
|
||||||
|
sql create table $tb1 using $mt tags( $nextSuffix , $tg2 )
|
||||||
|
|
||||||
$x = 0
|
$x = 0
|
||||||
while $x < $rowNum
|
while $x < $rowNum
|
||||||
|
@ -55,7 +62,7 @@ while $i < $tbNum
|
||||||
$nchar = $nchar . $c
|
$nchar = $nchar . $c
|
||||||
$nchar = $nchar . '
|
$nchar = $nchar . '
|
||||||
|
|
||||||
sql insert into $tb values ($tstart , $c , $c , $c , $c , $c , $c , $c , $binary , $nchar )
|
sql insert into $tb values ($tstart , $c , $c , $x , $x , $c , $c , $c , $binary , $nchar ) $tb1 values ($tstart , $c , $c , $c , $c , $c , $c , $c , $binary , $nchar )
|
||||||
$tstart = $tstart + 1
|
$tstart = $tstart + 1
|
||||||
$x = $x + 1
|
$x = $x + 1
|
||||||
endw
|
endw
|
||||||
|
@ -423,8 +430,172 @@ if $data97 != @group_tb0@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
print ---------------------------------> group by binary|nchar data add cases
|
sql select count(*),first(ts),last(ts),min(c3) from group_tb1 group by c4;
|
||||||
|
if $rows != 10000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != @70-01-01 08:01:40.000@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data02 != @70-01-01 08:01:40.000@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data03 != 0 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select count(*),first(ts),last(ts),min(c3) from group_tb1 group by c4 limit 1;
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select count(*),first(ts),last(ts),min(c3) from group_tb1 group by c4 limit 20 offset 9990;
|
||||||
|
if $rows != 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select count(*),first(ts),last(ts),min(c3),max(c3),sum(c3),avg(c3),sum(c4)/count(c4) from group_tb1 group by c4;
|
||||||
|
if $rows != 10000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print ---------------------------------> group by binary|nchar data add cases
|
||||||
|
sql select count(*) from group_tb1 group by c8;
|
||||||
|
if $rows != 100 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select count(*),sum(c4), count(c4), sum(c4)/count(c4) from group_tb1 group by c8
|
||||||
|
if $rows != 100 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != 100 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 495000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data02 != 100 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data03 != 4950.000000000 then
|
||||||
|
print expect 4950.000000000 , acutal $data03
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data10 != 100 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data11 != 495100 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data13 != 4951.000000000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print ====================> group by normal column + slimit + soffset
|
||||||
|
sql select count(*), c8 from group_mt0 group by c8 limit 1 offset 0;
|
||||||
|
if $rows != 100 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select sum(c2),c8,avg(c2), sum(c2)/count(*) from group_mt0 group by c8 slimit 2 soffset 99
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != 79200.000000000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != @binary99@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data02 != 99.000000000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data03 != 99.000000000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print ============>td-1765
|
||||||
|
sql select percentile(c4, 49),min(c4),max(c4),avg(c4),stddev(c4) from group_tb0 group by c8;
|
||||||
|
if $rows != 100 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != 4851.000000000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 0 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data02 != 9900 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data03 != 4950.000000000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data04 != 2886.607004772 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data10 != 4852.000000000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data11 != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data12 != 9901 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data13 != 4951.000000000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data14 != 2886.607004772 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print ================>td-2090
|
||||||
|
sql select leastsquares(c2, 1, 1) from group_tb1 group by c8;
|
||||||
|
if $rows != 100 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != @{slop:0.000000, intercept:0.000000}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data10 != @{slop:0.000000, intercept:1.000000}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data90 != @{slop:0.000000, intercept:9.000000}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
#=========================== group by multi tags ======================
|
#=========================== group by multi tags ======================
|
||||||
sql create table st (ts timestamp, c int) tags (t1 int, t2 int, t3 int, t4 int);
|
sql create table st (ts timestamp, c int) tags (t1 int, t2 int, t3 int, t4 int);
|
||||||
|
|
|
@ -47,8 +47,7 @@ while $i < $halfNum
|
||||||
$binary = $binary . '
|
$binary = $binary . '
|
||||||
$nchar = 'nchar . $c
|
$nchar = 'nchar . $c
|
||||||
$nchar = $nchar . '
|
$nchar = $nchar . '
|
||||||
sql insert into $tb values ( $ts , $c , $c , $c , $c , $c , $c , true, $binary , $nchar )
|
sql insert into $tb values ( $ts , $c , $c , $c , $c , $c , $c , true, $binary , $nchar ) $tb1 values ( $ts , $c , NULL , $c , NULL , $c , $c , true, $binary , $nchar )
|
||||||
sql insert into $tb1 values ( $ts , $c , NULL , $c , NULL , $c , $c , true, $binary , $nchar )
|
|
||||||
$x = $x + 1
|
$x = $x + 1
|
||||||
endw
|
endw
|
||||||
|
|
||||||
|
|
|
@ -203,10 +203,13 @@ endi
|
||||||
|
|
||||||
# this function will cause shell crash
|
# this function will cause shell crash
|
||||||
sql_error select count(join_mt0.c1), first(join_mt0.c1) from join_mt0, join_mt1 where join_mt0.t1=join_mt1.t1 and join_mt0.ts=join_mt1.ts interval(10a) group by join_mt0.t1 order by join_mt0.ts desc;
|
sql_error select count(join_mt0.c1), first(join_mt0.c1) from join_mt0, join_mt1 where join_mt0.t1=join_mt1.t1 and join_mt0.ts=join_mt1.ts interval(10a) group by join_mt0.t1 order by join_mt0.ts desc;
|
||||||
|
sql_error select last(join_mt1.c7), first(join_mt1.c7) from join_mt0, join_mt1 where join_mt0.t1=join_mt1.t1 and join_mt0.ts=join_mt1.ts interval(10m) group by join_mt0.t1 order by join_mt0.ts asc;
|
||||||
sql_error select last(join_mt1.c7), first(join_mt1.c7) from join_mt0, join_mt1 where join_mt0.t1=join_mt1.t1 and join_mt0.ts=join_mt1.ts interval(10m) group by join_mt0.t1 order by join_mt0.ts asc;
|
|
||||||
|
|
||||||
sql_error select count(join_mt0.c1), first(join_mt0.c1)-last(join_mt1.c1), first(join_mt1.c9) from join_mt0, join_mt1 where join_mt0.t1=join_mt1.t1 and join_mt0.ts=join_mt1.ts;", NULL);
|
sql_error select count(join_mt0.c1), first(join_mt0.c1)-last(join_mt1.c1), first(join_mt1.c9) from join_mt0, join_mt1 where join_mt0.t1=join_mt1.t1 and join_mt0.ts=join_mt1.ts;", NULL);
|
||||||
|
|
||||||
|
print ================================> TD-2152
|
||||||
|
sql_error select join_mt1.c1,join_mt0.c1 from join_mt1,join_mt0 where join_mt1.ts = join_mt0.ts and join_mt1.t1 = join_mt0.t1 order by t;
|
||||||
|
|
||||||
|
print =================================> add result check
|
||||||
sql select count(join_mt0.c1), first(join_mt0.c1)/count(*), first(join_mt1.c9) from join_mt0, join_mt1 where join_mt0.t1=join_mt1.t1 and join_mt0.ts=join_mt1.ts;", NULL);
|
sql select count(join_mt0.c1), first(join_mt0.c1)/count(*), first(join_mt1.c9) from join_mt0, join_mt1 where join_mt0.t1=join_mt1.t1 and join_mt0.ts=join_mt1.ts;", NULL);
|
||||||
sql select count(join_mt0.c1), first(join_mt0.c1)-last(join_mt0.c1), first(join_mt1.c9) from join_mt0, join_mt1 where join_mt0.t1=join_mt1.t1 and join_mt0.ts=join_mt1.ts;", NULL);
|
sql select count(join_mt0.c1), first(join_mt0.c1)-last(join_mt0.c1), first(join_mt1.c9) from join_mt0, join_mt1 where join_mt0.t1=join_mt1.t1 and join_mt0.ts=join_mt1.ts;", NULL);
|
||||||
sql select last(join_mt0.c1) from join_mt0, join_mt1 where join_mt0.t1=join_mt1.t1 and join_mt0.ts=join_mt1.ts;", NULL);
|
sql select last(join_mt0.c1) from join_mt0, join_mt1 where join_mt0.t1=join_mt1.t1 and join_mt0.ts=join_mt1.ts;", NULL);
|
||||||
|
|
|
@ -28,11 +28,19 @@ sql use $db
|
||||||
sql create table $mt (ts timestamp, c1 int, c2 float, c3 bigint, c4 smallint, c5 tinyint, c6 double, c7 bool, c8 binary(10), c9 nchar(9)) TAGS(t1 int, t2 binary(12))
|
sql create table $mt (ts timestamp, c1 int, c2 float, c3 bigint, c4 smallint, c5 tinyint, c6 double, c7 bool, c8 binary(10), c9 nchar(9)) TAGS(t1 int, t2 binary(12))
|
||||||
|
|
||||||
$i = 0
|
$i = 0
|
||||||
while $i < $tbNum
|
$half = $tbNum / 2
|
||||||
|
|
||||||
|
while $i < $half
|
||||||
$tb = $tbPrefix . $i
|
$tb = $tbPrefix . $i
|
||||||
$tg2 = ' . abc
|
$tg2 = ' . abc
|
||||||
$tg2 = $tg2 . '
|
$tg2 = $tg2 . '
|
||||||
|
|
||||||
|
$tbId = $i + $half
|
||||||
|
|
||||||
|
$tb1 = $tbPrefix . $tbId
|
||||||
|
|
||||||
sql create table $tb using $mt tags( $i , $tg2 )
|
sql create table $tb using $mt tags( $i , $tg2 )
|
||||||
|
sql create table $tb1 using $mt tags( $i , $tg2 )
|
||||||
|
|
||||||
$x = 0
|
$x = 0
|
||||||
while $x < $rowNum
|
while $x < $rowNum
|
||||||
|
@ -49,7 +57,7 @@ while $i < $tbNum
|
||||||
$nchar = $nchar . $c
|
$nchar = $nchar . $c
|
||||||
$nchar = $nchar . '
|
$nchar = $nchar . '
|
||||||
|
|
||||||
sql insert into $tb values ($tstart , $c , $c , $c , $c , $c , $c , $c , $binary , $nchar )
|
sql insert into $tb values ($tstart , $c , $c , $c , $c , $c , $c , $c , $binary , $nchar ) $tb1 values ($tstart , $c , $c , $c , $c , $c , $c , $c , $binary , $nchar )
|
||||||
$tstart = $tstart + 1
|
$tstart = $tstart + 1
|
||||||
$x = $x + 1
|
$x = $x + 1
|
||||||
endw
|
endw
|
||||||
|
|
|
@ -55,8 +55,7 @@ while $i < $halfNum
|
||||||
$binary = $binary . '
|
$binary = $binary . '
|
||||||
$nchar = 'nchar . $c
|
$nchar = 'nchar . $c
|
||||||
$nchar = $nchar . '
|
$nchar = $nchar . '
|
||||||
sql insert into $tb values ( $ts , $c , $c , $c , $c , $c , $c , true, $binary , $nchar )
|
sql insert into $tb values ( $ts , $c , $c , $c , $c , $c , $c , true, $binary , $nchar ) $tb1 values ( $ts , $c , NULL , $c , NULL , $c , $c , true, $binary , $nchar )
|
||||||
sql insert into $tb1 values ( $ts , $c , NULL , $c , NULL , $c , $c , true, $binary , $nchar )
|
|
||||||
$x = $x + 1
|
$x = $x + 1
|
||||||
endw
|
endw
|
||||||
|
|
||||||
|
|
|
@ -1,67 +1,66 @@
|
||||||
#sleep 500
|
run general/parser/alter.sim
|
||||||
#run general/parser/alter.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/alter1.sim
|
||||||
#run general/parser/alter1.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/alter_stable.sim
|
||||||
#run general/parser/alter_stable.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/auto_create_tb.sim
|
||||||
#run general/parser/auto_create_tb.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/auto_create_tb_drop_tb.sim
|
||||||
#run general/parser/auto_create_tb_drop_tb.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/col_arithmetic_operation.sim
|
||||||
#run general/parser/col_arithmetic_operation.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/columnValue.sim
|
||||||
#run general/parser/columnValue.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/commit.sim
|
||||||
#run general/parser/commit.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/create_db.sim
|
||||||
#run general/parser/create_db.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/create_mt.sim
|
||||||
#run general/parser/create_mt.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/create_tb.sim
|
||||||
#run general/parser/create_tb.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/dbtbnameValidate.sim
|
||||||
#run general/parser/dbtbnameValidate.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/fill.sim
|
||||||
#run general/parser/fill.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/fill_stb.sim
|
||||||
#run general/parser/fill_stb.sim
|
sleep 500
|
||||||
#sleep 500
|
#run general/parser/fill_us.sim #
|
||||||
##run general/parser/fill_us.sim #
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/first_last.sim
|
||||||
#run general/parser/first_last.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/import_commit1.sim
|
||||||
#run general/parser/import_commit1.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/import_commit2.sim
|
||||||
#run general/parser/import_commit2.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/import_commit3.sim
|
||||||
#run general/parser/import_commit3.sim
|
sleep 500
|
||||||
#sleep 500
|
#run general/parser/import_file.sim
|
||||||
##run general/parser/import_file.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/insert_tb.sim
|
||||||
#run general/parser/insert_tb.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/tags_dynamically_specifiy.sim
|
||||||
#run general/parser/tags_dynamically_specifiy.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/interp.sim
|
||||||
#run general/parser/interp.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/lastrow.sim
|
||||||
#run general/parser/lastrow.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/limit.sim
|
||||||
#run general/parser/limit.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/limit1.sim
|
||||||
#run general/parser/limit1.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/limit1_tblocks100.sim
|
||||||
#run general/parser/limit1_tblocks100.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/limit2.sim
|
||||||
#run general/parser/limit2.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/mixed_blocks.sim
|
||||||
#run general/parser/mixed_blocks.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/nchar.sim
|
||||||
#run general/parser/nchar.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/null_char.sim
|
||||||
#run general/parser/null_char.sim
|
sleep 500
|
||||||
#sleep 500
|
run general/parser/selectResNum.sim
|
||||||
#run general/parser/selectResNum.sim
|
|
||||||
sleep 500
|
sleep 500
|
||||||
run general/parser/select_across_vnodes.sim
|
run general/parser/select_across_vnodes.sim
|
||||||
sleep 500
|
sleep 500
|
||||||
|
|
|
@ -36,9 +36,16 @@ sql create table $mt (ts timestamp, c1 int, c2 float, c3 bigint, c4 smallint, c5
|
||||||
$i = 0
|
$i = 0
|
||||||
$t = 1578203484000
|
$t = 1578203484000
|
||||||
|
|
||||||
while $i < $tbNum
|
$half = $tbNum / 2
|
||||||
|
|
||||||
|
while $i < $half
|
||||||
$tb = $tbPrefix . $i
|
$tb = $tbPrefix . $i
|
||||||
|
|
||||||
|
$nextSuffix = $i + $half
|
||||||
|
$tb1 = $tbPrefix . $nextSuffix
|
||||||
|
|
||||||
sql create table $tb using $mt tags( $i )
|
sql create table $tb using $mt tags( $i )
|
||||||
|
sql create table $tb1 using $mt tags( $nextSuffix )
|
||||||
|
|
||||||
$x = 0
|
$x = 0
|
||||||
while $x < $rowNum
|
while $x < $rowNum
|
||||||
|
@ -54,7 +61,7 @@ while $i < $tbNum
|
||||||
$nchar = $nchar . '
|
$nchar = $nchar . '
|
||||||
|
|
||||||
$t1 = $t + $ms
|
$t1 = $t + $ms
|
||||||
sql insert into $tb values ($t1 , $c , $c , $c , $c , $c , $c , $c , $binary , $nchar )
|
sql insert into $tb values ($t1 , $c , $c , $c , $c , $c , $c , $c , $binary , $nchar ) $tb1 values ($t1 , $c , $c , $c , $c , $c , $c , $c , $binary , $nchar )
|
||||||
$x = $x + 1
|
$x = $x + 1
|
||||||
endw
|
endw
|
||||||
|
|
||||||
|
|
|
@ -26,10 +26,17 @@ sql create database if not exists $db
|
||||||
sql use $db
|
sql use $db
|
||||||
sql create table $mt (ts timestamp, c1 int, c2 float, c3 bigint, c4 smallint, c5 tinyint, c6 double, c7 bool, c8 binary(10), c9 nchar(9)) TAGS(t1 int)
|
sql create table $mt (ts timestamp, c1 int, c2 float, c3 bigint, c4 smallint, c5 tinyint, c6 double, c7 bool, c8 binary(10), c9 nchar(9)) TAGS(t1 int)
|
||||||
|
|
||||||
|
$half = $tbNum / 2
|
||||||
|
|
||||||
$i = 0
|
$i = 0
|
||||||
while $i < $tbNum
|
while $i < $half
|
||||||
$tb = $tbPrefix . $i
|
$tb = $tbPrefix . $i
|
||||||
|
|
||||||
|
$nextSuffix = $i + $half
|
||||||
|
$tb1 = $tbPrefix . $nextSuffix
|
||||||
|
|
||||||
sql create table $tb using $mt tags( $i )
|
sql create table $tb using $mt tags( $i )
|
||||||
|
sql create table $tb1 using $mt tags( $nextSuffix )
|
||||||
|
|
||||||
$x = 0
|
$x = 0
|
||||||
while $x < $rowNum
|
while $x < $rowNum
|
||||||
|
@ -42,7 +49,7 @@ while $i < $tbNum
|
||||||
$binary = $binary . '
|
$binary = $binary . '
|
||||||
$nchar = 'nchar . $c
|
$nchar = 'nchar . $c
|
||||||
$nchar = $nchar . '
|
$nchar = $nchar . '
|
||||||
sql insert into $tb values ($ms , $c , $c , $c , $c , $c , $c , $c , $binary , $nchar )
|
sql insert into $tb values ($ms , $c , $c , $c , $c , $c , $c , $c , $binary , $nchar ) $tb1 values ($ms , $c , $c , $c , $c , $c , $c , $c , $binary , $nchar )
|
||||||
$x = $x + 1
|
$x = $x + 1
|
||||||
endw
|
endw
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue