Hotfix/sangshuduo/td 3607 taosdemo buffer overflow (#5636)
* [TD-3607] <fix>: fix taosdemo buffer overflow. * [TD-3607] <fix>: taosdemo buffer overflow. add tmp buffer. * [TD-3607] <fix>: taosdemo buffer overflow. fix data generation. * [TD-3607] <fix>: taosdemo buffer overflow. fix normal table writting. * [TD-3607] <fix>: taosdemo buffer overflow. remove tail spaces. * [TD-3607] <fix>: taosdemo buffer overflow. fix taosdemo alter table test case. * [TD-3607] <fix>: taosdemo buffer overflow. fix taosdemo alter table case. Co-authored-by: Shuduo Sang <sdsang@taosdata.com>
This commit is contained in:
parent
ff2f32ad9f
commit
6cb5af8072
|
@ -124,7 +124,7 @@ typedef enum enum_INSERT_MODE {
|
||||||
|
|
||||||
typedef enum enumQUERY_TYPE {
|
typedef enum enumQUERY_TYPE {
|
||||||
NO_INSERT_TYPE,
|
NO_INSERT_TYPE,
|
||||||
INSERT_TYPE,
|
INSERT_TYPE,
|
||||||
QUERY_TYPE_BUT
|
QUERY_TYPE_BUT
|
||||||
} QUERY_TYPE;
|
} QUERY_TYPE;
|
||||||
|
|
||||||
|
@ -229,7 +229,7 @@ typedef struct SColumn_S {
|
||||||
typedef struct SSuperTable_S {
|
typedef struct SSuperTable_S {
|
||||||
char sTblName[MAX_TB_NAME_SIZE+1];
|
char sTblName[MAX_TB_NAME_SIZE+1];
|
||||||
int childTblCount;
|
int childTblCount;
|
||||||
bool childTblExists; // 0: no, 1: yes
|
bool childTblExists; // 0: no, 1: yes
|
||||||
int batchCreateTableNum; // 0: no batch, > 0: batch table number in one sql
|
int batchCreateTableNum; // 0: no batch, > 0: batch table number in one sql
|
||||||
int8_t autoCreateTable; // 0: create sub table, 1: auto create sub table
|
int8_t autoCreateTable; // 0: create sub table, 1: auto create sub table
|
||||||
char childTblPrefix[MAX_TB_NAME_SIZE];
|
char childTblPrefix[MAX_TB_NAME_SIZE];
|
||||||
|
@ -239,15 +239,15 @@ typedef struct SSuperTable_S {
|
||||||
int childTblOffset;
|
int childTblOffset;
|
||||||
|
|
||||||
int multiThreadWriteOneTbl; // 0: no, 1: yes
|
int multiThreadWriteOneTbl; // 0: no, 1: yes
|
||||||
int interlaceRows; //
|
int interlaceRows; //
|
||||||
int disorderRatio; // 0: no disorder, >0: x%
|
int disorderRatio; // 0: no disorder, >0: x%
|
||||||
int disorderRange; // ms or us by database precision
|
int disorderRange; // ms or us by database precision
|
||||||
int maxSqlLen; //
|
int maxSqlLen; //
|
||||||
|
|
||||||
int insertInterval; // insert interval, will override global insert interval
|
int insertInterval; // insert interval, will override global insert interval
|
||||||
int64_t insertRows; // 0: no limit
|
int64_t insertRows; // 0: no limit
|
||||||
int timeStampStep;
|
int timeStampStep;
|
||||||
char startTimestamp[MAX_TB_NAME_SIZE]; //
|
char startTimestamp[MAX_TB_NAME_SIZE]; //
|
||||||
char sampleFormat[MAX_TB_NAME_SIZE]; // csv, json
|
char sampleFormat[MAX_TB_NAME_SIZE]; // csv, json
|
||||||
char sampleFile[MAX_FILE_NAME_LEN+1];
|
char sampleFile[MAX_FILE_NAME_LEN+1];
|
||||||
char tagsFile[MAX_FILE_NAME_LEN+1];
|
char tagsFile[MAX_FILE_NAME_LEN+1];
|
||||||
|
@ -539,7 +539,7 @@ SArguments g_args = {
|
||||||
true, // insert_only
|
true, // insert_only
|
||||||
false, // debug_print
|
false, // debug_print
|
||||||
false, // verbose_print
|
false, // verbose_print
|
||||||
false, // performance statistic print
|
false, // performance statistic print
|
||||||
false, // answer_yes;
|
false, // answer_yes;
|
||||||
"./output.txt", // output_file
|
"./output.txt", // output_file
|
||||||
0, // mode : sync or async
|
0, // mode : sync or async
|
||||||
|
@ -641,7 +641,7 @@ static void printHelp() {
|
||||||
"The password to use when connecting to the server. Default is 'taosdata'.");
|
"The password to use when connecting to the server. Default is 'taosdata'.");
|
||||||
printf("%s%s%s%s\n", indent, "-c", indent,
|
printf("%s%s%s%s\n", indent, "-c", indent,
|
||||||
"Configuration directory. Default is '/etc/taos/'.");
|
"Configuration directory. Default is '/etc/taos/'.");
|
||||||
#endif
|
#endif
|
||||||
printf("%s%s%s%s\n", indent, "-h", indent,
|
printf("%s%s%s%s\n", indent, "-h", indent,
|
||||||
"The host to connect to TDengine. Default is localhost.");
|
"The host to connect to TDengine. Default is localhost.");
|
||||||
printf("%s%s%s%s\n", indent, "-p", indent,
|
printf("%s%s%s%s\n", indent, "-p", indent,
|
||||||
|
@ -684,7 +684,7 @@ static void printHelp() {
|
||||||
"Print debug info.");
|
"Print debug info.");
|
||||||
printf("%s%s%s%s\n", indent, "-V, --version", indent,
|
printf("%s%s%s%s\n", indent, "-V, --version", indent,
|
||||||
"Print version info.");
|
"Print version info.");
|
||||||
/* printf("%s%s%s%s\n", indent, "-D", indent,
|
/* printf("%s%s%s%s\n", indent, "-D", indent,
|
||||||
"if elete database if exists. 0: no, 1: yes, default is 1");
|
"if elete database if exists. 0: no, 1: yes, default is 1");
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
@ -749,7 +749,7 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
|
||||||
&& strcasecmp(argv[i], "SMALLINT")
|
&& strcasecmp(argv[i], "SMALLINT")
|
||||||
&& strcasecmp(argv[i], "BIGINT")
|
&& strcasecmp(argv[i], "BIGINT")
|
||||||
&& strcasecmp(argv[i], "DOUBLE")
|
&& strcasecmp(argv[i], "DOUBLE")
|
||||||
&& strcasecmp(argv[i], "BINARY")
|
&& strcasecmp(argv[i], "BINARY")
|
||||||
&& strcasecmp(argv[i], "NCHAR")) {
|
&& strcasecmp(argv[i], "NCHAR")) {
|
||||||
printHelp();
|
printHelp();
|
||||||
ERROR_EXIT( "Invalid data_type!\n");
|
ERROR_EXIT( "Invalid data_type!\n");
|
||||||
|
@ -1762,7 +1762,7 @@ static void printfQuerySystemInfo(TAOS * taos) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < dbCount; i++) {
|
for (int i = 0; i < dbCount; i++) {
|
||||||
// printf database info
|
// printf database info
|
||||||
printfDbInfoForQueryToFile(filename, dbInfos[i], i);
|
printfDbInfoForQueryToFile(filename, dbInfos[i], i);
|
||||||
|
|
||||||
// show db.vgroups
|
// show db.vgroups
|
||||||
|
@ -2098,7 +2098,7 @@ static int calcRowLen(SSuperTable* superTbls) {
|
||||||
lenOfTagOfOneRow += superTbls->tags[tagIndex].dataLen + 6;
|
lenOfTagOfOneRow += superTbls->tags[tagIndex].dataLen + 6;
|
||||||
} else if (strcasecmp(dataType, "FLOAT") == 0) {
|
} else if (strcasecmp(dataType, "FLOAT") == 0) {
|
||||||
lenOfTagOfOneRow += superTbls->tags[tagIndex].dataLen + 22;
|
lenOfTagOfOneRow += superTbls->tags[tagIndex].dataLen + 22;
|
||||||
} else if (strcasecmp(dataType, "DOUBLE") == 0) {
|
} else if (strcasecmp(dataType, "DOUBLE") == 0) {
|
||||||
lenOfTagOfOneRow += superTbls->tags[tagIndex].dataLen + 42;
|
lenOfTagOfOneRow += superTbls->tags[tagIndex].dataLen + 42;
|
||||||
} else {
|
} else {
|
||||||
printf("get error tag type : %s\n", dataType);
|
printf("get error tag type : %s\n", dataType);
|
||||||
|
@ -2262,7 +2262,7 @@ static int getSuperTableFromServer(TAOS * taos, char* dbName,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if (TBL_ALREADY_EXISTS == superTbls->childTblExists) {
|
if (TBL_ALREADY_EXISTS == superTbls->childTblExists) {
|
||||||
//get all child table name use cmd: select tbname from superTblName;
|
//get all child table name use cmd: select tbname from superTblName;
|
||||||
int childTblCount = 10000;
|
int childTblCount = 10000;
|
||||||
superTbls->childTblName = (char*)calloc(1, childTblCount * TSDB_TABLE_NAME_LEN);
|
superTbls->childTblName = (char*)calloc(1, childTblCount * TSDB_TABLE_NAME_LEN);
|
||||||
if (superTbls->childTblName == NULL) {
|
if (superTbls->childTblName == NULL) {
|
||||||
|
@ -2289,7 +2289,7 @@ static int createSuperTable(TAOS * taos, char* dbName,
|
||||||
int lenOfOneRow = 0;
|
int lenOfOneRow = 0;
|
||||||
for (colIndex = 0; colIndex < superTbls->columnCount; colIndex++) {
|
for (colIndex = 0; colIndex < superTbls->columnCount; colIndex++) {
|
||||||
char* dataType = superTbls->columns[colIndex].dataType;
|
char* dataType = superTbls->columns[colIndex].dataType;
|
||||||
|
|
||||||
if (strcasecmp(dataType, "BINARY") == 0) {
|
if (strcasecmp(dataType, "BINARY") == 0) {
|
||||||
len += snprintf(cols + len, STRING_LEN - len,
|
len += snprintf(cols + len, STRING_LEN - len,
|
||||||
", col%d %s(%d)", colIndex, "BINARY",
|
", col%d %s(%d)", colIndex, "BINARY",
|
||||||
|
@ -2386,7 +2386,7 @@ static int createSuperTable(TAOS * taos, char* dbName,
|
||||||
len += snprintf(tags + len, STRING_LEN - len, "t%d %s, ", tagIndex,
|
len += snprintf(tags + len, STRING_LEN - len, "t%d %s, ", tagIndex,
|
||||||
"FLOAT");
|
"FLOAT");
|
||||||
lenOfTagOfOneRow += superTbls->tags[tagIndex].dataLen + 22;
|
lenOfTagOfOneRow += superTbls->tags[tagIndex].dataLen + 22;
|
||||||
} else if (strcasecmp(dataType, "DOUBLE") == 0) {
|
} else if (strcasecmp(dataType, "DOUBLE") == 0) {
|
||||||
len += snprintf(tags + len, STRING_LEN - len, "t%d %s, ", tagIndex,
|
len += snprintf(tags + len, STRING_LEN - len, "t%d %s, ", tagIndex,
|
||||||
"DOUBLE");
|
"DOUBLE");
|
||||||
lenOfTagOfOneRow += superTbls->tags[tagIndex].dataLen + 42;
|
lenOfTagOfOneRow += superTbls->tags[tagIndex].dataLen + 42;
|
||||||
|
@ -2638,7 +2638,7 @@ static void* createTable(void *sarg)
|
||||||
lastPrintTime = currentPrintTime;
|
lastPrintTime = currentPrintTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != len) {
|
if (0 != len) {
|
||||||
verbosePrint("%s() %d buffer: %s\n", __func__, __LINE__, buffer);
|
verbosePrint("%s() %d buffer: %s\n", __func__, __LINE__, buffer);
|
||||||
if (0 != queryDbExec(winfo->taos, buffer, NO_INSERT_TYPE, false)) {
|
if (0 != queryDbExec(winfo->taos, buffer, NO_INSERT_TYPE, false)) {
|
||||||
|
@ -2703,7 +2703,7 @@ static int startMultiThreadCreateChildTable(
|
||||||
t_info->minDelay = INT16_MAX;
|
t_info->minDelay = INT16_MAX;
|
||||||
pthread_create(pids + i, NULL, createTable, t_info);
|
pthread_create(pids + i, NULL, createTable, t_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < threads; i++) {
|
for (int i = 0; i < threads; i++) {
|
||||||
pthread_join(pids[i], NULL);
|
pthread_join(pids[i], NULL);
|
||||||
}
|
}
|
||||||
|
@ -2920,7 +2920,7 @@ static bool getColumnAndTagTypeFromInsertJsonFile(
|
||||||
cJSON* stbInfo, SSuperTable* superTbls) {
|
cJSON* stbInfo, SSuperTable* superTbls) {
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
// columns
|
// columns
|
||||||
cJSON *columns = cJSON_GetObjectItem(stbInfo, "columns");
|
cJSON *columns = cJSON_GetObjectItem(stbInfo, "columns");
|
||||||
if (columns && columns->type != cJSON_Array) {
|
if (columns && columns->type != cJSON_Array) {
|
||||||
printf("ERROR: failed to read json, columns not found\n");
|
printf("ERROR: failed to read json, columns not found\n");
|
||||||
|
@ -2958,7 +2958,7 @@ static bool getColumnAndTagTypeFromInsertJsonFile(
|
||||||
count = 1;
|
count = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// column info
|
// column info
|
||||||
memset(&columnCase, 0, sizeof(StrColumn));
|
memset(&columnCase, 0, sizeof(StrColumn));
|
||||||
cJSON *dataType = cJSON_GetObjectItem(column, "type");
|
cJSON *dataType = cJSON_GetObjectItem(column, "type");
|
||||||
if (!dataType || dataType->type != cJSON_String || dataType->valuestring == NULL) {
|
if (!dataType || dataType->type != cJSON_String || dataType->valuestring == NULL) {
|
||||||
|
@ -2989,7 +2989,7 @@ static bool getColumnAndTagTypeFromInsertJsonFile(
|
||||||
|
|
||||||
count = 1;
|
count = 1;
|
||||||
index = 0;
|
index = 0;
|
||||||
// tags
|
// tags
|
||||||
cJSON *tags = cJSON_GetObjectItem(stbInfo, "tags");
|
cJSON *tags = cJSON_GetObjectItem(stbInfo, "tags");
|
||||||
if (!tags || tags->type != cJSON_Array) {
|
if (!tags || tags->type != cJSON_Array) {
|
||||||
debugPrint("%s() LN%d, failed to read json, tags not found\n", __func__, __LINE__);
|
debugPrint("%s() LN%d, failed to read json, tags not found\n", __func__, __LINE__);
|
||||||
|
@ -3018,7 +3018,7 @@ static bool getColumnAndTagTypeFromInsertJsonFile(
|
||||||
count = 1;
|
count = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// column info
|
// column info
|
||||||
memset(&columnCase, 0, sizeof(StrColumn));
|
memset(&columnCase, 0, sizeof(StrColumn));
|
||||||
cJSON *dataType = cJSON_GetObjectItem(tag, "type");
|
cJSON *dataType = cJSON_GetObjectItem(tag, "type");
|
||||||
if (!dataType || dataType->type != cJSON_String || dataType->valuestring == NULL) {
|
if (!dataType || dataType->type != cJSON_String || dataType->valuestring == NULL) {
|
||||||
|
@ -3166,7 +3166,7 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
if (numRecPerReq && numRecPerReq->type == cJSON_Number) {
|
if (numRecPerReq && numRecPerReq->type == cJSON_Number) {
|
||||||
g_args.num_of_RPR = numRecPerReq->valueint;
|
g_args.num_of_RPR = numRecPerReq->valueint;
|
||||||
} else if (!numRecPerReq) {
|
} else if (!numRecPerReq) {
|
||||||
g_args.num_of_RPR = 100;
|
g_args.num_of_RPR = 0xffff;
|
||||||
} else {
|
} else {
|
||||||
errorPrint("%s() LN%d, failed to read json, num_of_records_per_req not found\n", __func__, __LINE__);
|
errorPrint("%s() LN%d, failed to read json, num_of_records_per_req not found\n", __func__, __LINE__);
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
|
@ -3209,7 +3209,7 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
cJSON* dbinfos = cJSON_GetArrayItem(dbs, i);
|
cJSON* dbinfos = cJSON_GetArrayItem(dbs, i);
|
||||||
if (dbinfos == NULL) continue;
|
if (dbinfos == NULL) continue;
|
||||||
|
|
||||||
// dbinfo
|
// dbinfo
|
||||||
cJSON *dbinfo = cJSON_GetObjectItem(dbinfos, "dbinfo");
|
cJSON *dbinfo = cJSON_GetObjectItem(dbinfos, "dbinfo");
|
||||||
if (!dbinfo || dbinfo->type != cJSON_Object) {
|
if (!dbinfo || dbinfo->type != cJSON_Object) {
|
||||||
printf("ERROR: failed to read json, dbinfo not found\n");
|
printf("ERROR: failed to read json, dbinfo not found\n");
|
||||||
|
@ -3615,7 +3615,7 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
}
|
}
|
||||||
g_Dbs.db[i].superTbls[j].maxSqlLen = len;
|
g_Dbs.db[i].superTbls[j].maxSqlLen = len;
|
||||||
} else if (!maxSqlLen) {
|
} else if (!maxSqlLen) {
|
||||||
g_Dbs.db[i].superTbls[j].maxSqlLen = TSDB_MAX_SQL_LEN;
|
g_Dbs.db[i].superTbls[j].maxSqlLen = g_args.max_sql_len;
|
||||||
} else {
|
} else {
|
||||||
printf("ERROR: failed to read json, maxSqlLen not found\n");
|
printf("ERROR: failed to read json, maxSqlLen not found\n");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
|
@ -3748,7 +3748,7 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON* user = cJSON_GetObjectItem(root, "user");
|
cJSON* user = cJSON_GetObjectItem(root, "user");
|
||||||
if (user && user->type == cJSON_String && user->valuestring != NULL) {
|
if (user && user->type == cJSON_String && user->valuestring != NULL) {
|
||||||
tstrncpy(g_queryInfo.user, user->valuestring, MAX_USERNAME_SIZE);
|
tstrncpy(g_queryInfo.user, user->valuestring, MAX_USERNAME_SIZE);
|
||||||
} else if (!user) {
|
} else if (!user) {
|
||||||
tstrncpy(g_queryInfo.user, "root", MAX_USERNAME_SIZE); ;
|
tstrncpy(g_queryInfo.user, "root", MAX_USERNAME_SIZE); ;
|
||||||
}
|
}
|
||||||
|
@ -3805,7 +3805,7 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
// super_table_query
|
// super_table_query
|
||||||
cJSON *specifiedQuery = cJSON_GetObjectItem(root, "specified_table_query");
|
cJSON *specifiedQuery = cJSON_GetObjectItem(root, "specified_table_query");
|
||||||
if (!specifiedQuery) {
|
if (!specifiedQuery) {
|
||||||
g_queryInfo.specifiedQueryInfo.concurrent = 0;
|
g_queryInfo.specifiedQueryInfo.concurrent = 0;
|
||||||
|
@ -3930,7 +3930,7 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// sub_table_query
|
// sub_table_query
|
||||||
cJSON *superQuery = cJSON_GetObjectItem(root, "super_table_query");
|
cJSON *superQuery = cJSON_GetObjectItem(root, "super_table_query");
|
||||||
if (!superQuery) {
|
if (!superQuery) {
|
||||||
g_queryInfo.superQueryInfo.threadCnt = 0;
|
g_queryInfo.superQueryInfo.threadCnt = 0;
|
||||||
|
@ -3996,7 +3996,7 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
||||||
cJSON* subinterval = cJSON_GetObjectItem(superQuery, "interval");
|
cJSON* subinterval = cJSON_GetObjectItem(superQuery, "interval");
|
||||||
if (subinterval && subinterval->type == cJSON_Number) {
|
if (subinterval && subinterval->type == cJSON_Number) {
|
||||||
g_queryInfo.superQueryInfo.subscribeInterval = subinterval->valueint;
|
g_queryInfo.superQueryInfo.subscribeInterval = subinterval->valueint;
|
||||||
} else if (!subinterval) {
|
} else if (!subinterval) {
|
||||||
//printf("failed to read json, subscribe interval no found\n");
|
//printf("failed to read json, subscribe interval no found\n");
|
||||||
//goto PARSE_OVER;
|
//goto PARSE_OVER;
|
||||||
g_queryInfo.superQueryInfo.subscribeInterval = 10000;
|
g_queryInfo.superQueryInfo.subscribeInterval = 10000;
|
||||||
|
@ -4200,71 +4200,77 @@ static int getRowDataFromSample(char* dataBuf, int maxLen, int64_t timestamp,
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen, ")");
|
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen, ")");
|
||||||
|
|
||||||
(*sampleUsePos)++;
|
(*sampleUsePos)++;
|
||||||
|
|
||||||
return dataLen;
|
return dataLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int generateRowData(char* dataBuf, int maxLen, int64_t timestamp, SSuperTable* stbInfo) {
|
static int generateRowData(char* recBuf, int64_t timestamp, SSuperTable* stbInfo) {
|
||||||
int dataLen = 0;
|
int dataLen = 0;
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen, "(%" PRId64 ", ", timestamp);
|
char *pstr = recBuf;
|
||||||
|
int maxLen = MAX_DATA_SIZE;
|
||||||
|
|
||||||
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen, "(%" PRId64 ", ", timestamp);
|
||||||
|
|
||||||
for (int i = 0; i < stbInfo->columnCount; i++) {
|
for (int i = 0; i < stbInfo->columnCount; i++) {
|
||||||
if ((0 == strncasecmp(stbInfo->columns[i].dataType, "binary", 6))
|
if ((0 == strncasecmp(stbInfo->columns[i].dataType, "binary", 6))
|
||||||
|| (0 == strncasecmp(stbInfo->columns[i].dataType, "nchar", 5))) {
|
|| (0 == strncasecmp(stbInfo->columns[i].dataType, "nchar", 5))) {
|
||||||
if (stbInfo->columns[i].dataLen > TSDB_MAX_BINARY_LEN) {
|
if (stbInfo->columns[i].dataLen > TSDB_MAX_BINARY_LEN) {
|
||||||
errorPrint( "binary or nchar length overflow, max size:%u\n",
|
errorPrint( "binary or nchar length overflow, max size:%u\n",
|
||||||
(uint32_t)TSDB_MAX_BINARY_LEN);
|
(uint32_t)TSDB_MAX_BINARY_LEN);
|
||||||
return (-1);
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* buf = (char*)calloc(stbInfo->columns[i].dataLen+1, 1);
|
char* buf = (char*)calloc(stbInfo->columns[i].dataLen+1, 1);
|
||||||
if (NULL == buf) {
|
if (NULL == buf) {
|
||||||
errorPrint( "calloc failed! size:%d\n", stbInfo->columns[i].dataLen);
|
errorPrint( "calloc failed! size:%d\n", stbInfo->columns[i].dataLen);
|
||||||
return (-1);
|
return -1;
|
||||||
}
|
}
|
||||||
rand_string(buf, stbInfo->columns[i].dataLen);
|
rand_string(buf, stbInfo->columns[i].dataLen);
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen, "\'%s\', ", buf);
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen, "\'%s\', ", buf);
|
||||||
tmfree(buf);
|
tmfree(buf);
|
||||||
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
||||||
"int", 3)) {
|
"int", 3)) {
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen,
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
||||||
"%d, ", rand_int());
|
"%d, ", rand_int());
|
||||||
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
||||||
"bigint", 6)) {
|
"bigint", 6)) {
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen,
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
||||||
"%"PRId64", ", rand_bigint());
|
"%"PRId64", ", rand_bigint());
|
||||||
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
||||||
"float", 5)) {
|
"float", 5)) {
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen,
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
||||||
"%f, ", rand_float());
|
"%f, ", rand_float());
|
||||||
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
||||||
"double", 6)) {
|
"double", 6)) {
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen,
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen,
|
||||||
"%f, ", rand_double());
|
"%f, ", rand_double());
|
||||||
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
} else if (0 == strncasecmp(stbInfo->columns[i].dataType,
|
||||||
"smallint", 8)) {
|
"smallint", 8)) {
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen, "%d, ", rand_smallint());
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen, "%d, ", rand_smallint());
|
||||||
} else if (0 == strncasecmp(stbInfo->columns[i].dataType, "tinyint", 7)) {
|
} else if (0 == strncasecmp(stbInfo->columns[i].dataType, "tinyint", 7)) {
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen, "%d, ", rand_tinyint());
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen, "%d, ", rand_tinyint());
|
||||||
} else if (0 == strncasecmp(stbInfo->columns[i].dataType, "bool", 4)) {
|
} else if (0 == strncasecmp(stbInfo->columns[i].dataType, "bool", 4)) {
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen, "%d, ", rand_bool());
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen, "%d, ", rand_bool());
|
||||||
} else if (0 == strncasecmp(stbInfo->columns[i].dataType, "timestamp", 9)) {
|
} else if (0 == strncasecmp(stbInfo->columns[i].dataType, "timestamp", 9)) {
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen, "%"PRId64", ", rand_bigint());
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen, "%"PRId64", ", rand_bigint());
|
||||||
} else {
|
} else {
|
||||||
errorPrint( "No support data type: %s\n", stbInfo->columns[i].dataType);
|
errorPrint( "No support data type: %s\n", stbInfo->columns[i].dataType);
|
||||||
return (-1);
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dataLen -= 2;
|
dataLen -= 2;
|
||||||
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen, ")");
|
dataLen += snprintf(pstr + dataLen, maxLen - dataLen, ")");
|
||||||
|
|
||||||
return dataLen;
|
verbosePrint("%s() LN%d, recBuf:\n\t%s\n", __func__, __LINE__, recBuf);
|
||||||
|
|
||||||
|
return strlen(recBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t generateData(char *res, char **data_type,
|
static int32_t generateData(char *recBuf, char **data_type,
|
||||||
int num_of_cols, int64_t timestamp, int lenOfBinary) {
|
int num_of_cols, int64_t timestamp, int lenOfBinary) {
|
||||||
memset(res, 0, MAX_DATA_SIZE);
|
memset(recBuf, 0, MAX_DATA_SIZE);
|
||||||
char *pstr = res;
|
char *pstr = recBuf;
|
||||||
pstr += sprintf(pstr, "(%" PRId64, timestamp);
|
pstr += sprintf(pstr, "(%" PRId64, timestamp);
|
||||||
int c = 0;
|
int c = 0;
|
||||||
|
|
||||||
|
@ -4285,7 +4291,7 @@ static int32_t generateData(char *res, char **data_type,
|
||||||
} else if (strcasecmp(data_type[i % c], "smallint") == 0) {
|
} else if (strcasecmp(data_type[i % c], "smallint") == 0) {
|
||||||
pstr += sprintf(pstr, ", %d", rand_smallint());
|
pstr += sprintf(pstr, ", %d", rand_smallint());
|
||||||
} else if (strcasecmp(data_type[i % c], "int") == 0) {
|
} else if (strcasecmp(data_type[i % c], "int") == 0) {
|
||||||
pstr += sprintf(pstr, ", %d", rand_int());
|
pstr += sprintf(pstr, ", %d", rand_int());
|
||||||
} else if (strcasecmp(data_type[i % c], "bigint") == 0) {
|
} else if (strcasecmp(data_type[i % c], "bigint") == 0) {
|
||||||
pstr += sprintf(pstr, ", %" PRId64, rand_bigint());
|
pstr += sprintf(pstr, ", %" PRId64, rand_bigint());
|
||||||
} else if (strcasecmp(data_type[i % c], "float") == 0) {
|
} else if (strcasecmp(data_type[i % c], "float") == 0) {
|
||||||
|
@ -4308,7 +4314,7 @@ static int32_t generateData(char *res, char **data_type,
|
||||||
free(s);
|
free(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pstr - res > MAX_DATA_SIZE) {
|
if (strlen(recBuf) > MAX_DATA_SIZE) {
|
||||||
perror("column length too long, abort");
|
perror("column length too long, abort");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
@ -4316,7 +4322,7 @@ static int32_t generateData(char *res, char **data_type,
|
||||||
|
|
||||||
pstr += sprintf(pstr, ")");
|
pstr += sprintf(pstr, ")");
|
||||||
|
|
||||||
return (int32_t)(pstr - res);
|
return (int32_t)strlen(recBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int prepareSampleDataForSTable(SSuperTable *superTblInfo) {
|
static int prepareSampleDataForSTable(SSuperTable *superTblInfo) {
|
||||||
|
@ -4325,9 +4331,9 @@ static int prepareSampleDataForSTable(SSuperTable *superTblInfo) {
|
||||||
sampleDataBuf = calloc(
|
sampleDataBuf = calloc(
|
||||||
superTblInfo->lenOfOneRow * MAX_SAMPLES_ONCE_FROM_FILE, 1);
|
superTblInfo->lenOfOneRow * MAX_SAMPLES_ONCE_FROM_FILE, 1);
|
||||||
if (sampleDataBuf == NULL) {
|
if (sampleDataBuf == NULL) {
|
||||||
errorPrint("%s() LN%d, Failed to calloc %d Bytes, reason:%s\n",
|
errorPrint("%s() LN%d, Failed to calloc %d Bytes, reason:%s\n",
|
||||||
__func__, __LINE__,
|
__func__, __LINE__,
|
||||||
superTblInfo->lenOfOneRow * MAX_SAMPLES_ONCE_FROM_FILE,
|
superTblInfo->lenOfOneRow * MAX_SAMPLES_ONCE_FROM_FILE,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -4396,7 +4402,7 @@ static void getTableName(char *pTblName, threadInfo* pThreadInfo, int tableSeq)
|
||||||
|
|
||||||
static int generateDataTail(char *tableName, int32_t tableSeq,
|
static int generateDataTail(char *tableName, int32_t tableSeq,
|
||||||
threadInfo* pThreadInfo, SSuperTable* superTblInfo,
|
threadInfo* pThreadInfo, SSuperTable* superTblInfo,
|
||||||
int batch, char* buffer, int64_t insertRows,
|
int batch, char* buffer, int remainderBufLen, int64_t insertRows,
|
||||||
int64_t startFrom, uint64_t startTime, int *pSamplePos, int *dataLen) {
|
int64_t startFrom, uint64_t startTime, int *pSamplePos, int *dataLen) {
|
||||||
int len = 0;
|
int len = 0;
|
||||||
int ncols_per_record = 1; // count first col ts
|
int ncols_per_record = 1; // count first col ts
|
||||||
|
@ -4413,18 +4419,19 @@ static int generateDataTail(char *tableName, int32_t tableSeq,
|
||||||
|
|
||||||
int k = 0;
|
int k = 0;
|
||||||
for (k = 0; k < batch;) {
|
for (k = 0; k < batch;) {
|
||||||
if (superTblInfo) {
|
char data[MAX_DATA_SIZE];
|
||||||
int retLen = 0;
|
int retLen = 0;
|
||||||
|
|
||||||
if (0 == strncasecmp(superTblInfo->dataSource,
|
if (superTblInfo) {
|
||||||
|
if (0 == strncasecmp(superTblInfo->dataSource,
|
||||||
"sample", strlen("sample"))) {
|
"sample", strlen("sample"))) {
|
||||||
retLen = getRowDataFromSample(
|
retLen = getRowDataFromSample(
|
||||||
buffer + len,
|
data,
|
||||||
superTblInfo->maxSqlLen - len,
|
remainderBufLen,
|
||||||
startTime + superTblInfo->timeStampStep * k,
|
startTime + superTblInfo->timeStampStep * k,
|
||||||
superTblInfo,
|
superTblInfo,
|
||||||
pSamplePos);
|
pSamplePos);
|
||||||
} else if (0 == strncasecmp(superTblInfo->dataSource,
|
} else if (0 == strncasecmp(superTblInfo->dataSource,
|
||||||
"rand", strlen("rand"))) {
|
"rand", strlen("rand"))) {
|
||||||
int rand_num = rand_tinyint() % 100;
|
int rand_num = rand_tinyint() % 100;
|
||||||
if (0 != superTblInfo->disorderRatio
|
if (0 != superTblInfo->disorderRatio
|
||||||
|
@ -4433,60 +4440,56 @@ static int generateDataTail(char *tableName, int32_t tableSeq,
|
||||||
+ superTblInfo->timeStampStep * k
|
+ superTblInfo->timeStampStep * k
|
||||||
- taosRandom() % superTblInfo->disorderRange;
|
- taosRandom() % superTblInfo->disorderRange;
|
||||||
retLen = generateRowData(
|
retLen = generateRowData(
|
||||||
buffer + len,
|
data,
|
||||||
superTblInfo->maxSqlLen - len,
|
|
||||||
d,
|
d,
|
||||||
superTblInfo);
|
superTblInfo);
|
||||||
} else {
|
} else {
|
||||||
retLen = generateRowData(
|
retLen = generateRowData(
|
||||||
buffer + len,
|
data,
|
||||||
superTblInfo->maxSqlLen - len,
|
|
||||||
startTime + superTblInfo->timeStampStep * k,
|
startTime + superTblInfo->timeStampStep * k,
|
||||||
superTblInfo);
|
superTblInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (retLen < 0) {
|
if (retLen > remainderBufLen) {
|
||||||
return -1;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
len += retLen;
|
buffer += sprintf(buffer, " %s", data);
|
||||||
|
k++;
|
||||||
if (len >= (superTblInfo->maxSqlLen - 256)) { // reserve for overwrite
|
len += retLen;
|
||||||
k++;
|
remainderBufLen -= retLen;
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
int rand_num = taosRandom() % 100;
|
int rand_num = taosRandom() % 100;
|
||||||
char data[MAX_DATA_SIZE];
|
char **data_type = g_args.datatype;
|
||||||
char **data_type = g_args.datatype;
|
int lenOfBinary = g_args.len_of_binary;
|
||||||
int lenOfBinary = g_args.len_of_binary;
|
|
||||||
|
|
||||||
if ((g_args.disorderRatio != 0)
|
if ((g_args.disorderRatio != 0)
|
||||||
&& (rand_num < g_args.disorderRange)) {
|
&& (rand_num < g_args.disorderRange)) {
|
||||||
|
|
||||||
int64_t d = startTime + DEFAULT_TIMESTAMP_STEP * k
|
int64_t d = startTime + DEFAULT_TIMESTAMP_STEP * k
|
||||||
- taosRandom() % 1000000 + rand_num;
|
- taosRandom() % 1000000 + rand_num;
|
||||||
len = generateData(data, data_type,
|
retLen = generateData(data, data_type,
|
||||||
ncols_per_record, d, lenOfBinary);
|
ncols_per_record, d, lenOfBinary);
|
||||||
} else {
|
} else {
|
||||||
len = generateData(data, data_type,
|
retLen = generateData(data, data_type,
|
||||||
ncols_per_record,
|
ncols_per_record,
|
||||||
startTime + DEFAULT_TIMESTAMP_STEP * k,
|
startTime + DEFAULT_TIMESTAMP_STEP * k,
|
||||||
lenOfBinary);
|
lenOfBinary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (len > remainderBufLen)
|
||||||
|
break;
|
||||||
|
|
||||||
buffer += sprintf(buffer, " %s", data);
|
buffer += sprintf(buffer, " %s", data);
|
||||||
if (strlen(buffer) >= (g_args.max_sql_len - 256)) { // too long
|
k++;
|
||||||
k++;
|
len += retLen;
|
||||||
break;
|
remainderBufLen -= retLen;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
verbosePrint("%s() LN%d len=%d k=%d \nbuffer=%s\n",
|
verbosePrint("%s() LN%d len=%d k=%d \nbuffer=%s\n",
|
||||||
__func__, __LINE__, len, k, buffer);
|
__func__, __LINE__, len, k, buffer);
|
||||||
|
|
||||||
k++;
|
|
||||||
startFrom ++;
|
startFrom ++;
|
||||||
|
|
||||||
if (startFrom >= insertRows) {
|
if (startFrom >= insertRows) {
|
||||||
|
@ -4570,20 +4573,25 @@ static int generateProgressiveDataBuffer(char *pTblName,
|
||||||
|
|
||||||
assert(buffer != NULL);
|
assert(buffer != NULL);
|
||||||
|
|
||||||
memset(buffer, 0, superTblInfo?superTblInfo->maxSqlLen:g_args.max_sql_len);
|
int maxSqlLen = superTblInfo?superTblInfo->maxSqlLen:g_args.max_sql_len;
|
||||||
|
int remainderBufLen = maxSqlLen;
|
||||||
|
|
||||||
|
memset(buffer, 0, maxSqlLen);
|
||||||
|
|
||||||
char *pstr = buffer;
|
char *pstr = buffer;
|
||||||
|
|
||||||
int headLen = generateSQLHead(pTblName, tableSeq, pThreadInfo, superTblInfo,
|
int headLen = generateSQLHead(pTblName, tableSeq, pThreadInfo, superTblInfo,
|
||||||
buffer);
|
buffer);
|
||||||
pstr += headLen;
|
pstr += headLen;
|
||||||
|
remainderBufLen -= headLen;
|
||||||
|
|
||||||
int k;
|
int k;
|
||||||
int dataLen;
|
int dataLen;
|
||||||
k = generateDataTail(pTblName, tableSeq, pThreadInfo, superTblInfo,
|
k = generateDataTail(pTblName, tableSeq, pThreadInfo, superTblInfo,
|
||||||
g_args.num_of_RPR, pstr, insertRows, startFrom,
|
g_args.num_of_RPR, pstr, remainderBufLen, insertRows, startFrom,
|
||||||
startTime,
|
startTime,
|
||||||
pSamplePos, &dataLen);
|
pSamplePos, &dataLen);
|
||||||
|
|
||||||
return k;
|
return k;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4656,13 +4664,18 @@ static void* syncWriteInterlace(threadInfo *pThreadInfo) {
|
||||||
int generatedRecPerTbl = 0;
|
int generatedRecPerTbl = 0;
|
||||||
bool flagSleep = true;
|
bool flagSleep = true;
|
||||||
int sleepTimeTotal = 0;
|
int sleepTimeTotal = 0;
|
||||||
|
|
||||||
|
int maxSqlLen = superTblInfo?superTblInfo->maxSqlLen:g_args.max_sql_len;
|
||||||
|
int remainderBufLen;
|
||||||
|
|
||||||
while(pThreadInfo->totalInsertRows < pThreadInfo->ntables * insertRows) {
|
while(pThreadInfo->totalInsertRows < pThreadInfo->ntables * insertRows) {
|
||||||
if ((flagSleep) && (insert_interval)) {
|
if ((flagSleep) && (insert_interval)) {
|
||||||
st = taosGetTimestampUs();
|
st = taosGetTimestampUs();
|
||||||
flagSleep = false;
|
flagSleep = false;
|
||||||
}
|
}
|
||||||
// generate data
|
// generate data
|
||||||
memset(buffer, 0, superTblInfo?superTblInfo->maxSqlLen:g_args.max_sql_len);
|
memset(buffer, 0, maxSqlLen);
|
||||||
|
remainderBufLen = maxSqlLen;
|
||||||
|
|
||||||
char *pstr = buffer;
|
char *pstr = buffer;
|
||||||
int recOfBatch = 0;
|
int recOfBatch = 0;
|
||||||
|
@ -4685,6 +4698,8 @@ static void* syncWriteInterlace(threadInfo *pThreadInfo) {
|
||||||
pThreadInfo->threadID, __func__, __LINE__, i, buffer);
|
pThreadInfo->threadID, __func__, __LINE__, i, buffer);
|
||||||
|
|
||||||
pstr += headLen;
|
pstr += headLen;
|
||||||
|
remainderBufLen -= headLen;
|
||||||
|
|
||||||
int dataLen = 0;
|
int dataLen = 0;
|
||||||
|
|
||||||
verbosePrint("[%d] %s() LN%d i=%d batchPerTblTimes=%d batchPerTbl = %d\n",
|
verbosePrint("[%d] %s() LN%d i=%d batchPerTblTimes=%d batchPerTbl = %d\n",
|
||||||
|
@ -4698,13 +4713,20 @@ static void* syncWriteInterlace(threadInfo *pThreadInfo) {
|
||||||
} else {
|
} else {
|
||||||
startTime = 1500000000000;
|
startTime = 1500000000000;
|
||||||
}
|
}
|
||||||
generateDataTail(
|
int generated = generateDataTail(
|
||||||
tableName, tableSeq, pThreadInfo, superTblInfo,
|
tableName, tableSeq, pThreadInfo, superTblInfo,
|
||||||
batchPerTbl, pstr, insertRows, 0,
|
batchPerTbl, pstr, remainderBufLen, insertRows, 0,
|
||||||
startTime,
|
startTime,
|
||||||
&(pThreadInfo->samplePos), &dataLen);
|
&(pThreadInfo->samplePos), &dataLen);
|
||||||
|
|
||||||
|
if (generated < 0) {
|
||||||
|
debugPrint("[%d] %s() LN%d, generated data is %d\n",
|
||||||
|
pThreadInfo->threadID, __func__, __LINE__, generated);
|
||||||
|
goto free_and_statistics_interlace;
|
||||||
|
}
|
||||||
pstr += dataLen;
|
pstr += dataLen;
|
||||||
|
remainderBufLen -= dataLen;
|
||||||
|
|
||||||
recOfBatch += batchPerTbl;
|
recOfBatch += batchPerTbl;
|
||||||
startTime += batchPerTbl * superTblInfo->timeStampStep;
|
startTime += batchPerTbl * superTblInfo->timeStampStep;
|
||||||
pThreadInfo->totalInsertRows += batchPerTbl;
|
pThreadInfo->totalInsertRows += batchPerTbl;
|
||||||
|
@ -4796,9 +4818,9 @@ static void* syncWriteInterlace(threadInfo *pThreadInfo) {
|
||||||
free_and_statistics_interlace:
|
free_and_statistics_interlace:
|
||||||
tmfree(buffer);
|
tmfree(buffer);
|
||||||
|
|
||||||
printf("====thread[%d] completed total inserted rows: %"PRId64 ", total affected rows: %"PRId64 "====\n",
|
printf("====thread[%d] completed total inserted rows: %"PRId64 ", total affected rows: %"PRId64 "====\n",
|
||||||
pThreadInfo->threadID,
|
pThreadInfo->threadID,
|
||||||
pThreadInfo->totalInsertRows,
|
pThreadInfo->totalInsertRows,
|
||||||
pThreadInfo->totalAffectedRows);
|
pThreadInfo->totalAffectedRows);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -4929,16 +4951,16 @@ static void* syncWriteProgressive(threadInfo *pThreadInfo) {
|
||||||
free_and_statistics_2:
|
free_and_statistics_2:
|
||||||
tmfree(buffer);
|
tmfree(buffer);
|
||||||
|
|
||||||
printf("====thread[%d] completed total inserted rows: %"PRId64 ", total affected rows: %"PRId64 "====\n",
|
printf("====thread[%d] completed total inserted rows: %"PRId64 ", total affected rows: %"PRId64 "====\n",
|
||||||
pThreadInfo->threadID,
|
pThreadInfo->threadID,
|
||||||
pThreadInfo->totalInsertRows,
|
pThreadInfo->totalInsertRows,
|
||||||
pThreadInfo->totalAffectedRows);
|
pThreadInfo->totalAffectedRows);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void* syncWrite(void *sarg) {
|
static void* syncWrite(void *sarg) {
|
||||||
|
|
||||||
threadInfo *winfo = (threadInfo *)sarg;
|
threadInfo *winfo = (threadInfo *)sarg;
|
||||||
SSuperTable* superTblInfo = winfo->superTblInfo;
|
SSuperTable* superTblInfo = winfo->superTblInfo;
|
||||||
|
|
||||||
int interlaceRows = superTblInfo?superTblInfo->interlaceRows:g_args.interlace_rows;
|
int interlaceRows = superTblInfo?superTblInfo->interlaceRows:g_args.interlace_rows;
|
||||||
|
@ -4953,7 +4975,7 @@ static void* syncWrite(void *sarg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void callBack(void *param, TAOS_RES *res, int code) {
|
static void callBack(void *param, TAOS_RES *res, int code) {
|
||||||
threadInfo* winfo = (threadInfo*)param;
|
threadInfo* winfo = (threadInfo*)param;
|
||||||
SSuperTable* superTblInfo = winfo->superTblInfo;
|
SSuperTable* superTblInfo = winfo->superTblInfo;
|
||||||
|
|
||||||
int insert_interval =
|
int insert_interval =
|
||||||
|
@ -4966,7 +4988,7 @@ static void callBack(void *param, TAOS_RES *res, int code) {
|
||||||
}
|
}
|
||||||
|
|
||||||
char *buffer = calloc(1, winfo->superTblInfo->maxSqlLen);
|
char *buffer = calloc(1, winfo->superTblInfo->maxSqlLen);
|
||||||
char *data = calloc(1, MAX_DATA_SIZE);
|
char data[MAX_DATA_SIZE];
|
||||||
char *pstr = buffer;
|
char *pstr = buffer;
|
||||||
pstr += sprintf(pstr, "insert into %s.%s%d values", winfo->db_name, winfo->tb_prefix,
|
pstr += sprintf(pstr, "insert into %s.%s%d values", winfo->db_name, winfo->tb_prefix,
|
||||||
winfo->start_table_from);
|
winfo->start_table_from);
|
||||||
|
@ -4978,7 +5000,6 @@ static void callBack(void *param, TAOS_RES *res, int code) {
|
||||||
if (winfo->start_table_from > winfo->end_table_to) {
|
if (winfo->start_table_from > winfo->end_table_to) {
|
||||||
tsem_post(&winfo->lock_sem);
|
tsem_post(&winfo->lock_sem);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
free(data);
|
|
||||||
taos_free_result(res);
|
taos_free_result(res);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -4988,11 +5009,9 @@ static void callBack(void *param, TAOS_RES *res, int code) {
|
||||||
if (0 != winfo->superTblInfo->disorderRatio
|
if (0 != winfo->superTblInfo->disorderRatio
|
||||||
&& rand_num < winfo->superTblInfo->disorderRatio) {
|
&& rand_num < winfo->superTblInfo->disorderRatio) {
|
||||||
int64_t d = winfo->lastTs - taosRandom() % 1000000 + rand_num;
|
int64_t d = winfo->lastTs - taosRandom() % 1000000 + rand_num;
|
||||||
//generateData(data, datatype, ncols_per_record, d, len_of_binary);
|
generateRowData(data, d, winfo->superTblInfo);
|
||||||
generateRowData(data, MAX_DATA_SIZE, d, winfo->superTblInfo);
|
|
||||||
} else {
|
} else {
|
||||||
//generateData(data, datatype, ncols_per_record, start_time += 1000, len_of_binary);
|
generateRowData(data, winfo->lastTs += 1000, winfo->superTblInfo);
|
||||||
generateRowData(data, MAX_DATA_SIZE, winfo->lastTs += 1000, winfo->superTblInfo);
|
|
||||||
}
|
}
|
||||||
pstr += sprintf(pstr, "%s", data);
|
pstr += sprintf(pstr, "%s", data);
|
||||||
winfo->counter++;
|
winfo->counter++;
|
||||||
|
@ -5007,7 +5026,6 @@ static void callBack(void *param, TAOS_RES *res, int code) {
|
||||||
}
|
}
|
||||||
taos_query_a(winfo->taos, buffer, callBack, winfo);
|
taos_query_a(winfo->taos, buffer, callBack, winfo);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
free(data);
|
|
||||||
|
|
||||||
taos_free_result(res);
|
taos_free_result(res);
|
||||||
}
|
}
|
||||||
|
@ -5373,7 +5391,7 @@ static void *readTable(void *sarg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *readMetric(void *sarg) {
|
static void *readMetric(void *sarg) {
|
||||||
#if 1
|
#if 1
|
||||||
threadInfo *rinfo = (threadInfo *)sarg;
|
threadInfo *rinfo = (threadInfo *)sarg;
|
||||||
TAOS *taos = rinfo->taos;
|
TAOS *taos = rinfo->taos;
|
||||||
char command[BUFFER_SIZE] = "\0";
|
char command[BUFFER_SIZE] = "\0";
|
||||||
|
@ -5524,7 +5542,7 @@ static int insertTestProcess() {
|
||||||
|
|
||||||
//int64_t totalInsertRows = 0;
|
//int64_t totalInsertRows = 0;
|
||||||
//int64_t totalAffectedRows = 0;
|
//int64_t totalAffectedRows = 0;
|
||||||
//for (int i = 0; i < g_Dbs.dbCount; i++) {
|
//for (int i = 0; i < g_Dbs.dbCount; i++) {
|
||||||
// for (int j = 0; j < g_Dbs.db[i].superTblCount; j++) {
|
// for (int j = 0; j < g_Dbs.db[i].superTblCount; j++) {
|
||||||
// totalInsertRows+= g_Dbs.db[i].superTbls[j].totalInsertRows;
|
// totalInsertRows+= g_Dbs.db[i].superTbls[j].totalInsertRows;
|
||||||
// totalAffectedRows += g_Dbs.db[i].superTbls[j].totalAffectedRows;
|
// totalAffectedRows += g_Dbs.db[i].superTbls[j].totalAffectedRows;
|
||||||
|
@ -5921,7 +5939,7 @@ static void *subSubscribeProcess(void *sarg) {
|
||||||
sprintf(tmpFile, "%s-%d",
|
sprintf(tmpFile, "%s-%d",
|
||||||
g_queryInfo.superQueryInfo.result[i], winfo->threadID);
|
g_queryInfo.superQueryInfo.result[i], winfo->threadID);
|
||||||
}
|
}
|
||||||
tsub[i] = subscribeImpl(winfo->taos, subSqlstr, topic, tmpFile);
|
tsub[i] = subscribeImpl(winfo->taos, subSqlstr, topic, tmpFile);
|
||||||
if (NULL == tsub[i]) {
|
if (NULL == tsub[i]) {
|
||||||
taos_close(winfo->taos);
|
taos_close(winfo->taos);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -6109,7 +6127,7 @@ static int subscribeTestProcess() {
|
||||||
&& (g_queryInfo.superQueryInfo.threadCnt > 0)) {
|
&& (g_queryInfo.superQueryInfo.threadCnt > 0)) {
|
||||||
pidsOfSub = malloc(g_queryInfo.superQueryInfo.threadCnt *
|
pidsOfSub = malloc(g_queryInfo.superQueryInfo.threadCnt *
|
||||||
sizeof(pthread_t));
|
sizeof(pthread_t));
|
||||||
infosOfSub = malloc(g_queryInfo.superQueryInfo.threadCnt *
|
infosOfSub = malloc(g_queryInfo.superQueryInfo.threadCnt *
|
||||||
sizeof(threadInfo));
|
sizeof(threadInfo));
|
||||||
if ((NULL == pidsOfSub) || (NULL == infosOfSub)) {
|
if ((NULL == pidsOfSub) || (NULL == infosOfSub)) {
|
||||||
errorPrint("%s() LN%d, malloc failed for create threads\n",
|
errorPrint("%s() LN%d, malloc failed for create threads\n",
|
||||||
|
@ -6256,7 +6274,7 @@ static void setParaFromArg(){
|
||||||
g_Dbs.db[0].superTbls[0].timeStampStep = DEFAULT_TIMESTAMP_STEP;
|
g_Dbs.db[0].superTbls[0].timeStampStep = DEFAULT_TIMESTAMP_STEP;
|
||||||
|
|
||||||
g_Dbs.db[0].superTbls[0].insertRows = g_args.num_of_DPT;
|
g_Dbs.db[0].superTbls[0].insertRows = g_args.num_of_DPT;
|
||||||
g_Dbs.db[0].superTbls[0].maxSqlLen = TSDB_PAYLOAD_SIZE;
|
g_Dbs.db[0].superTbls[0].maxSqlLen = g_args.max_sql_len;
|
||||||
|
|
||||||
g_Dbs.db[0].superTbls[0].columnCount = 0;
|
g_Dbs.db[0].superTbls[0].columnCount = 0;
|
||||||
for (int i = 0; i < MAX_NUM_DATATYPE; i++) {
|
for (int i = 0; i < MAX_NUM_DATATYPE; i++) {
|
||||||
|
|
|
@ -139,6 +139,18 @@ python3 ./test.py -f import_merge/importInsertThenImport.py
|
||||||
python3 ./test.py -f import_merge/importCSV.py
|
python3 ./test.py -f import_merge/importCSV.py
|
||||||
#======================p1-end===============
|
#======================p1-end===============
|
||||||
#======================p2-start===============
|
#======================p2-start===============
|
||||||
|
# tools
|
||||||
|
python3 test.py -f tools/taosdumpTest.py
|
||||||
|
|
||||||
|
python3 test.py -f tools/taosdemoTest.py
|
||||||
|
python3 test.py -f tools/taosdemoTestWithoutMetric.py
|
||||||
|
python3 test.py -f tools/taosdemoTestWithJson.py
|
||||||
|
python3 test.py -f tools/taosdemoTestLimitOffset.py
|
||||||
|
python3 test.py -f tools/taosdemoTestTblAlt.py
|
||||||
|
python3 test.py -f tools/taosdemoTestSampleData.py
|
||||||
|
python3 test.py -f tools/taosdemoTestInterlace.py
|
||||||
|
python3 test.py -f tools/taosdemoTestQuery.py
|
||||||
|
|
||||||
# update
|
# update
|
||||||
python3 ./test.py -f update/allow_update.py
|
python3 ./test.py -f update/allow_update.py
|
||||||
python3 ./test.py -f update/allow_update-0.py
|
python3 ./test.py -f update/allow_update-0.py
|
||||||
|
@ -247,18 +259,6 @@ python3 test.py -f subscribe/supertable.py
|
||||||
#======================p3-end===============
|
#======================p3-end===============
|
||||||
#======================p4-start===============
|
#======================p4-start===============
|
||||||
|
|
||||||
# tools
|
|
||||||
python3 test.py -f tools/taosdumpTest.py
|
|
||||||
|
|
||||||
python3 test.py -f tools/taosdemoTest.py
|
|
||||||
python3 test.py -f tools/taosdemoTestWithoutMetric.py
|
|
||||||
python3 test.py -f tools/taosdemoTestWithJson.py
|
|
||||||
python3 test.py -f tools/taosdemoTestLimitOffset.py
|
|
||||||
python3 test.py -f tools/taosdemoTest2.py
|
|
||||||
python3 test.py -f tools/taosdemoTestSampleData.py
|
|
||||||
python3 test.py -f tools/taosdemoTestInterlace.py
|
|
||||||
python3 test.py -f tools/taosdemoTestQuery.py
|
|
||||||
|
|
||||||
python3 ./test.py -f update/merge_commit_data-0.py
|
python3 ./test.py -f update/merge_commit_data-0.py
|
||||||
# wal
|
# wal
|
||||||
python3 ./test.py -f wal/addOldWalTest.py
|
python3 ./test.py -f wal/addOldWalTest.py
|
||||||
|
|
|
@ -29,10 +29,33 @@ class TDTestCase:
|
||||||
self.numberOfTables = 10
|
self.numberOfTables = 10
|
||||||
self.numberOfRecords = 1000000
|
self.numberOfRecords = 1000000
|
||||||
|
|
||||||
|
def getBuildPath(self):
|
||||||
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
if ("community" in selfPath):
|
||||||
|
projPath = selfPath[:selfPath.find("community")]
|
||||||
|
else:
|
||||||
|
projPath = selfPath[:selfPath.find("tests")]
|
||||||
|
|
||||||
|
for root, dirs, files in os.walk(projPath):
|
||||||
|
if ("taosd" in files):
|
||||||
|
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||||
|
if ("packaging" not in rootRealPath):
|
||||||
|
buildPath = root[:len(root) - len("/build/bin")]
|
||||||
|
break
|
||||||
|
return buildPath
|
||||||
|
|
||||||
def insertDataAndAlterTable(self, threadID):
|
def insertDataAndAlterTable(self, threadID):
|
||||||
|
buildPath = self.getBuildPath()
|
||||||
|
if (buildPath == ""):
|
||||||
|
tdLog.exit("taosd not found!")
|
||||||
|
else:
|
||||||
|
tdLog.info("taosd found in %s" % buildPath)
|
||||||
|
binPath = buildPath + "/build/bin/"
|
||||||
|
|
||||||
if(threadID == 0):
|
if(threadID == 0):
|
||||||
os.system("taosdemo -y -t %d -n %d" %
|
os.system("%staosdemo -y -t %d -n %d" %
|
||||||
(self.numberOfTables, self.numberOfRecords))
|
(binPath, self.numberOfTables, self.numberOfRecords))
|
||||||
if(threadID == 1):
|
if(threadID == 1):
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
print("use test")
|
print("use test")
|
||||||
|
@ -47,7 +70,13 @@ class TDTestCase:
|
||||||
|
|
||||||
# check if all the tables have heen created
|
# check if all the tables have heen created
|
||||||
while True:
|
while True:
|
||||||
tdSql.query("show tables")
|
try:
|
||||||
|
tdSql.query("show tables")
|
||||||
|
except Exception as e:
|
||||||
|
tdLog.info("show tables test failed")
|
||||||
|
time.sleep(1)
|
||||||
|
continue
|
||||||
|
|
||||||
rows = tdSql.queryRows
|
rows = tdSql.queryRows
|
||||||
print("number of tables: %d" % rows)
|
print("number of tables: %d" % rows)
|
||||||
if(rows == self.numberOfTables):
|
if(rows == self.numberOfTables):
|
||||||
|
@ -56,16 +85,23 @@ class TDTestCase:
|
||||||
# check if there are any records in the last created table
|
# check if there are any records in the last created table
|
||||||
while True:
|
while True:
|
||||||
print("query started")
|
print("query started")
|
||||||
tdSql.query("select * from test.t9")
|
try:
|
||||||
|
tdSql.query("select * from test.t9")
|
||||||
|
except Exception as e:
|
||||||
|
tdLog.info("select * test failed")
|
||||||
|
time.sleep(2)
|
||||||
|
continue
|
||||||
|
|
||||||
rows = tdSql.queryRows
|
rows = tdSql.queryRows
|
||||||
print("number of records: %d" % rows)
|
print("number of records: %d" % rows)
|
||||||
if(rows > 0):
|
if(rows > 0):
|
||||||
break
|
break
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
print("alter table test.meters add column col10 int")
|
print("alter table test.meters add column col10 int")
|
||||||
tdSql.execute("alter table test.meters add column col10 int")
|
tdSql.execute("alter table test.meters add column col10 int")
|
||||||
print("insert into test.t0 values (now, 1, 2, 3, 4, 0.1, 0.01,'test', '测试', TRUE, 1610000000000, 0)")
|
print("insert into test.t9 values (now, 1, 2, 3, 4, 0.1, 0.01,'test', '测试', TRUE, 1610000000000, 0)")
|
||||||
tdSql.execute("insert into test.t0 values (now, 1, 2, 3, 4, 0.1, 0.01,'test', '测试', TRUE, 1610000000000, 0)")
|
tdSql.execute("insert into test.t9 values (now, 1, 2, 3, 4, 0.1, 0.01,'test', '测试', TRUE, 1610000000000, 0)")
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
tdSql.prepare()
|
tdSql.prepare()
|
||||||
|
@ -78,6 +114,8 @@ class TDTestCase:
|
||||||
t1.join()
|
t1.join()
|
||||||
t2.join()
|
t2.join()
|
||||||
|
|
||||||
|
time.sleep(3)
|
||||||
|
|
||||||
tdSql.query("select count(*) from test.meters")
|
tdSql.query("select count(*) from test.meters")
|
||||||
tdSql.checkData(0, 0, self.numberOfRecords * self.numberOfTables + 1)
|
tdSql.checkData(0, 0, self.numberOfRecords * self.numberOfTables + 1)
|
||||||
|
|
Loading…
Reference in New Issue