/* * Copyright (c) 2019 TAOS Data, Inc. * * 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 . */ #define _DEFAULT_SOURCE #include "os.h" #include "taos.h" #include "tulog.h" #include "ttimer.h" #include "tutil.h" #include "tglobal.h" #define MAX_RANDOM_POINTS 20000 #define GREEN "\033[1;32m" #define NC "\033[0m" void taos_error(TAOS *taos); void* taos_execute(void *param); typedef struct { pthread_t pid; int index; } ThreadObj; int threadNum = 1; int rowNum = 1000; int replica = 1; void printHelp() { char indent[10] = " "; printf("Used to test the performance of TDengine\n After writing one row of data to all tables, write the next row\n"); printf("%s%s\n", indent, "-r"); printf("%s%s%s%d\n", indent, indent, "Number of records to write table, default is ", rowNum); printf("%s%s\n", indent, "-t"); printf("%s%s%s%d\n", indent, indent, "Number of threads to be used, default is ", threadNum); printf("%s%s\n", indent, "-replica"); printf("%s%s%s%d\n", indent, indent, "Database parameters replica, default is ", replica); exit(EXIT_SUCCESS); } void shellParseArgument(int argc, char *argv[]) { for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { printHelp(); exit(0); } else if (strcmp(argv[i], "-r") == 0) { rowNum = atoi(argv[++i]); } else if (strcmp(argv[i], "-t") == 0) { threadNum = atoi(argv[++i]); } else if (strcmp(argv[i], "-replica") == 0) { replica = atoi(argv[++i]); } else { } } pPrint("%s rowNum:%d %s", GREEN, rowNum, NC); pPrint("%s threadNum:%d %s", GREEN, threadNum, NC); pPrint("%s replica:%d %s", GREEN, replica, NC); } int main(int argc, char *argv[]) { shellParseArgument(argc, argv); taos_init(); ThreadObj *threads = calloc(threadNum, sizeof(ThreadObj)); for (int i = 0; i < threadNum; ++i) { ThreadObj * pthread = threads + i; pthread_attr_t thattr; pthread->index = i; pthread_attr_init(&thattr); pthread_attr_setdetachstate(&thattr, PTHREAD_CREATE_JOINABLE); pthread_create(&pthread->pid, &thattr, taos_execute, pthread); } for (int i = 0; i < threadNum; i++) { pthread_join(threads[i].pid, NULL); } printf("all finished\n"); return 0; } void taos_error(TAOS *con) { fprintf(stderr, "TDengine error: %s\n", taos_errstr(con)); taos_close(con); exit(1); } void* taos_execute(void *param) { ThreadObj *pThread = (ThreadObj *)param; void *taos = taos_connect(tsMasterIp, tsDefaultUser, tsDefaultPass, NULL, 0); if (taos == NULL) taos_error(taos); char sql[1024] = {0}; sprintf(sql, "create database if not exists db replica %d", replica); taos_query(taos, sql); sprintf(sql, "create table if not exists db.t%d (ts timestamp, i int, j float, k double)", pThread->index); taos_query(taos, sql); int64_t timestamp = 1530374400000L; sprintf(sql, "insert into db.t%d values(%ld, %d, %d, %d)", pThread->index, timestamp, 0, 0, 0); int code = taos_query(taos, sql); if (code != 0) printf("error code:%d, sql:%s\n", code, sql); int affectrows = taos_affected_rows(taos); if (affectrows != 1) printf("affect rows:%d, sql:%s\n", affectrows, sql); timestamp -= 1000; int total_affect_rows = affectrows; for (int i = 1; i < rowNum; ++i) { sprintf(sql, "import into db.t%d values(%ld, %d, %d, %d)", pThread->index, timestamp, i, i, i); code = taos_query(taos, sql); if (code != 0) printf("error code:%d, sql:%s\n", code, sql); int affectrows = taos_affected_rows(taos); if (affectrows != 1) printf("affect rows:%d, sql:%s\n", affectrows, sql); total_affect_rows += affectrows; timestamp -= 1000; } printf("thread:%d run finished total_affect_rows:%d\n", pThread->index, total_affect_rows); return NULL; }