Merge remote-tracking branch 'origin/feature/query' into feature/query
This commit is contained in:
commit
b93509f35f
|
@ -24,3 +24,11 @@ ENDIF ()
|
||||||
IF (TD_MEM_CHECK)
|
IF (TD_MEM_CHECK)
|
||||||
ADD_DEFINITIONS(-DTAOS_MEM_CHECK)
|
ADD_DEFINITIONS(-DTAOS_MEM_CHECK)
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (TD_RANDOM_FILE_FAIL)
|
||||||
|
ADD_DEFINITIONS(-DTAOS_RANDOM_FILE_FAIL)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (TD_RANDOM_NETWORK_FAIL)
|
||||||
|
ADD_DEFINITIONS(-DTAOS_RANDOM_NETWORK_FAIL)
|
||||||
|
ENDIF ()
|
||||||
|
|
|
@ -31,3 +31,13 @@ IF (${MEM_CHECK} MATCHES "true")
|
||||||
SET(TD_MEM_CHECK TRUE)
|
SET(TD_MEM_CHECK TRUE)
|
||||||
MESSAGE(STATUS "build with memory check")
|
MESSAGE(STATUS "build with memory check")
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (${RANDOM_FILE_FAIL} MATCHES "true")
|
||||||
|
SET(TD_RANDOM_FILE_FAIL TRUE)
|
||||||
|
MESSAGE(STATUS "build with random-file-fail enabled")
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (${RANDOM_NETWORK_FAIL} MATCHES "true")
|
||||||
|
SET(TD_RANDOM_NETWORK_FAIL TRUE)
|
||||||
|
MESSAGE(STATUS "build with random-network-fail enabled")
|
||||||
|
ENDIF ()
|
||||||
|
|
|
@ -106,6 +106,12 @@ int32_t dnodeInitMgmt() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t code = vnodeInitResources();
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
dnodeCleanupMgmt();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// create the queue and thread to handle the message
|
// create the queue and thread to handle the message
|
||||||
tsMgmtQset = taosOpenQset();
|
tsMgmtQset = taosOpenQset();
|
||||||
if (tsMgmtQset == NULL) {
|
if (tsMgmtQset == NULL) {
|
||||||
|
@ -127,7 +133,7 @@ int32_t dnodeInitMgmt() {
|
||||||
pthread_attr_init(&thAttr);
|
pthread_attr_init(&thAttr);
|
||||||
pthread_attr_setdetachstate(&thAttr, PTHREAD_CREATE_JOINABLE);
|
pthread_attr_setdetachstate(&thAttr, PTHREAD_CREATE_JOINABLE);
|
||||||
|
|
||||||
int32_t code = pthread_create(&tsQthread, &thAttr, dnodeProcessMgmtQueue, NULL);
|
code = pthread_create(&tsQthread, &thAttr, dnodeProcessMgmtQueue, NULL);
|
||||||
pthread_attr_destroy(&thAttr);
|
pthread_attr_destroy(&thAttr);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
dError("failed to create thread to process mgmt queue, reason:%s", strerror(errno));
|
dError("failed to create thread to process mgmt queue, reason:%s", strerror(errno));
|
||||||
|
@ -176,6 +182,7 @@ void dnodeCleanupMgmt() {
|
||||||
tsMgmtQset = NULL;
|
tsMgmtQset = NULL;
|
||||||
tsMgmtQueue = NULL;
|
tsMgmtQueue = NULL;
|
||||||
|
|
||||||
|
vnodeCleanupResources();
|
||||||
}
|
}
|
||||||
|
|
||||||
void dnodeDispatchToMgmtQueue(SRpcMsg *pMsg) {
|
void dnodeDispatchToMgmtQueue(SRpcMsg *pMsg) {
|
||||||
|
@ -242,8 +249,14 @@ static int32_t dnodeGetVnodeList(int32_t vnodeList[], int32_t *numOfVnodes) {
|
||||||
int32_t vnode = atoi(de->d_name + 5);
|
int32_t vnode = atoi(de->d_name + 5);
|
||||||
if (vnode == 0) continue;
|
if (vnode == 0) continue;
|
||||||
|
|
||||||
vnodeList[*numOfVnodes] = vnode;
|
|
||||||
(*numOfVnodes)++;
|
(*numOfVnodes)++;
|
||||||
|
|
||||||
|
if (*numOfVnodes >= TSDB_MAX_VNODES) {
|
||||||
|
dError("vgId:%d, too many vnode directory in disk, exist:%d max:%d", vnode, *numOfVnodes, TSDB_MAX_VNODES);
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
vnodeList[*numOfVnodes - 1] = vnode;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
|
@ -275,13 +288,12 @@ static void *dnodeOpenVnode(void *param) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t dnodeOpenVnodes() {
|
static int32_t dnodeOpenVnodes() {
|
||||||
int32_t *vnodeList = calloc(TSDB_MAX_VNODES, sizeof(int32_t));
|
int32_t vnodeList[TSDB_MAX_VNODES] = {0};
|
||||||
int32_t numOfVnodes;
|
int32_t numOfVnodes = 0;
|
||||||
int32_t status = dnodeGetVnodeList(vnodeList, &numOfVnodes);
|
int32_t status = dnodeGetVnodeList(vnodeList, &numOfVnodes);
|
||||||
|
|
||||||
if (status != TSDB_CODE_SUCCESS) {
|
if (status != TSDB_CODE_SUCCESS) {
|
||||||
dInfo("get dnode list failed");
|
dInfo("get dnode list failed");
|
||||||
free(vnodeList);
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -327,7 +339,6 @@ static int32_t dnodeOpenVnodes() {
|
||||||
free(pThread->vnodeList);
|
free(pThread->vnodeList);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(vnodeList);
|
|
||||||
free(threads);
|
free(threads);
|
||||||
dInfo("there are total vnodes:%d, openned:%d failed:%d", numOfVnodes, openVnodes, failedVnodes);
|
dInfo("there are total vnodes:%d, openned:%d failed:%d", numOfVnodes, openVnodes, failedVnodes);
|
||||||
|
|
||||||
|
@ -335,9 +346,9 @@ static int32_t dnodeOpenVnodes() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void dnodeStartStream() {
|
void dnodeStartStream() {
|
||||||
int32_t vnodeList[TSDB_MAX_VNODES];
|
int32_t vnodeList[TSDB_MAX_VNODES] = {0};
|
||||||
int32_t numOfVnodes = 0;
|
int32_t numOfVnodes = 0;
|
||||||
int32_t status = dnodeGetVnodeList(vnodeList, &numOfVnodes);
|
int32_t status = vnodeGetVnodeList(vnodeList, &numOfVnodes);
|
||||||
|
|
||||||
if (status != TSDB_CODE_SUCCESS) {
|
if (status != TSDB_CODE_SUCCESS) {
|
||||||
dInfo("get dnode list failed");
|
dInfo("get dnode list failed");
|
||||||
|
@ -352,15 +363,14 @@ void dnodeStartStream() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dnodeCloseVnodes() {
|
static void dnodeCloseVnodes() {
|
||||||
int32_t *vnodeList = (int32_t *)malloc(sizeof(int32_t) * TSDB_MAX_VNODES);
|
int32_t vnodeList[TSDB_MAX_VNODES]= {0};
|
||||||
int32_t numOfVnodes;
|
int32_t numOfVnodes = 0;
|
||||||
int32_t status;
|
int32_t status;
|
||||||
|
|
||||||
status = dnodeGetVnodeList(vnodeList, &numOfVnodes);
|
status = vnodeGetVnodeList(vnodeList, &numOfVnodes);
|
||||||
|
|
||||||
if (status != TSDB_CODE_SUCCESS) {
|
if (status != TSDB_CODE_SUCCESS) {
|
||||||
dInfo("get dnode list failed");
|
dInfo("get dnode list failed");
|
||||||
free(vnodeList);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,7 +378,6 @@ static void dnodeCloseVnodes() {
|
||||||
vnodeClose(vnodeList[i]);
|
vnodeClose(vnodeList[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(vnodeList);
|
|
||||||
dInfo("total vnodes:%d are all closed", numOfVnodes);
|
dInfo("total vnodes:%d are all closed", numOfVnodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,9 +58,13 @@ void* vnodeGetWqueue(int32_t vgId);
|
||||||
void* vnodeGetWal(void *pVnode);
|
void* vnodeGetWal(void *pVnode);
|
||||||
|
|
||||||
int32_t vnodeProcessWrite(void *pVnode, int qtype, void *pHead, void *item);
|
int32_t vnodeProcessWrite(void *pVnode, int qtype, void *pHead, void *item);
|
||||||
|
int32_t vnodeGetVnodeList(int32_t vnodeList[], int32_t *numOfVnodes);
|
||||||
void vnodeBuildStatusMsg(void *param);
|
void vnodeBuildStatusMsg(void *param);
|
||||||
void vnodeSetAccess(SDMVgroupAccess *pAccess, int32_t numOfVnodes);
|
void vnodeSetAccess(SDMVgroupAccess *pAccess, int32_t numOfVnodes);
|
||||||
|
|
||||||
|
int32_t vnodeInitResources();
|
||||||
|
void vnodeCleanupResources();
|
||||||
|
|
||||||
int32_t vnodeProcessRead(void *pVnode, SReadMsg *pReadMsg);
|
int32_t vnodeProcessRead(void *pVnode, SReadMsg *pReadMsg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <wordexp.h>
|
#include <wordexp.h>
|
||||||
|
#include <regex.h>
|
||||||
|
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
@ -54,6 +55,7 @@ static struct argp_option options[] = {
|
||||||
{0, 'P', "password", 0, "The password to use when connecting to the server. Default is 'taosdata'.", 3},
|
{0, 'P', "password", 0, "The password to use when connecting to the server. Default is 'taosdata'.", 3},
|
||||||
{0, 'd', "database", 0, "Destination database. Default is 'test'.", 3},
|
{0, 'd', "database", 0, "Destination database. Default is 'test'.", 3},
|
||||||
{0, 'm', "table_prefix", 0, "Table prefix name. Default is 't'.", 3},
|
{0, 'm', "table_prefix", 0, "Table prefix name. Default is 't'.", 3},
|
||||||
|
{0, 's', "sql file", 0, "The select sql file.", 3},
|
||||||
{0, 'M', 0, 0, "Use metric flag.", 13},
|
{0, 'M', 0, 0, "Use metric flag.", 13},
|
||||||
{0, 'o', "outputfile", 0, "Direct output to the named file. Default is './output.txt'.", 14},
|
{0, 'o', "outputfile", 0, "Direct output to the named file. Default is './output.txt'.", 14},
|
||||||
{0, 'q', "query_mode", 0, "Query mode--0: SYNC, 1: ASYNC. Default is SYNC.", 6},
|
{0, 'q', "query_mode", 0, "Query mode--0: SYNC, 1: ASYNC. Default is SYNC.", 6},
|
||||||
|
@ -79,6 +81,7 @@ typedef struct DemoArguments {
|
||||||
char *password;
|
char *password;
|
||||||
char *database;
|
char *database;
|
||||||
char *tb_prefix;
|
char *tb_prefix;
|
||||||
|
char *sqlFile;
|
||||||
bool use_metric;
|
bool use_metric;
|
||||||
bool insert_only;
|
bool insert_only;
|
||||||
char *output_file;
|
char *output_file;
|
||||||
|
@ -120,6 +123,9 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
||||||
case 'o':
|
case 'o':
|
||||||
arguments->output_file = arg;
|
arguments->output_file = arg;
|
||||||
break;
|
break;
|
||||||
|
case 's':
|
||||||
|
arguments->sqlFile = arg;
|
||||||
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
arguments->mode = atoi(arg);
|
arguments->mode = atoi(arg);
|
||||||
break;
|
break;
|
||||||
|
@ -179,10 +185,10 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
||||||
arguments->tb_prefix = arg;
|
arguments->tb_prefix = arg;
|
||||||
break;
|
break;
|
||||||
case 'M':
|
case 'M':
|
||||||
arguments->use_metric = true;
|
arguments->use_metric = false;
|
||||||
break;
|
break;
|
||||||
case 'x':
|
case 'x':
|
||||||
arguments->insert_only = true;
|
arguments->insert_only = false;
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
if (wordexp(arg, &full_path, 0) != 0) {
|
if (wordexp(arg, &full_path, 0) != 0) {
|
||||||
|
@ -254,6 +260,9 @@ typedef struct {
|
||||||
int64_t start_time;
|
int64_t start_time;
|
||||||
bool do_aggreFunc;
|
bool do_aggreFunc;
|
||||||
|
|
||||||
|
char* cols;
|
||||||
|
bool use_metric;
|
||||||
|
|
||||||
sem_t mutex_sem;
|
sem_t mutex_sem;
|
||||||
int notFinished;
|
int notFinished;
|
||||||
sem_t lock_sem;
|
sem_t lock_sem;
|
||||||
|
@ -305,6 +314,8 @@ void rand_string(char *str, int size);
|
||||||
double getCurrentTime();
|
double getCurrentTime();
|
||||||
|
|
||||||
void callBack(void *param, TAOS_RES *res, int code);
|
void callBack(void *param, TAOS_RES *res, int code);
|
||||||
|
void multiThreadCreateTable(char* cols, bool use_metric, int threads, int ntables, char* db_name, char* tb_prefix, char *ip_addr, uint16_t port, char *user, char *pass);
|
||||||
|
void querySqlFile(TAOS* taos, char* sqlFile);
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
SDemoArguments arguments = { NULL, // host
|
SDemoArguments arguments = { NULL, // host
|
||||||
|
@ -313,6 +324,7 @@ int main(int argc, char *argv[]) {
|
||||||
"taosdata", // password
|
"taosdata", // password
|
||||||
"test", // database
|
"test", // database
|
||||||
"t", // tb_prefix
|
"t", // tb_prefix
|
||||||
|
NULL,
|
||||||
false, // use_metric
|
false, // use_metric
|
||||||
false, // insert_only
|
false, // insert_only
|
||||||
"./output.txt", // output_file
|
"./output.txt", // output_file
|
||||||
|
@ -385,6 +397,13 @@ int main(int argc, char *argv[]) {
|
||||||
char dataString[STRING_LEN];
|
char dataString[STRING_LEN];
|
||||||
bool do_aggreFunc = true;
|
bool do_aggreFunc = true;
|
||||||
|
|
||||||
|
if (NULL != arguments.sqlFile) {
|
||||||
|
TAOS* qtaos = taos_connect(ip_addr, user, pass, db_name, port);
|
||||||
|
querySqlFile(qtaos, arguments.sqlFile);
|
||||||
|
taos_close(qtaos);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
memset(dataString, 0, STRING_LEN);
|
memset(dataString, 0, STRING_LEN);
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
|
||||||
|
@ -495,46 +514,18 @@ int main(int argc, char *argv[]) {
|
||||||
len += snprintf(cols + len, STRING_LEN - len, ",f%d %s(%d))", colIndex + 1, data_type[colIndex % count_data_type], len_of_binary);
|
len += snprintf(cols + len, STRING_LEN - len, ",f%d %s(%d))", colIndex + 1, data_type[colIndex % count_data_type], len_of_binary);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!use_metric) {
|
if (use_metric) {
|
||||||
/* Create all the tables; */
|
|
||||||
printf("Creating %d table(s)......\n", ntables);
|
|
||||||
for (int i = 0; i < ntables; i++) {
|
|
||||||
snprintf(command, BUFFER_SIZE, "create table if not exists %s.%s%d (ts timestamp%s;", db_name, tb_prefix, i, cols);
|
|
||||||
queryDB(taos, command);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Table(s) created!\n");
|
|
||||||
taos_close(taos);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/* Create metric table */
|
/* Create metric table */
|
||||||
printf("Creating meters super table...\n");
|
printf("Creating meters super table...\n");
|
||||||
snprintf(command, BUFFER_SIZE, "create table if not exists %s.meters (ts timestamp%s tags (areaid int, loc binary(10))", db_name, cols);
|
snprintf(command, BUFFER_SIZE, "create table if not exists %s.meters (ts timestamp%s tags (areaid int, loc binary(10))", db_name, cols);
|
||||||
queryDB(taos, command);
|
queryDB(taos, command);
|
||||||
printf("meters created!\n");
|
printf("meters created!\n");
|
||||||
|
|
||||||
/* Create all the tables; */
|
|
||||||
printf("Creating %d table(s)......\n", ntables);
|
|
||||||
for (int i = 0; i < ntables; i++) {
|
|
||||||
int j;
|
|
||||||
if (i % 10 == 0) {
|
|
||||||
j = 10;
|
|
||||||
} else {
|
|
||||||
j = i % 10;
|
|
||||||
}
|
|
||||||
if (j % 2 == 0) {
|
|
||||||
snprintf(command, BUFFER_SIZE, "create table if not exists %s.%s%d using %s.meters tags (%d,\"%s\");", db_name, tb_prefix, i, db_name, j, "shanghai");
|
|
||||||
} else {
|
|
||||||
snprintf(command, BUFFER_SIZE, "create table if not exists %s.%s%d using %s.meters tags (%d,\"%s\");", db_name, tb_prefix, i, db_name, j, "beijing");
|
|
||||||
}
|
|
||||||
queryDB(taos, command);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Table(s) created!\n");
|
|
||||||
taos_close(taos);
|
taos_close(taos);
|
||||||
}
|
}
|
||||||
/* Wait for table to create */
|
|
||||||
|
|
||||||
|
/* Wait for table to create */
|
||||||
|
multiThreadCreateTable(cols, use_metric, threads, ntables, db_name, tb_prefix, ip_addr, port, user, pass);
|
||||||
|
|
||||||
/* Insert data */
|
/* Insert data */
|
||||||
double ts = getCurrentTime();
|
double ts = getCurrentTime();
|
||||||
|
@ -685,6 +676,198 @@ int main(int argc, char *argv[]) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_SQL_SIZE 65536
|
||||||
|
void selectSql(TAOS* taos, char* sqlcmd)
|
||||||
|
{
|
||||||
|
TAOS_RES *pSql = taos_query(taos, sqlcmd);
|
||||||
|
int32_t code = taos_errno(pSql);
|
||||||
|
|
||||||
|
if (code != 0) {
|
||||||
|
printf("Failed to sqlcmd:%s, reason:%s\n", sqlcmd, taos_errstr(pSql));
|
||||||
|
taos_free_result(pSql);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
while (taos_fetch_row(pSql) != NULL) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
taos_free_result(pSql);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Function to do regular expression check */
|
||||||
|
static int regexMatch(const char *s, const char *reg, int cflags) {
|
||||||
|
regex_t regex;
|
||||||
|
char msgbuf[100] = {0};
|
||||||
|
|
||||||
|
/* Compile regular expression */
|
||||||
|
if (regcomp(®ex, reg, cflags) != 0) {
|
||||||
|
printf("Fail to compile regex\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Execute regular expression */
|
||||||
|
int reti = regexec(®ex, s, 0, NULL, 0);
|
||||||
|
if (!reti) {
|
||||||
|
regfree(®ex);
|
||||||
|
return 1;
|
||||||
|
} else if (reti == REG_NOMATCH) {
|
||||||
|
regfree(®ex);
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
regerror(reti, ®ex, msgbuf, sizeof(msgbuf));
|
||||||
|
printf("Regex match failed: %s\n", msgbuf);
|
||||||
|
regfree(®ex);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int isCommentLine(char *line) {
|
||||||
|
if (line == NULL) return 1;
|
||||||
|
|
||||||
|
return regexMatch(line, "^\\s*#.*", REG_EXTENDED);
|
||||||
|
}
|
||||||
|
|
||||||
|
void querySqlFile(TAOS* taos, char* sqlFile)
|
||||||
|
{
|
||||||
|
FILE *fp = fopen(sqlFile, "r");
|
||||||
|
if (fp == NULL) {
|
||||||
|
printf("failed to open file %s, reason:%s\n", sqlFile, strerror(errno));
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int read_len = 0;
|
||||||
|
char * cmd = calloc(1, MAX_SQL_SIZE);
|
||||||
|
size_t cmd_len = 0;
|
||||||
|
char * line = NULL;
|
||||||
|
size_t line_len = 0;
|
||||||
|
|
||||||
|
double t = getCurrentTime();
|
||||||
|
|
||||||
|
while ((read_len = getline(&line, &line_len, fp)) != -1) {
|
||||||
|
if (read_len >= MAX_SQL_SIZE) continue;
|
||||||
|
line[--read_len] = '\0';
|
||||||
|
|
||||||
|
if (read_len == 0 || isCommentLine(line)) { // line starts with #
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line[read_len - 1] == '\\') {
|
||||||
|
line[read_len - 1] = ' ';
|
||||||
|
memcpy(cmd + cmd_len, line, read_len);
|
||||||
|
cmd_len += read_len;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(cmd + cmd_len, line, read_len);
|
||||||
|
selectSql(taos, cmd);
|
||||||
|
memset(cmd, 0, MAX_SQL_SIZE);
|
||||||
|
cmd_len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
t = getCurrentTime() - t;
|
||||||
|
printf("run %s took %.6f second(s)\n\n", sqlFile, t);
|
||||||
|
|
||||||
|
free(cmd);
|
||||||
|
if (line) free(line);
|
||||||
|
fclose(fp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void * createTable(void *sarg)
|
||||||
|
{
|
||||||
|
char command[BUFFER_SIZE] = "\0";
|
||||||
|
|
||||||
|
info *winfo = (info *)sarg;
|
||||||
|
|
||||||
|
if (!winfo->use_metric) {
|
||||||
|
/* Create all the tables; */
|
||||||
|
printf("Creating table from %d to %d\n", winfo->start_table_id, winfo->end_table_id);
|
||||||
|
for (int i = winfo->start_table_id; i <= winfo->end_table_id; i++) {
|
||||||
|
snprintf(command, BUFFER_SIZE, "create table if not exists %s.%s%d (ts timestamp%s;", winfo->db_name, winfo->tb_prefix, i, winfo->cols);
|
||||||
|
queryDB(winfo->taos, command);
|
||||||
|
}
|
||||||
|
|
||||||
|
taos_close(winfo->taos);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* Create all the tables; */
|
||||||
|
printf("Creating table from %d to %d\n", winfo->start_table_id, winfo->end_table_id);
|
||||||
|
for (int i = winfo->start_table_id; i <= winfo->end_table_id; i++) {
|
||||||
|
int j;
|
||||||
|
if (i % 10 == 0) {
|
||||||
|
j = 10;
|
||||||
|
} else {
|
||||||
|
j = i % 10;
|
||||||
|
}
|
||||||
|
if (j % 2 == 0) {
|
||||||
|
snprintf(command, BUFFER_SIZE, "create table if not exists %s.%s%d using %s.meters tags (%d,\"%s\");", winfo->db_name, winfo->tb_prefix, i, winfo->db_name, j, "shanghai");
|
||||||
|
} else {
|
||||||
|
snprintf(command, BUFFER_SIZE, "create table if not exists %s.%s%d using %s.meters tags (%d,\"%s\");", winfo->db_name, winfo->tb_prefix, i, winfo->db_name, j, "beijing");
|
||||||
|
}
|
||||||
|
queryDB(winfo->taos, command);
|
||||||
|
}
|
||||||
|
taos_close(winfo->taos);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void multiThreadCreateTable(char* cols, bool use_metric, int threads, int ntables, char* db_name, char* tb_prefix, char *ip_addr, uint16_t port, char *user, char *pass) {
|
||||||
|
double ts = getCurrentTime();
|
||||||
|
printf("create table......\n");
|
||||||
|
pthread_t *pids = malloc(threads * sizeof(pthread_t));
|
||||||
|
info *infos = malloc(threads * sizeof(info));
|
||||||
|
|
||||||
|
int a = ntables / threads;
|
||||||
|
if (a < 1) {
|
||||||
|
threads = ntables;
|
||||||
|
a = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int b = 0;
|
||||||
|
if (threads != 0)
|
||||||
|
b = ntables % threads;
|
||||||
|
int last = 0;
|
||||||
|
for (int i = 0; i < threads; i++) {
|
||||||
|
info *t_info = infos + i;
|
||||||
|
t_info->threadID = i;
|
||||||
|
tstrncpy(t_info->db_name, db_name, MAX_DB_NAME_SIZE);
|
||||||
|
tstrncpy(t_info->tb_prefix, tb_prefix, MAX_TB_NAME_SIZE);
|
||||||
|
t_info->taos = taos_connect(ip_addr, user, pass, db_name, port);
|
||||||
|
t_info->start_table_id = last;
|
||||||
|
t_info->end_table_id = i < b ? last + a : last + a - 1;
|
||||||
|
last = t_info->end_table_id + 1;
|
||||||
|
t_info->use_metric = use_metric;
|
||||||
|
t_info->cols = cols;
|
||||||
|
pthread_create(pids + i, NULL, createTable, t_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < threads; i++) {
|
||||||
|
pthread_join(pids[i], NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
double t = getCurrentTime() - ts;
|
||||||
|
printf("Spent %.4f seconds to create %d tables with %d connections\n", t, ntables, threads);
|
||||||
|
|
||||||
|
for (int i = 0; i < threads; i++) {
|
||||||
|
info *t_info = infos + i;
|
||||||
|
taos_close(t_info->taos);
|
||||||
|
sem_destroy(&(t_info->mutex_sem));
|
||||||
|
sem_destroy(&(t_info->lock_sem));
|
||||||
|
}
|
||||||
|
|
||||||
|
free(pids);
|
||||||
|
free(infos);
|
||||||
|
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
void *readTable(void *sarg) {
|
void *readTable(void *sarg) {
|
||||||
info *rinfo = (info *)sarg;
|
info *rinfo = (info *)sarg;
|
||||||
TAOS *taos = rinfo->taos;
|
TAOS *taos = rinfo->taos;
|
||||||
|
|
|
@ -86,9 +86,28 @@ extern "C" {
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TAOS_RANDOM_NETWORK_FAIL
|
||||||
|
|
||||||
|
ssize_t taos_send_random_fail(int sockfd, const void *buf, size_t len, int flags);
|
||||||
|
|
||||||
|
ssize_t taos_sendto_random_fail(int sockfd, const void *buf, size_t len, int flags,
|
||||||
|
const struct sockaddr *dest_addr, socklen_t addrlen);
|
||||||
|
ssize_t taos_read_random_fail(int fd, void *buf, size_t count);
|
||||||
|
ssize_t taos_write_random_fail(int fd, const void *buf, size_t count);
|
||||||
|
|
||||||
|
#define send(sockfd, buf, len, flags) taos_send_random_fail(sockfd, buf, len, flags)
|
||||||
|
#define sendto(sockfd, buf, len, flags, dest_addr, addrlen) \
|
||||||
|
taos_sendto_random_fail(sockfd, buf, len, flags, dest_addr, addrlen)
|
||||||
|
#define taosWriteSocket(fd, buf, len) taos_write_random_fail(fd, buf, len)
|
||||||
|
#define taosReadSocket(fd, buf, len) taos_read_random_fail(fd, buf, len)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
#define taosWriteSocket(fd, buf, len) write(fd, buf, len)
|
#define taosWriteSocket(fd, buf, len) write(fd, buf, len)
|
||||||
#define taosReadSocket(fd, buf, len) read(fd, buf, len)
|
#define taosReadSocket(fd, buf, len) read(fd, buf, len)
|
||||||
|
|
||||||
|
#endif /* TAOS_RANDOM_NETWORK_FAIL */
|
||||||
|
|
||||||
#define atomic_load_8(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
#define atomic_load_8(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
||||||
#define atomic_load_16(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
#define atomic_load_16(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
||||||
#define atomic_load_32(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
#define atomic_load_32(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
||||||
|
|
|
@ -270,3 +270,49 @@ int tSystem(const char * cmd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TAOS_RANDOM_NETWORK_FAIL
|
||||||
|
|
||||||
|
#define RANDOM_NETWORK_FAIL_FACTOR 20
|
||||||
|
|
||||||
|
ssize_t taos_send_random_fail(int sockfd, const void *buf, size_t len, int flags)
|
||||||
|
{
|
||||||
|
if (rand() % RANDOM_NETWORK_FAIL_FACTOR == 0) {
|
||||||
|
errno = ECONNRESET;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return send(sockfd, buf, len, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t taos_sendto_random_fail(int sockfd, const void *buf, size_t len, int flags,
|
||||||
|
const struct sockaddr *dest_addr, socklen_t addrlen)
|
||||||
|
{
|
||||||
|
if (rand() % RANDOM_NETWORK_FAIL_FACTOR == 0) {
|
||||||
|
errno = ECONNRESET;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sendto(sockfd, buf, len, flags, dest_addr, addrlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t taos_read_random_fail(int fd, void *buf, size_t count)
|
||||||
|
{
|
||||||
|
if (rand() % RANDOM_NETWORK_FAIL_FACTOR == 0) {
|
||||||
|
errno = ECONNRESET;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return read(fd, buf, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t taos_write_random_fail(int fd, const void *buf, size_t count)
|
||||||
|
{
|
||||||
|
if (rand() % RANDOM_NETWORK_FAIL_FACTOR == 0) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return write(fd, buf, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* TAOS_RANDOM_NETWORK_FAIL */
|
||||||
|
|
|
@ -160,7 +160,7 @@ static void taosGetSystemTimezone() {
|
||||||
|
|
||||||
/* load time zone string from /etc/timezone */
|
/* load time zone string from /etc/timezone */
|
||||||
FILE *f = fopen("/etc/timezone", "r");
|
FILE *f = fopen("/etc/timezone", "r");
|
||||||
char buf[65] = {0};
|
char buf[68] = {0};
|
||||||
if (f != NULL) {
|
if (f != NULL) {
|
||||||
int len = fread(buf, 64, 1, f);
|
int len = fread(buf, 64, 1, f);
|
||||||
if(len < 64 && ferror(f)) {
|
if(len < 64 && ferror(f)) {
|
||||||
|
@ -170,7 +170,6 @@ static void taosGetSystemTimezone() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
|
||||||
|
|
||||||
char *lineEnd = strstr(buf, "\n");
|
char *lineEnd = strstr(buf, "\n");
|
||||||
if (lineEnd != NULL) {
|
if (lineEnd != NULL) {
|
||||||
|
@ -181,7 +180,7 @@ static void taosGetSystemTimezone() {
|
||||||
if (strlen(buf) > 0) {
|
if (strlen(buf) > 0) {
|
||||||
setenv("TZ", buf, 1);
|
setenv("TZ", buf, 1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// get and set default timezone
|
// get and set default timezone
|
||||||
tzset();
|
tzset();
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
#include "tscompression.h"
|
#include "tscompression.h"
|
||||||
#include "ttime.h"
|
#include "ttime.h"
|
||||||
|
#include "tfile.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* check if the primary column is load by default, otherwise, the program will
|
* check if the primary column is load by default, otherwise, the program will
|
||||||
|
@ -2171,6 +2172,7 @@ static void ensureOutputBuffer(SQueryRuntimeEnv* pRuntimeEnv, SDataBlockInfo* pB
|
||||||
if (tmp == NULL) { // todo handle the oom
|
if (tmp == NULL) { // todo handle the oom
|
||||||
assert(0);
|
assert(0);
|
||||||
} else {
|
} else {
|
||||||
|
memset(tmp + sizeof(tFilePage) + bytes * pRec->rows, 0, (newSize - pRec->rows) * bytes);
|
||||||
pQuery->sdata[i] = (tFilePage *)tmp;
|
pQuery->sdata[i] = (tFilePage *)tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,7 @@ typedef struct {
|
||||||
SRpcInfo *pRpc; // associated SRpcInfo
|
SRpcInfo *pRpc; // associated SRpcInfo
|
||||||
SRpcIpSet ipSet; // ip list provided by app
|
SRpcIpSet ipSet; // ip list provided by app
|
||||||
void *ahandle; // handle provided by app
|
void *ahandle; // handle provided by app
|
||||||
|
void *signature; // for validation
|
||||||
struct SRpcConn *pConn; // pConn allocated
|
struct SRpcConn *pConn; // pConn allocated
|
||||||
char msgType; // message type
|
char msgType; // message type
|
||||||
uint8_t *pCont; // content provided by app
|
uint8_t *pCont; // content provided by app
|
||||||
|
@ -361,6 +362,7 @@ void rpcSendRequest(void *shandle, const SRpcIpSet *pIpSet, SRpcMsg *pMsg) {
|
||||||
int contLen = rpcCompressRpcMsg(pMsg->pCont, pMsg->contLen);
|
int contLen = rpcCompressRpcMsg(pMsg->pCont, pMsg->contLen);
|
||||||
pContext = (SRpcReqContext *) (pMsg->pCont-sizeof(SRpcHead)-sizeof(SRpcReqContext));
|
pContext = (SRpcReqContext *) (pMsg->pCont-sizeof(SRpcHead)-sizeof(SRpcReqContext));
|
||||||
pContext->ahandle = pMsg->ahandle;
|
pContext->ahandle = pMsg->ahandle;
|
||||||
|
pContext->signature = pContext;
|
||||||
pContext->pRpc = (SRpcInfo *)shandle;
|
pContext->pRpc = (SRpcInfo *)shandle;
|
||||||
pContext->ipSet = *pIpSet;
|
pContext->ipSet = *pIpSet;
|
||||||
pContext->contLen = contLen;
|
pContext->contLen = contLen;
|
||||||
|
@ -527,11 +529,13 @@ int rpcReportProgress(void *handle, char *pCont, int contLen) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* todo: cancel process may have race condition, pContext may have been released
|
|
||||||
just before app calls the rpcCancelRequest */
|
|
||||||
void rpcCancelRequest(void *handle) {
|
void rpcCancelRequest(void *handle) {
|
||||||
SRpcReqContext *pContext = handle;
|
SRpcReqContext *pContext = handle;
|
||||||
|
|
||||||
|
// signature is used to check if pContext is freed.
|
||||||
|
// pContext may have been released just before app calls the rpcCancelRequest
|
||||||
|
if (pContext->signature != pContext) return;
|
||||||
|
|
||||||
if (pContext->pConn) {
|
if (pContext->pConn) {
|
||||||
tDebug("%s, app trys to cancel request", pContext->pConn->info);
|
tDebug("%s, app trys to cancel request", pContext->pConn->info);
|
||||||
rpcCloseConn(pContext->pConn);
|
rpcCloseConn(pContext->pConn);
|
||||||
|
@ -1005,6 +1009,7 @@ static void *rpcProcessMsgFromPeer(SRecvInfo *pRecv) {
|
||||||
static void rpcNotifyClient(SRpcReqContext *pContext, SRpcMsg *pMsg) {
|
static void rpcNotifyClient(SRpcReqContext *pContext, SRpcMsg *pMsg) {
|
||||||
SRpcInfo *pRpc = pContext->pRpc;
|
SRpcInfo *pRpc = pContext->pRpc;
|
||||||
|
|
||||||
|
pContext->signature = NULL;
|
||||||
pContext->pConn = NULL;
|
pContext->pConn = NULL;
|
||||||
if (pContext->pRsp) {
|
if (pContext->pRsp) {
|
||||||
// for synchronous API
|
// for synchronous API
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "tsdbMain.h"
|
#include "tsdbMain.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
#include "ttime.h"
|
#include "ttime.h"
|
||||||
|
#include "tfile.h"
|
||||||
|
|
||||||
const char *tsdbFileSuffix[] = {".head", ".data", ".last", "", ".h", ".l"};
|
const char *tsdbFileSuffix[] = {".head", ".data", ".last", "", ".h", ".l"};
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "tcoding.h"
|
#include "tcoding.h"
|
||||||
#include "tscompression.h"
|
#include "tscompression.h"
|
||||||
#include "tsdbMain.h"
|
#include "tsdbMain.h"
|
||||||
|
#include "tfile.h"
|
||||||
|
|
||||||
#define TSDB_GET_COMPCOL_LEN(nCols) (sizeof(SCompData) + sizeof(SCompCol) * (nCols) + sizeof(TSCKSUM))
|
#define TSDB_GET_COMPCOL_LEN(nCols) (sizeof(SCompData) + sizeof(SCompCol) * (nCols) + sizeof(TSCKSUM))
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TDENGINE_TFILE_H
|
||||||
|
#define TDENGINE_TFILE_H
|
||||||
|
|
||||||
|
#ifdef TAOS_RANDOM_FILE_FAIL
|
||||||
|
|
||||||
|
ssize_t taos_tread(int fd, void *buf, size_t count);
|
||||||
|
ssize_t taos_twrite(int fd, void *buf, size_t count);
|
||||||
|
off_t taos_lseek(int fd, off_t offset, int whence);
|
||||||
|
|
||||||
|
#define tread(fd, buf, count) taos_tread(fd, buf, count)
|
||||||
|
#define twrite(fd, buf, count) taos_twrite(fd, buf, count)
|
||||||
|
#define lseek(fd, offset, whence) taos_lseek(fd, offset, whence)
|
||||||
|
|
||||||
|
#endif // TAOS_RANDOM_FILE_FAIL
|
||||||
|
|
||||||
|
#endif // TDENGINE_TFILE_H
|
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <error.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
|
#define RANDOM_FILE_FAIL_FACTOR 5
|
||||||
|
|
||||||
|
ssize_t taos_tread(int fd, void *buf, size_t count)
|
||||||
|
{
|
||||||
|
#ifdef TAOS_RANDOM_FILE_FAIL
|
||||||
|
if (rand() % RANDOM_FILE_FAIL_FACTOR == 0) {
|
||||||
|
errno = EIO;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return tread(fd, buf, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t taos_twrite(int fd, void *buf, size_t count)
|
||||||
|
{
|
||||||
|
#ifdef TAOS_RANDOM_FILE_FAIL
|
||||||
|
if (rand() % RANDOM_FILE_FAIL_FACTOR == 0) {
|
||||||
|
errno = EIO;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return twrite(fd, buf, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
off_t taos_lseek(int fd, off_t offset, int whence)
|
||||||
|
{
|
||||||
|
#ifdef TAOS_RANDOM_FILE_FAIL
|
||||||
|
if (rand() % RANDOM_FILE_FAIL_FACTOR == 0) {
|
||||||
|
errno = EIO;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return lseek(fd, offset, whence);
|
||||||
|
}
|
|
@ -27,6 +27,7 @@
|
||||||
#include "tcoding.h"
|
#include "tcoding.h"
|
||||||
#include "tkvstore.h"
|
#include "tkvstore.h"
|
||||||
#include "tulog.h"
|
#include "tulog.h"
|
||||||
|
#include "tfile.h"
|
||||||
|
|
||||||
#define TD_KVSTORE_HEADER_SIZE 512
|
#define TD_KVSTORE_HEADER_SIZE 512
|
||||||
#define TD_KVSTORE_MAJOR_VERSION 1
|
#define TD_KVSTORE_MAJOR_VERSION 1
|
||||||
|
|
|
@ -34,8 +34,7 @@
|
||||||
|
|
||||||
#define TSDB_VNODE_VERSION_CONTENT_LEN 31
|
#define TSDB_VNODE_VERSION_CONTENT_LEN 31
|
||||||
|
|
||||||
static int32_t tsOpennedVnodes;
|
static SHashObj*tsDnodeVnodesHash;
|
||||||
static void *tsDnodeVnodesHash;
|
|
||||||
static void vnodeCleanUp(SVnodeObj *pVnode);
|
static void vnodeCleanUp(SVnodeObj *pVnode);
|
||||||
static int32_t vnodeSaveCfg(SMDCreateVnodeMsg *pVnodeCfg);
|
static int32_t vnodeSaveCfg(SMDCreateVnodeMsg *pVnodeCfg);
|
||||||
static int32_t vnodeReadCfg(SVnodeObj *pVnode);
|
static int32_t vnodeReadCfg(SVnodeObj *pVnode);
|
||||||
|
@ -47,8 +46,6 @@ static int vnodeGetWalInfo(void *ahandle, char *name, uint32_t *index);
|
||||||
static void vnodeNotifyRole(void *ahandle, int8_t role);
|
static void vnodeNotifyRole(void *ahandle, int8_t role);
|
||||||
static void vnodeNotifyFileSynced(void *ahandle, uint64_t fversion);
|
static void vnodeNotifyFileSynced(void *ahandle, uint64_t fversion);
|
||||||
|
|
||||||
static pthread_once_t vnodeModuleInit = PTHREAD_ONCE_INIT;
|
|
||||||
|
|
||||||
#ifndef _SYNC
|
#ifndef _SYNC
|
||||||
tsync_h syncStart(const SSyncInfo *info) { return NULL; }
|
tsync_h syncStart(const SSyncInfo *info) { return NULL; }
|
||||||
int32_t syncForwardToPeer(tsync_h shandle, void *pHead, void *mhandle, int qtype) { return 0; }
|
int32_t syncForwardToPeer(tsync_h shandle, void *pHead, void *mhandle, int qtype) { return 0; }
|
||||||
|
@ -58,19 +55,28 @@ int syncGetNodesRole(tsync_h shandle, SNodesRole * cfg) { return 0; }
|
||||||
void syncConfirmForward(tsync_h shandle, uint64_t version, int32_t code) {}
|
void syncConfirmForward(tsync_h shandle, uint64_t version, int32_t code) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void vnodeInit() {
|
int32_t vnodeInitResources() {
|
||||||
vnodeInitWriteFp();
|
vnodeInitWriteFp();
|
||||||
vnodeInitReadFp();
|
vnodeInitReadFp();
|
||||||
|
|
||||||
tsDnodeVnodesHash = taosHashInit(TSDB_MAX_VNODES, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true);
|
tsDnodeVnodesHash = taosHashInit(TSDB_MAX_VNODES, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true);
|
||||||
if (tsDnodeVnodesHash == NULL) {
|
if (tsDnodeVnodesHash == NULL) {
|
||||||
vError("failed to init vnode list");
|
vError("failed to init vnode list");
|
||||||
|
return TSDB_CODE_VND_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vnodeCleanupResources() {
|
||||||
|
if (tsDnodeVnodesHash != NULL) {
|
||||||
|
taosHashCleanup(tsDnodeVnodesHash);
|
||||||
|
tsDnodeVnodesHash = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t vnodeCreate(SMDCreateVnodeMsg *pVnodeCfg) {
|
int32_t vnodeCreate(SMDCreateVnodeMsg *pVnodeCfg) {
|
||||||
int32_t code;
|
int32_t code;
|
||||||
pthread_once(&vnodeModuleInit, vnodeInit);
|
|
||||||
|
|
||||||
SVnodeObj *pTemp = (SVnodeObj *)taosHashGet(tsDnodeVnodesHash, (const char *)&pVnodeCfg->cfg.vgId, sizeof(int32_t));
|
SVnodeObj *pTemp = (SVnodeObj *)taosHashGet(tsDnodeVnodesHash, (const char *)&pVnodeCfg->cfg.vgId, sizeof(int32_t));
|
||||||
if (pTemp != NULL) {
|
if (pTemp != NULL) {
|
||||||
|
@ -138,11 +144,6 @@ int32_t vnodeCreate(SMDCreateVnodeMsg *pVnodeCfg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t vnodeDrop(int32_t vgId) {
|
int32_t vnodeDrop(int32_t vgId) {
|
||||||
if (tsDnodeVnodesHash == NULL) {
|
|
||||||
vDebug("vgId:%d, failed to drop, vgId not exist", vgId);
|
|
||||||
return TSDB_CODE_VND_INVALID_VGROUP_ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
SVnodeObj **ppVnode = (SVnodeObj **)taosHashGet(tsDnodeVnodesHash, (const char *)&vgId, sizeof(int32_t));
|
SVnodeObj **ppVnode = (SVnodeObj **)taosHashGet(tsDnodeVnodesHash, (const char *)&vgId, sizeof(int32_t));
|
||||||
if (ppVnode == NULL || *ppVnode == NULL) {
|
if (ppVnode == NULL || *ppVnode == NULL) {
|
||||||
vDebug("vgId:%d, failed to drop, vgId not find", vgId);
|
vDebug("vgId:%d, failed to drop, vgId not find", vgId);
|
||||||
|
@ -181,7 +182,6 @@ int32_t vnodeAlter(void *param, SMDCreateVnodeMsg *pVnodeCfg) {
|
||||||
|
|
||||||
int32_t vnodeOpen(int32_t vnode, char *rootDir) {
|
int32_t vnodeOpen(int32_t vnode, char *rootDir) {
|
||||||
char temp[TSDB_FILENAME_LEN];
|
char temp[TSDB_FILENAME_LEN];
|
||||||
pthread_once(&vnodeModuleInit, vnodeInit);
|
|
||||||
|
|
||||||
SVnodeObj *pVnode = calloc(sizeof(SVnodeObj), 1);
|
SVnodeObj *pVnode = calloc(sizeof(SVnodeObj), 1);
|
||||||
if (pVnode == NULL) {
|
if (pVnode == NULL) {
|
||||||
|
@ -189,7 +189,6 @@ int32_t vnodeOpen(int32_t vnode, char *rootDir) {
|
||||||
return TAOS_SYSTEM_ERROR(errno);
|
return TAOS_SYSTEM_ERROR(errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_add_fetch_32(&tsOpennedVnodes, 1);
|
|
||||||
atomic_add_fetch_32(&pVnode->refCount, 1);
|
atomic_add_fetch_32(&pVnode->refCount, 1);
|
||||||
|
|
||||||
pVnode->vgId = vnode;
|
pVnode->vgId = vnode;
|
||||||
|
@ -360,19 +359,11 @@ void vnodeRelease(void *pVnodeRaw) {
|
||||||
|
|
||||||
free(pVnode);
|
free(pVnode);
|
||||||
|
|
||||||
int32_t count = atomic_sub_fetch_32(&tsOpennedVnodes, 1);
|
int32_t count = taosHashGetSize(tsDnodeVnodesHash);
|
||||||
vDebug("vgId:%d, vnode is released, vnodes:%d", vgId, count);
|
vDebug("vgId:%d, vnode is released, vnodes:%d", vgId, count);
|
||||||
|
|
||||||
if (count <= 0) {
|
|
||||||
taosHashCleanup(tsDnodeVnodesHash);
|
|
||||||
vnodeModuleInit = PTHREAD_ONCE_INIT;
|
|
||||||
tsDnodeVnodesHash = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *vnodeGetVnode(int32_t vgId) {
|
void *vnodeGetVnode(int32_t vgId) {
|
||||||
if (tsDnodeVnodesHash == NULL) return NULL;
|
|
||||||
|
|
||||||
SVnodeObj **ppVnode = (SVnodeObj **)taosHashGet(tsDnodeVnodesHash, (const char *)&vgId, sizeof(int32_t));
|
SVnodeObj **ppVnode = (SVnodeObj **)taosHashGet(tsDnodeVnodesHash, (const char *)&vgId, sizeof(int32_t));
|
||||||
if (ppVnode == NULL || *ppVnode == NULL) {
|
if (ppVnode == NULL || *ppVnode == NULL) {
|
||||||
terrno = TSDB_CODE_VND_INVALID_VGROUP_ID;
|
terrno = TSDB_CODE_VND_INVALID_VGROUP_ID;
|
||||||
|
@ -433,6 +424,26 @@ static void vnodeBuildVloadMsg(SVnodeObj *pVnode, SDMStatusMsg *pStatus) {
|
||||||
pLoad->replica = pVnode->syncCfg.replica;
|
pLoad->replica = pVnode->syncCfg.replica;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t vnodeGetVnodeList(int32_t vnodeList[], int32_t *numOfVnodes) {
|
||||||
|
SHashMutableIterator *pIter = taosHashCreateIter(tsDnodeVnodesHash);
|
||||||
|
while (taosHashIterNext(pIter)) {
|
||||||
|
SVnodeObj **pVnode = taosHashIterGet(pIter);
|
||||||
|
if (pVnode == NULL) continue;
|
||||||
|
if (*pVnode == NULL) continue;
|
||||||
|
|
||||||
|
(*numOfVnodes)++;
|
||||||
|
if (*numOfVnodes >= TSDB_MAX_VNODES) {
|
||||||
|
vError("vgId:%d, too many open vnodes, exist:%d max:%d", (*pVnode)->vgId, *numOfVnodes, TSDB_MAX_VNODES);
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
vnodeList[*numOfVnodes - 1] = (*pVnode)->vgId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taosHashDestroyIter(pIter);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
void vnodeBuildStatusMsg(void *param) {
|
void vnodeBuildStatusMsg(void *param) {
|
||||||
SDMStatusMsg *pStatus = param;
|
SDMStatusMsg *pStatus = param;
|
||||||
SHashMutableIterator *pIter = taosHashCreateIter(tsDnodeVnodesHash);
|
SHashMutableIterator *pIter = taosHashCreateIter(tsDnodeVnodesHash);
|
||||||
|
|
|
@ -94,7 +94,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.guava</groupId>
|
<groupId>com.google.guava</groupId>
|
||||||
<artifactId>guava</artifactId>
|
<artifactId>guava</artifactId>
|
||||||
<version>18.0</version>
|
<version>24.1.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
|
@ -365,3 +365,7 @@ cd ../../../debug; make
|
||||||
./test.sh -f unique/arbitrator/sync_replica3_dropDb.sim
|
./test.sh -f unique/arbitrator/sync_replica3_dropDb.sim
|
||||||
./test.sh -f unique/arbitrator/sync_replica3_dropTable.sim
|
./test.sh -f unique/arbitrator/sync_replica3_dropTable.sim
|
||||||
|
|
||||||
|
./test.sh -f unique/migrate/mn2_vn2_repl2_rmMnodeDir.sim
|
||||||
|
./test.sh -f unique/migrate/mn2_vn2_repl2_rmMnodeVnodeDir.sim
|
||||||
|
./test.sh -f unique/migrate/mn2_vn2_repl2_rmMnodeVnodeDir_stopAll_starAll.sim
|
||||||
|
./test.sh -f unique/migrate/mn2_vn2_repl2_rmVnodeDir.sim
|
||||||
|
|
|
@ -133,3 +133,7 @@ cd ../../../debug; make
|
||||||
./test.sh -f unique/arbitrator/sync_replica3_dropDb.sim
|
./test.sh -f unique/arbitrator/sync_replica3_dropDb.sim
|
||||||
./test.sh -f unique/arbitrator/sync_replica3_dropTable.sim
|
./test.sh -f unique/arbitrator/sync_replica3_dropTable.sim
|
||||||
|
|
||||||
|
./test.sh -f unique/migrate/mn2_vn2_repl2_rmMnodeDir.sim
|
||||||
|
./test.sh -f unique/migrate/mn2_vn2_repl2_rmMnodeVnodeDir.sim
|
||||||
|
./test.sh -f unique/migrate/mn2_vn2_repl2_rmMnodeVnodeDir_stopAll_starAll.sim
|
||||||
|
./test.sh -f unique/migrate/mn2_vn2_repl2_rmVnodeDir.sim
|
||||||
|
|
|
@ -0,0 +1,272 @@
|
||||||
|
# Test case describe: dnode1/dnode2 include mnode and vnode roles
|
||||||
|
# step 1: start dnode1/dnode2, and added into cluster
|
||||||
|
# step 2: create db(repl = 2), table, insert data,
|
||||||
|
# step 4: stop dnode1, remove its mnode dir, and copy mnode dir of dnode2 to dnode1
|
||||||
|
# step 5: restart dnode1, waiting sync end
|
||||||
|
# step 6: stop dnode2, reset query cache, and query
|
||||||
|
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/deploy.sh -n dnode2 -i 2
|
||||||
|
#system sh/deploy.sh -n dnode3 -i 3
|
||||||
|
#system sh/deploy.sh -n dnode4 -i 4
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c numOfMnodes -v 2
|
||||||
|
system sh/cfg.sh -n dnode2 -c numOfMnodes -v 2
|
||||||
|
#system sh/cfg.sh -n dnode3 -c numOfMnodes -v 1
|
||||||
|
#system sh/cfg.sh -n dnode4 -c numOfMnodes -v 1
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c walLevel -v 2
|
||||||
|
system sh/cfg.sh -n dnode2 -c walLevel -v 2
|
||||||
|
#system sh/cfg.sh -n dnode3 -c walLevel -v 2
|
||||||
|
#system sh/cfg.sh -n dnode4 -c walLevel -v 2
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c balanceInterval -v 10
|
||||||
|
system sh/cfg.sh -n dnode2 -c balanceInterval -v 10
|
||||||
|
#system sh/cfg.sh -n dnode3 -c balanceInterval -v 10
|
||||||
|
#system sh/cfg.sh -n dnode4 -c balanceInterval -v 10
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c numOfTotalVnodes -v 4
|
||||||
|
system sh/cfg.sh -n dnode2 -c numOfTotalVnodes -v 4
|
||||||
|
#system sh/cfg.sh -n dnode3 -c numOfTotalVnodes -v 4
|
||||||
|
#system sh/cfg.sh -n dnode4 -c numOfTotalVnodes -v 4
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c alternativeRole -v 0
|
||||||
|
system sh/cfg.sh -n dnode2 -c alternativeRole -v 0
|
||||||
|
#system sh/cfg.sh -n dnode3 -c alternativeRole -v 2
|
||||||
|
#system sh/cfg.sh -n dnode4 -c alternativeRole -v 2
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c maxtablesPerVnode -v 4
|
||||||
|
system sh/cfg.sh -n dnode2 -c maxtablesPerVnode -v 4
|
||||||
|
#system sh/cfg.sh -n dnode3 -c maxtablesPerVnode -v 4
|
||||||
|
#system sh/cfg.sh -n dnode4 -c maxtablesPerVnode -v 4
|
||||||
|
#system sh/cfg.sh -n dnode5 -c maxtablesPerVnode -v 4
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c arbitrator -v $arbitrator
|
||||||
|
system sh/cfg.sh -n dnode2 -c arbitrator -v $arbitrator
|
||||||
|
#system sh/cfg.sh -n dnode3 -c arbitrator -v $arbitrator
|
||||||
|
|
||||||
|
print ============== step0: start tarbitrator
|
||||||
|
system sh/exec_tarbitrator.sh -s start
|
||||||
|
|
||||||
|
print ============== step1: start dnode1/dnode2 and add into cluster
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
system sh/exec.sh -n dnode2 -s start
|
||||||
|
sleep 1000
|
||||||
|
sql connect
|
||||||
|
sleep 1000
|
||||||
|
sql create dnode $hostname2
|
||||||
|
sleep 1000
|
||||||
|
|
||||||
|
print ============== step2: create database with replica 2, and create table, insert data
|
||||||
|
$totalTableNum = 10
|
||||||
|
$sleepTimer = 3000
|
||||||
|
|
||||||
|
$db = db
|
||||||
|
sql create database $db replica 2 cache 1
|
||||||
|
sql use $db
|
||||||
|
|
||||||
|
# create table , insert data
|
||||||
|
$stb = stb
|
||||||
|
sql create table $stb (ts timestamp, c1 double) tags(t1 int)
|
||||||
|
$rowNum = 1200
|
||||||
|
$tblNum = $totalTableNum
|
||||||
|
$totalRows = 0
|
||||||
|
$tsStart = 1577808000000 # 2020-01-01 00:00:00.000
|
||||||
|
|
||||||
|
$i = 0
|
||||||
|
while $i < $tblNum
|
||||||
|
$tb = tb . $i
|
||||||
|
sql create table $tb using $stb tags( $i )
|
||||||
|
|
||||||
|
$x = 0
|
||||||
|
while $x < $rowNum
|
||||||
|
$ts = $tsStart + $x
|
||||||
|
sql insert into $tb values ( $ts + 0a , $x ) ( $ts + 1a , $x ) ( $ts + 2a , $x ) ( $ts + 3a , $x ) ( $ts + 4a , $x ) ( $ts + 5a , $x ) ( $ts + 6a , $x ) ( $ts + 7a , $x ) ( $ts + 8a , $x ) ( $ts + 9a , $x ) ( $ts + 10a , $x ) ( $ts + 11a , $x ) ( $ts + 12a , $x ) ( $ts + 13a , $x ) ( $ts + 14a , $x ) ( $ts + 15a , $x ) ( $ts + 16a , $x ) ( $ts + 17a , $x ) ( $ts + 18a , $x ) ( $ts + 19a , $x ) ( $ts + 20a , $x ) ( $ts + 21a , $x ) ( $ts + 22a , $x ) ( $ts + 23a , $x ) ( $ts + 24a , $x ) ( $ts + 25a , $x ) ( $ts + 26a , $x ) ( $ts + 27a , $x ) ( $ts + 28a , $x ) ( $ts + 29a , $x ) ( $ts + 30a , $x ) ( $ts + 31a , $x ) ( $ts + 32a , $x ) ( $ts + 33a , $x ) ( $ts + 34a , $x ) ( $ts + 25a , $x ) ( $ts + 26a , $x ) ( $ts + 27a , $x ) ( $ts + 28a , $x ) ( $ts + 29a , $x ) ( $ts + 30a , $x ) ( $ts + 31a , $x ) ( $ts + 32a , $x ) ( $ts + 33a , $x ) ( $ts + 34a , $x ) ( $ts + 35a , $x ) ( $ts + 36a , $x ) ( $ts + 37a , $x ) ( $ts + 38a , $x ) ( $ts + 39a , $x ) ( $ts + 40a , $x ) ( $ts + 41a , $x ) ( $ts + 42a , $x ) ( $ts + 43a , $x ) ( $ts + 44a , $x ) ( $ts + 45a , $x ) ( $ts + 46a , $x ) ( $ts + 47a , $x ) ( $ts + 48a , $x ) ( $ts + 49a , $x ) ( $ts + 50a , $x ) ( $ts + 51a , $x ) ( $ts + 52a , $x ) ( $ts + 53a , $x ) ( $ts + 54a , $x ) ( $ts + 55a , $x ) ( $ts + 56a , $x ) ( $ts + 57a , $x ) ( $ts + 58a , $x ) ( $ts + 59a , $x )
|
||||||
|
$x = $x + 60
|
||||||
|
endw
|
||||||
|
$totalRows = $totalRows + $x
|
||||||
|
print info: inserted $x rows into $tb and totalRows: $totalRows
|
||||||
|
$i = $i + 1
|
||||||
|
endw
|
||||||
|
|
||||||
|
sql select count(*) from $stb
|
||||||
|
print rows:$rows data00:$data00 totalRows:$totalRows
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != $totalRows then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
|
||||||
|
print ============== step3: insert old data(now-15d) and new data(now+15d), control data rows in order to save in cache, not falling disc
|
||||||
|
sql insert into $tb values ( now - 20d , -20 )
|
||||||
|
sql insert into $tb values ( now - 40d , -40 )
|
||||||
|
$totalRows = $totalRows + 2
|
||||||
|
|
||||||
|
print ============== step4: stop dnode1
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode1_offline:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show dnodes
|
||||||
|
if $rows != 2 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_offline
|
||||||
|
endi
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
|
||||||
|
$dnode1Status = $data4_1
|
||||||
|
$dnode2Status = $data4_2
|
||||||
|
|
||||||
|
if $dnode1Status != offline then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_offline
|
||||||
|
endi
|
||||||
|
if $dnode2Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_offline
|
||||||
|
endi
|
||||||
|
|
||||||
|
# check using select
|
||||||
|
sql select count(*) from $stb
|
||||||
|
print data00 $data00
|
||||||
|
if $data00 != $totalRows then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
#sql show vgroups
|
||||||
|
#print show vgroups:
|
||||||
|
#print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $data7_1 $data8_1 $data9_1
|
||||||
|
#print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 $data5_2 $data6_2 $data7_2 $data8_2 $data9_2
|
||||||
|
#print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 $data5_3 $data6_3 $data7_3 $data8_3 $data9_3
|
||||||
|
|
||||||
|
print ============== step5: remove the mnode dir of dnode1, then copy the monde dir of dnode2
|
||||||
|
system_content rm -rf ../../../sim/dnode1/data/mnode
|
||||||
|
system_content cp -rf ../../../sim/dnode2/data/mnode ../../../sim/dnode1/data/
|
||||||
|
|
||||||
|
print ============== step6: restart dnode1, waiting sync end
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
sleep 1000
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode1_ready:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 20 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show dnodes -x wait_dnode1_ready
|
||||||
|
if $rows != 2 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_ready
|
||||||
|
endi
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
|
||||||
|
$dnode1Status = $data4_1
|
||||||
|
$dnode2Status = $data4_2
|
||||||
|
|
||||||
|
if $dnode1Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_ready
|
||||||
|
endi
|
||||||
|
if $dnode2Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_ready
|
||||||
|
endi
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode1_vgroup_slave:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show vgroups
|
||||||
|
if $rows != 3 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
print show vgroups:
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $data7_1 $data8_1 $data9_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 $data5_2 $data6_2 $data7_2 $data8_2 $data9_2
|
||||||
|
print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 $data5_3 $data6_3 $data7_3 $data8_3 $data9_3
|
||||||
|
print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4 $data5_4 $data6_4 $data7_4 $data8_4 $data9_4
|
||||||
|
$d2v2status = $data4_4
|
||||||
|
$d2v3status = $data4_2
|
||||||
|
$d2v4status = $data4_3
|
||||||
|
|
||||||
|
$d1v2status = $data7_4
|
||||||
|
$d1v3status = $data7_2
|
||||||
|
$d1v4status = $data7_3
|
||||||
|
|
||||||
|
if $d2v2status != master then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d2v3status != master then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d2v4status != master then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $d1v2status != slave then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d1v3status != slave then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d1v4status != slave then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
|
||||||
|
print ============== step7: stop dnode2
|
||||||
|
system sh/exec.sh -n dnode2 -s stop -x SIGINT
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode2_offline:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show dnodes
|
||||||
|
if $rows != 2 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode2_offline
|
||||||
|
endi
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
|
||||||
|
$dnode1Status = $data4_1
|
||||||
|
$dnode2Status = $data4_2
|
||||||
|
|
||||||
|
if $dnode1Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode2_offline
|
||||||
|
endi
|
||||||
|
if $dnode2Status != offline then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode2_offline
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql reset query cache
|
||||||
|
|
||||||
|
# check using select
|
||||||
|
sql select count(*) from $stb
|
||||||
|
print data00 $data00
|
||||||
|
if $data00 != $totalRows then
|
||||||
|
return -1
|
||||||
|
endi
|
|
@ -0,0 +1,274 @@
|
||||||
|
# Test case describe: dnode1/dnode2 include mnode and vnode roles
|
||||||
|
# step 1: start dnode1/dnode2, and added into cluster
|
||||||
|
# step 2: create db(repl = 2), table, insert data,
|
||||||
|
# step 4: stop dnode1, remove its mnode and vnode dir, and copy mnode and vnode dir of dnode2 to dnode1
|
||||||
|
# step 5: restart dnode1, waiting sync end
|
||||||
|
# step 6: stop dnode2, reset query cache, and query
|
||||||
|
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/deploy.sh -n dnode2 -i 2
|
||||||
|
#system sh/deploy.sh -n dnode3 -i 3
|
||||||
|
#system sh/deploy.sh -n dnode4 -i 4
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c numOfMnodes -v 2
|
||||||
|
system sh/cfg.sh -n dnode2 -c numOfMnodes -v 2
|
||||||
|
#system sh/cfg.sh -n dnode3 -c numOfMnodes -v 1
|
||||||
|
#system sh/cfg.sh -n dnode4 -c numOfMnodes -v 1
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c walLevel -v 2
|
||||||
|
system sh/cfg.sh -n dnode2 -c walLevel -v 2
|
||||||
|
#system sh/cfg.sh -n dnode3 -c walLevel -v 2
|
||||||
|
#system sh/cfg.sh -n dnode4 -c walLevel -v 2
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c balanceInterval -v 10
|
||||||
|
system sh/cfg.sh -n dnode2 -c balanceInterval -v 10
|
||||||
|
#system sh/cfg.sh -n dnode3 -c balanceInterval -v 10
|
||||||
|
#system sh/cfg.sh -n dnode4 -c balanceInterval -v 10
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c numOfTotalVnodes -v 4
|
||||||
|
system sh/cfg.sh -n dnode2 -c numOfTotalVnodes -v 4
|
||||||
|
#system sh/cfg.sh -n dnode3 -c numOfTotalVnodes -v 4
|
||||||
|
#system sh/cfg.sh -n dnode4 -c numOfTotalVnodes -v 4
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c alternativeRole -v 0
|
||||||
|
system sh/cfg.sh -n dnode2 -c alternativeRole -v 0
|
||||||
|
#system sh/cfg.sh -n dnode3 -c alternativeRole -v 2
|
||||||
|
#system sh/cfg.sh -n dnode4 -c alternativeRole -v 2
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c maxtablesPerVnode -v 4
|
||||||
|
system sh/cfg.sh -n dnode2 -c maxtablesPerVnode -v 4
|
||||||
|
#system sh/cfg.sh -n dnode3 -c maxtablesPerVnode -v 4
|
||||||
|
#system sh/cfg.sh -n dnode4 -c maxtablesPerVnode -v 4
|
||||||
|
#system sh/cfg.sh -n dnode5 -c maxtablesPerVnode -v 4
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c arbitrator -v $arbitrator
|
||||||
|
system sh/cfg.sh -n dnode2 -c arbitrator -v $arbitrator
|
||||||
|
#system sh/cfg.sh -n dnode3 -c arbitrator -v $arbitrator
|
||||||
|
|
||||||
|
print ============== step0: start tarbitrator
|
||||||
|
system sh/exec_tarbitrator.sh -s start
|
||||||
|
|
||||||
|
print ============== step1: start dnode1/dnode2 and add into cluster
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
system sh/exec.sh -n dnode2 -s start
|
||||||
|
sleep 1000
|
||||||
|
sql connect
|
||||||
|
sleep 1000
|
||||||
|
sql create dnode $hostname2
|
||||||
|
sleep 1000
|
||||||
|
|
||||||
|
print ============== step2: create database with replica 2, and create table, insert data
|
||||||
|
$totalTableNum = 10
|
||||||
|
$sleepTimer = 3000
|
||||||
|
|
||||||
|
$db = db
|
||||||
|
sql create database $db replica 2 cache 1
|
||||||
|
sql use $db
|
||||||
|
|
||||||
|
# create table , insert data
|
||||||
|
$stb = stb
|
||||||
|
sql create table $stb (ts timestamp, c1 double) tags(t1 int)
|
||||||
|
$rowNum = 1200
|
||||||
|
$tblNum = $totalTableNum
|
||||||
|
$totalRows = 0
|
||||||
|
$tsStart = 1577808000000 # 2020-01-01 00:00:00.000
|
||||||
|
|
||||||
|
$i = 0
|
||||||
|
while $i < $tblNum
|
||||||
|
$tb = tb . $i
|
||||||
|
sql create table $tb using $stb tags( $i )
|
||||||
|
|
||||||
|
$x = 0
|
||||||
|
while $x < $rowNum
|
||||||
|
$ts = $tsStart + $x
|
||||||
|
sql insert into $tb values ( $ts + 0a , $x ) ( $ts + 1a , $x ) ( $ts + 2a , $x ) ( $ts + 3a , $x ) ( $ts + 4a , $x ) ( $ts + 5a , $x ) ( $ts + 6a , $x ) ( $ts + 7a , $x ) ( $ts + 8a , $x ) ( $ts + 9a , $x ) ( $ts + 10a , $x ) ( $ts + 11a , $x ) ( $ts + 12a , $x ) ( $ts + 13a , $x ) ( $ts + 14a , $x ) ( $ts + 15a , $x ) ( $ts + 16a , $x ) ( $ts + 17a , $x ) ( $ts + 18a , $x ) ( $ts + 19a , $x ) ( $ts + 20a , $x ) ( $ts + 21a , $x ) ( $ts + 22a , $x ) ( $ts + 23a , $x ) ( $ts + 24a , $x ) ( $ts + 25a , $x ) ( $ts + 26a , $x ) ( $ts + 27a , $x ) ( $ts + 28a , $x ) ( $ts + 29a , $x ) ( $ts + 30a , $x ) ( $ts + 31a , $x ) ( $ts + 32a , $x ) ( $ts + 33a , $x ) ( $ts + 34a , $x ) ( $ts + 25a , $x ) ( $ts + 26a , $x ) ( $ts + 27a , $x ) ( $ts + 28a , $x ) ( $ts + 29a , $x ) ( $ts + 30a , $x ) ( $ts + 31a , $x ) ( $ts + 32a , $x ) ( $ts + 33a , $x ) ( $ts + 34a , $x ) ( $ts + 35a , $x ) ( $ts + 36a , $x ) ( $ts + 37a , $x ) ( $ts + 38a , $x ) ( $ts + 39a , $x ) ( $ts + 40a , $x ) ( $ts + 41a , $x ) ( $ts + 42a , $x ) ( $ts + 43a , $x ) ( $ts + 44a , $x ) ( $ts + 45a , $x ) ( $ts + 46a , $x ) ( $ts + 47a , $x ) ( $ts + 48a , $x ) ( $ts + 49a , $x ) ( $ts + 50a , $x ) ( $ts + 51a , $x ) ( $ts + 52a , $x ) ( $ts + 53a , $x ) ( $ts + 54a , $x ) ( $ts + 55a , $x ) ( $ts + 56a , $x ) ( $ts + 57a , $x ) ( $ts + 58a , $x ) ( $ts + 59a , $x )
|
||||||
|
$x = $x + 60
|
||||||
|
endw
|
||||||
|
$totalRows = $totalRows + $x
|
||||||
|
print info: inserted $x rows into $tb and totalRows: $totalRows
|
||||||
|
$i = $i + 1
|
||||||
|
endw
|
||||||
|
|
||||||
|
sql select count(*) from $stb
|
||||||
|
print rows:$rows data00:$data00 totalRows:$totalRows
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != $totalRows then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
|
||||||
|
print ============== step3: insert old data(now-15d) and new data(now+15d), control data rows in order to save in cache, not falling disc
|
||||||
|
sql insert into $tb values ( now - 20d , -20 )
|
||||||
|
sql insert into $tb values ( now - 40d , -40 )
|
||||||
|
$totalRows = $totalRows + 2
|
||||||
|
|
||||||
|
print ============== step4: stop dnode1
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode1_offline:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show dnodes
|
||||||
|
if $rows != 2 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_offline
|
||||||
|
endi
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
|
||||||
|
$dnode1Status = $data4_1
|
||||||
|
$dnode2Status = $data4_2
|
||||||
|
|
||||||
|
if $dnode1Status != offline then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_offline
|
||||||
|
endi
|
||||||
|
if $dnode2Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_offline
|
||||||
|
endi
|
||||||
|
|
||||||
|
# check using select
|
||||||
|
sql select count(*) from $stb
|
||||||
|
print data00 $data00
|
||||||
|
if $data00 != $totalRows then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
#sql show vgroups
|
||||||
|
#print show vgroups:
|
||||||
|
#print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $data7_1 $data8_1 $data9_1
|
||||||
|
#print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 $data5_2 $data6_2 $data7_2 $data8_2 $data9_2
|
||||||
|
#print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 $data5_3 $data6_3 $data7_3 $data8_3 $data9_3
|
||||||
|
|
||||||
|
print ============== step5: remove the mnode dir of dnode1, then copy the monde dir of dnode2
|
||||||
|
system_content rm -rf ../../../sim/dnode1/data/vnode
|
||||||
|
system_content rm -rf ../../../sim/dnode1/data/mnode
|
||||||
|
system_content cp -rf ../../../sim/dnode2/data/vnode ../../../sim/dnode1/data/
|
||||||
|
system_content cp -rf ../../../sim/dnode2/data/mnode ../../../sim/dnode1/data/
|
||||||
|
|
||||||
|
print ============== step6: restart dnode1, waiting sync end
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
sleep 1000
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode1_ready:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 20 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show dnodes -x wait_dnode1_ready
|
||||||
|
if $rows != 2 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_ready
|
||||||
|
endi
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
|
||||||
|
$dnode1Status = $data4_1
|
||||||
|
$dnode2Status = $data4_2
|
||||||
|
|
||||||
|
if $dnode1Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_ready
|
||||||
|
endi
|
||||||
|
if $dnode2Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_ready
|
||||||
|
endi
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode1_vgroup_slave:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show vgroups
|
||||||
|
if $rows != 3 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
print show vgroups:
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $data7_1 $data8_1 $data9_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 $data5_2 $data6_2 $data7_2 $data8_2 $data9_2
|
||||||
|
print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 $data5_3 $data6_3 $data7_3 $data8_3 $data9_3
|
||||||
|
print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4 $data5_4 $data6_4 $data7_4 $data8_4 $data9_4
|
||||||
|
$d2v2status = $data4_4
|
||||||
|
$d2v3status = $data4_2
|
||||||
|
$d2v4status = $data4_3
|
||||||
|
|
||||||
|
$d1v2status = $data7_4
|
||||||
|
$d1v3status = $data7_2
|
||||||
|
$d1v4status = $data7_3
|
||||||
|
|
||||||
|
if $d2v2status != master then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d2v3status != master then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d2v4status != master then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $d1v2status != slave then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d1v3status != slave then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d1v4status != slave then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
|
||||||
|
print ============== step7: stop dnode2
|
||||||
|
system sh/exec.sh -n dnode2 -s stop -x SIGINT
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode2_offline:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show dnodes
|
||||||
|
if $rows != 2 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode2_offline
|
||||||
|
endi
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
|
||||||
|
$dnode1Status = $data4_1
|
||||||
|
$dnode2Status = $data4_2
|
||||||
|
|
||||||
|
if $dnode1Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode2_offline
|
||||||
|
endi
|
||||||
|
if $dnode2Status != offline then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode2_offline
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql reset query cache
|
||||||
|
|
||||||
|
# check using select
|
||||||
|
sql select count(*) from $stb
|
||||||
|
print data00 $data00
|
||||||
|
if $data00 != $totalRows then
|
||||||
|
return -1
|
||||||
|
endi
|
|
@ -0,0 +1,210 @@
|
||||||
|
# Test case describe: dnode1/dnode2 include mnode and vnode roles
|
||||||
|
# step 1: start dnode1/dnode2, and added into cluster
|
||||||
|
# step 2: create db(repl = 2), table, insert data,
|
||||||
|
# step 4: stop dnode1, remove its mnode and vnode dir, and copy mnode and vnode dir of dnode2 to dnode1
|
||||||
|
# step 5: restart dnode1, waiting sync end
|
||||||
|
# step 6: stop dnode2, reset query cache, and query
|
||||||
|
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/deploy.sh -n dnode2 -i 2
|
||||||
|
#system sh/deploy.sh -n dnode3 -i 3
|
||||||
|
#system sh/deploy.sh -n dnode4 -i 4
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c numOfMnodes -v 2
|
||||||
|
system sh/cfg.sh -n dnode2 -c numOfMnodes -v 2
|
||||||
|
#system sh/cfg.sh -n dnode3 -c numOfMnodes -v 1
|
||||||
|
#system sh/cfg.sh -n dnode4 -c numOfMnodes -v 1
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c walLevel -v 2
|
||||||
|
system sh/cfg.sh -n dnode2 -c walLevel -v 2
|
||||||
|
#system sh/cfg.sh -n dnode3 -c walLevel -v 2
|
||||||
|
#system sh/cfg.sh -n dnode4 -c walLevel -v 2
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c balanceInterval -v 10
|
||||||
|
system sh/cfg.sh -n dnode2 -c balanceInterval -v 10
|
||||||
|
#system sh/cfg.sh -n dnode3 -c balanceInterval -v 10
|
||||||
|
#system sh/cfg.sh -n dnode4 -c balanceInterval -v 10
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c numOfTotalVnodes -v 4
|
||||||
|
system sh/cfg.sh -n dnode2 -c numOfTotalVnodes -v 4
|
||||||
|
#system sh/cfg.sh -n dnode3 -c numOfTotalVnodes -v 4
|
||||||
|
#system sh/cfg.sh -n dnode4 -c numOfTotalVnodes -v 4
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c alternativeRole -v 0
|
||||||
|
system sh/cfg.sh -n dnode2 -c alternativeRole -v 0
|
||||||
|
#system sh/cfg.sh -n dnode3 -c alternativeRole -v 2
|
||||||
|
#system sh/cfg.sh -n dnode4 -c alternativeRole -v 2
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c maxtablesPerVnode -v 4
|
||||||
|
system sh/cfg.sh -n dnode2 -c maxtablesPerVnode -v 4
|
||||||
|
#system sh/cfg.sh -n dnode3 -c maxtablesPerVnode -v 4
|
||||||
|
#system sh/cfg.sh -n dnode4 -c maxtablesPerVnode -v 4
|
||||||
|
#system sh/cfg.sh -n dnode5 -c maxtablesPerVnode -v 4
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c arbitrator -v $arbitrator
|
||||||
|
system sh/cfg.sh -n dnode2 -c arbitrator -v $arbitrator
|
||||||
|
#system sh/cfg.sh -n dnode3 -c arbitrator -v $arbitrator
|
||||||
|
|
||||||
|
print ============== step0: start tarbitrator
|
||||||
|
system sh/exec_tarbitrator.sh -s start
|
||||||
|
|
||||||
|
print ============== step1: start dnode1/dnode2 and add into cluster
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
system sh/exec.sh -n dnode2 -s start
|
||||||
|
sleep 1000
|
||||||
|
sql connect
|
||||||
|
sleep 1000
|
||||||
|
sql create dnode $hostname2
|
||||||
|
sleep 1000
|
||||||
|
|
||||||
|
print ============== step2: create database with replica 2, and create table, insert data
|
||||||
|
$totalTableNum = 10
|
||||||
|
$sleepTimer = 3000
|
||||||
|
|
||||||
|
$db = db
|
||||||
|
sql create database $db replica 2 cache 1
|
||||||
|
sql use $db
|
||||||
|
|
||||||
|
# create table , insert data
|
||||||
|
$stb = stb
|
||||||
|
sql create table $stb (ts timestamp, c1 double) tags(t1 int)
|
||||||
|
$rowNum = 1200
|
||||||
|
$tblNum = $totalTableNum
|
||||||
|
$totalRows = 0
|
||||||
|
$tsStart = 1577808000000 # 2020-01-01 00:00:00.000
|
||||||
|
|
||||||
|
$i = 0
|
||||||
|
while $i < $tblNum
|
||||||
|
$tb = tb . $i
|
||||||
|
sql create table $tb using $stb tags( $i )
|
||||||
|
|
||||||
|
$x = 0
|
||||||
|
while $x < $rowNum
|
||||||
|
$ts = $tsStart + $x
|
||||||
|
sql insert into $tb values ( $ts + 0a , $x ) ( $ts + 1a , $x ) ( $ts + 2a , $x ) ( $ts + 3a , $x ) ( $ts + 4a , $x ) ( $ts + 5a , $x ) ( $ts + 6a , $x ) ( $ts + 7a , $x ) ( $ts + 8a , $x ) ( $ts + 9a , $x ) ( $ts + 10a , $x ) ( $ts + 11a , $x ) ( $ts + 12a , $x ) ( $ts + 13a , $x ) ( $ts + 14a , $x ) ( $ts + 15a , $x ) ( $ts + 16a , $x ) ( $ts + 17a , $x ) ( $ts + 18a , $x ) ( $ts + 19a , $x ) ( $ts + 20a , $x ) ( $ts + 21a , $x ) ( $ts + 22a , $x ) ( $ts + 23a , $x ) ( $ts + 24a , $x ) ( $ts + 25a , $x ) ( $ts + 26a , $x ) ( $ts + 27a , $x ) ( $ts + 28a , $x ) ( $ts + 29a , $x ) ( $ts + 30a , $x ) ( $ts + 31a , $x ) ( $ts + 32a , $x ) ( $ts + 33a , $x ) ( $ts + 34a , $x ) ( $ts + 25a , $x ) ( $ts + 26a , $x ) ( $ts + 27a , $x ) ( $ts + 28a , $x ) ( $ts + 29a , $x ) ( $ts + 30a , $x ) ( $ts + 31a , $x ) ( $ts + 32a , $x ) ( $ts + 33a , $x ) ( $ts + 34a , $x ) ( $ts + 35a , $x ) ( $ts + 36a , $x ) ( $ts + 37a , $x ) ( $ts + 38a , $x ) ( $ts + 39a , $x ) ( $ts + 40a , $x ) ( $ts + 41a , $x ) ( $ts + 42a , $x ) ( $ts + 43a , $x ) ( $ts + 44a , $x ) ( $ts + 45a , $x ) ( $ts + 46a , $x ) ( $ts + 47a , $x ) ( $ts + 48a , $x ) ( $ts + 49a , $x ) ( $ts + 50a , $x ) ( $ts + 51a , $x ) ( $ts + 52a , $x ) ( $ts + 53a , $x ) ( $ts + 54a , $x ) ( $ts + 55a , $x ) ( $ts + 56a , $x ) ( $ts + 57a , $x ) ( $ts + 58a , $x ) ( $ts + 59a , $x )
|
||||||
|
$x = $x + 60
|
||||||
|
endw
|
||||||
|
$totalRows = $totalRows + $x
|
||||||
|
print info: inserted $x rows into $tb and totalRows: $totalRows
|
||||||
|
$i = $i + 1
|
||||||
|
endw
|
||||||
|
|
||||||
|
sql select count(*) from $stb
|
||||||
|
print rows:$rows data00:$data00 totalRows:$totalRows
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != $totalRows then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
|
||||||
|
print ============== step3: insert old data(now-15d) and new data(now+15d), control data rows in order to save in cache, not falling disc
|
||||||
|
sql insert into $tb values ( now - 20d , -20 )
|
||||||
|
sql insert into $tb values ( now - 40d , -40 )
|
||||||
|
$totalRows = $totalRows + 2
|
||||||
|
|
||||||
|
print ============== step4: stop dnode1
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
system sh/exec.sh -n dnode2 -s stop -x SIGINT
|
||||||
|
|
||||||
|
print ============== step5: remove the mnode dir of dnode1, then copy the monde dir of dnode2
|
||||||
|
system_content rm -rf ../../../sim/dnode1/data/vnode
|
||||||
|
system_content rm -rf ../../../sim/dnode1/data/mnode
|
||||||
|
system_content cp -rf ../../../sim/dnode2/data/vnode ../../../sim/dnode1/data/
|
||||||
|
system_content cp -rf ../../../sim/dnode2/data/mnode ../../../sim/dnode1/data/
|
||||||
|
|
||||||
|
print ============== step6: restart dnode1/dnode2
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
system sh/exec.sh -n dnode2 -s start
|
||||||
|
sleep 1000
|
||||||
|
sql connect
|
||||||
|
sql use $db
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode1_ready:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 20 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show dnodes -x wait_dnode1_ready
|
||||||
|
if $rows != 2 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_ready
|
||||||
|
endi
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
|
||||||
|
$dnode1Status = $data4_1
|
||||||
|
$dnode2Status = $data4_2
|
||||||
|
|
||||||
|
if $dnode1Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_ready
|
||||||
|
endi
|
||||||
|
if $dnode2Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_ready
|
||||||
|
endi
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode1_vgroup_slave:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show vgroups
|
||||||
|
if $rows != 3 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
print show vgroups:
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $data7_1 $data8_1 $data9_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 $data5_2 $data6_2 $data7_2 $data8_2 $data9_2
|
||||||
|
print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 $data5_3 $data6_3 $data7_3 $data8_3 $data9_3
|
||||||
|
print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4 $data5_4 $data6_4 $data7_4 $data8_4 $data9_4
|
||||||
|
$d2v2status = $data4_4
|
||||||
|
$d2v3status = $data4_2
|
||||||
|
$d2v4status = $data4_3
|
||||||
|
|
||||||
|
$d1v2status = $data7_4
|
||||||
|
$d1v3status = $data7_2
|
||||||
|
$d1v4status = $data7_3
|
||||||
|
|
||||||
|
if $d2v2status != master then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d2v3status != master then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d2v4status != master then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $d1v2status != slave then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d1v3status != slave then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d1v4status != slave then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql reset query cache
|
||||||
|
|
||||||
|
# check using select
|
||||||
|
sql select count(*) from $stb
|
||||||
|
print data00 $data00
|
||||||
|
if $data00 != $totalRows then
|
||||||
|
return -1
|
||||||
|
endi
|
|
@ -0,0 +1,272 @@
|
||||||
|
# Test case describe: dnode1/dnode2 include mnode and vnode roles
|
||||||
|
# step 1: start dnode1/dnode2, and added into cluster
|
||||||
|
# step 2: create db(repl = 2), table, insert data,
|
||||||
|
# step 4: stop dnode1, remove its vnode dir, and copy vnode dir of dnode2 to dnode1
|
||||||
|
# step 5: restart dnode1, waiting sync end
|
||||||
|
# step 6: stop dnode2, reset query cache, and query
|
||||||
|
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/deploy.sh -n dnode2 -i 2
|
||||||
|
#system sh/deploy.sh -n dnode3 -i 3
|
||||||
|
#system sh/deploy.sh -n dnode4 -i 4
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c numOfMnodes -v 2
|
||||||
|
system sh/cfg.sh -n dnode2 -c numOfMnodes -v 2
|
||||||
|
#system sh/cfg.sh -n dnode3 -c numOfMnodes -v 1
|
||||||
|
#system sh/cfg.sh -n dnode4 -c numOfMnodes -v 1
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c walLevel -v 2
|
||||||
|
system sh/cfg.sh -n dnode2 -c walLevel -v 2
|
||||||
|
#system sh/cfg.sh -n dnode3 -c walLevel -v 2
|
||||||
|
#system sh/cfg.sh -n dnode4 -c walLevel -v 2
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c balanceInterval -v 10
|
||||||
|
system sh/cfg.sh -n dnode2 -c balanceInterval -v 10
|
||||||
|
#system sh/cfg.sh -n dnode3 -c balanceInterval -v 10
|
||||||
|
#system sh/cfg.sh -n dnode4 -c balanceInterval -v 10
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c numOfTotalVnodes -v 4
|
||||||
|
system sh/cfg.sh -n dnode2 -c numOfTotalVnodes -v 4
|
||||||
|
#system sh/cfg.sh -n dnode3 -c numOfTotalVnodes -v 4
|
||||||
|
#system sh/cfg.sh -n dnode4 -c numOfTotalVnodes -v 4
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c alternativeRole -v 0
|
||||||
|
system sh/cfg.sh -n dnode2 -c alternativeRole -v 0
|
||||||
|
#system sh/cfg.sh -n dnode3 -c alternativeRole -v 2
|
||||||
|
#system sh/cfg.sh -n dnode4 -c alternativeRole -v 2
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c maxtablesPerVnode -v 4
|
||||||
|
system sh/cfg.sh -n dnode2 -c maxtablesPerVnode -v 4
|
||||||
|
#system sh/cfg.sh -n dnode3 -c maxtablesPerVnode -v 4
|
||||||
|
#system sh/cfg.sh -n dnode4 -c maxtablesPerVnode -v 4
|
||||||
|
#system sh/cfg.sh -n dnode5 -c maxtablesPerVnode -v 4
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c arbitrator -v $arbitrator
|
||||||
|
system sh/cfg.sh -n dnode2 -c arbitrator -v $arbitrator
|
||||||
|
#system sh/cfg.sh -n dnode3 -c arbitrator -v $arbitrator
|
||||||
|
|
||||||
|
print ============== step0: start tarbitrator
|
||||||
|
system sh/exec_tarbitrator.sh -s start
|
||||||
|
|
||||||
|
print ============== step1: start dnode1/dnode2 and add into cluster
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
system sh/exec.sh -n dnode2 -s start
|
||||||
|
sleep 1000
|
||||||
|
sql connect
|
||||||
|
sleep 1000
|
||||||
|
sql create dnode $hostname2
|
||||||
|
sleep 1000
|
||||||
|
|
||||||
|
print ============== step2: create database with replica 2, and create table, insert data
|
||||||
|
$totalTableNum = 10
|
||||||
|
$sleepTimer = 3000
|
||||||
|
|
||||||
|
$db = db
|
||||||
|
sql create database $db replica 2 cache 1
|
||||||
|
sql use $db
|
||||||
|
|
||||||
|
# create table , insert data
|
||||||
|
$stb = stb
|
||||||
|
sql create table $stb (ts timestamp, c1 double) tags(t1 int)
|
||||||
|
$rowNum = 1200
|
||||||
|
$tblNum = $totalTableNum
|
||||||
|
$totalRows = 0
|
||||||
|
$tsStart = 1577808000000 # 2020-01-01 00:00:00.000
|
||||||
|
|
||||||
|
$i = 0
|
||||||
|
while $i < $tblNum
|
||||||
|
$tb = tb . $i
|
||||||
|
sql create table $tb using $stb tags( $i )
|
||||||
|
|
||||||
|
$x = 0
|
||||||
|
while $x < $rowNum
|
||||||
|
$ts = $tsStart + $x
|
||||||
|
sql insert into $tb values ( $ts + 0a , $x ) ( $ts + 1a , $x ) ( $ts + 2a , $x ) ( $ts + 3a , $x ) ( $ts + 4a , $x ) ( $ts + 5a , $x ) ( $ts + 6a , $x ) ( $ts + 7a , $x ) ( $ts + 8a , $x ) ( $ts + 9a , $x ) ( $ts + 10a , $x ) ( $ts + 11a , $x ) ( $ts + 12a , $x ) ( $ts + 13a , $x ) ( $ts + 14a , $x ) ( $ts + 15a , $x ) ( $ts + 16a , $x ) ( $ts + 17a , $x ) ( $ts + 18a , $x ) ( $ts + 19a , $x ) ( $ts + 20a , $x ) ( $ts + 21a , $x ) ( $ts + 22a , $x ) ( $ts + 23a , $x ) ( $ts + 24a , $x ) ( $ts + 25a , $x ) ( $ts + 26a , $x ) ( $ts + 27a , $x ) ( $ts + 28a , $x ) ( $ts + 29a , $x ) ( $ts + 30a , $x ) ( $ts + 31a , $x ) ( $ts + 32a , $x ) ( $ts + 33a , $x ) ( $ts + 34a , $x ) ( $ts + 25a , $x ) ( $ts + 26a , $x ) ( $ts + 27a , $x ) ( $ts + 28a , $x ) ( $ts + 29a , $x ) ( $ts + 30a , $x ) ( $ts + 31a , $x ) ( $ts + 32a , $x ) ( $ts + 33a , $x ) ( $ts + 34a , $x ) ( $ts + 35a , $x ) ( $ts + 36a , $x ) ( $ts + 37a , $x ) ( $ts + 38a , $x ) ( $ts + 39a , $x ) ( $ts + 40a , $x ) ( $ts + 41a , $x ) ( $ts + 42a , $x ) ( $ts + 43a , $x ) ( $ts + 44a , $x ) ( $ts + 45a , $x ) ( $ts + 46a , $x ) ( $ts + 47a , $x ) ( $ts + 48a , $x ) ( $ts + 49a , $x ) ( $ts + 50a , $x ) ( $ts + 51a , $x ) ( $ts + 52a , $x ) ( $ts + 53a , $x ) ( $ts + 54a , $x ) ( $ts + 55a , $x ) ( $ts + 56a , $x ) ( $ts + 57a , $x ) ( $ts + 58a , $x ) ( $ts + 59a , $x )
|
||||||
|
$x = $x + 60
|
||||||
|
endw
|
||||||
|
$totalRows = $totalRows + $x
|
||||||
|
print info: inserted $x rows into $tb and totalRows: $totalRows
|
||||||
|
$i = $i + 1
|
||||||
|
endw
|
||||||
|
|
||||||
|
sql select count(*) from $stb
|
||||||
|
print rows:$rows data00:$data00 totalRows:$totalRows
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data00 != $totalRows then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
|
||||||
|
print ============== step3: insert old data(now-15d) and new data(now+15d), control data rows in order to save in cache, not falling disc
|
||||||
|
sql insert into $tb values ( now - 20d , -20 )
|
||||||
|
sql insert into $tb values ( now - 40d , -40 )
|
||||||
|
$totalRows = $totalRows + 2
|
||||||
|
|
||||||
|
print ============== step4: stop dnode1
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode1_offline:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show dnodes
|
||||||
|
if $rows != 2 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_offline
|
||||||
|
endi
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
|
||||||
|
$dnode1Status = $data4_1
|
||||||
|
$dnode2Status = $data4_2
|
||||||
|
|
||||||
|
if $dnode1Status != offline then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_offline
|
||||||
|
endi
|
||||||
|
if $dnode2Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_offline
|
||||||
|
endi
|
||||||
|
|
||||||
|
# check using select
|
||||||
|
sql select count(*) from $stb
|
||||||
|
print data00 $data00
|
||||||
|
if $data00 != $totalRows then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
#sql show vgroups
|
||||||
|
#print show vgroups:
|
||||||
|
#print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $data7_1 $data8_1 $data9_1
|
||||||
|
#print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 $data5_2 $data6_2 $data7_2 $data8_2 $data9_2
|
||||||
|
#print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 $data5_3 $data6_3 $data7_3 $data8_3 $data9_3
|
||||||
|
|
||||||
|
print ============== step5: remove the mnode dir of dnode1, then copy the monde dir of dnode2
|
||||||
|
system_content rm -rf ../../../sim/dnode1/data/vnode
|
||||||
|
system_content cp -rf ../../../sim/dnode2/data/vnode ../../../sim/dnode1/data/
|
||||||
|
|
||||||
|
print ============== step6: restart dnode1, waiting sync end
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
sleep 1000
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode1_ready:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 20 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show dnodes -x wait_dnode1_ready
|
||||||
|
if $rows != 2 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_ready
|
||||||
|
endi
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
|
||||||
|
$dnode1Status = $data4_1
|
||||||
|
$dnode2Status = $data4_2
|
||||||
|
|
||||||
|
if $dnode1Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_ready
|
||||||
|
endi
|
||||||
|
if $dnode2Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_ready
|
||||||
|
endi
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode1_vgroup_slave:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show vgroups
|
||||||
|
if $rows != 3 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
print show vgroups:
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $data7_1 $data8_1 $data9_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 $data5_2 $data6_2 $data7_2 $data8_2 $data9_2
|
||||||
|
print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 $data5_3 $data6_3 $data7_3 $data8_3 $data9_3
|
||||||
|
print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4 $data5_4 $data6_4 $data7_4 $data8_4 $data9_4
|
||||||
|
$d2v2status = $data4_4
|
||||||
|
$d2v3status = $data4_2
|
||||||
|
$d2v4status = $data4_3
|
||||||
|
|
||||||
|
$d1v2status = $data7_4
|
||||||
|
$d1v3status = $data7_2
|
||||||
|
$d1v4status = $data7_3
|
||||||
|
|
||||||
|
if $d2v2status != master then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d2v3status != master then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d2v4status != master then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $d1v2status != slave then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d1v3status != slave then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
if $d1v4status != slave then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode1_vgroup_slave
|
||||||
|
endi
|
||||||
|
|
||||||
|
print ============== step7: stop dnode2
|
||||||
|
system sh/exec.sh -n dnode2 -s stop -x SIGINT
|
||||||
|
|
||||||
|
$loopCnt = 0
|
||||||
|
wait_dnode2_offline:
|
||||||
|
$loopCnt = $loopCnt + 1
|
||||||
|
if $loopCnt == 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show dnodes
|
||||||
|
if $rows != 2 then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode2_offline
|
||||||
|
endi
|
||||||
|
print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
|
||||||
|
print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
|
||||||
|
$dnode1Status = $data4_1
|
||||||
|
$dnode2Status = $data4_2
|
||||||
|
|
||||||
|
if $dnode1Status != ready then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode2_offline
|
||||||
|
endi
|
||||||
|
if $dnode2Status != offline then
|
||||||
|
sleep 2000
|
||||||
|
goto wait_dnode2_offline
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql reset query cache
|
||||||
|
|
||||||
|
# check using select
|
||||||
|
sql select count(*) from $stb
|
||||||
|
print data00 $data00
|
||||||
|
if $data00 != $totalRows then
|
||||||
|
return -1
|
||||||
|
endi
|
Loading…
Reference in New Issue