diff --git a/.travis.yml b/.travis.yml index 221a1f1a300d265db1f8958feba6539a9b7b5b81..bda5c0d75896ffacae6a048ab97ee34229b5e58b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,114 +1,19 @@ # # Configuration # -git: - depth: 1 - -language: c - -compiler: - - clang - - gcc - -os: - - linux -# - osx - -before_install: - - |- - case $TRAVIS_OS_NAME in - linux) - sudo apt -y update - sudo apt -y install python-pip python3-pip python-setuptools python3-setuptools - ;; - esac - -addons: - coverity_scan: - - # GitHub project metadata - # ** specific to your project ** - project: - name: TDengine - version: 2.x - description: TDengine - - # Where email notification of build analysis results will be sent - notification_email: sdsang@taosdata.com - - # Commands to prepare for build_command - # ** likely specific to your build ** - build_command_prepend: cmake .. - - # The command that will be added as an argument to "cov-build" to compile your project for analysis, - # ** likely specific to your build ** - build_command: cmake --build . - - # Pattern to match selecting branches that will run analysis. We recommend leaving this set to 'coverity_scan'. - # Take care in resource usage, and consider the build frequency allowances per - # https://scan.coverity.com/faq#frequency - branch_pattern: coverity_scan - -before_script: - - mkdir debug - - cd debug - -script: - - cmake .. - - cmake --build . || exit $? - - |- - case $TRAVIS_OS_NAME in - linux) - # Color setting - RED='\033[0;31m' - GREEN='\033[1;32m' - GREEN_DARK='\033[0;32m' - GREEN_UNDERLINE='\033[4;32m' - NC='\033[0m' - - sudo make install - - cd ../tests/script - sudo ./test.sh 2>&1 | grep 'success\|failed' | tee out.txt - - total_success=`grep success out.txt | wc -l` - - if [ "$total_success" -gt "0" ]; then - total_success=`expr $total_success - 1` - echo -e "${GREEN} ### Total $total_success TSIM case(s) succeed! ### ${NC}" - fi - - total_failed=`grep failed out.txt | wc -l` - if [ "$total_failed" -ne "0" ]; then - echo -e "${RED} ### Total $total_failed TSIM case(s) failed! ### ${NC}" - exit $total_failed - fi - - pip install --user ../../src/connector/python/linux/python2/ - pip3 install --user ../../src/connector/python/linux/python3/ - - cd ../pytest - sudo ./simpletest.sh 2>&1 | grep 'successfully executed\|failed' | tee pytest-out.txt - total_py_success=`grep 'successfully executed' pytest-out.txt | wc -l` - - if [ "$total_py_success" -gt "0" ]; then - echo -e "${GREEN} ### Total $total_py_success python case(s) succeed! ### ${NC}" - fi - - total_py_failed=`grep 'failed' pytest-out.txt | wc -l` - if [ "$total_py_failed" -ne "0" ]; then - echo -e "${RED} ### Total $total_py_failed python case(s) failed! ### ${NC}" - exit $total_py_failed - fi - - ;; - esac - # # Build Matrix # matrix: - os: linux + language: c + + git: + - depth: 1 + + compiler: gcc + env: DESC="linux/gcc build and test" + addons: apt: packages: @@ -120,8 +25,193 @@ matrix: - python3-pip - python3-setuptools -# - os: osx -# addons: -# homebrew: -# - cmake + before_install: + - sudo apt update -y -qq + - sudo apt install -y net-tools python-pip python-setuptools python3-pip python3-setuptools + + before_script: + - cd ${TRAVIS_BUILD_DIR} + - mkdir debug + - cd debug + + script: + - cmake .. + - make + + after_success: + - |- + case $TRAVIS_OS_NAME in + linux) + cd ${TRAVIS_BUILD_DIR}/debug + sudo make install || exit $? + + pip install --user ${TRAVIS_BUILD_DIR}/src/connector/python/linux/python2/ + pip3 install --user ${TRAVIS_BUILD_DIR}/src/connector/python/linux/python3/ + + cd ${TRAVIS_BUILD_DIR}/tests + bash ./test-all.sh + + if [ "$?" -ne "0" ]; then + exit $? + fi + + ;; + esac + + - os: linux + language: c + compiler: gcc + env: COVERITY_SCAN=true + git: + - depth: 1 + + script: + - echo "this job is for coverity scan" + + addons: + coverity_scan: + + # GitHub project metadata + # ** specific to your project ** + project: + name: sangshuduo/TDengine + version: 2.x + description: sangshuduo/TDengine + + # Where email notification of build analysis results will be sent + notification_email: sangshuduo@gmail.com + + # Commands to prepare for build_command + # ** likely specific to your build ** + build_command_prepend: cmake .. + + # The command that will be added as an argument to "cov-build" to compile your project for analysis, + # ** likely specific to your build ** + build_command: cmake --build . + + # Pattern to match selecting branches that will run analysis. We recommend leaving this set to 'coverity_scan'. + # Take care in resource usage, and consider the build frequency allowances per + # https://scan.coverity.com/faq#frequency + branch_pattern: coverity_scan + + - os: linux + language: c + compiler: gcc + env: ENV_COVER=true + + git: + - depth: 1 + + addons: + apt: + packages: + - build-essential + - cmake + - net-tools + - python-pip + - python-setuptools + - python3-pip + - python3-setuptools + - lcov + + before_install: + - sudo apt update -y -qq + - sudo apt install -y net-tools python-pip python-setuptools python3-pip python3-setuptools lcov + + before_script: + - cd ${TRAVIS_BUILD_DIR} + - mkdir debug + - cd debug + + script: + - cmake -DCOVER=true .. + - make + + after_success: + - |- + case $TRAVIS_OS_NAME in + linux) + cd ${TRAVIS_BUILD_DIR}/debug + sudo make install || exit $? + + pip install --user ${TRAVIS_BUILD_DIR}/src/connector/python/linux/python2/ + pip3 install --user ${TRAVIS_BUILD_DIR}/src/connector/python/linux/python3/ + + cd ${TRAVIS_BUILD_DIR}/tests + + bash ./test-all.sh + + if [ "$?" -ne "0" ]; then + exit $? + fi + + cd ${TRAVIS_BUILD_DIR} + lcov -d . --capture -o coverage.info + lcov -l coverage.info || exit $? + + gem install coveralls-lcov + + # Color setting + RED='\033[0;31m' + GREEN='\033[1;32m' + GREEN_DARK='\033[0;32m' + GREEN_UNDERLINE='\033[4;32m' + NC='\033[0m' + + coveralls-lcov coverage.info + if [ "$?" -eq "0" ]; then + echo -e "${GREEN} ## Uploaded to Coveralls.io! ## ${NC}" + else + echo -e "${RED} ## Coveralls.io not collect coverage report! ## ${NC} " + exit $? + fi + + bash <(curl -s https://codecov.io/bash) -f coverage.info + if [ "$?" -eq "0" ]; then + echo -e "${GREEN} ## Uploaded to Codecov! ## ${NC} " + else + echo -e "${RED} ## Codecov did not collect coverage report! ## ${NC} " + exit $? + fi + + ;; + esac + + - os: linux + language: c + compiler: clang + env: DESC="linux/clang build" + git: + - depth: 1 + + addons: + apt: + packages: + - build-essential + - cmake + before_script: + - cd ${TRAVIS_BUILD_DIR} + - mkdir debug + - cd debug + + script: + - cmake .. + - make + + # - os: osx + # language: c + # compiler: clang + # env: DESC="mac/clang build" + # git: + # - depth: 1 + # addons: + # homebrew: + # - cmake + # + # script: + # - cd ${TRAVIS_BUILD_DIR} + # - mkdir debug + # - cd debug + # - cmake .. + # - make diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a9a42cc3627d18af7fd48064b35f5abd6b15601..e53cca2ea80e70a755724577ac788ecdcd97274b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,15 +1,16 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(TDengine) -SET(TD_CLUSTER FALSE) +SET(TD_SYNC FALSE) SET(TD_ACCOUNT FALSE) -SET(TD_VPEER FALSE) -SET(TD_MPEER FALSE) +SET(TD_ADMIN FALSE) SET(TD_GRANT FALSE) + SET(TD_COVER FALSE) +SET(TD_MEM_CHECK FALSE) + SET(TD_PAGMODE_LITE FALSE) SET(TD_GODLL FALSE) -SET(TD_MEM_CHECK FALSE) SET(TD_COMMUNITY_DIR ${PROJECT_SOURCE_DIR}) MESSAGE(STATUS "Community directory: " ${TD_COMMUNITY_DIR}) diff --git a/cmake/define.inc b/cmake/define.inc index 5f17ee121633f4c1c4d65a5bd6241072989dbafb..da100f4260c7f824f2b2d3f2ba562d7ea03e4f51 100755 --- a/cmake/define.inc +++ b/cmake/define.inc @@ -1,23 +1,16 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(TDengine) -IF (TD_CLUSTER) - ADD_DEFINITIONS(-D_CLUSTER) +IF (TD_SYNC) + ADD_DEFINITIONS(-D_SYNC) ENDIF () -IF (TD_MPEER) - ADD_DEFINITIONS(-D_MPEER) -ENDIF () - -IF (TD_VPEER) - ADD_DEFINITIONS(-D_VPEER) - #ADD_DEFINITIONS(-DTSDB_REPLICA_MAX_NUM=3) -ELSE () - #ADD_DEFINITIONS(-DTSDB_REPLICA_MAX_NUM=1) +IF (TD_ACCOUNT) + ADD_DEFINITIONS(-D_ACCT) ENDIF () -IF (TD_ACCOUNT) - ADD_DEFINITIONS(-D_ACCOUNT) +IF (TD_ADMIN) + ADD_DEFINITIONS(-D_ADMIN) ENDIF () IF (TD_GRANT) diff --git a/cmake/input.inc b/cmake/input.inc index d29b7c5ff815a9d89222c296ba36be39da0e5ce0..5a17e0319c01d335e5940e0475db4f2f57d7bfd7 100755 --- a/cmake/input.inc +++ b/cmake/input.inc @@ -1,14 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(TDengine) -IF (${CLUSTER} MATCHES "true") - SET(TD_CLUSTER TRUE) - MESSAGE(STATUS "Build with cluster plugins") -ELSEIF (${CLUSTER} MATCHES "false") - SET(TD_CLUSTER FALSE) - MESSAGE(STATUS "Build without cluster plugins") -ENDIF () - IF (${ACCOUNT} MATCHES "true") SET(TD_ACCOUNT TRUE) MESSAGE(STATUS "Build with account plugins") diff --git a/cmake/platform.inc b/cmake/platform.inc index 6087b6f16f61273dd1dcb69dd6aca207335a96a8..2e0e2d6af08fa529f7435b2e39fa4cdb4d293fae 100755 --- a/cmake/platform.inc +++ b/cmake/platform.inc @@ -122,6 +122,12 @@ IF (TD_LINUX_64) link_libraries(/usr/lib/libargp.a) ADD_DEFINITIONS(-D_ALPINE) ENDIF () + IF (${COVER} MATCHES "true") + MESSAGE(STATUS "Test coverage mode, add extra flags") + SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage") + SET(GCC_COVERAGE_LINK_FLAGS "-lgcov --coverage") + SET(COMMON_FLAGS "${COMMON_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}") + ENDIF () ELSEIF (TD_LINUX_32) IF (NOT TD_ARM) EXIT () @@ -138,6 +144,12 @@ IF (TD_LINUX_64) link_library(/usr/lib/libargp.a) ADD_DEFINITIONS(-D_ALPINE) ENDIF () + IF (${COVER} MATCHES "true") + MESSAGE(STATUS "Test coverage mode, add extra flags") + SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage") + SET(GCC_COVERAGE_LINK_FLAGS "-lgcov --coverage") + SET(COMMON_FLAGS "${COMMON_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}") + ENDIF () ELSEIF (TD_WINDOWS_64) SET(CMAKE_GENERATOR "NMake Makefiles" CACHE INTERNAL "" FORCE) IF (NOT TD_GODLL) diff --git a/src/util/src/tstring.c b/src/common/src/tstring.c similarity index 100% rename from src/util/src/tstring.c rename to src/common/src/tstring.c diff --git a/src/dnode/CMakeLists.txt b/src/dnode/CMakeLists.txt index 899977061832bf1ba4c76ba2d802d3e1c619c1fd..5735e1a8c18677f7323db6942d115fca681ab105 100644 --- a/src/dnode/CMakeLists.txt +++ b/src/dnode/CMakeLists.txt @@ -21,20 +21,13 @@ IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM)) IF (TD_ACCOUNT) TARGET_LINK_LIBRARIES(taosd account) ENDIF () + IF (TD_GRANT) TARGET_LINK_LIBRARIES(taosd grant) ENDIF () - IF (TD_CLUSTER) - TARGET_LINK_LIBRARIES(taosd cluster) - ENDIF () - - IF (TD_VPEER) - TARGET_LINK_LIBRARIES(taosd balance sync) - ENDIF () - - IF (TD_MPEER) - TARGET_LINK_LIBRARIES(taosd mpeer sync) + IF (TD_SYNC) + TARGET_LINK_LIBRARIES(taosd replica sync) ENDIF () SET(PREPARE_ENV_CMD "prepare_env_cmd") diff --git a/src/dnode/inc/dnodeMClient.h b/src/dnode/inc/dnodeMClient.h index 594fb84d3b4cd30e550ed41b79adff10a18589b0..6d413ada884cc874a8277888995b96fa3e70aa48 100644 --- a/src/dnode/inc/dnodeMClient.h +++ b/src/dnode/inc/dnodeMClient.h @@ -23,9 +23,6 @@ extern "C" { int32_t dnodeInitMClient(); void dnodeCleanupMClient(); void dnodeSendMsgToMnode(SRpcMsg *rpcMsg); -uint32_t dnodeGetMnodeMasteIp(); -void * dnodeGetMpeerInfos(); -int32_t dnodeGetDnodeId(); #ifdef __cplusplus } diff --git a/src/dnode/inc/dnodeModule.h b/src/dnode/inc/dnodeModule.h index 728630748f8b195721cd554cf590af900c49a1e8..b6b57be3d1760d79007658255e94870660d73446 100644 --- a/src/dnode/inc/dnodeModule.h +++ b/src/dnode/inc/dnodeModule.h @@ -21,9 +21,9 @@ extern "C" { #endif int32_t dnodeInitModules(); -void dnodeCleanUpModules(); -void dnodeStartModules(); -void dnodeProcessModuleStatus(uint32_t moduleStatus); +void dnodeStartModules(); +void dnodeCleanUpModules(); +void dnodeProcessModuleStatus(uint32_t moduleStatus); #ifdef __cplusplus } diff --git a/src/dnode/src/dnodeMClient.c b/src/dnode/src/dnodeMClient.c index 85454af095aed7782c4fbbd3f2f3be0bf3210024..90a093560f7860a3414f803c7549f50f4388797f 100644 --- a/src/dnode/src/dnodeMClient.c +++ b/src/dnode/src/dnodeMClient.c @@ -23,12 +23,12 @@ #include "tsync.h" #include "ttime.h" #include "ttimer.h" +#include "treplica.h" #include "dnode.h" #include "dnodeMClient.h" #include "dnodeModule.h" #include "dnodeMgmt.h" #include "vnode.h" -#include "mpeer.h" #define MPEER_CONTENT_LEN 2000 @@ -142,9 +142,9 @@ static void dnodeProcessStatusRsp(SRpcMsg *pMsg) { } SDMStatusRsp *pStatusRsp = pMsg->pCont; - SDMNodeInfos *mpeers = &pStatusRsp->mpeers; - if (mpeers->nodeNum <= 0) { - dError("status msg is invalid, num of ips is %d", mpeers->nodeNum); + SDMNodeInfos *mnodes = &pStatusRsp->mnodes; + if (mnodes->nodeNum <= 0) { + dError("status msg is invalid, num of ips is %d", mnodes->nodeNum); taosTmrReset(dnodeSendStatusMsg, tsStatusInterval * 1000, NULL, tsDnodeTmr, &tsStatusTimer); return; } @@ -159,29 +159,29 @@ static void dnodeProcessStatusRsp(SRpcMsg *pMsg) { dnodeUpdateDnodeInfo(pState->dnodeId); SRpcIpSet mgmtIpSet = {0}; - mgmtIpSet.inUse = mpeers->inUse; - mgmtIpSet.numOfIps = mpeers->nodeNum; - mgmtIpSet.port = htons(mpeers->nodeInfos[0].nodePort); - for (int32_t i = 0; i < mpeers->nodeNum; i++) { - mgmtIpSet.ip[i] = htonl(mpeers->nodeInfos[i].nodeIp); + mgmtIpSet.inUse = mnodes->inUse; + mgmtIpSet.numOfIps = mnodes->nodeNum; + mgmtIpSet.port = htons(mnodes->nodeInfos[0].nodePort); + for (int32_t i = 0; i < mnodes->nodeNum; i++) { + mgmtIpSet.ip[i] = htonl(mnodes->nodeInfos[i].nodeIp); } if (memcmp(&mgmtIpSet, &tsMnodeIpList, sizeof(SRpcIpSet)) != 0 || tsMnodeInfos.nodeNum == 0) { memcpy(&tsMnodeIpList, &mgmtIpSet, sizeof(SRpcIpSet)); - tsMnodeInfos.inUse = mpeers->inUse; - tsMnodeInfos.nodeNum = mpeers->nodeNum; + tsMnodeInfos.inUse = mnodes->inUse; + tsMnodeInfos.nodeNum = mnodes->nodeNum; dPrint("mnode ip list is changed, numOfIps:%d inUse:%d", tsMnodeInfos.nodeNum, tsMnodeInfos.inUse); - for (int32_t i = 0; i < mpeers->nodeNum; i++) { - tsMnodeInfos.nodeInfos[i].nodeId = htonl(mpeers->nodeInfos[i].nodeId); - tsMnodeInfos.nodeInfos[i].nodeIp = htonl(mpeers->nodeInfos[i].nodeIp); - tsMnodeInfos.nodeInfos[i].nodePort = htons(mpeers->nodeInfos[i].nodePort); - strcpy(tsMnodeInfos.nodeInfos[i].nodeName, mpeers->nodeInfos[i].nodeName); + for (int32_t i = 0; i < mnodes->nodeNum; i++) { + tsMnodeInfos.nodeInfos[i].nodeId = htonl(mnodes->nodeInfos[i].nodeId); + tsMnodeInfos.nodeInfos[i].nodeIp = htonl(mnodes->nodeInfos[i].nodeIp); + tsMnodeInfos.nodeInfos[i].nodePort = htons(mnodes->nodeInfos[i].nodePort); + strcpy(tsMnodeInfos.nodeInfos[i].nodeName, mnodes->nodeInfos[i].nodeName); dPrint("mnode:%d, ip:%s:%u name:%s", tsMnodeInfos.nodeInfos[i].nodeId, taosIpStr(tsMnodeInfos.nodeInfos[i].nodeIp), tsMnodeInfos.nodeInfos[i].nodePort, tsMnodeInfos.nodeInfos[i].nodeName); } dnodeSaveMnodeIpList(); - mpeerUpdateSync(); + replicaNotify(); } taosTmrReset(dnodeSendStatusMsg, tsStatusInterval * 1000, NULL, tsDnodeTmr, &tsStatusTimer); @@ -332,7 +332,7 @@ uint32_t dnodeGetMnodeMasteIp() { return tsMnodeIpList.ip[tsMnodeIpList.inUse]; } -void* dnodeGetMpeerInfos() { +void* dnodeGetMnodeList() { return &tsMnodeInfos; } diff --git a/src/dnode/src/dnodeMain.c b/src/dnode/src/dnodeMain.c index 5fba941788965f1d60fc47fb4e7abc7eef09df5a..a4e7b5599559aa86a43303c5a58f7b7d32940bf7 100644 --- a/src/dnode/src/dnodeMain.c +++ b/src/dnode/src/dnodeMain.c @@ -17,7 +17,6 @@ #include "os.h" #include "tglobalcfg.h" #include "tlog.h" -#include "tmodule.h" #include "trpc.h" #include "tutil.h" #include "dnode.h" @@ -229,3 +228,7 @@ static int32_t dnodeInitStorage() { } static void dnodeCleanupStorage() {} + +bool dnodeIsFirstDeploy() { + return strcmp(tsMasterIp, tsPrivateIp) == 0; +} \ No newline at end of file diff --git a/src/dnode/src/dnodeMgmt.c b/src/dnode/src/dnodeMgmt.c index abfee2239bc7e8b2a6d9f339928ef51a63bc14fe..8f62e3adc09edf3fac58b43fc03f476630946733 100644 --- a/src/dnode/src/dnodeMgmt.c +++ b/src/dnode/src/dnodeMgmt.c @@ -22,11 +22,11 @@ #include "trpc.h" #include "tsdb.h" #include "twal.h" +#include "vnode.h" #include "dnodeMClient.h" #include "dnodeMgmt.h" #include "dnodeRead.h" #include "dnodeWrite.h" -#include "vnode.h" static int32_t dnodeOpenVnodes(); static void dnodeCloseVnodes(); diff --git a/src/dnode/src/dnodeModule.c b/src/dnode/src/dnodeModule.c index 7a2facb255c784af0b0856c24abb856a2a33eed8..57ef655078d46d42516850692eb8730f22d5e7c6 100644 --- a/src/dnode/src/dnodeModule.c +++ b/src/dnode/src/dnodeModule.c @@ -15,55 +15,74 @@ #define _DEFAULT_SOURCE #include "os.h" +#include "taosdef.h" #include "tlog.h" -#include "tmodule.h" #include "tglobalcfg.h" #include "mnode.h" #include "http.h" #include "monitor.h" #include "dnodeModule.h" -#include "dnode.h" -static void dnodeAllocModules() { - tsModule[TSDB_MOD_MGMT].name = "mgmt"; - tsModule[TSDB_MOD_MGMT].initFp = mgmtInitSystem; - tsModule[TSDB_MOD_MGMT].cleanUpFp = mgmtCleanUpSystem; - tsModule[TSDB_MOD_MGMT].startFp = mgmtStartSystem; - tsModule[TSDB_MOD_MGMT].stopFp = mgmtStopSystem; - tsModule[TSDB_MOD_MGMT].num = tsNumOfMPeers; - tsModule[TSDB_MOD_MGMT].curNum = 0; - tsModule[TSDB_MOD_MGMT].equalVnodeNum = tsMgmtEqualVnodeNum; +typedef struct { + bool enable; + char * name; + int32_t (*initFp)(); + int32_t (*startFp)(); + void (*cleanUpFp)(); + void (*stopFp)(); +} SModule; + +static SModule tsModule[TSDB_MOD_MAX] = {0}; +static uint32_t tsModuleStatus = 0; - tsModule[TSDB_MOD_HTTP].name = "http"; - tsModule[TSDB_MOD_HTTP].initFp = httpInitSystem; - tsModule[TSDB_MOD_HTTP].cleanUpFp = httpCleanUpSystem; - tsModule[TSDB_MOD_HTTP].startFp = httpStartSystem; - tsModule[TSDB_MOD_HTTP].stopFp = httpStopSystem; - tsModule[TSDB_MOD_HTTP].num = (tsEnableHttpModule == 1) ? -1 : 0; - tsModule[TSDB_MOD_HTTP].curNum = 0; - tsModule[TSDB_MOD_HTTP].equalVnodeNum = 0; +static void dnodeSetModuleStatus(int32_t module) { + tsModuleStatus |= (1 << module); +} + +static void dnodeUnSetModuleStatus(int32_t module) { + tsModuleStatus &= ~(1 << module); +} - tsModule[TSDB_MOD_MONITOR].name = "monitor"; - tsModule[TSDB_MOD_MONITOR].initFp = monitorInitSystem; - tsModule[TSDB_MOD_MONITOR].cleanUpFp = monitorCleanUpSystem; - tsModule[TSDB_MOD_MONITOR].startFp = monitorStartSystem; - tsModule[TSDB_MOD_MONITOR].stopFp = monitorStopSystem; - tsModule[TSDB_MOD_MONITOR].num = (tsEnableMonitorModule == 1) ? -1 : 0; - tsModule[TSDB_MOD_MONITOR].curNum = 0; - tsModule[TSDB_MOD_MONITOR].equalVnodeNum = 0; +static void dnodeAllocModules() { + tsModule[TSDB_MOD_MGMT].name = false; + tsModule[TSDB_MOD_MGMT].name = "mgmt"; + tsModule[TSDB_MOD_MGMT].initFp = mgmtInitSystem; + tsModule[TSDB_MOD_MGMT].cleanUpFp = mgmtCleanUpSystem; + tsModule[TSDB_MOD_MGMT].startFp = mgmtStartSystem; + tsModule[TSDB_MOD_MGMT].stopFp = mgmtStopSystem; + + tsModule[TSDB_MOD_HTTP].enable = (tsEnableHttpModule == 1); + tsModule[TSDB_MOD_HTTP].name = "http"; + tsModule[TSDB_MOD_HTTP].initFp = httpInitSystem; + tsModule[TSDB_MOD_HTTP].cleanUpFp = httpCleanUpSystem; + tsModule[TSDB_MOD_HTTP].startFp = httpStartSystem; + tsModule[TSDB_MOD_HTTP].stopFp = httpStopSystem; + if (tsEnableHttpModule) { + dnodeSetModuleStatus(TSDB_MOD_HTTP); + } + + tsModule[TSDB_MOD_MONITOR].enable = (tsEnableMonitorModule == 1); + tsModule[TSDB_MOD_MONITOR].name = "monitor"; + tsModule[TSDB_MOD_MONITOR].initFp = monitorInitSystem; + tsModule[TSDB_MOD_MONITOR].cleanUpFp = monitorCleanUpSystem; + tsModule[TSDB_MOD_MONITOR].startFp = monitorStartSystem; + tsModule[TSDB_MOD_MONITOR].stopFp = monitorStopSystem; + if (tsEnableMonitorModule) { + dnodeSetModuleStatus(TSDB_MOD_MONITOR); + } } void dnodeCleanUpModules() { - for (int mod = 1; mod < TSDB_MOD_MAX; ++mod) { - if (tsModule[mod].num != 0 && tsModule[mod].stopFp) { - (*tsModule[mod].stopFp)(); + for (int32_t module = 1; module < TSDB_MOD_MAX; ++module) { + if (tsModule[module].enable && tsModule[module].stopFp) { + (*tsModule[module].stopFp)(); } - if (tsModule[mod].num != 0 && tsModule[mod].cleanUpFp) { - (*tsModule[mod].cleanUpFp)(); + if (tsModule[module].cleanUpFp) { + (*tsModule[module].cleanUpFp)(); } } - if (tsModule[TSDB_MOD_MGMT].num != 0 && tsModule[TSDB_MOD_MGMT].cleanUpFp) { + if (tsModule[TSDB_MOD_MGMT].enable && tsModule[TSDB_MOD_MGMT].cleanUpFp) { (*tsModule[TSDB_MOD_MGMT].cleanUpFp)(); } } @@ -71,57 +90,41 @@ void dnodeCleanUpModules() { int32_t dnodeInitModules() { dnodeAllocModules(); - for (int mod = 0; mod < TSDB_MOD_MAX; ++mod) { - if (tsModule[mod].num != 0 && tsModule[mod].initFp) { - if ((*tsModule[mod].initFp)() != 0) { - dError("failed to init modules"); + for (int32_t module = 0; module < TSDB_MOD_MAX; ++module) { + if (tsModule[module].initFp) { + if ((*tsModule[module].initFp)() != 0) { + dError("failed to init module:%s", tsModule[module].name); return -1; } } } - return TSDB_CODE_SUCCESS; + return 0; } void dnodeStartModules() { - // for (int mod = 1; mod < TSDB_MOD_MAX; ++mod) { - // if (tsModule[mod].num != 0 && tsModule[mod].startFp) { - // if ((*tsModule[mod].startFp)() != 0) { - // dError("failed to start module:%d", mod); - // } - // } - // } + for (int32_t module = 1; module < TSDB_MOD_MAX; ++module) { + if (tsModule[module].enable && tsModule[module].startFp) { + if ((*tsModule[module].startFp)() != 0) { + dError("failed to start module:%s", tsModule[module].name); + } + } + } } void dnodeProcessModuleStatus(uint32_t moduleStatus) { - if (moduleStatus == tsModuleStatus) return; - - dPrint("module status is received, old:%d, new:%d", tsModuleStatus, moduleStatus); - - int news = moduleStatus; - int olds = tsModuleStatus; - - for (int moduleType = 0; moduleType < TSDB_MOD_MAX; ++moduleType) { - int newStatus = news & (1 << moduleType); - int oldStatus = olds & (1 << moduleType); - - if (oldStatus > 0) { - if (newStatus == 0) { - if (tsModule[moduleType].stopFp) { - dPrint("module:%s is stopped on this node", tsModule[moduleType].name); - (*tsModule[moduleType].stopFp)(); - } - } - } else if (oldStatus == 0) { - if (newStatus > 0) { - if (tsModule[moduleType].startFp) { - dPrint("module:%s is started on this node", tsModule[moduleType].name); - (*tsModule[moduleType].startFp)(); - } - } - } else { - } + bool enableMgmtModule = moduleStatus & (1 << TSDB_MOD_MGMT); + if (!tsModule[TSDB_MOD_MGMT].enable && enableMgmtModule) { + dPrint("module status is received, start mgmt module", tsModuleStatus, moduleStatus); + tsModule[TSDB_MOD_MGMT].enable = true; + dnodeSetModuleStatus(TSDB_MOD_MGMT); + (*tsModule[TSDB_MOD_MGMT].startFp)(); } - tsModuleStatus = moduleStatus; + if (tsModule[TSDB_MOD_MGMT].enable && !enableMgmtModule) { + dPrint("module status is received, stop mgmt module", tsModuleStatus, moduleStatus); + tsModule[TSDB_MOD_MGMT].enable = false; + dnodeUnSetModuleStatus(TSDB_MOD_MGMT); + (*tsModule[TSDB_MOD_MGMT].stopFp)(); + } } diff --git a/src/inc/dnode.h b/src/inc/dnode.h index db39906c6892d641cff0880425c6c3ab0818c20f..0be18a007e831614d0e5362bccf32a7b529abc8b 100644 --- a/src/inc/dnode.h +++ b/src/inc/dnode.h @@ -20,9 +20,6 @@ extern "C" { #endif -#include -#include - typedef struct { int32_t queryReqNum; int32_t submitReqNum; @@ -44,6 +41,11 @@ void *dnodeAllocateRqueue(void *pVnode); void dnodeFreeRqueue(void *rqueue); void dnodeSendRpcWriteRsp(void *pVnode, void *param, int32_t code); +bool dnodeIsFirstDeploy(); +uint32_t dnodeGetMnodeMasteIp(); +void * dnodeGetMnodeList(); +int32_t dnodeGetDnodeId(); + #ifdef __cplusplus } #endif diff --git a/src/inc/mnode.h b/src/inc/mnode.h index f0407aa9e4a635590be34f536f931cd1da77e88b..e7ad88d6b66398e14411bcbf9e74ffeedb18cbda 100644 --- a/src/inc/mnode.h +++ b/src/inc/mnode.h @@ -20,248 +20,11 @@ extern "C" { #endif -#include "os.h" -#include "taosdef.h" -#include "taosmsg.h" -#include "taoserror.h" -#include "tglobalcfg.h" -#include "thash.h" -#include "tidpool.h" -#include "tlog.h" -#include "tmempool.h" -#include "trpc.h" -#include "taosdef.h" -#include "tskiplist.h" -#include "tsocket.h" -#include "ttime.h" -#include "ttimer.h" -#include "tutil.h" - -struct _vg_obj; -struct _db_obj; -struct _acct_obj; -struct _user_obj; -struct _mnode_obj; - -typedef struct _mnode_obj { - int32_t mnodeId; - int64_t createdTime; - int8_t reserved[14]; - int8_t updateEnd[1]; - int32_t refCount; - uint32_t privateIp; - uint32_t publicIp; - uint16_t port; - int8_t role; - char mnodeName[TSDB_NODE_NAME_LEN + 1]; -} SMnodeObj; - -typedef struct _dnode_obj { - int32_t dnodeId; - uint32_t privateIp; - uint32_t publicIp; - uint32_t moduleStatus; - int64_t createdTime; - uint32_t lastAccess; - int32_t openVnodes; - int32_t numOfTotalVnodes; // from dnode status msg, config information - uint32_t rack; - uint16_t idc; - uint16_t slot; - uint16_t numOfCores; // from dnode status msg - int8_t alternativeRole; // from dnode status msg, 0-any, 1-mgmt, 2-dnode - int8_t status; // set in balance function - int32_t customScore; // config by user - char dnodeName[TSDB_NODE_NAME_LEN + 1]; - int8_t reserved[15]; - int8_t updateEnd[1]; - int32_t refCount; - SVnodeLoad vload[TSDB_MAX_VNODES]; - uint32_t lastReboot; // time stamp for last reboot - float score; // calc in balance function - float diskAvailable; // from dnode status msg - int16_t diskAvgUsage; // calc from sys.disk - int16_t cpuAvgUsage; // calc from sys.cpu - int16_t memoryAvgUsage; // calc from sys.mem - int16_t bandwidthUsage; // calc from sys.band -} SDnodeObj; - -typedef struct { - int32_t dnodeId; - uint16_t port; - uint32_t privateIp; - uint32_t publicIp; -} SVnodeGid; - -typedef struct { - char tableId[TSDB_TABLE_ID_LEN + 1]; - int8_t type; -} STableObj; - -typedef struct SSuperTableObj { - STableObj info; - uint64_t uid; - int64_t createdTime; - int32_t sversion; - int32_t numOfColumns; - int32_t numOfTags; - int8_t reserved[15]; - int8_t updateEnd[1]; - int32_t refCount; - int32_t numOfTables; - int16_t nextColId; - SSchema * schema; - int32_t vgLen; - int32_t * vgList; -} SSuperTableObj; - -typedef struct { - STableObj info; - uint64_t uid; - int64_t createdTime; - int32_t sversion; //used by normal table - int32_t numOfColumns; //used by normal table - int32_t sid; - int32_t vgId; - char superTableId[TSDB_TABLE_ID_LEN + 1]; - int32_t sqlLen; - int8_t reserved[1]; - int8_t updateEnd[1]; - int16_t nextColId; //used by normal table - int32_t refCount; - char* sql; //used by normal table - SSchema* schema; //used by normal table - SSuperTableObj *superTable; -} SChildTableObj; - -typedef struct _vg_obj { - uint32_t vgId; - char dbName[TSDB_DB_NAME_LEN + 1]; - int64_t createdTime; - SVnodeGid vnodeGid[TSDB_VNODES_SUPPORT]; - int32_t numOfVnodes; - int32_t lbDnodeId; - int32_t lbTime; - int8_t status; - int8_t inUse; - int8_t reserved[13]; - int8_t updateEnd[1]; - int32_t refCount; - struct _vg_obj *prev, *next; - struct _db_obj *pDb; - int32_t numOfTables; - void * idPool; - SChildTableObj ** tableList; -} SVgObj; - -typedef struct _db_obj { - char name[TSDB_DB_NAME_LEN + 1]; - int8_t status; - int64_t createdTime; - SDbCfg cfg; - int8_t reserved[15]; - int8_t updateEnd[1]; - int32_t refCount; - int32_t numOfVgroups; - int32_t numOfTables; - int32_t numOfSuperTables; - SVgObj *pHead; - SVgObj *pTail; - struct _acct_obj *pAcct; -} SDbObj; - -typedef struct _user_obj { - char user[TSDB_USER_LEN + 1]; - char pass[TSDB_KEY_LEN + 1]; - char acct[TSDB_USER_LEN + 1]; - int64_t createdTime; - int8_t superAuth; - int8_t writeAuth; - int8_t reserved[13]; - int8_t updateEnd[1]; - int32_t refCount; - struct _acct_obj * pAcct; - SQqueryList * pQList; // query list - SStreamList * pSList; // stream list -} SUserObj; - -typedef struct { - int32_t numOfUsers; - int32_t numOfDbs; - int32_t numOfTimeSeries; - int32_t numOfPointsPerSecond; - int32_t numOfConns; - int32_t numOfQueries; - int32_t numOfStreams; - int64_t totalStorage; // Total storage wrtten from this account - int64_t compStorage; // Compressed storage on disk - int64_t queryTime; - int64_t totalPoints; - int64_t inblound; - int64_t outbound; - int64_t sKey; - int8_t accessState; // Checked by mgmt heartbeat message -} SAcctInfo; - -typedef struct _acct_obj { - char user[TSDB_USER_LEN + 1]; - char pass[TSDB_KEY_LEN + 1]; - SAcctCfg cfg; - int32_t acctId; - int64_t createdTime; - int8_t dirty; - int8_t reserved[14]; - int8_t updateEnd[1]; - int32_t refCount; - SAcctInfo acctInfo; - pthread_mutex_t mutex; -} SAcctObj; - -typedef struct { - int8_t type; - char db[TSDB_DB_NAME_LEN + 1]; - void * pNode; - int16_t numOfColumns; - int32_t rowSize; - int32_t numOfRows; - int32_t numOfReads; - int16_t offset[TSDB_MAX_COLUMNS]; - int16_t bytes[TSDB_MAX_COLUMNS]; - void * signature; - uint16_t payloadLen; - char payload[]; -} SShowObj; - -typedef struct { - uint8_t msgType; - int8_t usePublicIp; - int8_t received; - int8_t successed; - int8_t expected; - int8_t retry; - int8_t maxRetry; - int32_t contLen; - int32_t code; - void *ahandle; - void *thandle; - void *pCont; - SAcctObj *pAcct; - SDnodeObj*pDnode; - SUserObj *pUser; - SDbObj *pDb; - SVgObj *pVgroup; - STableObj *pTable; -} SQueuedMsg; - int32_t mgmtInitSystem(); int32_t mgmtStartSystem(); void mgmtCleanUpSystem(); void mgmtStopSystem(); -extern char version[]; -extern void *tsMgmtTmr; -extern char tsMnodeDir[]; - #ifdef __cplusplus } #endif diff --git a/src/inc/mpeer.h b/src/inc/mpeer.h deleted file mode 100644 index ba1b7d32cf27a22540d3d3cbfd7388c617e24880..0000000000000000000000000000000000000000 --- a/src/inc/mpeer.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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 . - */ - -#ifndef TDENGINE_MPEER_H -#define TDENGINE_MPEER_H - -#ifdef __cplusplus -extern "C" { -#endif - -struct _mnode_obj; - -enum _TAOS_MN_STATUS { - TAOS_MN_STATUS_OFFLINE, - TAOS_MN_STATUS_DROPPING, - TAOS_MN_STATUS_READY -}; - -// general implementation -int32_t mpeerInit(); -void mpeerCleanup(); - -// special implementation -int32_t mpeerInitMnodes(); -void mpeerCleanupMnodes(); -int32_t mpeerAddMnode(int32_t dnodeId); -int32_t mpeerRemoveMnode(int32_t dnodeId); - -void * mpeerGetMnode(int32_t mnodeId); -int32_t mpeerGetMnodesNum(); -void * mpeerGetNextMnode(void *pNode, struct _mnode_obj **pMnode); -void mpeerReleaseMnode(struct _mnode_obj *pMnode); - -bool mpeerIsMaster(); - -void mpeerGetPrivateIpList(SRpcIpSet *ipSet); -void mpeerGetPublicIpList(SRpcIpSet *ipSet); -void mpeerGetMpeerInfos(void *mpeers); - -int32_t mpeerForwardReqToPeer(void *pHead); -void mpeerUpdateSync(); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/inc/query.h b/src/inc/query.h index 1d190c03be15ed01b63ac30b94b0d1f58a3ecdd8..c2cad24f3e89f26039ae75f5ade7d07036f5d73c 100644 --- a/src/inc/query.h +++ b/src/inc/query.h @@ -38,57 +38,57 @@ typedef void* qinfo_t; * create the qinfo object according to QueryTableMsg * @param pVnode * @param pQueryTableMsg - * @param pQInfo + * @param qinfo * @return */ -int32_t qCreateQueryInfo(void* pVnode, SQueryTableMsg* pQueryTableMsg, qinfo_t* pQInfo); +int32_t qCreateQueryInfo(void* pVnode, SQueryTableMsg* pQueryTableMsg, qinfo_t* qinfo); /** * Destroy QInfo object * - * @param pQInfo + * @param qinfo * @return */ -void qDestroyQueryInfo(qinfo_t pQInfo); +void qDestroyQueryInfo(qinfo_t qinfo); /** * the main query execution function, including query on both table and multitables, * which are decided according to the tag or table name query conditions * - * @param pQInfo + * @param qinfo * @return */ -void qTableQuery(qinfo_t pQInfo); +void qTableQuery(qinfo_t qinfo); /** * Retrieve the produced results information, if current query is not paused or completed, * this function will be blocked to wait for the query execution completed or paused, * in which case enough results have been produced already. * - * @param pQInfo + * @param qinfo * @return */ -int32_t qRetrieveQueryResultInfo(qinfo_t pQInfo); +int32_t qRetrieveQueryResultInfo(qinfo_t qinfo); /** * * Retrieve the actual results to fill the response message payload. * Note that this function must be executed after qRetrieveQueryResultInfo is invoked. * - * @param pQInfo qinfo object + * @param qinfo qinfo object * @param pRsp response message * @param contLen payload length * @return */ -int32_t qDumpRetrieveResult(qinfo_t pQInfo, SRetrieveTableRsp** pRsp, int32_t* contLen); +int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp** pRsp, int32_t* contLen); /** * Decide if more results will be produced or not * - * @param pQInfo + * @param qinfo * @return */ -bool qHasMoreResultsToRetrieve(qinfo_t pQInfo); +bool qHasMoreResultsToRetrieve(qinfo_t qinfo); #ifdef __cplusplus } diff --git a/src/util/src/tmodule.c b/src/inc/tacct.h similarity index 67% rename from src/util/src/tmodule.c rename to src/inc/tacct.h index 8faff15cfa28bdf156acf55f7b64d36e623f1c0a..52215fac526f91355efafaf9edb2fb1366dd46fb 100644 --- a/src/util/src/tmodule.c +++ b/src/inc/tacct.h @@ -13,8 +13,25 @@ * along with this program. If not, see . */ -#define _DEFAULT_SOURCE -#include "tmodule.h" +#ifndef TDENGINE_ACCT_H +#define TDENGINE_ACCT_H -SModule tsModule[TSDB_MOD_MAX] = {0}; -uint32_t tsModuleStatus = 0; \ No newline at end of file +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + ACCT_GRANT_USER, + ACCT_GRANT_DB, + ACCT_GRANT_TABLE +} EAcctGrantType; + +int32_t acctInit(); +void acctCleanUp(); +int32_t acctCheck(void *pAcct, EAcctGrantType type); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/inc/tadmin.h b/src/inc/tadmin.h index 4a883965f4ceb28cb37b411d6996e1d933c06782..b7de33576a3e73ea481bb75d01f1005b3bd942f6 100644 --- a/src/inc/tadmin.h +++ b/src/inc/tadmin.h @@ -20,15 +20,10 @@ extern "C" { #endif -#include -#include +struct HttpServer; -void adminInit(); - -struct _http_server_obj_; - -extern void (*adminInitHandleFp)(struct _http_server_obj_* pServer); -extern void (*opInitHandleFp)(struct _http_server_obj_* pServer); +void adminInitHandle(struct HttpServer* pServer); +void opInitHandle(struct HttpServer* pServer); #ifdef __cplusplus } diff --git a/src/inc/taosdef.h b/src/inc/taosdef.h index 2b15e7a4c61560aa3fd985b7631870b5def75bf9..b46986d750c2ddc7f8475b18cca487ce9805ad8e 100644 --- a/src/inc/taosdef.h +++ b/src/inc/taosdef.h @@ -319,11 +319,11 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size); #define TSDB_MAX_NORMAL_TABLES 1000 #define TSDB_MAX_CHILD_TABLES 100000 -enum { +typedef enum { TSDB_PRECISION_MILLI, TSDB_PRECISION_MICRO, TSDB_PRECISION_NANO -}; +} EPrecisionType; typedef enum { TSDB_SUPER_TABLE = 0, // super table @@ -331,7 +331,14 @@ typedef enum { TSDB_NORMAL_TABLE = 2, // ordinary table TSDB_STREAM_TABLE = 3, // table created from stream computing TSDB_TABLE_MAX = 4 -} TSDB_TABLE_TYPE; +} ETableType; + +typedef enum { + TSDB_MOD_MGMT, + TSDB_MOD_HTTP, + TSDB_MOD_MONITOR, + TSDB_MOD_MAX +} EModuleType; #ifdef __cplusplus } diff --git a/src/inc/taosmsg.h b/src/inc/taosmsg.h index 3d0c72e5311522ae97b0c0b703c6530df54afb0e..f292345e68636f1480c4c7c738965787362dbbe4 100644 --- a/src/inc/taosmsg.h +++ b/src/inc/taosmsg.h @@ -584,6 +584,7 @@ typedef struct { char dnodeName[TSDB_NODE_NAME_LEN + 1]; uint32_t privateIp; uint32_t publicIp; + uint32_t moduleStatus; uint32_t lastReboot; // time stamp for last reboot uint16_t numOfTotalVnodes; // from config file uint16_t openVnodes; @@ -608,7 +609,7 @@ typedef struct { } SDMNodeInfos; typedef struct { - SDMNodeInfos mpeers; + SDMNodeInfos mnodes; SDnodeState dnodeState; SVnodeAccess vnodeAccess[]; } SDMStatusRsp; diff --git a/src/inc/tbalance.h b/src/inc/treplica.h similarity index 65% rename from src/inc/tbalance.h rename to src/inc/treplica.h index c73d6a91a93bb03fc188fa72889d4e8a23c6cc85..3abed1c4aa258bca9e538b561d3da5599ca3e48e 100644 --- a/src/inc/tbalance.h +++ b/src/inc/treplica.h @@ -13,27 +13,23 @@ * along with this program. If not, see . */ -#ifndef TDENGINE_BALANCE_H -#define TDENGINE_BALANCE_H +#ifndef TDENGINE_REPLICA_H +#define TDENGINE_REPLICA_H #ifdef __cplusplus extern "C" { #endif -#include -#include -#include +struct SVgObj; +struct SDnodeObj; -struct _db_obj; -struct _vg_obj; -struct _dnode_obj; - -int32_t balanceInit(); -void balanceCleanUp(); -void balanceNotify(); -void balanceReset(); -int32_t balanceAllocVnodes(struct _vg_obj *pVgroup); -int32_t balanceDropDnode(struct _dnode_obj *pDnode); +int32_t replicaInit(); +void replicaCleanUp(); +void replicaNotify(); +void replicaReset(); +int32_t replicaAllocVnodes(struct SVgObj *pVgroup); +int32_t replicaForwardReqToPeer(void *pHead); +int32_t replicaDropDnode(struct SDnodeObj *pDnode); #ifdef __cplusplus } diff --git a/src/tsdb/inc/tsdb.h b/src/inc/tsdb.h similarity index 78% rename from src/tsdb/inc/tsdb.h rename to src/inc/tsdb.h index 72cb16ae3c034f42fdbdc1d85aa4c7a5c94aef9f..235988e6c949266b48edeaf9b1fc6eea2eabe3f3 100644 --- a/src/tsdb/inc/tsdb.h +++ b/src/inc/tsdb.h @@ -20,10 +20,10 @@ #include #include "dataformat.h" +#include "name.h" #include "taosdef.h" #include "taosmsg.h" #include "tarray.h" -#include "name.h" #ifdef __cplusplus extern "C" { @@ -62,14 +62,11 @@ void tsdbFreeCfg(STsdbCfg *pCfg); // --------- TSDB REPOSITORY DEFINITION typedef void tsdb_repo_t; // use void to hide implementation details from outside -int tsdbCreateRepo(char *rootDir, STsdbCfg *pCfg, void *limiter); -int32_t tsdbDropRepo(tsdb_repo_t *repo); -tsdb_repo_t * tsdbOpenRepo(char *tsdbDir, STsdbAppH *pAppH); -int32_t tsdbCloseRepo(tsdb_repo_t *repo); -int32_t tsdbConfigRepo(tsdb_repo_t *repo, STsdbCfg *pCfg); -int32_t tsdbTriggerCommit(tsdb_repo_t *repo); -int32_t tsdbLockRepo(tsdb_repo_t *repo); -int32_t tsdbUnLockRepo(tsdb_repo_t *repo); +int tsdbCreateRepo(char *rootDir, STsdbCfg *pCfg, void *limiter); +int32_t tsdbDropRepo(tsdb_repo_t *repo); +tsdb_repo_t *tsdbOpenRepo(char *tsdbDir, STsdbAppH *pAppH); +int32_t tsdbCloseRepo(tsdb_repo_t *repo); +int32_t tsdbConfigRepo(tsdb_repo_t *repo, STsdbCfg *pCfg); // --------- TSDB TABLE DEFINITION typedef struct { @@ -79,7 +76,7 @@ typedef struct { // --------- TSDB TABLE configuration typedef struct { - TSDB_TABLE_TYPE type; + ETableType type; STableId tableId; int32_t sversion; int64_t superUid; @@ -88,7 +85,7 @@ typedef struct { SDataRow tagValues; } STableCfg; -int tsdbInitTableCfg(STableCfg *config, TSDB_TABLE_TYPE type, int64_t uid, int32_t tid); +int tsdbInitTableCfg(STableCfg *config, ETableType type, int64_t uid, int32_t tid); int tsdbTableSetSuperUid(STableCfg *config, int64_t uid); int tsdbTableSetSchema(STableCfg *config, STSchema *pSchema, bool dup); int tsdbTableSetTagSchema(STableCfg *config, STSchema *pSchema, bool dup); @@ -101,27 +98,6 @@ int tsdbCreateTable(tsdb_repo_t *repo, STableCfg *pCfg); int tsdbDropTable(tsdb_repo_t *pRepo, STableId tableId); int tsdbAlterTable(tsdb_repo_t *repo, STableCfg *pCfg); -typedef struct { - int32_t totalLen; - int32_t len; - SDataRow row; -} SSubmitBlkIter; - -int tsdbInitSubmitBlkIter(SSubmitBlk *pBlock, SSubmitBlkIter *pIter); -SDataRow tsdbGetSubmitBlkNext(SSubmitBlkIter *pIter); - -#define TSDB_SUBMIT_MSG_HEAD_SIZE sizeof(SSubmitMsg) - -// SSubmitMsg Iterator -typedef struct { - int32_t totalLen; - int32_t len; - SSubmitBlk *pBlock; -} SSubmitMsgIter; - -int tsdbInitSubmitMsgIter(SSubmitMsg *pMsg, SSubmitMsgIter *pIter); -SSubmitBlk *tsdbGetSubmitMsgNext(SSubmitMsgIter *pIter); - // the TSDB repository info typedef struct STsdbRepoInfo { STsdbCfg tsdbCfg; @@ -139,35 +115,7 @@ typedef struct { int64_t tableTotalDataSize; // In bytes int64_t tableTotalDiskSize; // In bytes } STableInfo; -STableInfo * tsdbGetTableInfo(tsdb_repo_t *pRepo, STableId tid); - -// -- For table manipulation - -/** - * Create/Alter a table in a TSDB repository handle - * @param repo the TSDB repository handle - * @param pCfg the table configurations, the upper layer should free the pointer - * - * @return 0 for success, -1 for failure and the error number is set - */ - -/** - * Drop a table in a repository and free all the resources it takes - * @param pRepo the TSDB repository handle - * @param tid the ID of the table to drop - * @param error the error number to set when failure occurs - * - * @return 0 for success, -1 for failure and the error number is set - */ - -/** - * Get the information of a table in the repository - * @param pRepo the TSDB repository handle - * @param tid the ID of the table to drop - * @param error the error number to set when failure occurs - * - * @return a table information handle for success, NULL for failure and the error number is set - */ +STableInfo *tsdbGetTableInfo(tsdb_repo_t *pRepo, STableId tid); // -- FOR INSERT DATA /** @@ -181,13 +129,18 @@ int32_t tsdbInsertData(tsdb_repo_t *pRepo, SSubmitMsg *pMsg); // -- FOR QUERY TIME SERIES DATA -typedef void* tsdb_query_handle_t; // Use void to hide implementation details +typedef void *tsdb_query_handle_t; // Use void to hide implementation details + +typedef struct STableGroupList { // qualified table object list in group + SArray *pGroupList; + int32_t numOfTables; +} STableGroupList; // query condition to build vnode iterator typedef struct STsdbQueryCond { - STimeWindow twindow; - int32_t order; // desc/asc order to iterate the data block - SColumnInfoData* colList; + STimeWindow twindow; + int32_t order; // desc/asc order to iterate the data block + SColumnInfoData *colList; } STsdbQueryCond; typedef struct SBlockInfo { @@ -199,12 +152,6 @@ typedef struct SBlockInfo { STableId tableId; } SBlockInfo; -// TODO: move this data struct out of the module -//typedef struct SData { -// int32_t num; -// char * data; -//} SData; - typedef struct SDataBlockInfo { STimeWindow window; int32_t rows; @@ -286,7 +233,7 @@ SArray *tsdbRetrieveDataBlock(tsdb_query_handle_t *pQueryHandle, SArray *pIdList * @param order ascending order or descending order * @return */ -int32_t tsdbResetQuery(tsdb_query_handle_t *pQueryHandle, STimeWindow* window, tsdbpos_t position, int16_t order); +int32_t tsdbResetQuery(tsdb_query_handle_t *pQueryHandle, STimeWindow *window, tsdbpos_t position, int16_t order); /** * return the access position of current query handle diff --git a/src/util/inc/tmodule.h b/src/mnode/inc/mgmtAcct.h similarity index 54% rename from src/util/inc/tmodule.h rename to src/mnode/inc/mgmtAcct.h index f5ad6a6b6014df142c69a4b6357a2b518ad77dc6..67c98d1eb2c187aa6ee6837d813dc237fdf1e033 100644 --- a/src/util/inc/tmodule.h +++ b/src/mnode/inc/mgmtAcct.h @@ -13,42 +13,25 @@ * along with this program. If not, see . */ -#ifndef TDENGINE_TMODULE_H -#define TDENGINE_TMODULE_H +#ifndef TDENGINE_MGMT_ACCT_H +#define TDENGINE_MGMT_ACCT_H #ifdef __cplusplus extern "C" { #endif -#include -#include -#include +#include "tacct.h" -enum _module { - TSDB_MOD_MGMT, - TSDB_MOD_HTTP, - TSDB_MOD_MONITOR, - TSDB_MOD_MAX -}; +int32_t mgmtInitAccts(); +void mgmtCleanUpAccts(); +void *mgmtGetAcct(char *acctName); +void mgmtIncAcctRef(SAcctObj *pAcct); +void mgmtDecAcctRef(SAcctObj *pAcct); -#define tsetModuleStatus(mod) \ - { tsModuleStatus |= (1 << mod); } -#define tclearModuleStatus(mod) \ - { tsModuleStatus &= ~(1 << mod); } - -typedef struct { - char *name; - int (*initFp)(); - void (*cleanUpFp)(); - int (*startFp)(); - void (*stopFp)(); - int num; - int curNum; - int equalVnodeNum; -} SModule; - -extern uint32_t tsModuleStatus; -extern SModule tsModule[]; +void mgmtAddDbToAcct(SAcctObj *pAcct, SDbObj *pDb); +void mgmtDropDbFromAcct(SAcctObj *pAcct, SDbObj *pDb); +void mgmtAddUserToAcct(SAcctObj *pAcct, SUserObj *pUser); +void mgmtDropUserFromAcct(SAcctObj *pAcct, SUserObj *pUser); #ifdef __cplusplus } diff --git a/src/mnode/inc/mgmtDb.h b/src/mnode/inc/mgmtDb.h index 22c92bff6dd68ebd61e3621cc77deab5158d653d..920217b9b8e0cc2d96acfb9fc26d6712cee1f5f1 100644 --- a/src/mnode/inc/mgmtDb.h +++ b/src/mnode/inc/mgmtDb.h @@ -20,7 +20,7 @@ extern "C" { #endif -#include "mnode.h" +#include "mgmtDef.h" enum _TSDB_DB_STATUS { TSDB_DB_STATUS_READY, @@ -33,7 +33,7 @@ void mgmtCleanUpDbs(); SDbObj *mgmtGetDb(char *db); SDbObj *mgmtGetDbByTableId(char *db); void mgmtIncDbRef(SDbObj *pDb); -void mgmtReleaseDb(SDbObj *pDb); +void mgmtDecDbRef(SDbObj *pDb); bool mgmtCheckIsMonitorDB(char *db, char *monitordb); void mgmtDropAllDbs(SAcctObj *pAcct); diff --git a/src/mnode/inc/mgmtDef.h b/src/mnode/inc/mgmtDef.h new file mode 100644 index 0000000000000000000000000000000000000000..a31500750e4a89434a48035c83c2600fead34c22 --- /dev/null +++ b/src/mnode/inc/mgmtDef.h @@ -0,0 +1,246 @@ +/* + * 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 . + */ + +#ifndef TDENGINE_MGMT_DEF_H +#define TDENGINE_MGMT_DEF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "taosdef.h" +#include "taosmsg.h" + +struct SVgObj; +struct SDbObj; +struct SAcctObj; +struct SUserObj; +struct SMnodeObj; + +typedef struct SDnodeObj { + int32_t dnodeId; + uint32_t privateIp; + uint32_t publicIp; + uint16_t mnodeShellPort; + uint16_t mnodeDnodePort; + uint16_t dnodeShellPort; + uint16_t dnodeMnodePort; + uint16_t syncPort; + int64_t createdTime; + uint32_t lastAccess; + int32_t openVnodes; + int32_t totalVnodes; // from dnode status msg, config information + int32_t customScore; // config by user + uint16_t numOfCores; // from dnode status msg + int8_t alternativeRole; // from dnode status msg, 0-any, 1-mgmt, 2-dnode + int8_t status; // set in balance function + int8_t isMgmt; + char dnodeName[TSDB_NODE_NAME_LEN + 1]; + int8_t reserved[15]; + int8_t updateEnd[1]; + int32_t refCount; + SVnodeLoad vload[TSDB_MAX_VNODES]; + uint32_t moduleStatus; + uint32_t lastReboot; // time stamp for last reboot + float score; // calc in balance function + float diskAvailable; // from dnode status msg + int16_t diskAvgUsage; // calc from sys.disk + int16_t cpuAvgUsage; // calc from sys.cpu + int16_t memoryAvgUsage; // calc from sys.mem + int16_t bandwidthUsage; // calc from sys.band +} SDnodeObj; + +typedef struct SMnodeObj { + int32_t mnodeId; + int64_t createdTime; + int8_t reserved[14]; + int8_t updateEnd[1]; + int32_t refCount; + int8_t role; + SDnodeObj *pDnode; +} SMnodeObj; + + +typedef struct { + int32_t dnodeId; + uint32_t privateIp; + uint32_t publicIp; +} SVnodeGid; + +typedef struct { + char tableId[TSDB_TABLE_ID_LEN + 1]; + int8_t type; +} STableObj; + +typedef struct SSuperTableObj { + STableObj info; + uint64_t uid; + int64_t createdTime; + int32_t sversion; + int32_t numOfColumns; + int32_t numOfTags; + int8_t reserved[15]; + int8_t updateEnd[1]; + int32_t refCount; + int32_t numOfTables; + int16_t nextColId; + SSchema * schema; + int32_t vgLen; + int32_t * vgList; +} SSuperTableObj; + +typedef struct { + STableObj info; + uint64_t uid; + int64_t createdTime; + int32_t sversion; //used by normal table + int32_t numOfColumns; //used by normal table + int32_t sid; + int32_t vgId; + char superTableId[TSDB_TABLE_ID_LEN + 1]; + int32_t sqlLen; + int8_t reserved[1]; + int8_t updateEnd[1]; + int16_t nextColId; //used by normal table + int32_t refCount; + char* sql; //used by normal table + SSchema* schema; //used by normal table + SSuperTableObj *superTable; +} SChildTableObj; + +typedef struct SVgObj { + uint32_t vgId; + char dbName[TSDB_DB_NAME_LEN + 1]; + int64_t createdTime; + SVnodeGid vnodeGid[TSDB_VNODES_SUPPORT]; + int32_t numOfVnodes; + int32_t lbDnodeId; + int32_t lbTime; + int8_t status; + int8_t inUse; + int8_t reserved[13]; + int8_t updateEnd[1]; + int32_t refCount; + struct SVgObj *prev, *next; + struct SDbObj *pDb; + int32_t numOfTables; + void * idPool; + SChildTableObj ** tableList; +} SVgObj; + +typedef struct SDbObj { + char name[TSDB_DB_NAME_LEN + 1]; + int8_t status; + int64_t createdTime; + SDbCfg cfg; + int8_t reserved[15]; + int8_t updateEnd[1]; + int32_t refCount; + int32_t numOfVgroups; + int32_t numOfTables; + int32_t numOfSuperTables; + SVgObj *pHead; + SVgObj *pTail; + struct SAcctObj *pAcct; +} SDbObj; + +typedef struct SUserObj { + char user[TSDB_USER_LEN + 1]; + char pass[TSDB_KEY_LEN + 1]; + char acct[TSDB_USER_LEN + 1]; + int64_t createdTime; + int8_t superAuth; + int8_t writeAuth; + int8_t reserved[13]; + int8_t updateEnd[1]; + int32_t refCount; + struct SAcctObj * pAcct; + SQqueryList * pQList; // query list + SStreamList * pSList; // stream list +} SUserObj; + +typedef struct { + int32_t numOfUsers; + int32_t numOfDbs; + int32_t numOfTimeSeries; + int32_t numOfPointsPerSecond; + int32_t numOfConns; + int32_t numOfQueries; + int32_t numOfStreams; + int64_t totalStorage; // Total storage wrtten from this account + int64_t compStorage; // Compressed storage on disk + int64_t queryTime; + int64_t totalPoints; + int64_t inblound; + int64_t outbound; + int64_t sKey; + int8_t accessState; // Checked by mgmt heartbeat message +} SAcctInfo; + +typedef struct SAcctObj { + char user[TSDB_USER_LEN + 1]; + char pass[TSDB_KEY_LEN + 1]; + SAcctCfg cfg; + int32_t acctId; + int64_t createdTime; + int8_t status; + int8_t reserved[14]; + int8_t updateEnd[1]; + int32_t refCount; + SAcctInfo acctInfo; + pthread_mutex_t mutex; +} SAcctObj; + +typedef struct { + int8_t type; + char db[TSDB_DB_NAME_LEN + 1]; + void * pNode; + int16_t numOfColumns; + int32_t rowSize; + int32_t numOfRows; + int32_t numOfReads; + int16_t offset[TSDB_MAX_COLUMNS]; + int16_t bytes[TSDB_MAX_COLUMNS]; + void * signature; + uint16_t payloadLen; + char payload[]; +} SShowObj; + +typedef struct { + uint8_t msgType; + int8_t usePublicIp; + int8_t received; + int8_t successed; + int8_t expected; + int8_t retry; + int8_t maxRetry; + int32_t contLen; + int32_t code; + void *ahandle; + void *thandle; + void *pCont; + SAcctObj *pAcct; + SDnodeObj*pDnode; + SUserObj *pUser; + SDbObj *pDb; + SVgObj *pVgroup; + STableObj *pTable; +} SQueuedMsg; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/inc/tcluster.h b/src/mnode/inc/mgmtDnode.h similarity index 54% rename from src/inc/tcluster.h rename to src/mnode/inc/mgmtDnode.h index a56285fe1c29f9b18c175ed360a448351017f097..48111d3110c7fc6b2f3e54c062329bdf9cfd70c2 100644 --- a/src/inc/tcluster.h +++ b/src/mnode/inc/mgmtDnode.h @@ -20,34 +20,26 @@ extern "C" { #endif -#include -#include -#include - -struct _dnode_obj; - -enum _TAOS_DN_STATUS { +typedef enum { TAOS_DN_STATUS_OFFLINE, TAOS_DN_STATUS_DROPPING, TAOS_DN_STATUS_BALANCING, TAOS_DN_STATUS_READY -}; - -int32_t clusterInit(); -void clusterCleanUp(); -char* clusterGetDnodeStatusStr(int32_t dnodeStatus); -bool clusterCheckModuleInDnode(struct _dnode_obj *pDnode, int moduleType); -void clusterMonitorDnodeModule(); - -int32_t clusterInitDnodes(); -void clusterCleanupDnodes(); -int32_t clusterGetDnodesNum(); -void * clusterGetNextDnode(void *pNode, struct _dnode_obj **pDnode); -void clusterReleaseDnode(struct _dnode_obj *pDnode); -void * clusterGetDnode(int32_t dnodeId); -void * clusterGetDnodeByIp(uint32_t ip); -void clusterUpdateDnode(struct _dnode_obj *pDnode); -int32_t clusterDropDnode(struct _dnode_obj *pDnode); +} EDnodeStatus; + +int32_t mgmtInitDnodes(); +void mgmtCleanupDnodes(); + +char* mgmtGetDnodeStatusStr(int32_t dnodeStatus); +void mgmtMonitorDnodeModule(); + +int32_t mgmtGetDnodesNum(); +void * mgmtGetNextDnode(void *pNode, SDnodeObj **pDnode); +void mgmtReleaseDnode(SDnodeObj *pDnode); +void * mgmtGetDnode(int32_t dnodeId); +void * mgmtGetDnodeByIp(uint32_t ip); +void mgmtUpdateDnode(SDnodeObj *pDnode); +int32_t mgmtDropDnode(SDnodeObj *pDnode); #ifdef __cplusplus } diff --git a/src/mnode/inc/mgmtLog.h b/src/mnode/inc/mgmtLog.h new file mode 100644 index 0000000000000000000000000000000000000000..401b8ac32cdfa4c99c214f9ecb4903d003586931 --- /dev/null +++ b/src/mnode/inc/mgmtLog.h @@ -0,0 +1,68 @@ +/* + * 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 . + */ + +#ifndef TDENGINE_MGMT_LOG_H +#define TDENGINE_MGMT_LOG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "tlog.h" + +// mnode log function +#define mError(...) \ + if (mdebugFlag & DEBUG_ERROR) { \ + tprintf("ERROR MND ", 255, __VA_ARGS__); \ + } +#define mWarn(...) \ + if (mdebugFlag & DEBUG_WARN) { \ + tprintf("WARN MND ", mdebugFlag, __VA_ARGS__); \ + } +#define mTrace(...) \ + if (mdebugFlag & DEBUG_TRACE) { \ + tprintf("MND ", mdebugFlag, __VA_ARGS__); \ + } +#define mPrint(...) \ + { tprintf("MND ", 255, __VA_ARGS__); } + +#define mLError(...) taosLogError(__VA_ARGS__) mError(__VA_ARGS__) +#define mLWarn(...) taosLogWarn(__VA_ARGS__) mWarn(__VA_ARGS__) +#define mLPrint(...) taosLogPrint(__VA_ARGS__) mPrint(__VA_ARGS__) + +#define sdbError(...) \ + if (sdbDebugFlag & DEBUG_ERROR) { \ + tprintf("ERROR MND-SDB ", 255, __VA_ARGS__); \ + } +#define sdbWarn(...) \ + if (sdbDebugFlag & DEBUG_WARN) { \ + tprintf("WARN MND-SDB ", sdbDebugFlag, __VA_ARGS__); \ + } +#define sdbTrace(...) \ + if (sdbDebugFlag & DEBUG_TRACE) { \ + tprintf("MND-SDB ", sdbDebugFlag, __VA_ARGS__); \ + } +#define sdbPrint(...) \ + { tprintf("MND-SDB ", 255, __VA_ARGS__); } + +#define sdbLError(...) taosLogError(__VA_ARGS__) sdbError(__VA_ARGS__) +#define sdbLWarn(...) taosLogWarn(__VA_ARGS__) sdbWarn(__VA_ARGS__) +#define sdbLPrint(...) taosLogPrint(__VA_ARGS__) sdbPrint(__VA_ARGS__) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/inc/taccount.h b/src/mnode/inc/mgmtMnode.h similarity index 51% rename from src/inc/taccount.h rename to src/mnode/inc/mgmtMnode.h index 18a974a574c41ea6f3c86d958bc759906760707e..1faa616cebe12eddb000db0e97f731c33f7463d4 100644 --- a/src/inc/taccount.h +++ b/src/mnode/inc/mgmtMnode.h @@ -13,34 +13,36 @@ * along with this program. If not, see . */ -#ifndef TDENGINE_ACCT_H -#define TDENGINE_ACCT_H +#ifndef TDENGINE_MGMT_MNODE_H +#define TDENGINE_MGMT_MNODE_H #ifdef __cplusplus extern "C" { #endif -struct _acct_obj; -struct _user_obj; -struct _db_obj; - +struct SMnodeObj; + typedef enum { - TSDB_ACCT_USER, - TSDB_ACCT_DB, - TSDB_ACCT_TABLE -} EAcctGrantType; - -int32_t acctInit(); -void acctCleanUp(); -void *acctGetAcct(char *acctName); -void acctIncRef(struct _acct_obj *pAcct); -void acctReleaseAcct(struct _acct_obj *pAcct); -int32_t acctCheck(struct _acct_obj *pAcct, EAcctGrantType type); - -void acctAddDb(struct _acct_obj *pAcct, struct _db_obj *pDb); -void acctRemoveDb(struct _acct_obj *pAcct, struct _db_obj *pDb); -void acctAddUser(struct _acct_obj *pAcct, struct _user_obj *pUser); -void acctRemoveUser(struct _acct_obj *pAcct, struct _user_obj *pUser); + TAOS_MN_STATUS_OFFLINE, + TAOS_MN_STATUS_DROPPING, + TAOS_MN_STATUS_READY +} EMnodeStatus; + +int32_t mgmtInitMnodes(); +void mgmtCleanupMnodes(); + +int32_t mgmtAddMnode(int32_t dnodeId); +int32_t mgmtDropMnode(int32_t dnodeId); + +void * mgmtGetMnode(int32_t mnodeId); +int32_t mgmtGetMnodesNum(); +void * mgmtGetNextMnode(void *pNode, struct SMnodeObj **pMnode); +void mgmtReleaseMnode(struct SMnodeObj *pMnode); + +bool mgmtIsMaster(); + +void mgmtGetMnodeIpList(SRpcIpSet *ipSet, bool usePublicIp); +void mgmtGetMnodeList(void *mpeers); #ifdef __cplusplus } diff --git a/src/mnode/inc/mgmtProfile.h b/src/mnode/inc/mgmtProfile.h index b05877f32cea02d8b0e7084903bd835a7b958659..07ed3f0f13b66595ca2bf7f7d48d652e051d150d 100644 --- a/src/mnode/inc/mgmtProfile.h +++ b/src/mnode/inc/mgmtProfile.h @@ -19,7 +19,7 @@ #ifdef __cplusplus extern "C" { #endif -#include "mnode.h" +#include "mgmtDef.h" int32_t mgmtInitProfile(); void mgmtCleanUpProfile(); diff --git a/src/mnode/inc/mgmtShell.h b/src/mnode/inc/mgmtShell.h index 171c93a390c1e84a002d62ddea7483e9ccc5eb36..3941a0a87db5f8bb9f54ed981e1193d6e7a72206 100644 --- a/src/mnode/inc/mgmtShell.h +++ b/src/mnode/inc/mgmtShell.h @@ -19,7 +19,7 @@ #ifdef __cplusplus extern "C" { #endif -#include "mnode.h" +#include "mgmtDef.h" int32_t mgmtInitShell(); void mgmtCleanUpShell(); diff --git a/src/mnode/inc/mgmtTable.h b/src/mnode/inc/mgmtTable.h index 4d3e0f6b4356b633fb2ef8547a669ea872ccbd87..03d31d8e4bdf0ddf30b4c00140a32dbccbed2b91 100644 --- a/src/mnode/inc/mgmtTable.h +++ b/src/mnode/inc/mgmtTable.h @@ -20,10 +20,7 @@ extern "C" { #endif -#include -#include -#include -#include "mnode.h" +#include "mgmtDef.h" int32_t mgmtInitTables(); void mgmtCleanUpTables(); diff --git a/src/mnode/inc/mgmtUser.h b/src/mnode/inc/mgmtUser.h index 6997081c7c1f269344fb88bd379532bf20aeb4fe..b6a71f6efde589611b0d5ee4a6106d35861e2f4e 100644 --- a/src/mnode/inc/mgmtUser.h +++ b/src/mnode/inc/mgmtUser.h @@ -19,7 +19,7 @@ #ifdef __cplusplus extern "C" { #endif -#include "mnode.h" +#include "mgmtDef.h" int32_t mgmtInitUsers(); void mgmtCleanUpUsers(); diff --git a/src/mnode/inc/mgmtVgroup.h b/src/mnode/inc/mgmtVgroup.h index 072c616f3de5c7b6f99b734e2c30bb2d6adaa08b..3da002026ba918e10ff8fa2e47eb469d21c959b1 100644 --- a/src/mnode/inc/mgmtVgroup.h +++ b/src/mnode/inc/mgmtVgroup.h @@ -20,9 +20,7 @@ extern "C" { #endif -#include -#include -#include "mnode.h" +#include "mgmtDef.h" enum _TSDB_VG_STATUS { TSDB_VG_STATUS_READY, diff --git a/src/mnode/src/mgmtAcct.c b/src/mnode/src/mgmtAcct.c index a22313c52e12c19109ed2ae9a557a56a423d234c..3a52715274059f0b386810bcd8eb36a7f679b636 100644 --- a/src/mnode/src/mgmtAcct.c +++ b/src/mnode/src/mgmtAcct.c @@ -16,49 +16,181 @@ #define _DEFAULT_SOURCE #include "os.h" #include "taoserror.h" -#include "mnode.h" -#include "taccount.h" +#include "ttime.h" +#include "tutil.h" +#include "dnode.h" +#include "mgmtDef.h" +#include "mgmtLog.h" +#include "mgmtAcct.h" #include "mgmtDb.h" +#include "mgmtSdb.h" #include "mgmtUser.h" -#ifndef _ACCOUNT +void * tsAcctSdb = NULL; +int32_t tsAcctUpdateSize; +static void mgmtCreateRootAcct(); -static SAcctObj tsAcctObj = {0}; +static int32_t mgmtActionAcctDestroy(SSdbOperDesc *pOper) { + SAcctObj *pAcct = pOper->pObj; + pthread_mutex_destroy(&pAcct->mutex); + tfree(pOper->pObj); + return TSDB_CODE_SUCCESS; +} -int32_t acctInit() { - tsAcctObj.acctId = 0; - strcpy(tsAcctObj.user, "root"); +static int32_t mgmtAcctActionInsert(SSdbOperDesc *pOper) { + SAcctObj *pAcct = pOper->pObj; + memset(&pAcct->acctInfo, 0, sizeof(SAcctInfo)); + pthread_mutex_init(&pAcct->mutex, NULL); return TSDB_CODE_SUCCESS; } -void acctCleanUp() {} -void *acctGetAcct(char *acctName) { return &tsAcctObj; } -void acctIncRef(struct _acct_obj *pAcct) {} -void acctReleaseAcct(SAcctObj *pAcct) {} -int32_t acctCheck(SAcctObj *pAcct, EAcctGrantType type) { return TSDB_CODE_SUCCESS; } +static int32_t mgmtActionAcctDelete(SSdbOperDesc *pOper) { + SAcctObj *pAcct = pOper->pObj; + mgmtDropAllUsers(pAcct); + mgmtDropAllDbs(pAcct); + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtActionAcctUpdate(SSdbOperDesc *pOper) { + SAcctObj *pAcct = pOper->pObj; + SAcctObj *pSaved = mgmtGetAcct(pAcct->user); + if (pAcct != pSaved) { + memcpy(pSaved, pAcct, tsAcctUpdateSize); + free(pAcct); + } + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtActionActionEncode(SSdbOperDesc *pOper) { + SAcctObj *pAcct = pOper->pObj; + memcpy(pOper->rowData, pAcct, tsAcctUpdateSize); + pOper->rowSize = tsAcctUpdateSize; + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtActionAcctDecode(SSdbOperDesc *pOper) { + SAcctObj *pAcct = (SAcctObj *) calloc(1, sizeof(SAcctObj)); + if (pAcct == NULL) return TSDB_CODE_SERV_OUT_OF_MEMORY; + + memcpy(pAcct, pOper->rowData, tsAcctUpdateSize); + pOper->pObj = pAcct; + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtActionAcctRestored() { + if (dnodeIsFirstDeploy()) { + mgmtCreateRootAcct(); + } + return TSDB_CODE_SUCCESS; +} + +int32_t mgmtInitAccts() { + SAcctObj tObj; + tsAcctUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj; + + SSdbTableDesc tableDesc = { + .tableId = SDB_TABLE_ACCOUNT, + .tableName = "accounts", + .hashSessions = TSDB_MAX_ACCOUNTS, + .maxRowSize = tsAcctUpdateSize, + .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj, + .keyType = SDB_KEY_STRING, + .insertFp = mgmtAcctActionInsert, + .deleteFp = mgmtActionAcctDelete, + .updateFp = mgmtActionAcctUpdate, + .encodeFp = mgmtActionActionEncode, + .decodeFp = mgmtActionAcctDecode, + .destroyFp = mgmtActionAcctDestroy, + .restoredFp = mgmtActionAcctRestored + }; -#endif + tsAcctSdb = sdbOpenTable(&tableDesc); + if (tsAcctSdb == NULL) { + mError("failed to init acct data"); + return -1; + } -void acctAddDb(SAcctObj *pAcct, SDbObj *pDb) { + mTrace("account table is created"); + return acctInit(); +} + +void mgmtCleanUpAccts() { + sdbCloseTable(tsAcctSdb); + acctCleanUp(); +} + +void *mgmtGetAcct(char *name) { + return sdbGetRow(tsAcctSdb, name); +} + +void mgmtIncAcctRef(SAcctObj *pAcct) { + sdbIncRef(tsAcctSdb, pAcct); +} + +void mgmtDecAcctRef(SAcctObj *pAcct) { + sdbDecRef(tsAcctSdb, pAcct); +} + +void mgmtAddDbToAcct(SAcctObj *pAcct, SDbObj *pDb) { atomic_add_fetch_32(&pAcct->acctInfo.numOfDbs, 1); pDb->pAcct = pAcct; - acctIncRef(pAcct); + mgmtIncAcctRef(pAcct); } -void acctRemoveDb(SAcctObj *pAcct, SDbObj *pDb) { +void mgmtDropDbFromAcct(SAcctObj *pAcct, SDbObj *pDb) { atomic_sub_fetch_32(&pAcct->acctInfo.numOfDbs, 1); pDb->pAcct = NULL; - acctReleaseAcct(pAcct); + mgmtDecAcctRef(pAcct); } -void acctAddUser(SAcctObj *pAcct, SUserObj *pUser) { +void mgmtAddUserToAcct(SAcctObj *pAcct, SUserObj *pUser) { atomic_add_fetch_32(&pAcct->acctInfo.numOfUsers, 1); pUser->pAcct = pAcct; - acctIncRef(pAcct); + mgmtIncAcctRef(pAcct); } -void acctRemoveUser(SAcctObj *pAcct, SUserObj *pUser) { +void mgmtDropUserFromAcct(SAcctObj *pAcct, SUserObj *pUser) { atomic_sub_fetch_32(&pAcct->acctInfo.numOfUsers, 1); pUser->pAcct = NULL; - acctReleaseAcct(pAcct); -} \ No newline at end of file + mgmtDecAcctRef(pAcct); +} + +static void mgmtCreateRootAcct() { + int32_t numOfAccts = sdbGetNumOfRows(tsAcctSdb); + if (numOfAccts != 0) return; + + SAcctObj *pAcct = malloc(sizeof(SAcctObj)); + memset(pAcct, 0, sizeof(SAcctObj)); + strcpy(pAcct->user, "root"); + taosEncryptPass((uint8_t*)"taosdata", strlen("taosdata"), pAcct->pass); + pAcct->cfg = (SAcctCfg){ + .maxUsers = 10, + .maxDbs = 64, + .maxTimeSeries = INT32_MAX, + .maxConnections = 1024, + .maxStreams = 1000, + .maxPointsPerSecond = 10000000, + .maxStorage = INT64_MAX, + .maxQueryTime = INT64_MAX, + .maxInbound = 0, + .maxOutbound = 0, + .accessState = TSDB_VN_ALL_ACCCESS + }; + pAcct->acctId = sdbGetId(tsAcctSdb); + pAcct->createdTime = taosGetTimestampMs(); + + SSdbOperDesc oper = { + .type = SDB_OPER_GLOBAL, + .table = tsAcctSdb, + .pObj = pAcct, + }; + sdbInsertRow(&oper); +} + +#ifndef _ACCT + +int32_t acctInit() { return TSDB_CODE_SUCCESS; } +void acctCleanUp() {} +int32_t acctCheck(void *pAcct, EAcctGrantType type) { return TSDB_CODE_SUCCESS; } + +#endif \ No newline at end of file diff --git a/src/mnode/src/mgmtDClient.c b/src/mnode/src/mgmtDClient.c index b402a850057b0baa1770020859b557ddf666077f..177934ccfdf6b27f3d6ad9fcccf3eed1dce93c59 100644 --- a/src/mnode/src/mgmtDClient.c +++ b/src/mnode/src/mgmtDClient.c @@ -19,12 +19,14 @@ #include "tsched.h" #include "tsystem.h" #include "tutil.h" +#include "tglobalcfg.h" #include "dnode.h" -#include "mnode.h" -#include "tbalance.h" -#include "mgmtDb.h" -#include "tcluster.h" #include "tgrant.h" +#include "mgmtDef.h" +#include "mgmtLog.h" +#include "mgmtMnode.h" +#include "mgmtDb.h" +#include "mgmtDnode.h" #include "mgmtProfile.h" #include "mgmtShell.h" #include "mgmtTable.h" diff --git a/src/mnode/src/mgmtDServer.c b/src/mnode/src/mgmtDServer.c index 0ac93d429cae4768b27894737990a7fef88de4ba..4d8163deced31b5ab9260b43d3ffd07c025fe083 100644 --- a/src/mnode/src/mgmtDServer.c +++ b/src/mnode/src/mgmtDServer.c @@ -20,12 +20,14 @@ #include "tsched.h" #include "tsystem.h" #include "tutil.h" +#include "tgrant.h" +#include "treplica.h" +#include "tglobalcfg.h" #include "dnode.h" -#include "mnode.h" -#include "tbalance.h" +#include "mgmtDef.h" +#include "mgmtLog.h" #include "mgmtDb.h" #include "mgmtDServer.h" -#include "tgrant.h" #include "mgmtProfile.h" #include "mgmtShell.h" #include "mgmtTable.h" diff --git a/src/mnode/src/mgmtDb.c b/src/mnode/src/mgmtDb.c index c38fe8af3e5c0d1a5a8ef2ea7247d55c3ae4d42b..9bf05ecfc4ac54e8e8ffaecd1fdfae77b1c3ba4c 100644 --- a/src/mnode/src/mgmtDb.c +++ b/src/mnode/src/mgmtDb.c @@ -17,14 +17,16 @@ #include "os.h" #include "taoserror.h" #include "tutil.h" +#include "tgrant.h" +#include "tglobalcfg.h" +#include "ttime.h" #include "name.h" -#include "mnode.h" -#include "taccount.h" -#include "tbalance.h" +#include "mgmtDef.h" +#include "mgmtLog.h" +#include "mgmtAcct.h" #include "mgmtDb.h" -#include "tcluster.h" -#include "tgrant.h" -#include "mpeer.h" +#include "mgmtDnode.h" +#include "mgmtMnode.h" #include "mgmtShell.h" #include "mgmtProfile.h" #include "mgmtSdb.h" @@ -51,7 +53,7 @@ static int32_t mgmtDbActionDestroy(SSdbOperDesc *pOper) { static int32_t mgmtDbActionInsert(SSdbOperDesc *pOper) { SDbObj *pDb = pOper->pObj; - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); + SAcctObj *pAcct = mgmtGetAcct(pDb->cfg.acct); pDb->pHead = NULL; pDb->pTail = NULL; @@ -60,7 +62,7 @@ static int32_t mgmtDbActionInsert(SSdbOperDesc *pOper) { pDb->numOfSuperTables = 0; if (pAcct != NULL) { - acctAddDb(pAcct, pDb); + mgmtAddDbToAcct(pAcct, pDb); } else { mError("db:%s, acct:%s info not exist in sdb", pDb->name, pDb->cfg.acct); @@ -72,9 +74,9 @@ static int32_t mgmtDbActionInsert(SSdbOperDesc *pOper) { static int32_t mgmtDbActionDelete(SSdbOperDesc *pOper) { SDbObj *pDb = pOper->pObj; - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); + SAcctObj *pAcct = mgmtGetAcct(pDb->cfg.acct); - acctRemoveDb(pAcct, pDb); + mgmtDropDbFromAcct(pAcct, pDb); mgmtDropAllChildTables(pDb); mgmtDropAllSuperTables(pDb); mgmtDropAllVgroups(pDb); @@ -156,7 +158,7 @@ void mgmtIncDbRef(SDbObj *pDb) { return sdbIncRef(tsDbSdb, pDb); } -void mgmtReleaseDb(SDbObj *pDb) { +void mgmtDecDbRef(SDbObj *pDb) { return sdbDecRef(tsDbSdb, pDb); } @@ -288,14 +290,14 @@ static int32_t mgmtCheckDbParams(SCMCreateDbMsg *pCreate) { } static int32_t mgmtCreateDb(SAcctObj *pAcct, SCMCreateDbMsg *pCreate) { - int32_t code = acctCheck(pAcct, TSDB_ACCT_DB); + int32_t code = acctCheck(pAcct, ACCT_GRANT_DB); if (code != 0) { return code; } SDbObj *pDb = mgmtGetDb(pCreate->db); if (pDb != NULL) { - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); return TSDB_CODE_DB_ALREADY_EXIST; } @@ -641,7 +643,7 @@ static int32_t mgmtRetrieveDbs(SShowObj *pShow, char *data, int32_t rows, void * cols++; numOfRows++; - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); } pShow->numOfReads += numOfRows; @@ -888,7 +890,7 @@ void mgmtDropAllDbs(SAcctObj *pAcct) { mgmtSetDbDropping(pDb); numOfDbs++; } - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); } mTrace("acct:%s, all dbs is is set dirty", pAcct->user, numOfDbs); diff --git a/src/mnode/src/mgmtDnode.c b/src/mnode/src/mgmtDnode.c index d13d37586ac18d27fb34daff79c6fe97bd1efa55..3c66ff6c57a61a56c361d1d125cedca152f2e2e0 100644 --- a/src/mnode/src/mgmtDnode.c +++ b/src/mnode/src/mgmtDnode.c @@ -15,93 +15,223 @@ #define _DEFAULT_SOURCE #include "os.h" -#include "tmodule.h" -#include "tbalance.h" -#include "tcluster.h" -#include "mnode.h" -#include "mpeer.h" +#include "tgrant.h" +#include "treplica.h" +#include "tglobalcfg.h" +#include "ttime.h" +#include "tutil.h" +#include "tsocket.h" +#include "dnode.h" +#include "mgmtDef.h" +#include "mgmtLog.h" #include "mgmtDClient.h" -#include "mgmtShell.h" #include "mgmtDServer.h" +#include "mgmtDnode.h" +#include "mgmtMnode.h" +#include "mgmtSdb.h" +#include "mgmtShell.h" #include "mgmtUser.h" #include "mgmtVgroup.h" -static void clusterProcessCfgDnodeMsg(SQueuedMsg *pMsg); -static void clusterProcessCfgDnodeMsgRsp(SRpcMsg *rpcMsg) ; -static void clusterProcessDnodeStatusMsg(SRpcMsg *rpcMsg); -static int32_t clusterGetModuleMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); -static int32_t clusterRetrieveModules(SShowObj *pShow, char *data, int32_t rows, void *pConn); -static int32_t clusterGetConfigMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); -static int32_t clusterRetrieveConfigs(SShowObj *pShow, char *data, int32_t rows, void *pConn); -static int32_t clusterGetVnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); -static int32_t clusterRetrieveVnodes(SShowObj *pShow, char *data, int32_t rows, void *pConn); -static int32_t clusterGetDnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); -static int32_t clusterRetrieveDnodes(SShowObj *pShow, char *data, int32_t rows, void *pConn); - -#ifndef _CLUSTER - -static SDnodeObj tsDnodeObj = {0}; - -int32_t clusterInitDnodes() { - tsDnodeObj.dnodeId = 1; - tsDnodeObj.privateIp = inet_addr(tsPrivateIp); - tsDnodeObj.publicIp = inet_addr(tsPublicIp); - tsDnodeObj.createdTime = taosGetTimestampMs(); - tsDnodeObj.numOfTotalVnodes = tsNumOfTotalVnodes; - tsDnodeObj.status = TAOS_DN_STATUS_OFFLINE; - tsDnodeObj.lastReboot = taosGetTimestampSec(); - sprintf(tsDnodeObj.dnodeName, "%d", tsDnodeObj.dnodeId); - - tsDnodeObj.moduleStatus |= (1 << TSDB_MOD_MGMT); - if (tsEnableHttpModule) { - tsDnodeObj.moduleStatus |= (1 << TSDB_MOD_HTTP); +void *tsDnodeSdb = NULL; +int32_t tsDnodeUpdateSize = 0; +extern void * tsVgroupSdb; + +static int32_t mgmtCreateDnode(uint32_t ip); +static void mgmtProcessCreateDnodeMsg(SQueuedMsg *pMsg); +static void mgmtProcessDropDnodeMsg(SQueuedMsg *pMsg); +static void mgmtProcessCfgDnodeMsg(SQueuedMsg *pMsg); +static void mgmtProcessCfgDnodeMsgRsp(SRpcMsg *rpcMsg) ; +static void mgmtProcessDnodeStatusMsg(SRpcMsg *rpcMsg); +static int32_t mgmtGetModuleMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); +static int32_t mgmtRetrieveModules(SShowObj *pShow, char *data, int32_t rows, void *pConn); +static int32_t mgmtGetConfigMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); +static int32_t mgmtRetrieveConfigs(SShowObj *pShow, char *data, int32_t rows, void *pConn); +static int32_t mgmtGetVnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); +static int32_t mgmtRetrieveVnodes(SShowObj *pShow, char *data, int32_t rows, void *pConn); +static int32_t mgmtGetDnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); +static int32_t mgmtRetrieveDnodes(SShowObj *pShow, char *data, int32_t rows, void *pConn); + +static int32_t mgmtDnodeActionDestroy(SSdbOperDesc *pOper) { + tfree(pOper->pObj); + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtDnodeActionInsert(SSdbOperDesc *pOper) { + SDnodeObj *pDnode = pOper->pObj; + if (pDnode->status != TAOS_DN_STATUS_DROPPING) { + pDnode->status = TAOS_DN_STATUS_OFFLINE; } - if (tsEnableMonitorModule) { - tsDnodeObj.moduleStatus |= (1 << TSDB_MOD_MONITOR); + + pDnode->mnodeShellPort = tsMnodeShellPort; + pDnode->mnodeDnodePort = tsMnodeDnodePort; + pDnode->dnodeShellPort = tsDnodeShellPort; + pDnode->dnodeMnodePort = tsDnodeMnodePort; + pDnode->syncPort = 0; + + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtDnodeActionDelete(SSdbOperDesc *pOper) { + SDnodeObj *pDnode = pOper->pObj; + void * pNode = NULL; + void * pLastNode = NULL; + SVgObj * pVgroup = NULL; + int32_t numOfVgroups = 0; + + while (1) { + pLastNode = pNode; + pNode = sdbFetchRow(tsVgroupSdb, pNode, (void **)&pVgroup); + if (pVgroup == NULL) break; + + if (pVgroup->vnodeGid[0].dnodeId == pDnode->dnodeId) { + SSdbOperDesc oper = { + .type = SDB_OPER_LOCAL, + .table = tsVgroupSdb, + .pObj = pVgroup, + }; + sdbDeleteRow(&oper); + pNode = pLastNode; + numOfVgroups++; + continue; + } } - return 0; + + mTrace("dnode:%d, all vgroups:%d is dropped from sdb", pDnode->dnodeId, numOfVgroups); + return TSDB_CODE_SUCCESS; } -void *clusterGetNextDnode(void *pNode, SDnodeObj **pDnode) { - if (*pDnode == NULL) { - *pDnode = &tsDnodeObj; - } else { - *pDnode = NULL; +static int32_t mgmtDnodeActionUpdate(SSdbOperDesc *pOper) { + SDnodeObj *pDnode = pOper->pObj; + SDnodeObj *pSaved = mgmtGetDnode(pDnode->dnodeId); + if (pDnode != pSaved) { + memcpy(pSaved, pDnode, pOper->rowSize); + free(pDnode); } - return *pDnode; + return TSDB_CODE_SUCCESS; } -void clusterCleanupDnodes() {} -int32_t clusterGetDnodesNum() { return 1; } -void * clusterGetDnode(int32_t dnodeId) { return dnodeId == 1 ? &tsDnodeObj : NULL; } -void * clusterGetDnodeByIp(uint32_t ip) { return &tsDnodeObj; } -void clusterReleaseDnode(struct _dnode_obj *pDnode) {} -void clusterUpdateDnode(struct _dnode_obj *pDnode) {} -void clusterMonitorDnodeModule() {} +static int32_t mgmtDnodeActionEncode(SSdbOperDesc *pOper) { + SDnodeObj *pDnode = pOper->pObj; + memcpy(pOper->rowData, pDnode, tsDnodeUpdateSize); + pOper->rowSize = tsDnodeUpdateSize; + return TSDB_CODE_SUCCESS; +} -#endif +static int32_t mgmtDnodeActionDecode(SSdbOperDesc *pOper) { + SDnodeObj *pDnode = (SDnodeObj *) calloc(1, sizeof(SDnodeObj)); + if (pDnode == NULL) return TSDB_CODE_SERV_OUT_OF_MEMORY; -int32_t clusterInit() { - mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_CONFIG_DNODE, clusterProcessCfgDnodeMsg); - mgmtAddDClientRspHandle(TSDB_MSG_TYPE_MD_CONFIG_DNODE_RSP, clusterProcessCfgDnodeMsgRsp); - mgmtAddDServerMsgHandle(TSDB_MSG_TYPE_DM_STATUS, clusterProcessDnodeStatusMsg); - mgmtAddShellShowMetaHandle(TSDB_MGMT_TABLE_MODULE, clusterGetModuleMeta); - mgmtAddShellShowRetrieveHandle(TSDB_MGMT_TABLE_MODULE, clusterRetrieveModules); - mgmtAddShellShowMetaHandle(TSDB_MGMT_TABLE_CONFIGS, clusterGetConfigMeta); - mgmtAddShellShowRetrieveHandle(TSDB_MGMT_TABLE_CONFIGS, clusterRetrieveConfigs); - mgmtAddShellShowMetaHandle(TSDB_MGMT_TABLE_VNODES, clusterGetVnodeMeta); - mgmtAddShellShowRetrieveHandle(TSDB_MGMT_TABLE_VNODES, clusterRetrieveVnodes); - mgmtAddShellShowMetaHandle(TSDB_MGMT_TABLE_DNODE, clusterGetDnodeMeta); - mgmtAddShellShowRetrieveHandle(TSDB_MGMT_TABLE_DNODE, clusterRetrieveDnodes); + memcpy(pDnode, pOper->rowData, tsDnodeUpdateSize); + pOper->pObj = pDnode; + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtDnodeActionRestored() { + int32_t numOfRows = sdbGetNumOfRows(tsDnodeSdb); + if (numOfRows <= 0 && dnodeIsFirstDeploy()) { + uint32_t ip = inet_addr(tsPrivateIp); + mgmtCreateDnode(ip); + SDnodeObj *pDnode = mgmtGetDnodeByIp(ip); + mgmtAddMnode(pDnode->dnodeId); + mgmtReleaseDnode(pDnode); + } + + return TSDB_CODE_SUCCESS; +} + +int32_t mgmtInitDnodes() { + SDnodeObj tObj; + tsDnodeUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj; + + SSdbTableDesc tableDesc = { + .tableId = SDB_TABLE_DNODE, + .tableName = "dnodes", + .hashSessions = TSDB_MAX_DNODES, + .maxRowSize = tsDnodeUpdateSize, + .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj, + .keyType = SDB_KEY_AUTO, + .insertFp = mgmtDnodeActionInsert, + .deleteFp = mgmtDnodeActionDelete, + .updateFp = mgmtDnodeActionUpdate, + .encodeFp = mgmtDnodeActionEncode, + .decodeFp = mgmtDnodeActionDecode, + .destroyFp = mgmtDnodeActionDestroy, + .restoredFp = mgmtDnodeActionRestored + }; + + tsDnodeSdb = sdbOpenTable(&tableDesc); + if (tsDnodeSdb == NULL) { + mError("failed to init dnodes data"); + return -1; + } + + mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_CREATE_DNODE, mgmtProcessCreateDnodeMsg); + mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_DROP_DNODE, mgmtProcessDropDnodeMsg); + mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_CONFIG_DNODE, mgmtProcessCfgDnodeMsg); + mgmtAddDClientRspHandle(TSDB_MSG_TYPE_MD_CONFIG_DNODE_RSP, mgmtProcessCfgDnodeMsgRsp); + mgmtAddDServerMsgHandle(TSDB_MSG_TYPE_DM_STATUS, mgmtProcessDnodeStatusMsg); + mgmtAddShellShowMetaHandle(TSDB_MGMT_TABLE_MODULE, mgmtGetModuleMeta); + mgmtAddShellShowRetrieveHandle(TSDB_MGMT_TABLE_MODULE, mgmtRetrieveModules); + mgmtAddShellShowMetaHandle(TSDB_MGMT_TABLE_CONFIGS, mgmtGetConfigMeta); + mgmtAddShellShowRetrieveHandle(TSDB_MGMT_TABLE_CONFIGS, mgmtRetrieveConfigs); + mgmtAddShellShowMetaHandle(TSDB_MGMT_TABLE_VNODES, mgmtGetVnodeMeta); + mgmtAddShellShowRetrieveHandle(TSDB_MGMT_TABLE_VNODES, mgmtRetrieveVnodes); + mgmtAddShellShowMetaHandle(TSDB_MGMT_TABLE_DNODE, mgmtGetDnodeMeta); + mgmtAddShellShowRetrieveHandle(TSDB_MGMT_TABLE_DNODE, mgmtRetrieveDnodes); - return clusterInitDnodes(); + mTrace("dnodes table is created"); + return 0; +} + +void mgmtCleanupDnodes() { + sdbCloseTable(tsDnodeSdb); +} + +void *mgmtGetNextDnode(void *pNode, SDnodeObj **pDnode) { + return sdbFetchRow(tsDnodeSdb, pNode, (void **)pDnode); +} + +int32_t mgmtGetDnodesNum() { + return sdbGetNumOfRows(tsDnodeSdb); +} + +void *mgmtGetDnode(int32_t dnodeId) { + return sdbGetRow(tsDnodeSdb, &dnodeId); +} + +void *mgmtGetDnodeByIp(uint32_t ip) { + SDnodeObj *pDnode = NULL; + void * pNode = NULL; + + while (1) { + pNode = sdbFetchRow(tsDnodeSdb, pNode, (void**)&pDnode); + if (pDnode == NULL) break; + if (ip == pDnode->privateIp) { + return pDnode; + } + mgmtReleaseDnode(pDnode); + } + + return NULL; } -void clusterCleanUp() { - clusterCleanupDnodes(); +void mgmtReleaseDnode(SDnodeObj *pDnode) { + sdbDecRef(tsDnodeSdb, pDnode); +} + +void mgmtUpdateDnode(SDnodeObj *pDnode) { + SSdbOperDesc oper = { + .type = SDB_OPER_GLOBAL, + .table = tsDnodeSdb, + .pObj = pDnode, + .rowSize = tsDnodeUpdateSize + }; + + sdbUpdateRow(&oper); } -void clusterProcessCfgDnodeMsg(SQueuedMsg *pMsg) { +void mgmtProcessCfgDnodeMsg(SQueuedMsg *pMsg) { SRpcMsg rpcRsp = {.handle = pMsg->thandle, .pCont = NULL, .contLen = 0, .code = 0, .msgType = 0}; SCMCfgDnodeMsg *pCmCfgDnode = pMsg->pCont; @@ -137,15 +267,16 @@ void clusterProcessCfgDnodeMsg(SQueuedMsg *pMsg) { rpcSendResponse(&rpcRsp); } -static void clusterProcessCfgDnodeMsgRsp(SRpcMsg *rpcMsg) { +static void mgmtProcessCfgDnodeMsgRsp(SRpcMsg *rpcMsg) { mPrint("cfg vnode rsp is received, result:%s", tstrerror(rpcMsg->code)); } -void clusterProcessDnodeStatusMsg(SRpcMsg *rpcMsg) { +void mgmtProcessDnodeStatusMsg(SRpcMsg *rpcMsg) { SDMStatusMsg *pStatus = rpcMsg->pCont; pStatus->dnodeId = htonl(pStatus->dnodeId); pStatus->privateIp = htonl(pStatus->privateIp); pStatus->publicIp = htonl(pStatus->publicIp); + pStatus->moduleStatus = htonl(pStatus->moduleStatus); pStatus->lastReboot = htonl(pStatus->lastReboot); pStatus->numOfCores = htons(pStatus->numOfCores); pStatus->numOfTotalVnodes = htons(pStatus->numOfTotalVnodes); @@ -159,14 +290,14 @@ void clusterProcessDnodeStatusMsg(SRpcMsg *rpcMsg) { SDnodeObj *pDnode = NULL; if (pStatus->dnodeId == 0) { - pDnode = clusterGetDnodeByIp(pStatus->privateIp); + pDnode = mgmtGetDnodeByIp(pStatus->privateIp); if (pDnode == NULL) { mTrace("dnode not created, privateIp:%s", taosIpStr(pStatus->privateIp)); mgmtSendSimpleResp(rpcMsg->handle, TSDB_CODE_DNODE_NOT_EXIST); return; } } else { - pDnode = clusterGetDnode(pStatus->dnodeId); + pDnode = mgmtGetDnode(pStatus->dnodeId); if (pDnode == NULL) { mError("dnode:%d, not exist, privateIp:%s", pStatus->dnodeId, taosIpStr(pStatus->privateIp)); mgmtSendSimpleResp(rpcMsg->handle, TSDB_CODE_DNODE_NOT_EXIST); @@ -180,7 +311,8 @@ void clusterProcessDnodeStatusMsg(SRpcMsg *rpcMsg) { pDnode->numOfCores = pStatus->numOfCores; pDnode->diskAvailable = pStatus->diskAvailable; pDnode->alternativeRole = pStatus->alternativeRole; - pDnode->numOfTotalVnodes = pStatus->numOfTotalVnodes; + pDnode->totalVnodes = pStatus->numOfTotalVnodes; + pDnode->moduleStatus = pStatus->moduleStatus; if (pStatus->dnodeId == 0) { mTrace("dnode:%d, first access, privateIp:%s, name:%s", pDnode->dnodeId, taosIpStr(pDnode->privateIp), pDnode->dnodeName); @@ -208,11 +340,10 @@ void clusterProcessDnodeStatusMsg(SRpcMsg *rpcMsg) { if (pDnode->status == TAOS_DN_STATUS_OFFLINE) { mTrace("dnode:%d, from offline to online", pDnode->dnodeId); pDnode->status = TAOS_DN_STATUS_READY; - balanceNotify(); - clusterMonitorDnodeModule(); + replicaNotify(); } - clusterReleaseDnode(pDnode); + mgmtReleaseDnode(pDnode); int32_t contLen = sizeof(SDMStatusRsp) + TSDB_MAX_VNODES * sizeof(SVnodeAccess); SDMStatusRsp *pRsp = rpcMallocCont(contLen); @@ -221,10 +352,10 @@ void clusterProcessDnodeStatusMsg(SRpcMsg *rpcMsg) { return; } - mpeerGetMpeerInfos(&pRsp->mpeers); + mgmtGetMnodeList(&pRsp->mnodes); pRsp->dnodeState.dnodeId = htonl(pDnode->dnodeId); - pRsp->dnodeState.moduleStatus = htonl(pDnode->moduleStatus); + pRsp->dnodeState.moduleStatus = htonl((int32_t)pDnode->isMgmt); pRsp->dnodeState.createdTime = htonl(pDnode->createdTime / 1000); pRsp->dnodeState.numOfVnodes = 0; @@ -242,7 +373,119 @@ void clusterProcessDnodeStatusMsg(SRpcMsg *rpcMsg) { rpcSendResponse(&rpcRsp); } -static int32_t clusterGetDnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { +static int32_t mgmtCreateDnode(uint32_t ip) { + int32_t grantCode = grantCheck(TSDB_GRANT_DNODE); + if (grantCode != TSDB_CODE_SUCCESS) { + return grantCode; + } + + SDnodeObj *pDnode = mgmtGetDnodeByIp(ip); + if (pDnode != NULL) { + mError("dnode:%d is alredy exist, ip:%s", pDnode->dnodeId, taosIpStr(pDnode->privateIp)); + return TSDB_CODE_DNODE_ALREADY_EXIST; + } + + pDnode = (SDnodeObj *) calloc(1, sizeof(SDnodeObj)); + pDnode->privateIp = ip; + pDnode->publicIp = ip; + pDnode->createdTime = taosGetTimestampMs(); + pDnode->status = TAOS_DN_STATUS_OFFLINE; + pDnode->totalVnodes = TSDB_INVALID_VNODE_NUM; + sprintf(pDnode->dnodeName, "n%d", sdbGetId(tsDnodeSdb) + 1); + + SSdbOperDesc oper = { + .type = SDB_OPER_GLOBAL, + .table = tsDnodeSdb, + .pObj = pDnode, + .rowSize = sizeof(SDnodeObj) + }; + + int32_t code = sdbInsertRow(&oper); + if (code != TSDB_CODE_SUCCESS) { + tfree(pDnode); + code = TSDB_CODE_SDB_ERROR; + } + + mPrint("dnode:%d is created, result:%s", pDnode->dnodeId, tstrerror(code)); + return code; +} + +int32_t mgmtDropDnode(SDnodeObj *pDnode) { + SSdbOperDesc oper = { + .type = SDB_OPER_GLOBAL, + .table = tsDnodeSdb, + .pObj = pDnode + }; + + int32_t code = sdbDeleteRow(&oper); + if (code != TSDB_CODE_SUCCESS) { + code = TSDB_CODE_SDB_ERROR; + } + + mLPrint("dnode:%d is dropped from cluster, result:%s", pDnode->dnodeId, tstrerror(code)); + return code; +} + +static int32_t mgmtDropDnodeByIp(uint32_t ip) { + SDnodeObj *pDnode = mgmtGetDnodeByIp(ip); + if (pDnode == NULL) { + mError("dnode:%s, is not exist", taosIpStr(ip)); + return TSDB_CODE_INVALID_VALUE; + } + + if (pDnode->privateIp == dnodeGetMnodeMasteIp()) { + mError("dnode:%d, can't drop dnode which is master", pDnode->dnodeId); + return TSDB_CODE_NO_REMOVE_MASTER; + } + +#ifndef _VPEER + return mgmtDropDnode(pDnode); +#else + return balanceDropDnode(pDnode); +#endif +} + +static void mgmtProcessCreateDnodeMsg(SQueuedMsg *pMsg) { + SRpcMsg rpcRsp = {.handle = pMsg->thandle, .pCont = NULL, .contLen = 0, .code = 0, .msgType = 0}; + + SCMCreateDnodeMsg *pCreate = pMsg->pCont; + + if (strcmp(pMsg->pUser->pAcct->user, "root") != 0) { + rpcRsp.code = TSDB_CODE_NO_RIGHTS; + } else { + uint32_t ip = inet_addr(pCreate->ip); + rpcRsp.code = mgmtCreateDnode(ip); + if (rpcRsp.code == TSDB_CODE_SUCCESS) { + SDnodeObj *pDnode = mgmtGetDnodeByIp(ip); + mLPrint("dnode:%d, ip:%s is created by %s", pDnode->dnodeId, pCreate->ip, pMsg->pUser->user); + } else { + mError("failed to create dnode:%s, reason:%s", pCreate->ip, tstrerror(rpcRsp.code)); + } + } + rpcSendResponse(&rpcRsp); +} + + +static void mgmtProcessDropDnodeMsg(SQueuedMsg *pMsg) { + SRpcMsg rpcRsp = {.handle = pMsg->thandle, .pCont = NULL, .contLen = 0, .code = 0, .msgType = 0}; + + SCMDropDnodeMsg *pDrop = pMsg->pCont; + if (strcmp(pMsg->pUser->pAcct->user, "root") != 0) { + rpcRsp.code = TSDB_CODE_NO_RIGHTS; + } else { + uint32_t ip = inet_addr(pDrop->ip); + rpcRsp.code = mgmtDropDnodeByIp(ip); + if (rpcRsp.code == TSDB_CODE_SUCCESS) { + mLPrint("dnode:%s is dropped by %s", pDrop->ip, pMsg->pUser->user); + } else { + mError("failed to drop dnode:%s, reason:%s", pDrop->ip, tstrerror(rpcRsp.code)); + } + } + + rpcSendResponse(&rpcRsp); +} + +static int32_t mgmtGetDnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { SUserObj *pUser = mgmtGetUserFromConn(pConn, NULL); if (pUser == NULL) return 0; @@ -309,7 +552,7 @@ static int32_t clusterGetDnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void * pShow->offset[i] = pShow->offset[i - 1] + pShow->bytes[i - 1]; } - pShow->numOfRows = clusterGetDnodesNum(); + pShow->numOfRows = mgmtGetDnodesNum(); pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; pShow->pNode = NULL; @@ -318,7 +561,7 @@ static int32_t clusterGetDnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void * return 0; } -static int32_t clusterRetrieveDnodes(SShowObj *pShow, char *data, int32_t rows, void *pConn) { +static int32_t mgmtRetrieveDnodes(SShowObj *pShow, char *data, int32_t rows, void *pConn) { int32_t numOfRows = 0; int32_t cols = 0; SDnodeObj *pDnode = NULL; @@ -326,7 +569,7 @@ static int32_t clusterRetrieveDnodes(SShowObj *pShow, char *data, int32_t rows, char ipstr[32]; while (numOfRows < rows) { - pShow->pNode = clusterGetNextDnode(pShow->pNode, &pDnode); + pShow->pNode = mgmtGetNextDnode(pShow->pNode, &pDnode); if (pDnode == NULL) break; cols = 0; @@ -350,7 +593,7 @@ static int32_t clusterRetrieveDnodes(SShowObj *pShow, char *data, int32_t rows, cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - strcpy(pWrite, clusterGetDnodeStatusStr(pDnode->status)); + strcpy(pWrite, mgmtGetDnodeStatusStr(pDnode->status)); cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; @@ -358,29 +601,29 @@ static int32_t clusterRetrieveDnodes(SShowObj *pShow, char *data, int32_t rows, cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - *(int16_t *)pWrite = pDnode->numOfTotalVnodes; + *(int16_t *)pWrite = pDnode->totalVnodes; cols++; #ifdef _VPEER pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - strcpy(pWrite, clusterGetDnodeStatusStr(pDnode->status)); + strcpy(pWrite, mgmtGetDnodeStatusStr(pDnode->status)); cols++; #endif numOfRows++; - clusterReleaseDnode(pDnode); + mgmtReleaseDnode(pDnode); } pShow->numOfReads += numOfRows; return numOfRows; } -bool clusterCheckModuleInDnode(SDnodeObj *pDnode, int32_t moduleType) { +static bool mgmtCheckModuleInDnode(SDnodeObj *pDnode, int32_t moduleType) { uint32_t status = pDnode->moduleStatus & (1 << moduleType); return status > 0; } -static int32_t clusterGetModuleMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { +static int32_t mgmtGetModuleMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { int32_t cols = 0; SUserObj *pUser = mgmtGetUserFromConn(pConn, NULL); @@ -390,21 +633,27 @@ static int32_t clusterGetModuleMeta(STableMetaMsg *pMeta, SShowObj *pShow, void SSchema *pSchema = pMeta->schema; + pShow->bytes[cols] = 2; + pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT; + strcpy(pSchema[cols].name, "id"); + pSchema[cols].bytes = htons(pShow->bytes[cols]); + cols++; + pShow->bytes[cols] = 16; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; - strcpy(pSchema[cols].name, "IP"); + strcpy(pSchema[cols].name, "ip"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; - pShow->bytes[cols] = 10; + pShow->bytes[cols] = 8; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; - strcpy(pSchema[cols].name, "module type"); + strcpy(pSchema[cols].name, "module"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; - pShow->bytes[cols] = 10; + pShow->bytes[cols] = 8; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; - strcpy(pSchema[cols].name, "module status"); + strcpy(pSchema[cols].name, "status"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; @@ -416,18 +665,7 @@ static int32_t clusterGetModuleMeta(STableMetaMsg *pMeta, SShowObj *pShow, void pShow->offset[i] = pShow->offset[i - 1] + pShow->bytes[i - 1]; } - pShow->numOfRows = 0; - SDnodeObj *pDnode = NULL; - while (1) { - pShow->pNode = clusterGetNextDnode(pShow->pNode, (SDnodeObj **)&pDnode); - if (pDnode == NULL) break; - for (int32_t moduleType = 0; moduleType < TSDB_MOD_MAX; ++moduleType) { - if (clusterCheckModuleInDnode(pDnode, moduleType)) { - pShow->numOfRows++; - } - } - } - + pShow->numOfRows = mgmtGetDnodesNum() * TSDB_MOD_MAX; pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; pShow->pNode = NULL; mgmtReleaseUser(pUser); @@ -435,53 +673,66 @@ static int32_t clusterGetModuleMeta(STableMetaMsg *pMeta, SShowObj *pShow, void return 0; } -int32_t clusterRetrieveModules(SShowObj *pShow, char *data, int32_t rows, void *pConn) { - int32_t numOfRows = 0; - SDnodeObj *pDnode = NULL; - char * pWrite; - int32_t cols = 0; - char ipstr[20]; +int32_t mgmtRetrieveModules(SShowObj *pShow, char *data, int32_t rows, void *pConn) { + int32_t numOfRows = 0; + char * pWrite; while (numOfRows < rows) { - clusterReleaseDnode(pDnode); - pShow->pNode = clusterGetNextDnode(pShow->pNode, (SDnodeObj **)&pDnode); + SDnodeObj *pDnode = NULL; + pShow->pNode = mgmtGetNextDnode(pShow->pNode, (SDnodeObj **)&pDnode); if (pDnode == NULL) break; for (int32_t moduleType = 0; moduleType < TSDB_MOD_MAX; ++moduleType) { - if (!clusterCheckModuleInDnode(pDnode, moduleType)) { - continue; - } + int32_t cols = 0; - cols = 0; + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; + *(int16_t *)pWrite = pDnode->dnodeId; + cols++; + char ipstr[20]; tinet_ntoa(ipstr, pDnode->privateIp); pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; strcpy(pWrite, ipstr); cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - strcpy(pWrite, tsModule[moduleType].name); + switch (moduleType) { + case TSDB_MOD_MGMT: + strcpy(pWrite, "mgmt"); + break; + case TSDB_MOD_HTTP: + strcpy(pWrite, "http"); + break; + case TSDB_MOD_MONITOR: + strcpy(pWrite, "monitor"); + break; + default: + strcpy(pWrite, "unknown"); + } cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - strcpy(pWrite, clusterGetDnodeStatusStr(pDnode->status)); + bool enable = mgmtCheckModuleInDnode(pDnode, moduleType); + strcpy(pWrite, enable ? "enable" : "disable"); cols++; numOfRows++; } + + mgmtReleaseDnode(pDnode); } pShow->numOfReads += numOfRows; return numOfRows; } -static bool clusterCheckConfigShow(SGlobalConfig *cfg) { +static bool mgmtCheckConfigShow(SGlobalConfig *cfg) { if (!(cfg->cfgType & TSDB_CFG_CTYPE_B_SHOW)) return false; return true; } -static int32_t clusterGetConfigMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { +static int32_t mgmtGetConfigMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { int32_t cols = 0; SUserObj *pUser = mgmtGetUserFromConn(pConn, NULL); @@ -512,7 +763,7 @@ static int32_t clusterGetConfigMeta(STableMetaMsg *pMeta, SShowObj *pShow, void pShow->numOfRows = 0; for (int32_t i = tsGlobalConfigNum - 1; i >= 0; --i) { SGlobalConfig *cfg = tsGlobalConfig + i; - if (!clusterCheckConfigShow(cfg)) continue; + if (!mgmtCheckConfigShow(cfg)) continue; pShow->numOfRows++; } @@ -523,12 +774,12 @@ static int32_t clusterGetConfigMeta(STableMetaMsg *pMeta, SShowObj *pShow, void return 0; } -static int32_t clusterRetrieveConfigs(SShowObj *pShow, char *data, int32_t rows, void *pConn) { +static int32_t mgmtRetrieveConfigs(SShowObj *pShow, char *data, int32_t rows, void *pConn) { int32_t numOfRows = 0; for (int32_t i = tsGlobalConfigNum - 1; i >= 0 && numOfRows < rows; --i) { SGlobalConfig *cfg = tsGlobalConfig + i; - if (!clusterCheckConfigShow(cfg)) continue; + if (!mgmtCheckConfigShow(cfg)) continue; char *pWrite; int32_t cols = 0; @@ -570,7 +821,7 @@ static int32_t clusterRetrieveConfigs(SShowObj *pShow, char *data, int32_t rows, return numOfRows; } -static int32_t clusterGetVnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { +static int32_t mgmtGetVnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { int32_t cols = 0; SUserObj *pUser = mgmtGetUserFromConn(pConn, NULL); if (pUser == NULL) return 0; @@ -599,7 +850,7 @@ static int32_t clusterGetVnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void * SDnodeObj *pDnode = NULL; if (pShow->payloadLen > 0 ) { uint32_t ip = ip2uint(pShow->payload); - pDnode = clusterGetDnodeByIp(ip); + pDnode = mgmtGetDnodeByIp(ip); if (NULL == pDnode) { return TSDB_CODE_NODE_OFFLINE; } @@ -616,7 +867,7 @@ static int32_t clusterGetVnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void * pShow->pNode = pDnode; } else { while (true) { - pShow->pNode = clusterGetNextDnode(pShow->pNode, (SDnodeObj **)&pDnode); + pShow->pNode = mgmtGetNextDnode(pShow->pNode, (SDnodeObj **)&pDnode); if (pDnode == NULL) break; pShow->numOfRows += pDnode->openVnodes; @@ -627,13 +878,13 @@ static int32_t clusterGetVnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void * } pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; - clusterReleaseDnode(pDnode); + mgmtReleaseDnode(pDnode); mgmtReleaseUser(pUser); return 0; } -static int32_t clusterRetrieveVnodes(SShowObj *pShow, char *data, int32_t rows, void *pConn) { +static int32_t mgmtRetrieveVnodes(SShowObj *pShow, char *data, int32_t rows, void *pConn) { int32_t numOfRows = 0; SDnodeObj *pDnode = NULL; char * pWrite; @@ -674,7 +925,7 @@ static int32_t clusterRetrieveVnodes(SShowObj *pShow, char *data, int32_t rows, return numOfRows; } -char* clusterGetDnodeStatusStr(int32_t dnodeStatus) { +char* mgmtGetDnodeStatusStr(int32_t dnodeStatus) { switch (dnodeStatus) { case TAOS_DN_STATUS_OFFLINE: return "offline"; case TAOS_DN_STATUS_DROPPING: return "dropping"; diff --git a/src/mnode/src/mgmtGrant.c b/src/mnode/src/mgmtGrant.c index ed32f974268927e51711e8cda03beb93cc0a4513..449799ef9572efbe3d1584550a3f4a35822e6ecb 100644 --- a/src/mnode/src/mgmtGrant.c +++ b/src/mnode/src/mgmtGrant.c @@ -17,8 +17,8 @@ #ifndef _GRANT #include "os.h" #include "taoserror.h" -#include "tlog.h" #include "tgrant.h" +#include "mgmtLog.h" int32_t grantInit() { return TSDB_CODE_SUCCESS; } void grantCleanUp() {} diff --git a/src/mnode/src/mgmtMain.c b/src/mnode/src/mgmtMain.c index b6fb1ba42546ef4345f060e954feb144ba2456dd..38f18b462ae69427088eea77bc7652ce9d144624 100644 --- a/src/mnode/src/mgmtMain.c +++ b/src/mnode/src/mgmtMain.c @@ -16,14 +16,16 @@ #define _DEFAULT_SOURCE #include "os.h" #include "taosdef.h" -#include "tmodule.h" #include "tsched.h" -#include "mnode.h" -#include "taccount.h" -#include "tbalance.h" -#include "tcluster.h" +#include "treplica.h" #include "tgrant.h" -#include "mpeer.h" +#include "ttimer.h" +#include "dnode.h" +#include "mgmtDef.h" +#include "mgmtLog.h" +#include "mgmtAcct.h" +#include "mgmtDnode.h" +#include "mgmtMnode.h" #include "mgmtDb.h" #include "mgmtDClient.h" #include "mgmtDServer.h" @@ -33,48 +35,28 @@ #include "mgmtTable.h" #include "mgmtShell.h" -static int32_t mgmtCheckMgmtRunning(); void *tsMgmtTmr = NULL; +static bool tsMgmtIsRunning = false; -int32_t mgmtInitSystem() { - if (mgmtInitShell() != 0) { - mError("failed to init shell"); - return -1; - } - - struct stat dirstat; - bool fileExist = (stat(tsMnodeDir, &dirstat) == 0); - bool asMaster = (strcmp(tsMasterIp, tsPrivateIp) == 0); - - if (asMaster || fileExist) { - if (mgmtStartSystem() != 0) { - return -1; - } +int32_t mgmtStartSystem() { + if (tsMgmtIsRunning) { + mPrint("TDengine mgmt module already started..."); + return 0; } - return 0; -} - -int32_t mgmtStartSystem() { mPrint("starting to initialize TDengine mgmt ..."); - struct stat dirstat; if (stat(tsMnodeDir, &dirstat) < 0) { mkdir(tsMnodeDir, 0755); } - if (mgmtCheckMgmtRunning() != 0) { - mPrint("TDengine mgmt module already started..."); - return 0; - } - tsMgmtTmr = taosTmrInit((tsMaxShellConns) * 3, 200, 3600000, "MND"); if (tsMgmtTmr == NULL) { mError("failed to init timer"); return -1; } - if (acctInit() < 0) { + if (mgmtInitAccts() < 0) { mError("failed to init accts"); return -1; } @@ -89,7 +71,7 @@ int32_t mgmtStartSystem() { return -1; } - if (clusterInit() < 0) { + if (mgmtInitDnodes() < 0) { mError("failed to init dnodes"); return -1; } @@ -109,7 +91,7 @@ int32_t mgmtStartSystem() { return -1; } - if (mpeerInit() < 0) { + if (mgmtInitMnodes() < 0) { mError("failed to init mpeers"); return -1; } @@ -119,6 +101,10 @@ int32_t mgmtStartSystem() { return -1; } + if (replicaInit() < 0) { + mError("failed to init replica") + } + if (mgmtInitDClient() < 0) { return -1; } @@ -127,52 +113,61 @@ int32_t mgmtStartSystem() { return -1; } - if (balanceInit() < 0) { - mError("failed to init dnode balance") - } - grantReset(TSDB_GRANT_ALL, 0); + tsMgmtIsRunning = true; mPrint("TDengine mgmt is initialized successfully"); return 0; } +int32_t mgmtInitSystem() { + if (mgmtInitShell() != 0) { + mError("failed to init shell"); + return -1; + } -void mgmtStopSystem() { - if (mpeerIsMaster()) { - mTrace("it is a master mgmt node, it could not be stopped"); - return; + struct stat dirstat; + bool fileExist = (stat(tsMnodeDir, &dirstat) == 0); + bool asMaster = (strcmp(tsMasterIp, tsPrivateIp) == 0); + + if (asMaster || fileExist) { + if (mgmtStartSystem() != 0) { + return -1; + } } - mgmtCleanUpSystem(); - remove(tsMnodeDir); + return 0; } void mgmtCleanUpSystem() { mPrint("starting to clean up mgmt"); grantCleanUp(); - mpeerCleanup(); - balanceCleanUp(); + mgmtCleanupMnodes(); + replicaCleanUp(); mgmtCleanUpShell(); mgmtCleanupDClient(); mgmtCleanupDServer(); mgmtCleanUpTables(); mgmtCleanUpVgroups(); mgmtCleanUpDbs(); - clusterCleanUp(); + mgmtCleanupDnodes(); mgmtCleanUpUsers(); - acctCleanUp(); + mgmtCleanUpAccts(); sdbCleanUp(); taosTmrCleanUp(tsMgmtTmr); + tsMgmtIsRunning = false; mPrint("mgmt is cleaned up"); } -static int32_t mgmtCheckMgmtRunning() { - if (tsModuleStatus & (1 << TSDB_MOD_MGMT)) { - return -1; +void mgmtStopSystem() { + if (mgmtIsMaster()) { + mTrace("it is a master mgmt node, it could not be stopped"); + return; } - tsetModuleStatus(TSDB_MOD_MGMT); - return 0; -} \ No newline at end of file + mgmtCleanUpSystem(); + + mPrint("mgmt file is removed"); + remove(tsMnodeDir); +} diff --git a/src/mnode/src/mgmtMnode.c b/src/mnode/src/mgmtMnode.c index e2edb201b99a88189b6d0da32f9f1af4520084bf..8087ce5ad1513cdc89795fbe745bad28c96c96f6 100644 --- a/src/mnode/src/mgmtMnode.c +++ b/src/mnode/src/mgmtMnode.c @@ -18,89 +18,146 @@ #include "taoserror.h" #include "trpc.h" #include "tsync.h" -#include "mpeer.h" +#include "treplica.h" +#include "tutil.h" +#include "ttime.h" +#include "tsocket.h" +#include "mgmtDef.h" +#include "mgmtLog.h" +#include "mgmtMnode.h" +#include "mgmtDnode.h" +#include "mgmtSdb.h" #include "mgmtShell.h" #include "mgmtUser.h" +int32_t tsMnodeIsMaster = true; +static void * tsMnodeSdb = NULL; +static int32_t tsMnodeUpdateSize = 0; static int32_t mgmtGetMnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); static int32_t mgmtRetrieveMnodes(SShowObj *pShow, char *data, int32_t rows, void *pConn); -#ifndef _MPEER +static int32_t mgmtMnodeActionDestroy(SSdbOperDesc *pOper) { + tfree(pOper->pObj); + return TSDB_CODE_SUCCESS; +} -static SMnodeObj tsMnodeObj = {0}; +static int32_t mgmtMnodeActionInsert(SSdbOperDesc *pOper) { + SMnodeObj *pMnode = pOper->pObj; + SDnodeObj *pDnode = mgmtGetDnode(pMnode->mnodeId); + if (pDnode == NULL) return TSDB_CODE_DNODE_NOT_EXIST; -int32_t mpeerInitMnodes() { - tsMnodeObj.mnodeId = 1; - tsMnodeObj.privateIp = inet_addr(tsPrivateIp); - tsMnodeObj.publicIp = inet_addr(tsPublicIp); - tsMnodeObj.createdTime = taosGetTimestampMs(); - tsMnodeObj.role = TAOS_SYNC_ROLE_MASTER; - tsMnodeObj.port = tsMnodeDnodePort; - sprintf(tsMnodeObj.mnodeName, "m%d", tsMnodeObj.mnodeId); + pMnode->pDnode = pDnode; + pDnode->isMgmt = true; + mgmtReleaseDnode(pDnode); return TSDB_CODE_SUCCESS; } -void mpeerCleanupMnodes() {} -int32_t mpeerAddMnode(int32_t dnodeId) { return TSDB_CODE_SUCCESS; } -int32_t mpeerRemoveMnode(int32_t dnodeId) { return TSDB_CODE_SUCCESS; } -void * mpeerGetMnode(int32_t mnodeId) { return &tsMnodeObj; } -int32_t mpeerGetMnodesNum() { return 1; } -void mpeerReleaseMnode(struct _mnode_obj *pMnode) {} -bool mpeerIsMaster() { return tsMnodeObj.role == TAOS_SYNC_ROLE_MASTER; } -void mpeerUpdateSync() {} - -void *mpeerGetNextMnode(void *pNode, SMnodeObj **pMnode) { - if (*pMnode == NULL) { - *pMnode = &tsMnodeObj; - } else { - *pMnode = NULL; - } +static int32_t mgmtMnodeActionDelete(SSdbOperDesc *pOper) { + SMnodeObj *pMnode = pOper->pObj; + + SDnodeObj *pDnode = mgmtGetDnode(pMnode->mnodeId); + if (pDnode == NULL) return TSDB_CODE_DNODE_NOT_EXIST; + pDnode->isMgmt = false; + mgmtReleaseDnode(pDnode); - return *pMnode; + mTrace("mnode:%d, is dropped from sdb", pMnode->mnodeId); + return TSDB_CODE_SUCCESS; } -void mpeerGetPrivateIpList(SRpcIpSet *ipSet) { - ipSet->inUse = 0; - ipSet->numOfIps = 1; - ipSet->port = htons(tsMnodeObj.port); - ipSet->ip[0] = htonl(tsMnodeObj.privateIp); +static int32_t mgmtMnodeActionUpdate(SSdbOperDesc *pOper) { + SMnodeObj *pMnode = pOper->pObj; + SMnodeObj *pSaved = mgmtGetMnode(pMnode->mnodeId); + if (pMnode != pSaved) { + memcpy(pSaved, pMnode, pOper->rowSize); + free(pMnode); + } + + return TSDB_CODE_SUCCESS; } -void mpeerGetPublicIpList(SRpcIpSet *ipSet) { - ipSet->inUse = 0; - ipSet->numOfIps = 1; - ipSet->port = htons(tsMnodeObj.port); - ipSet->ip[0] = htonl(tsMnodeObj.publicIp); +static int32_t mgmtMnodeActionEncode(SSdbOperDesc *pOper) { + SMnodeObj *pMnode = pOper->pObj; + memcpy(pOper->rowData, pMnode, tsMnodeUpdateSize); + pOper->rowSize = tsMnodeUpdateSize; + return TSDB_CODE_SUCCESS; } -void mpeerGetMpeerInfos(void *param) { - SDMNodeInfos *mpeers = param; - mpeers->inUse = 0; - mpeers->nodeNum = 1; - mpeers->nodeInfos[0].nodeId = htonl(tsMnodeObj.mnodeId); - mpeers->nodeInfos[0].nodeIp = htonl(tsMnodeObj.privateIp); - mpeers->nodeInfos[0].nodePort = htons(tsMnodeObj.port); - strcpy(mpeers->nodeInfos[0].nodeName, tsMnodeObj.mnodeName); +static int32_t mgmtMnodeActionDecode(SSdbOperDesc *pOper) { + SMnodeObj *pMnode = calloc(1, sizeof(SMnodeObj)); + if (pMnode == NULL) return TSDB_CODE_SERV_OUT_OF_MEMORY; + + memcpy(pMnode, pOper->rowData, tsMnodeUpdateSize); + pOper->pObj = pMnode; + return TSDB_CODE_SUCCESS; } -int32_t mpeerForwardReqToPeer(void *pHead) { +static int32_t mgmtMnodeActionRestored() { + if (mgmtGetMnodesNum() == 1) { + SMnodeObj *pMnode = NULL; + mgmtGetNextMnode(NULL, &pMnode); + if (pMnode != NULL) { + pMnode->role = TAOS_SYNC_ROLE_MASTER; + mgmtReleaseMnode(pMnode); + } + } return TSDB_CODE_SUCCESS; } -#endif +int32_t mgmtInitMnodes() { + SMnodeObj tObj; + tsMnodeUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj; + + SSdbTableDesc tableDesc = { + .tableId = SDB_TABLE_MNODE, + .tableName = "mnodes", + .hashSessions = TSDB_MAX_MNODES, + .maxRowSize = tsMnodeUpdateSize, + .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj, + .keyType = SDB_KEY_INT, + .insertFp = mgmtMnodeActionInsert, + .deleteFp = mgmtMnodeActionDelete, + .updateFp = mgmtMnodeActionUpdate, + .encodeFp = mgmtMnodeActionEncode, + .decodeFp = mgmtMnodeActionDecode, + .destroyFp = mgmtMnodeActionDestroy, + .restoredFp = mgmtMnodeActionRestored + }; + + tsMnodeSdb = sdbOpenTable(&tableDesc); + if (tsMnodeSdb == NULL) { + mError("failed to init mnodes data"); + return -1; + } -int32_t mpeerInit() { mgmtAddShellShowMetaHandle(TSDB_MGMT_TABLE_MNODE, mgmtGetMnodeMeta); mgmtAddShellShowRetrieveHandle(TSDB_MGMT_TABLE_MNODE, mgmtRetrieveMnodes); - return mpeerInitMnodes(); + + mTrace("mnodes table is created"); + return TSDB_CODE_SUCCESS; +} + +void mgmtCleanupMnodes() { + sdbCloseTable(tsMnodeSdb); +} + +int32_t mgmtGetMnodesNum() { + return sdbGetNumOfRows(tsMnodeSdb); } -void mpeerCleanup() { - mpeerCleanupMnodes(); +void *mgmtGetMnode(int32_t mnodeId) { + return sdbGetRow(tsMnodeSdb, &mnodeId); } -static char *mpeerGetMnodeRoleStr(int32_t role) { +void mgmtReleaseMnode(SMnodeObj *pMnode) { + sdbDecRef(tsMnodeSdb, pMnode); +} + +void *mgmtGetNextMnode(void *pNode, SMnodeObj **pMnode) { + return sdbFetchRow(tsMnodeSdb, pNode, (void **)pMnode); +} + +static char *mgmtGetMnodeRoleStr(int32_t role) { switch (role) { case TAOS_SYNC_ROLE_OFFLINE: return "offline"; @@ -115,6 +172,101 @@ static char *mpeerGetMnodeRoleStr(int32_t role) { } } +bool mgmtIsMaster() { return tsMnodeIsMaster; } + +void mgmtGetMnodeIpList(SRpcIpSet *ipSet, bool usePublicIp) { + void *pNode = NULL; + while (1) { + SMnodeObj *pMnode = NULL; + pNode = mgmtGetNextMnode(pNode, &pMnode); + if (pMnode == NULL) break; + + if (usePublicIp) { + ipSet->ip[ipSet->numOfIps] = htonl(pMnode->pDnode->publicIp); + } else { + ipSet->ip[ipSet->numOfIps] = htonl(pMnode->pDnode->privateIp); + } + + if (pMnode->role == TAOS_SYNC_ROLE_MASTER) { + ipSet->inUse = ipSet->numOfIps; + } + + ipSet->numOfIps++; + ipSet->port = htons(pMnode->pDnode->mnodeShellPort); + + mgmtReleaseMnode(pMnode); + } +} + +void mgmtGetMnodeList(void *param) { + SDMNodeInfos *mnodes = param; + mnodes->inUse = 0; + + int32_t index = 0; + void *pNode = NULL; + while (1) { + SMnodeObj *pMnode = NULL; + pNode = mgmtGetNextMnode(pNode, &pMnode); + if (pMnode == NULL) break; + + mnodes->nodeInfos[index].nodeId = htonl(pMnode->mnodeId); + mnodes->nodeInfos[index].nodeIp = htonl(pMnode->pDnode->privateIp); + mnodes->nodeInfos[index].nodePort = htons(pMnode->pDnode->mnodeDnodePort); + strcpy(mnodes->nodeInfos[index].nodeName, pMnode->pDnode->dnodeName); + mPrint("node:%d role:%s", pMnode->mnodeId, mgmtGetMnodeRoleStr(pMnode->role)); + if (pMnode->role == TAOS_SYNC_ROLE_MASTER) { + mnodes->inUse = index; + mPrint("node:%d inUse:%d", pMnode->mnodeId, mnodes->inUse); + } + + index++; + mgmtReleaseMnode(pMnode); + } + + mnodes->nodeNum = index; +} + +int32_t mgmtAddMnode(int32_t dnodeId) { + SMnodeObj *pMnode = calloc(1, sizeof(SMnodeObj)); + pMnode->mnodeId = dnodeId; + pMnode->createdTime = taosGetTimestampMs(); + + SSdbOperDesc oper = { + .type = SDB_OPER_GLOBAL, + .table = tsMnodeSdb, + .pObj = pMnode, + }; + + int32_t code = sdbInsertRow(&oper); + if (code != TSDB_CODE_SUCCESS) { + tfree(pMnode); + code = TSDB_CODE_SDB_ERROR; + } + + return code; +} + +int32_t mgmtDropMnode(int32_t dnodeId) { + SMnodeObj *pMnode = sdbGetRow(tsMnodeSdb, &dnodeId); + if (pMnode == NULL) { + return TSDB_CODE_DNODE_NOT_EXIST; + } + + SSdbOperDesc oper = { + .type = SDB_OPER_GLOBAL, + .table = tsMnodeSdb, + .pObj = pMnode + }; + + int32_t code = sdbDeleteRow(&oper); + if (code != TSDB_CODE_SUCCESS) { + code = TSDB_CODE_SDB_ERROR; + } + + sdbDecRef(tsMnodeSdb, pMnode); + return code; +} + static int32_t mgmtGetMnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { SUserObj *pUser = mgmtGetUserFromConn(pConn, NULL); if (pUser == NULL) return 0; @@ -162,7 +314,7 @@ static int32_t mgmtGetMnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pCo pShow->offset[i] = pShow->offset[i - 1] + pShow->bytes[i - 1]; } - pShow->numOfRows = mpeerGetMnodesNum(); + pShow->numOfRows = mgmtGetMnodesNum(); pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; pShow->pNode = NULL; mgmtReleaseUser(pUser); @@ -178,7 +330,7 @@ static int32_t mgmtRetrieveMnodes(SShowObj *pShow, char *data, int32_t rows, voi char ipstr[32]; while (numOfRows < rows) { - pShow->pNode = mpeerGetNextMnode(pShow->pNode, &pMnode); + pShow->pNode = mgmtGetNextMnode(pShow->pNode, &pMnode); if (pMnode == NULL) break; cols = 0; @@ -187,12 +339,12 @@ static int32_t mgmtRetrieveMnodes(SShowObj *pShow, char *data, int32_t rows, voi *(int16_t *)pWrite = pMnode->mnodeId; cols++; - tinet_ntoa(ipstr, pMnode->privateIp); + tinet_ntoa(ipstr, pMnode->pDnode->privateIp); pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; strcpy(pWrite, ipstr); cols++; - tinet_ntoa(ipstr, pMnode->publicIp); + tinet_ntoa(ipstr, pMnode->pDnode->publicIp); pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; strcpy(pWrite, ipstr); cols++; @@ -202,15 +354,15 @@ static int32_t mgmtRetrieveMnodes(SShowObj *pShow, char *data, int32_t rows, voi cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - strcpy(pWrite, mpeerGetMnodeRoleStr(pMnode->role)); + strcpy(pWrite, mgmtGetMnodeRoleStr(pMnode->role)); cols++; numOfRows++; - mpeerReleaseMnode(pMnode); + mgmtReleaseMnode(pMnode); } pShow->numOfReads += numOfRows; return numOfRows; -} \ No newline at end of file +} diff --git a/src/mnode/src/mgmtProfile.c b/src/mnode/src/mgmtProfile.c index f7dec4656b668769325273eadd7d2572a049c7b7..1f557681ff209de9b9032267dd552978f40e274a 100644 --- a/src/mnode/src/mgmtProfile.c +++ b/src/mnode/src/mgmtProfile.c @@ -16,10 +16,14 @@ #define _DEFAULT_SOURCE #include "os.h" #include "taosmsg.h" -#include "taccount.h" -#include "tcluster.h" +#include "taoserror.h" +#include "tutil.h" +#include "mgmtDef.h" +#include "mgmtLog.h" +#include "mgmtAcct.h" +#include "mgmtDnode.h" #include "mgmtDb.h" -#include "mpeer.h" +#include "mgmtMnode.h" #include "mgmtProfile.h" #include "mgmtShell.h" #include "mgmtTable.h" @@ -787,11 +791,11 @@ void mgmtFreeQueuedMsg(SQueuedMsg *pMsg) { if (pMsg != NULL) { rpcFreeCont(pMsg->pCont); if (pMsg->pUser) mgmtReleaseUser(pMsg->pUser); - if (pMsg->pDb) mgmtReleaseDb(pMsg->pDb); + if (pMsg->pDb) mgmtDecDbRef(pMsg->pDb); if (pMsg->pVgroup) mgmtReleaseVgroup(pMsg->pVgroup); if (pMsg->pTable) mgmtDecTableRef(pMsg->pTable); - if (pMsg->pAcct) acctReleaseAcct(pMsg->pAcct); - if (pMsg->pDnode) clusterReleaseDnode(pMsg->pDnode); + if (pMsg->pAcct) mgmtDecAcctRef(pMsg->pAcct); + if (pMsg->pDnode) mgmtReleaseDnode(pMsg->pDnode); free(pMsg); } } diff --git a/src/mnode/src/mgmtBalance.c b/src/mnode/src/mgmtReplica.c similarity index 68% rename from src/mnode/src/mgmtBalance.c rename to src/mnode/src/mgmtReplica.c index 77d68f43d8e209cf789a79024deee1f3b8bff21e..05a303a69bb82497672176b62897cf50d013a4bc 100644 --- a/src/mnode/src/mgmtBalance.c +++ b/src/mnode/src/mgmtReplica.c @@ -14,34 +14,41 @@ */ #define _DEFAULT_SOURCE -#include "tbalance.h" -#include "mnode.h" -#include "tcluster.h" +#include "os.h" +#include "trpc.h" +#include "treplica.h" +#include "mgmtDef.h" +#include "mgmtLog.h" +#include "mgmtMnode.h" +#include "mgmtDnode.h" #include "mgmtVgroup.h" -#ifndef _VPEER -int32_t balanceInit() { return 0; } -void balanceCleanUp() {} -void balanceNotify() {} +#ifndef _SYNC -int32_t balanceAllocVnodes(SVgObj *pVgroup) { +int32_t replicaInit() { return TSDB_CODE_SUCCESS; } +void replicaCleanUp() {} +void replicaNotify() {} +void replicaReset() {} +int32_t replicaForwardReqToPeer(void *pHead) { return TSDB_CODE_SUCCESS; } + +int32_t replicaAllocVnodes(SVgObj *pVgroup) { void * pNode = NULL; SDnodeObj *pDnode = NULL; SDnodeObj *pSelDnode = NULL; float vnodeUsage = 1.0; while (1) { - pNode = clusterGetNextDnode(pNode, &pDnode); + pNode = mgmtGetNextDnode(pNode, &pDnode); if (pDnode == NULL) break; - if (pDnode->numOfTotalVnodes > 0 && pDnode->openVnodes < pDnode->numOfTotalVnodes) { - float usage = (float)pDnode->openVnodes / pDnode->numOfTotalVnodes; + if (pDnode->totalVnodes > 0 && pDnode->openVnodes < pDnode->totalVnodes) { + float usage = (float)pDnode->openVnodes / pDnode->totalVnodes; if (usage <= vnodeUsage) { pSelDnode = pDnode; vnodeUsage = usage; } } - clusterReleaseDnode(pDnode); + mgmtReleaseDnode(pDnode); } if (pSelDnode == NULL) { diff --git a/src/mnode/src/mgmtSdb.c b/src/mnode/src/mgmtSdb.c index 12fab5587550159d8095dd4d94b765b47105fac2..4bc18d6a0de369bd417f4e8f9e4abdf7cc439e17 100644 --- a/src/mnode/src/mgmtSdb.c +++ b/src/mnode/src/mgmtSdb.c @@ -18,11 +18,13 @@ #include "taoserror.h" #include "tlog.h" #include "trpc.h" +#include "treplica.h" #include "tqueue.h" #include "twal.h" #include "hashint.h" #include "hashstr.h" -#include "mpeer.h" +#include "mgmtLog.h" +#include "mgmtMnode.h" #include "mgmtSdb.h" typedef struct _SSdbTable { @@ -67,10 +69,16 @@ static void *(*sdbGetIndexFp[])(void *handle, void *key) = {sdbGetStrHashData, s static void (*sdbCleanUpIndexFp[])(void *handle) = {sdbCloseStrHash, sdbCloseIntHash, sdbCloseIntHash}; static void *(*sdbFetchRowFp[])(void *handle, void *ptr, void **ppRow) = {sdbFetchStrHashData, sdbFetchIntHashData, sdbFetchIntHashData}; -uint64_t sdbGetVersion() { return tsSdbObj->version; } int32_t sdbGetId(void *handle) { return ((SSdbTable *)handle)->autoIndex; } int64_t sdbGetNumOfRows(void *handle) { return ((SSdbTable *)handle)->numOfRows; } +uint64_t sdbGetVersion() { + if (tsSdbObj) + return tsSdbObj->version; + else + return 0; +} + static char *sdbGetActionStr(int32_t action) { switch (action) { case SDB_ACTION_INSERT: @@ -131,7 +139,7 @@ int32_t sdbInit() { sdbTrace("sdb is initialized, version:%d totalRows:%d numOfTables:%d", tsSdbObj->version, totalRows, numOfTables); - mpeerUpdateSync(); + replicaNotify(); return TSDB_CODE_SUCCESS; } @@ -145,10 +153,6 @@ void sdbCleanUp() { } } -SSdbObject *sdbGetObj() { - return tsSdbObj; -} - void sdbIncRef(void *handle, void *pRow) { if (pRow) { SSdbTable *pTable = handle; @@ -264,7 +268,7 @@ static int32_t sdbProcessWriteFromApp(SSdbTable *pTable, SWalHead *pHead, int32_ tsSdbObj->version++; pHead->version = tsSdbObj->version; - code = mpeerForwardReqToPeer(pHead); + code = replicaForwardReqToPeer(pHead); if (code != TSDB_CODE_SUCCESS) { pthread_mutex_unlock(&tsSdbObj->mutex); sdbError("table:%s, failed to forward %s record:%s from file, version:%" PRId64 ", reason:%s", pTable->tableName, diff --git a/src/mnode/src/mgmtShell.c b/src/mnode/src/mgmtShell.c index 5010429db39e781735149265072556a4dbb74162..1dec4bd0153ee27299e946da933460eb7c5d802f 100644 --- a/src/mnode/src/mgmtShell.c +++ b/src/mnode/src/mgmtShell.c @@ -20,14 +20,16 @@ #include "tlog.h" #include "trpc.h" #include "tsched.h" +#include "tutil.h" +#include "ttimer.h" #include "dnode.h" -#include "mnode.h" -#include "taccount.h" -#include "tbalance.h" +#include "mgmtDef.h" +#include "mgmtLog.h" +#include "mgmtAcct.h" #include "mgmtDb.h" -#include "tcluster.h" +#include "mgmtDnode.h" #include "tgrant.h" -#include "mpeer.h" +#include "mgmtMnode.h" #include "mgmtProfile.h" #include "mgmtSdb.h" #include "mgmtShell.h" @@ -48,6 +50,7 @@ static void mgmtProcessHeartBeatMsg(SQueuedMsg *queuedMsg); static void mgmtProcessConnectMsg(SQueuedMsg *queuedMsg); static void mgmtProcessUseMsg(SQueuedMsg *queuedMsg); +extern void *tsMgmtTmr; static void *tsMgmtShellRpc = NULL; static void *tsMgmtTranQhandle = NULL; static void (*tsMgmtProcessShellMsgFp[TSDB_MSG_TYPE_MAX])(SQueuedMsg *) = {0}; @@ -141,7 +144,7 @@ static void mgmtProcessMsgFromShell(SRpcMsg *rpcMsg) { return; } - if (!mpeerIsMaster()) { + if (!mgmtIsMaster()) { // rpcSendRedirectRsp(rpcMsg->handle, mgmtGetMnodeIpListForRedirect()); mgmtSendSimpleResp(rpcMsg->handle, TSDB_CODE_NO_MASTER); rpcFreeCont(rpcMsg->pCont); @@ -329,12 +332,8 @@ static void mgmtProcessHeartBeatMsg(SQueuedMsg *pMsg) { return; } - if (pMsg->usePublicIp) { - mpeerGetPublicIpList(&pHBRsp->ipList); - } else { - mpeerGetPrivateIpList(&pHBRsp->ipList); - } - + mgmtGetMnodeIpList(&pHBRsp->ipList, pMsg->usePublicIp); + /* * TODO * Dispose kill stream or kill query message @@ -415,12 +414,8 @@ static void mgmtProcessConnectMsg(SQueuedMsg *pMsg) { pConnectRsp->writeAuth = pUser->writeAuth; pConnectRsp->superAuth = pUser->superAuth; - if (pMsg->usePublicIp) { - mpeerGetPublicIpList(&pConnectRsp->ipList); - } else { - mpeerGetPrivateIpList(&pConnectRsp->ipList); - } - + mgmtGetMnodeIpList(&pConnectRsp->ipList, pMsg->usePublicIp); + connect_over: rpcRsp.code = code; if (code != TSDB_CODE_SUCCESS) { diff --git a/src/mnode/src/mgmtTable.c b/src/mnode/src/mgmtTable.c index 10cd343a5bb472da7c301ba6202bf8a5b5224696..3fb4272b7f36f61ee31a2bb9029a03c3ac39e995 100644 --- a/src/mnode/src/mgmtTable.c +++ b/src/mnode/src/mgmtTable.c @@ -15,7 +15,6 @@ #define _DEFAULT_SOURCE #include "os.h" - #include "taosmsg.h" #include "ttime.h" #include "tutil.h" @@ -23,13 +22,16 @@ #include "taosmsg.h" #include "tscompression.h" #include "name.h" -#include "taccount.h" +#include "tidpool.h" +#include "mgmtDef.h" +#include "mgmtLog.h" +#include "mgmtAcct.h" #include "mgmtDClient.h" #include "mgmtDb.h" -#include "tcluster.h" +#include "mgmtDnode.h" #include "mgmtDServer.h" #include "tgrant.h" -#include "mpeer.h" +#include "mgmtMnode.h" #include "mgmtProfile.h" #include "mgmtSdb.h" #include "mgmtShell.h" @@ -101,14 +103,14 @@ static int32_t mgmtChildTableActionInsert(SSdbOperDesc *pOper) { mError("ctable:%s, vgroup:%d not in db:%s", pTable->info.tableId, pVgroup->vgId, pVgroup->dbName); return TSDB_CODE_INVALID_DB; } - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); + SAcctObj *pAcct = mgmtGetAcct(pDb->cfg.acct); if (pAcct == NULL) { mError("ctable:%s, account:%s not exists", pTable->info.tableId, pDb->cfg.acct); return TSDB_CODE_INVALID_ACCT; } - acctReleaseAcct(pAcct); + mgmtDecAcctRef(pAcct); if (pTable->info.type == TSDB_CHILD_TABLE) { pTable->superTable = mgmtGetSuperTable(pTable->superTableId); @@ -143,14 +145,14 @@ static int32_t mgmtChildTableActionDelete(SSdbOperDesc *pOper) { mError("ctable:%s, vgroup:%d not in DB:%s", pTable->info.tableId, pVgroup->vgId, pVgroup->dbName); return TSDB_CODE_INVALID_DB; } - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); + SAcctObj *pAcct = mgmtGetAcct(pDb->cfg.acct); if (pAcct == NULL) { mError("ctable:%s, account:%s not exists", pTable->info.tableId, pDb->cfg.acct); return TSDB_CODE_INVALID_ACCT; } - acctReleaseAcct(pAcct); + mgmtDecAcctRef(pAcct); if (pTable->info.type == TSDB_CHILD_TABLE) { grantRestore(TSDB_GRANT_TIMESERIES, pTable->superTable->numOfColumns - 1); @@ -258,7 +260,7 @@ static int32_t mgmtChildTableActionRestored() { pNode = pLastNode; continue; } - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); SVgObj *pVgroup = mgmtGetVgroup(pTable->vgId); if (pVgroup == NULL) { @@ -401,7 +403,7 @@ static int32_t mgmtSuperTableActionInsert(SSdbOperDesc *pOper) { if (pDb != NULL) { mgmtAddSuperTableIntoDb(pDb); } - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); return TSDB_CODE_SUCCESS; } @@ -413,7 +415,7 @@ static int32_t mgmtSuperTableActionDelete(SSdbOperDesc *pOper) { mgmtRemoveSuperTableFromDb(pDb); mgmtDropAllChildTablesInStable((SSuperTableObj *)pStable); } - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); return TSDB_CODE_SUCCESS; } @@ -923,10 +925,10 @@ static int32_t mgmtAddSuperTableColumn(SDbObj *pDb, SSuperTableObj *pStable, SSc pStable->numOfColumns += ncols; pStable->sversion++; - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); + SAcctObj *pAcct = mgmtGetAcct(pDb->cfg.acct); if (pAcct != NULL) { pAcct->acctInfo.numOfTimeSeries += (ncols * pStable->numOfTables); - acctReleaseAcct(pAcct); + mgmtDecAcctRef(pAcct); } SSdbOperDesc oper = { @@ -960,10 +962,10 @@ static int32_t mgmtDropSuperTableColumn(SDbObj *pDb, SSuperTableObj *pStable, ch int32_t schemaSize = sizeof(SSchema) * (pStable->numOfTags + pStable->numOfColumns); pStable->schema = realloc(pStable->schema, schemaSize); - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); + SAcctObj *pAcct = mgmtGetAcct(pDb->cfg.acct); if (pAcct != NULL) { pAcct->acctInfo.numOfTimeSeries -= pStable->numOfTables; - acctReleaseAcct(pAcct); + mgmtDecAcctRef(pAcct); } SSdbOperDesc oper = { @@ -1029,7 +1031,7 @@ static int32_t mgmtGetShowSuperTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, pShow->numOfRows = pDb->numOfSuperTables; pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); return 0; } @@ -1094,7 +1096,7 @@ int32_t mgmtRetrieveShowSuperTables(SShowObj *pShow, char *data, int32_t rows, v } pShow->numOfReads += numOfRows; - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); return numOfRows; } @@ -1191,14 +1193,14 @@ static void mgmtProcessSuperTableVgroupMsg(SQueuedMsg *pMsg) { pRsp->vgroups[vg].vgId = htonl(vgId); for (int32_t vn = 0; vn < pVgroup->numOfVnodes; ++vn) { - SDnodeObj *pDnode = clusterGetDnode(pVgroup->vnodeGid[vn].dnodeId); + SDnodeObj *pDnode = mgmtGetDnode(pVgroup->vnodeGid[vn].dnodeId); if (pDnode == NULL) break; pRsp->vgroups[vg].ipAddr[vn].ip = htonl(pDnode->privateIp); pRsp->vgroups[vg].ipAddr[vn].port = htons(tsDnodeShellPort); pRsp->vgroups[vg].numOfIps++; - clusterReleaseDnode(pDnode); + mgmtReleaseDnode(pDnode); } mgmtReleaseVgroup(pVgroup); @@ -1500,10 +1502,10 @@ static int32_t mgmtAddNormalTableColumn(SDbObj *pDb, SChildTableObj *pTable, SSc pTable->numOfColumns += ncols; pTable->sversion++; - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); + SAcctObj *pAcct = mgmtGetAcct(pDb->cfg.acct); if (pAcct != NULL) { pAcct->acctInfo.numOfTimeSeries += ncols; - acctReleaseAcct(pAcct); + mgmtDecAcctRef(pAcct); } SSdbOperDesc oper = { @@ -1534,10 +1536,10 @@ static int32_t mgmtDropNormalTableColumn(SDbObj *pDb, SChildTableObj *pTable, ch pTable->numOfColumns--; pTable->sversion++; - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); + SAcctObj *pAcct = mgmtGetAcct(pDb->cfg.acct); if (pAcct != NULL) { pAcct->acctInfo.numOfTimeSeries--; - acctReleaseAcct(pAcct); + mgmtDecAcctRef(pAcct); } SSdbOperDesc oper = { @@ -1600,7 +1602,7 @@ static int32_t mgmtDoGetChildTableMeta(SQueuedMsg *pMsg, STableMetaMsg *pMeta) { } for (int32_t i = 0; i < pVgroup->numOfVnodes; ++i) { - SDnodeObj *pDnode = clusterGetDnode(pVgroup->vnodeGid[i].dnodeId); + SDnodeObj *pDnode = mgmtGetDnode(pVgroup->vnodeGid[i].dnodeId); if (pDnode == NULL) break; if (usePublicIp) { pMeta->vgroup.ipAddr[i].ip = htonl(pDnode->publicIp); @@ -1610,7 +1612,7 @@ static int32_t mgmtDoGetChildTableMeta(SQueuedMsg *pMsg, STableMetaMsg *pMeta) { pMeta->vgroup.ipAddr[i].port = htonl(tsDnodeShellPort); } pMeta->vgroup.numOfIps++; - clusterReleaseDnode(pDnode); + mgmtReleaseDnode(pDnode); } pMeta->vgroup.vgId = htonl(pVgroup->vgId); @@ -1730,7 +1732,7 @@ static void mgmtDropAllChildTablesInStable(SSuperTableObj *pStable) { } static SChildTableObj* mgmtGetTableByPos(uint32_t dnodeId, int32_t vnode, int32_t sid) { - SDnodeObj *pObj = clusterGetDnode(dnodeId); + SDnodeObj *pObj = mgmtGetDnode(dnodeId); SVgObj *pVgroup = mgmtGetVgroup(vnode); if (pObj == NULL || pVgroup == NULL) { @@ -1968,7 +1970,7 @@ static int32_t mgmtGetShowTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, void pShow->numOfRows = pDb->numOfTables; pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); return 0; } @@ -2045,7 +2047,7 @@ static int32_t mgmtRetrieveShowTables(SShowObj *pShow, char *data, int32_t rows, const int32_t NUM_OF_COLUMNS = 4; mgmtVacuumResult(data, NUM_OF_COLUMNS, numOfRows, rows, pShow); - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); return numOfRows; } diff --git a/src/mnode/src/mgmtUser.c b/src/mnode/src/mgmtUser.c index 931272fb580a205d6bf3f6319fb6412edfa38bdd..9098a0c17d4db0c8b955cc5b97c187f1d56262d5 100644 --- a/src/mnode/src/mgmtUser.c +++ b/src/mnode/src/mgmtUser.c @@ -18,9 +18,12 @@ #include "trpc.h" #include "ttime.h" #include "tutil.h" -#include "taccount.h" +#include "dnode.h" +#include "mgmtDef.h" +#include "mgmtLog.h" +#include "mgmtAcct.h" #include "tgrant.h" -#include "mpeer.h" +#include "mgmtMnode.h" #include "mgmtSdb.h" #include "mgmtShell.h" #include "mgmtUser.h" @@ -40,10 +43,10 @@ static int32_t mgmtUserActionDestroy(SSdbOperDesc *pOper) { static int32_t mgmtUserActionInsert(SSdbOperDesc *pOper) { SUserObj *pUser = pOper->pObj; - SAcctObj *pAcct = acctGetAcct(pUser->acct); + SAcctObj *pAcct = mgmtGetAcct(pUser->acct); if (pAcct != NULL) { - acctAddUser(pAcct, pUser); + mgmtAddUserToAcct(pAcct, pUser); } else { mError("user:%s, acct:%s info not exist in sdb", pUser->user, pUser->acct); @@ -55,10 +58,10 @@ static int32_t mgmtUserActionInsert(SSdbOperDesc *pOper) { static int32_t mgmtUserActionDelete(SSdbOperDesc *pOper) { SUserObj *pUser = pOper->pObj; - SAcctObj *pAcct = acctGetAcct(pUser->acct); + SAcctObj *pAcct = mgmtGetAcct(pUser->acct); if (pAcct != NULL) { - acctRemoveUser(pAcct, pUser); + mgmtDropUserFromAcct(pAcct, pUser); } return TSDB_CODE_SUCCESS; @@ -91,12 +94,12 @@ static int32_t mgmtUserActionDecode(SSdbOperDesc *pOper) { } static int32_t mgmtUserActionRestored() { - if (strcmp(tsMasterIp, tsPrivateIp) == 0) { - SAcctObj *pAcct = acctGetAcct("root"); + if (dnodeIsFirstDeploy()) { + SAcctObj *pAcct = mgmtGetAcct("root"); mgmtCreateUser(pAcct, "root", "taosdata"); mgmtCreateUser(pAcct, "monitor", tsInternalPass); mgmtCreateUser(pAcct, "_root", tsInternalPass); - acctReleaseAcct(pAcct); + mgmtDecAcctRef(pAcct); } return 0; @@ -167,7 +170,7 @@ static int32_t mgmtUpdateUser(SUserObj *pUser) { } int32_t mgmtCreateUser(SAcctObj *pAcct, char *name, char *pass) { - int32_t code = acctCheck(pAcct, TSDB_ACCT_USER); + int32_t code = acctCheck(pAcct, ACCT_GRANT_USER); if (code != 0) { return code; } diff --git a/src/mnode/src/mgmtVgroup.c b/src/mnode/src/mgmtVgroup.c index 98d9b22d8e87918236144f8bd1c9d99904162da6..9be95f4087aba02e4394793e9e7a1e4c24040ca4 100644 --- a/src/mnode/src/mgmtVgroup.c +++ b/src/mnode/src/mgmtVgroup.c @@ -17,14 +17,19 @@ #include "os.h" #include "taoserror.h" #include "tlog.h" -#include "tbalance.h" +#include "tutil.h" +#include "tsocket.h" +#include "tidpool.h" #include "tsync.h" -#include "tcluster.h" -#include "mnode.h" +#include "ttime.h" +#include "treplica.h" +#include "mgmtDef.h" +#include "mgmtLog.h" #include "mgmtDb.h" #include "mgmtDClient.h" #include "mgmtDServer.h" -#include "mpeer.h" +#include "mgmtDnode.h" +#include "mgmtMnode.h" #include "mgmtProfile.h" #include "mgmtSdb.h" #include "mgmtShell.h" @@ -63,7 +68,7 @@ static int32_t mgmtVgroupActionInsert(SSdbOperDesc *pOper) { if (pDb == NULL) { return TSDB_CODE_INVALID_DB; } - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); pVgroup->pDb = pDb; pVgroup->prev = NULL; @@ -84,12 +89,12 @@ static int32_t mgmtVgroupActionInsert(SSdbOperDesc *pOper) { } for (int32_t i = 0; i < pVgroup->numOfVnodes; ++i) { - SDnodeObj *pDnode = clusterGetDnode(pVgroup->vnodeGid[i].dnodeId); + SDnodeObj *pDnode = mgmtGetDnode(pVgroup->vnodeGid[i].dnodeId); if (pDnode != NULL) { pVgroup->vnodeGid[i].privateIp = pDnode->privateIp; pVgroup->vnodeGid[i].publicIp = pDnode->publicIp; atomic_add_fetch_32(&pDnode->openVnodes, 1); - clusterReleaseDnode(pDnode); + mgmtReleaseDnode(pDnode); } } @@ -106,14 +111,14 @@ static int32_t mgmtVgroupActionDelete(SSdbOperDesc *pOper) { mgmtRemoveVgroupFromDb(pVgroup); } - mgmtReleaseDb(pVgroup->pDb); + mgmtDecDbRef(pVgroup->pDb); for (int32_t i = 0; i < pVgroup->numOfVnodes; ++i) { - SDnodeObj *pDnode = clusterGetDnode(pVgroup->vnodeGid[i].dnodeId); + SDnodeObj *pDnode = mgmtGetDnode(pVgroup->vnodeGid[i].dnodeId); if (pDnode) { atomic_sub_fetch_32(&pDnode->openVnodes, 1); } - clusterReleaseDnode(pDnode); + mgmtReleaseDnode(pDnode); } return TSDB_CODE_SUCCESS; @@ -244,7 +249,7 @@ void mgmtCreateVgroup(SQueuedMsg *pMsg, SDbObj *pDb) { strcpy(pVgroup->dbName, pDb->name); pVgroup->numOfVnodes = pDb->cfg.replications; pVgroup->createdTime = taosGetTimestampMs(); - if (balanceAllocVnodes(pVgroup) != 0) { + if (replicaAllocVnodes(pVgroup) != 0) { mError("db:%s, no enough dnode to alloc %d vnodes to vgroup", pDb->name, pVgroup->numOfVnodes); free(pVgroup); mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_NO_ENOUGH_DNODES); @@ -381,18 +386,18 @@ int32_t mgmtGetVgroupMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { pShow->pNode = pVgroup; } - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); return 0; } char *mgmtGetVnodeStatus(SVgObj *pVgroup, SVnodeGid *pVnode) { - SDnodeObj *pDnode = clusterGetDnode(pVnode->dnodeId); + SDnodeObj *pDnode = mgmtGetDnode(pVnode->dnodeId); if (pDnode == NULL) { mError("vgroup:%d, not exist in dnode:%d", pVgroup->vgId, pDnode->dnodeId); return "null"; } - clusterReleaseDnode(pDnode); + mgmtReleaseDnode(pDnode); if (pDnode->status == TAOS_DN_STATUS_OFFLINE) { return "offline"; @@ -467,7 +472,7 @@ int32_t mgmtRetrieveVgroups(SShowObj *pShow, char *data, int32_t rows, void *pCo } pShow->numOfReads += numOfRows; - mgmtReleaseDb(pDb); + mgmtDecDbRef(pDb); return numOfRows; } @@ -676,13 +681,13 @@ static void mgmtProcessVnodeCfgMsg(SRpcMsg *rpcMsg) { pCfg->dnodeId = htonl(pCfg->dnodeId); pCfg->vgId = htonl(pCfg->vgId); - SDnodeObj *pDnode = clusterGetDnode(pCfg->dnodeId); + SDnodeObj *pDnode = mgmtGetDnode(pCfg->dnodeId); if (pDnode == NULL) { mTrace("dnode:%s, invalid dnode", taosIpStr(pCfg->dnodeId), pCfg->vgId); mgmtSendSimpleResp(rpcMsg->handle, TSDB_CODE_NOT_ACTIVE_VNODE); return; } - clusterReleaseDnode(pDnode); + mgmtReleaseDnode(pDnode); SVgObj *pVgroup = mgmtGetVgroup(pCfg->vgId); if (pVgroup == NULL) { diff --git a/src/os/darwin/src/tdarwin.c b/src/os/darwin/src/tdarwin.c index 7896592030f8e18e5d4be5efad0bf7c78100dfb8..a8dfdb1e3ff9360f7196ca455b81f873dfef7fc6 100644 --- a/src/os/darwin/src/tdarwin.c +++ b/src/os/darwin/src/tdarwin.c @@ -243,6 +243,11 @@ int taosInitTimer(void (*callback)(int), int ms) { return setitimer(ITIMER_REAL, &tv, NULL); } +void taosUninitTimer() { + struct itimerval tv = { 0 }; + return setitimer(ITIMER_REAL, &tv, NULL); +} + void taosGetSystemTimezone() { // get and set default timezone SGlobalConfig *cfg_timezone = tsGetConfigOption("timezone"); diff --git a/src/os/linux/src/tlinux.c b/src/os/linux/src/tlinux.c index c1bd0ceb5f5059f09bec9023dc1c767fbc871b9e..88d69816abbc161d07d1f96f33c6558a3a2ac42c 100644 --- a/src/os/linux/src/tlinux.c +++ b/src/os/linux/src/tlinux.c @@ -286,20 +286,23 @@ void *taosProcessAlarmSignal(void *tharg) { return NULL; } +static pthread_t timerThread; + int taosInitTimer(void (*callback)(int), int ms) { - pthread_t thread; pthread_attr_t tattr; pthread_attr_init(&tattr); - pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); - int code = pthread_create(&thread, &tattr, taosProcessAlarmSignal, callback); - pthread_detach(thread); + int code = pthread_create(&timerThread, &tattr, taosProcessAlarmSignal, callback); pthread_attr_destroy(&tattr); if (code != 0) { tmrError("failed to create timer thread"); return -1; } + return 0; +} - return thread; +void taosUninitTimer() { + pthread_cancel(timerThread); + pthread_join(timerThread, NULL); } ssize_t tread(int fd, void *buf, size_t count) { diff --git a/src/os/windows/src/twintimer.c b/src/os/windows/src/twintimer.c index 68899bea51e936678abfbe6004e8fdb2713ce11a..2bb8478f09dc61c395d425953e2c2251862df557 100644 --- a/src/os/windows/src/twintimer.c +++ b/src/os/windows/src/twintimer.c @@ -30,8 +30,8 @@ void WINAPI taosWinOnTimer(UINT wTimerID, UINT msg, DWORD_PTR dwUser, DWORD_PTR } } +static MMRESULT timerId; int taosInitTimer(win_timer_f callback, int ms) { - MMRESULT timerId; DWORD_PTR param = *((int64_t *) & callback); timerId = timeSetEvent(ms, 1, (LPTIMECALLBACK)taosWinOnTimer, param, TIME_PERIODIC); @@ -41,6 +41,10 @@ int taosInitTimer(win_timer_f callback, int ms) { return 0; } +void taosUninitTimer() { + timeKillEvent(timerId); +} + void taosMsleep(int mseconds) { Sleep(mseconds); } diff --git a/src/plugins/http/CMakeLists.txt b/src/plugins/http/CMakeLists.txt index 9b36f4029a7d5993435b5a0e45cde1d31d19b184..40dee941171b2a80499f9d9a4dc7c08a71ad0f14 100644 --- a/src/plugins/http/CMakeLists.txt +++ b/src/plugins/http/CMakeLists.txt @@ -15,7 +15,7 @@ IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM)) ADD_LIBRARY(http ${SRC}) TARGET_LINK_LIBRARIES(http taos_static z) - IF (TD_CLUSTER) - TARGET_LINK_LIBRARIES(http) + IF (TD_ADMIN) + TARGET_LINK_LIBRARIES(http admin) ENDIF () ENDIF () diff --git a/src/plugins/http/inc/httpHandle.h b/src/plugins/http/inc/httpHandle.h index 9c6a263c5bd328ca0fc59eb5365f7722324ef729..ad5a28e10e0d5c9a068511fd83b1518f2be10ba1 100644 --- a/src/plugins/http/inc/httpHandle.h +++ b/src/plugins/http/inc/httpHandle.h @@ -23,7 +23,7 @@ #include "taosdef.h" #include "tutil.h" #include "zlib.h" - +#include "tlog.h" #include "http.h" #include "httpJson.h" @@ -206,10 +206,10 @@ typedef struct HttpThread { int threadId; char label[HTTP_LABEL_SIZE]; bool (*processData)(HttpContext *pContext); - struct _http_server_obj_ *pServer; // handle passed by upper layer during pServer initialization + struct HttpServer *pServer; // handle passed by upper layer during pServer initialization } HttpThread; -typedef struct _http_server_obj_ { +typedef struct HttpServer { char label[HTTP_LABEL_SIZE]; char serverIp[16]; uint16_t serverPort; @@ -313,4 +313,27 @@ const char* httpContextStateStr(HttpContextState state); bool httpAlterContextState(HttpContext *pContext, HttpContextState srcState, HttpContextState destState); void httpRemoveContextFromEpoll(HttpThread *pThread, HttpContext *pContext); +#define httpError(...) \ + if (httpDebugFlag & DEBUG_ERROR) { \ + tprintf("ERROR HTP ", 255, __VA_ARGS__); \ + } +#define httpWarn(...) \ + if (httpDebugFlag & DEBUG_WARN) { \ + tprintf("WARN HTP ", httpDebugFlag, __VA_ARGS__); \ + } +#define httpTrace(...) \ + if (httpDebugFlag & DEBUG_TRACE) { \ + tprintf("HTP ", httpDebugFlag, __VA_ARGS__); \ + } +#define httpDump(...) \ + if (httpDebugFlag & DEBUG_TRACE) { \ + taosPrintLongString("HTP ", httpDebugFlag, __VA_ARGS__); \ + } +#define httpPrint(...) \ + { tprintf("HTP ", 255, __VA_ARGS__); } + +#define httpLError(...) taosLogError(__VA_ARGS__) httpError(__VA_ARGS__) +#define httpLWarn(...) taosLogWarn(__VA_ARGS__) httpWarn(__VA_ARGS__) +#define httpLPrint(...) taosLogPrint(__VA_ARGS__) httpPrint(__VA_ARGS__) + #endif diff --git a/src/plugins/http/src/httpSystem.c b/src/plugins/http/src/httpSystem.c index 2a118cc2b14d01a8600d85970318bbcd3676131e..52910cb1db1cbdd9225908383f5c298643cc06b9 100644 --- a/src/plugins/http/src/httpSystem.c +++ b/src/plugins/http/src/httpSystem.c @@ -13,11 +13,9 @@ * along with this program. If not, see . */ -#include -#include -#include -#include - +#define _DEFAULT_SOURCE +#include "os.h" +#include "tadmin.h" #include "http.h" #include "httpCode.h" #include "httpHandle.h" @@ -27,28 +25,17 @@ #include "tglobalcfg.h" #include "tsocket.h" #include "ttimer.h" - #include "gcHandle.h" #include "httpHandle.h" #include "restHandle.h" #include "tgHandle.h" -#include "tlog.h" +#ifndef _ADMIN -void (*adminInitHandleFp)(HttpServer* pServer) = NULL; -void (*opInitHandleFp)(HttpServer* pServer) = NULL; - -void adminInitHandle(HttpServer* pServer) { - if (adminInitHandleFp) { - (*adminInitHandleFp)(pServer); - } -} +void adminInitHandle(HttpServer* pServer) {} +void opInitHandle(HttpServer* pServer) {} -void opInitHandle(HttpServer* pServer) { - if (opInitHandleFp) { - (*opInitHandleFp)(pServer); - } -} +#endif static HttpServer *httpServer = NULL; void taosInitNote(int numOfNoteLines, int maxNotes, char* lable); diff --git a/src/plugins/monitor/src/monitorSystem.c b/src/plugins/monitor/src/monitorSystem.c index 4fb3ba2f5b55ee72452fd7e39793053394f9c51a..a547d1354563d012e8a5d6b76fdbe1413bce8cfd 100644 --- a/src/plugins/monitor/src/monitorSystem.c +++ b/src/plugins/monitor/src/monitorSystem.c @@ -13,17 +13,37 @@ * along with this program. If not, see . */ +#define _DEFAULT_SOURCE #include "os.h" - +#include "tlog.h" #include "monitor.h" #include "dnode.h" -#include "monitorSystem.h" #include "tsclient.h" #include "taosdef.h" #include "tsystem.h" #include "ttime.h" #include "ttimer.h" #include "tutil.h" +#include "monitorSystem.h" + +#define monitorError(...) \ + if (monitorDebugFlag & DEBUG_ERROR) { \ + tprintf("ERROR MON ", 255, __VA_ARGS__); \ + } +#define monitorWarn(...) \ + if (monitorDebugFlag & DEBUG_WARN) { \ + tprintf("WARN MON ", monitorDebugFlag, __VA_ARGS__); \ + } +#define monitorTrace(...) \ + if (monitorDebugFlag & DEBUG_TRACE) { \ + tprintf("MON ", monitorDebugFlag, __VA_ARGS__); \ + } +#define monitorPrint(...) \ + { tprintf("MON ", 255, __VA_ARGS__); } + +#define monitorLError(...) taosLogError(__VA_ARGS__) monitorError(__VA_ARGS__) +#define monitorLWarn(...) taosLogWarn(__VA_ARGS__) monitorWarn(__VA_ARGS__) +#define monitorLPrint(...) taosLogPrint(__VA_ARGS__) monitorPrint(__VA_ARGS__) #define SQL_LENGTH 1024 #define LOG_LEN_STR 80 diff --git a/src/query/inc/queryExecutor.h b/src/query/inc/queryExecutor.h index 48df8374ab8d8feb90c3333715ba1fb48c168061..244f15e1ddc64a4889cd08466424960814bb44d8 100644 --- a/src/query/inc/queryExecutor.h +++ b/src/query/inc/queryExecutor.h @@ -189,5 +189,4 @@ typedef struct SQInfo { TSKEY* tsList; } SQInfo; - #endif // TDENGINE_QUERYEXECUTOR_H diff --git a/src/query/src/queryExecutor.c b/src/query/src/queryExecutor.c index 1e544966829dce19d5f80af16d3ca1ebb0faa1d2..04f3a711fdae8c312b5fe4b143d0abcbb98364ae 100644 --- a/src/query/src/queryExecutor.c +++ b/src/query/src/queryExecutor.c @@ -12,7 +12,6 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -#include "tsdbMain.h" //todo use TableId instead of STable object #include "os.h" #include "hash.h" @@ -28,6 +27,8 @@ #include "qresultBuf.h" #include "queryExecutor.h" #include "queryUtil.h" +#include "query.h" +#include "tsdbMain.h" //todo use TableId instead of STable object #define DEFAULT_INTERN_BUF_SIZE 16384L @@ -6031,7 +6032,7 @@ static int32_t doDumpQueryResult(SQInfo *pQInfo, char *data) { // todo if interpolation exists, the result may be dump to client by several rounds } -int32_t qCreateQueryInfo(void* tsdb, SQueryTableMsg *pQueryMsg, SQInfo **pQInfo) { +int32_t qCreateQueryInfo(void* tsdb, SQueryTableMsg *pQueryMsg, qinfo_t *pQInfo) { assert(pQueryMsg != NULL); int32_t code = TSDB_CODE_SUCCESS; @@ -6121,12 +6122,14 @@ _query_over: return TSDB_CODE_SUCCESS; } -void qDestroyQueryInfo(SQInfo* pQInfo) { +void qDestroyQueryInfo(qinfo_t pQInfo) { dTrace("QInfo:%p query completed", pQInfo); freeQInfo(pQInfo); } -void qTableQuery(SQInfo *pQInfo) { +void qTableQuery(qinfo_t qinfo) { + SQInfo* pQInfo = (SQInfo*) qinfo; + if (pQInfo == NULL || pQInfo->signature != pQInfo) { dTrace("%p freed abort query", pQInfo); return; @@ -6148,7 +6151,9 @@ void qTableQuery(SQInfo *pQInfo) { // vnodeDecRefCount(pQInfo); } -int32_t qRetrieveQueryResultInfo(SQInfo *pQInfo) { +int32_t qRetrieveQueryResultInfo(qinfo_t qinfo) { + SQInfo* pQInfo = (SQInfo*) qinfo; + if (pQInfo == NULL || !isValidQInfo(pQInfo)) { return TSDB_CODE_INVALID_QHANDLE; } @@ -6166,7 +6171,9 @@ int32_t qRetrieveQueryResultInfo(SQInfo *pQInfo) { return pQInfo->code; } -bool qHasMoreResultsToRetrieve(SQInfo* pQInfo) { +bool qHasMoreResultsToRetrieve(qinfo_t qinfo) { + SQInfo* pQInfo = (SQInfo*) qinfo; + if (pQInfo == NULL || pQInfo->signature != pQInfo || pQInfo->code != TSDB_CODE_SUCCESS) { return false; } @@ -6183,7 +6190,9 @@ bool qHasMoreResultsToRetrieve(SQInfo* pQInfo) { } } -int32_t qDumpRetrieveResult(SQInfo *pQInfo, SRetrieveTableRsp** pRsp, int32_t* contLen) { +int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp** pRsp, int32_t* contLen) { + SQInfo* pQInfo = (SQInfo*) qinfo; + if (pQInfo == NULL || !isValidQInfo(pQInfo)) { return TSDB_CODE_INVALID_QHANDLE; } diff --git a/src/rpc/CMakeLists.txt b/src/rpc/CMakeLists.txt index 229b1077f83093223a3b1ffbfdf55c7e4f106ff4..141ae3499aff6a80e2cbd8b29b42bf5ee0d42f0f 100644 --- a/src/rpc/CMakeLists.txt +++ b/src/rpc/CMakeLists.txt @@ -24,7 +24,7 @@ ELSEIF (TD_WINDOWS_64) ENDIF () ADD_LIBRARY(trpc ${SRC}) -TARGET_LINK_LIBRARIES(trpc tutil lz4) +TARGET_LINK_LIBRARIES(trpc tutil lz4 common) ADD_SUBDIRECTORY(test) diff --git a/src/tsdb/inc/tsdbMain.h b/src/tsdb/inc/tsdbMain.h index d9fed4327bb8a580f47e0119bed88630bdc2304c..ce6999a9e1d2fb1518d238098270034425610477 100644 --- a/src/tsdb/inc/tsdbMain.h +++ b/src/tsdb/inc/tsdbMain.h @@ -15,9 +15,9 @@ #ifndef _TD_TSDB_MAIN_H_ #define _TD_TSDB_MAIN_H_ -#include "tsdb.h" -#include "tlist.h" #include "tglobalcfg.h" +#include "tlist.h" +#include "tsdb.h" #include "tskiplist.h" #include "tutil.h" @@ -90,9 +90,9 @@ typedef struct { STable *superList; // super table list TODO: change it to list container - void *map; // table map of (uid ===> table) + void *map; // table map of (uid ===> table) - SMetaFile *mfh; // meta file handle + SMetaFile *mfh; // meta file handle int maxRowBytes; int maxCols; } STsdbMeta; @@ -119,14 +119,14 @@ STSchema * tsdbGetTableTagSchema(STsdbMeta *pMeta, STable *pTable); #define TSDB_TABLE_OF_ID(pHandle, id) ((pHandle)->pTables)[id] #define TSDB_GET_TABLE_OF_NAME(pHandle, name) /* TODO */ -STsdbMeta* tsdbGetMeta(tsdb_repo_t* pRepo); +STsdbMeta *tsdbGetMeta(tsdb_repo_t *pRepo); int32_t tsdbCreateTableImpl(STsdbMeta *pMeta, STableCfg *pCfg); int32_t tsdbDropTableImpl(STsdbMeta *pMeta, STableId tableId); STable *tsdbIsValidTableToInsert(STsdbMeta *pMeta, STableId tableId); // int32_t tsdbInsertRowToTableImpl(SSkipListNode *pNode, STable *pTable); STable *tsdbGetTableByUid(STsdbMeta *pMeta, int64_t uid); -char *getTupleKey(const void * data); +char * getTupleKey(const void *data); // ------------------------------ TSDB CACHE INTERFACES ------------------------------ #define TSDB_DEFAULT_CACHE_BLOCK_SIZE 16 * 1024 * 1024 /* 16M */ @@ -192,8 +192,8 @@ typedef struct { } SFileInfo; typedef struct { - int fd; - char fname[128]; + int fd; + char fname[128]; SFileInfo info; } SFile; @@ -217,13 +217,15 @@ typedef struct { STsdbFileH *tsdbInitFileH(char *dataDir, int maxFiles); void tsdbCloseFileH(STsdbFileH *pFileH); -int tsdbCreateFile(char *dataDir, int fileId, const char *suffix, int maxTables, SFile *pFile, int writeHeader, int toClose); +int tsdbCreateFile(char *dataDir, int fileId, const char *suffix, int maxTables, SFile *pFile, int writeHeader, + int toClose); int tsdbCreateFGroup(STsdbFileH *pFileH, char *dataDir, int fid, int maxTables); int tsdbOpenFile(SFile *pFile, int oflag); -int tsdbCloseFile(SFile *pFile); SFileGroup *tsdbOpenFilesForCommit(STsdbFileH *pFileH, int fid); +int tsdbCloseFile(SFile *pFile); +SFileGroup *tsdbOpenFilesForCommit(STsdbFileH *pFileH, int fid); int tsdbRemoveFileGroup(STsdbFileH *pFile, int fid); -#define TSDB_FGROUP_ITER_FORWARD TSDB_ORDER_ASC +#define TSDB_FGROUP_ITER_FORWARD TSDB_ORDER_ASC #define TSDB_FGROUP_ITER_BACKWARD TSDB_ORDER_DESC typedef struct { @@ -278,15 +280,15 @@ typedef struct { } SCompInfo; #define TSDB_COMPBLOCK_AT(pCompInfo, idx) ((pCompInfo)->blocks + (idx)) -#define TSDB_COMPBLOCK_GET_START_AND_SIZE(pCompInfo, pCompBlock, size)\ -do {\ - if (pCompBlock->numOfSubBlocks > 1) {\ - pCompBlock = pCompInfo->blocks + pCompBlock->offset;\ - size = pCompBlock->numOfSubBlocks;\ - } else {\ - size = 1;\ - }\ -} while (0) +#define TSDB_COMPBLOCK_GET_START_AND_SIZE(pCompInfo, pCompBlock, size) \ + do { \ + if (pCompBlock->numOfSubBlocks > 1) { \ + pCompBlock = pCompInfo->blocks + pCompBlock->offset; \ + size = pCompBlock->numOfSubBlocks; \ + } else { \ + size = 1; \ + } \ + } while (0) // TODO: take pre-calculation into account typedef struct { @@ -304,9 +306,10 @@ typedef struct { SCompCol cols[]; } SCompData; -STsdbFileH* tsdbGetFile(tsdb_repo_t* pRepo); +STsdbFileH *tsdbGetFile(tsdb_repo_t *pRepo); -int tsdbCopyBlockDataInFile(SFile *pOutFile, SFile *pInFile, SCompInfo *pCompInfo, int idx, int isLast, SDataCols *pCols); +int tsdbCopyBlockDataInFile(SFile *pOutFile, SFile *pInFile, SCompInfo *pCompInfo, int idx, int isLast, + SDataCols *pCols); int tsdbLoadCompIdx(SFileGroup *pGroup, void *buf, int maxTables); int tsdbLoadCompBlocks(SFileGroup *pGroup, SCompIdx *pIdx, void *buf); @@ -350,6 +353,30 @@ typedef struct _tsdb_repo { } STsdbRepo; +typedef struct { + int32_t totalLen; + int32_t len; + SDataRow row; +} SSubmitBlkIter; + +int tsdbInitSubmitBlkIter(SSubmitBlk *pBlock, SSubmitBlkIter *pIter); +SDataRow tsdbGetSubmitBlkNext(SSubmitBlkIter *pIter); + +#define TSDB_SUBMIT_MSG_HEAD_SIZE sizeof(SSubmitMsg) + +// SSubmitMsg Iterator +typedef struct { + int32_t totalLen; + int32_t len; + SSubmitBlk *pBlock; +} SSubmitMsgIter; + +int tsdbInitSubmitMsgIter(SSubmitMsg *pMsg, SSubmitMsgIter *pIter); +SSubmitBlk *tsdbGetSubmitMsgNext(SSubmitMsgIter *pIter); + +int32_t tsdbTriggerCommit(tsdb_repo_t *repo); +int32_t tsdbLockRepo(tsdb_repo_t *repo); +int32_t tsdbUnLockRepo(tsdb_repo_t *repo); #ifdef __cplusplus } diff --git a/src/tsdb/src/tsdbMain.c b/src/tsdb/src/tsdbMain.c index 8f99a6359ac38c0583a65e22138ec47f6ff9342f..f26b44f1fc1867551ec438d43250d80b2f2e6ad4 100644 --- a/src/tsdb/src/tsdbMain.c +++ b/src/tsdb/src/tsdbMain.c @@ -387,7 +387,7 @@ int32_t tsdbInsertData(tsdb_repo_t *repo, SSubmitMsg *pMsg) { /** * Initialize a table configuration */ -int tsdbInitTableCfg(STableCfg *config, TSDB_TABLE_TYPE type, int64_t uid, int32_t tid) { +int tsdbInitTableCfg(STableCfg *config, ETableType type, int64_t uid, int32_t tid) { if (config == NULL) return -1; if (type != TSDB_NORMAL_TABLE && type != TSDB_CHILD_TABLE) return -1; diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index a814bf52ab65aaf85f7c3042e6622ad9b4a3337f..f875cfff943d908a3efd27fdc1499fac4c705830 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -107,8 +107,4 @@ ELSEIF(TD_DARWIN_64) TARGET_LINK_LIBRARIES(tutil iconv pthread os) ENDIF() -#IF (TD_CLUSTER) # TARGET_LINK_LIBRARIES(tutil mstorage) -#ENDIF () - - diff --git a/src/util/inc/tlog.h b/src/util/inc/tlog.h index 8a3bd6bc7c9b2728430f5341d0f1b0c94bc9b17c..485f8644d37bf9750f7a1898f5a9d1e4834d71a2 100644 --- a/src/util/inc/tlog.h +++ b/src/util/inc/tlog.h @@ -177,87 +177,6 @@ extern uint32_t cdebugFlag; tprintf("DND QRY ", qdebugFlag, __VA_ARGS__); \ } -// mnode log function -#define mError(...) \ - if (mdebugFlag & DEBUG_ERROR) { \ - tprintf("ERROR MND ", 255, __VA_ARGS__); \ - } -#define mWarn(...) \ - if (mdebugFlag & DEBUG_WARN) { \ - tprintf("WARN MND ", mdebugFlag, __VA_ARGS__); \ - } -#define mTrace(...) \ - if (mdebugFlag & DEBUG_TRACE) { \ - tprintf("MND ", mdebugFlag, __VA_ARGS__); \ - } -#define mPrint(...) \ - { tprintf("MND ", 255, __VA_ARGS__); } - -#define mLError(...) taosLogError(__VA_ARGS__) mError(__VA_ARGS__) -#define mLWarn(...) taosLogWarn(__VA_ARGS__) mWarn(__VA_ARGS__) -#define mLPrint(...) taosLogPrint(__VA_ARGS__) mPrint(__VA_ARGS__) - -#define httpError(...) \ - if (httpDebugFlag & DEBUG_ERROR) { \ - tprintf("ERROR HTP ", 255, __VA_ARGS__); \ - } -#define httpWarn(...) \ - if (httpDebugFlag & DEBUG_WARN) { \ - tprintf("WARN HTP ", httpDebugFlag, __VA_ARGS__); \ - } -#define httpTrace(...) \ - if (httpDebugFlag & DEBUG_TRACE) { \ - tprintf("HTP ", httpDebugFlag, __VA_ARGS__); \ - } -#define httpDump(...) \ - if (httpDebugFlag & DEBUG_TRACE) { \ - taosPrintLongString("HTP ", httpDebugFlag, __VA_ARGS__); \ - } -#define httpPrint(...) \ - { tprintf("HTP ", 255, __VA_ARGS__); } - -#define httpLError(...) taosLogError(__VA_ARGS__) httpError(__VA_ARGS__) -#define httpLWarn(...) taosLogWarn(__VA_ARGS__) httpWarn(__VA_ARGS__) -#define httpLPrint(...) taosLogPrint(__VA_ARGS__) httpPrint(__VA_ARGS__) - -#define monitorError(...) \ - if (monitorDebugFlag & DEBUG_ERROR) { \ - tprintf("ERROR MON ", 255, __VA_ARGS__); \ - } -#define monitorWarn(...) \ - if (monitorDebugFlag & DEBUG_WARN) { \ - tprintf("WARN MON ", monitorDebugFlag, __VA_ARGS__); \ - } -#define monitorTrace(...) \ - if (monitorDebugFlag & DEBUG_TRACE) { \ - tprintf("MON ", monitorDebugFlag, __VA_ARGS__); \ - } -#define monitorPrint(...) \ - { tprintf("MON ", 255, __VA_ARGS__); } - -#define monitorLError(...) taosLogError(__VA_ARGS__) monitorError(__VA_ARGS__) -#define monitorLWarn(...) taosLogWarn(__VA_ARGS__) monitorWarn(__VA_ARGS__) -#define monitorLPrint(...) taosLogPrint(__VA_ARGS__) monitorPrint(__VA_ARGS__) - -#define sdbError(...) \ - if (sdbDebugFlag & DEBUG_ERROR) { \ - tprintf("ERROR MND-SDB ", 255, __VA_ARGS__); \ - } -#define sdbWarn(...) \ - if (sdbDebugFlag & DEBUG_WARN) { \ - tprintf("WARN MND-SDB ", sdbDebugFlag, __VA_ARGS__); \ - } -#define sdbTrace(...) \ - if (sdbDebugFlag & DEBUG_TRACE) { \ - tprintf("MND-SDB ", sdbDebugFlag, __VA_ARGS__); \ - } -#define sdbPrint(...) \ - { tprintf("MND-SDB ", 255, __VA_ARGS__); } - -#define sdbLError(...) taosLogError(__VA_ARGS__) sdbError(__VA_ARGS__) -#define sdbLWarn(...) taosLogWarn(__VA_ARGS__) sdbWarn(__VA_ARGS__) -#define sdbLPrint(...) taosLogPrint(__VA_ARGS__) sdbPrint(__VA_ARGS__) - #ifdef __cplusplus } #endif diff --git a/src/util/inc/tsched.h b/src/util/inc/tsched.h index c9ce6b388f9374bf21abab9036c4f0707d547f14..3e481cbc327b495975fb03bc4e4d850e4372f044 100644 --- a/src/util/inc/tsched.h +++ b/src/util/inc/tsched.h @@ -20,22 +20,17 @@ extern "C" { #endif -typedef struct _sched_msg { - void (*fp)(struct _sched_msg *); - +typedef struct SSchedMsg { + void (*fp)(struct SSchedMsg *); void (*tfp)(void *, void *); - void *msg; void *ahandle; void *thandle; } SSchedMsg; void *taosInitScheduler(int queueSize, int numOfThreads, const char *label); - void *taosInitSchedulerWithInfo(int queueSize, int numOfThreads, const char *label, void *tmrCtrl); - -int taosScheduleTask(void *qhandle, SSchedMsg *pMsg); - +int taosScheduleTask(void *qhandle, SSchedMsg *pMsg); void taosCleanUpScheduler(void *param); #ifdef __cplusplus diff --git a/src/util/inc/tutil.h b/src/util/inc/tutil.h index a31d71dd192f90c1a597bee556ae3559e596d10b..18a277c7fa19e7819279ee8fd0f0542bedb826e9 100644 --- a/src/util/inc/tutil.h +++ b/src/util/inc/tutil.h @@ -144,6 +144,7 @@ int32_t taosFileRename(char *fullPath, char *suffix, char delimiter, char **dstP void getTmpfilePath(const char *fileNamePattern, char *dstPath); int32_t taosInitTimer(void (*callback)(int), int32_t ms); +void taosUninitTimer(); bool taosMbsToUcs4(char *mbs, int32_t mbs_len, char *ucs4, int32_t ucs4_max_len); diff --git a/src/util/src/talgo.c b/src/util/src/talgo.c index 7a682cd466adaadd39cf38190725ff8ace7ba2ce..76de87e67d5ef295a75976fa8c85e39d61f16006 100644 --- a/src/util/src/talgo.c +++ b/src/util/src/talgo.c @@ -168,6 +168,7 @@ void * taosbsearch(const void *key, const void *base, size_t nmemb, size_t size, if (flags == TD_EQ) { return bsearch(key, base, nmemb, size, compar); } else if (flags == TD_GE) { + if (nmemb <= 0) return NULL; if ((*compar)(key, elePtrAt(base, size, 0)) <= 0) return elePtrAt(base, size, 0); if ((*compar)(key, elePtrAt(base, size, nmemb - 1)) > 0) return NULL; @@ -193,6 +194,7 @@ void * taosbsearch(const void *key, const void *base, size_t nmemb, size_t size, } } } else if (flags == TD_LE) { + if (nmemb <= 0) return NULL; if ((*compar)(key, elePtrAt(base, size, nmemb - 1)) >= 0) return elePtrAt(base, size, nmemb - 1); if ((*compar)(key, elePtrAt(base, size, 0)) < 0) return NULL; diff --git a/src/util/src/tglobalcfg.c b/src/util/src/tglobalcfg.c index 8ce4530dbf997b6673d4e8cdd903428ea0a07ddc..d91230164115408c029aee93e0a708c533aca8b8 100644 --- a/src/util/src/tglobalcfg.c +++ b/src/util/src/tglobalcfg.c @@ -110,12 +110,7 @@ short tsDaysPerFile = 10; int tsDaysToKeep = 3650; int tsReplications = TSDB_REPLICA_MIN_NUM; -#ifdef _MPEER int tsNumOfMPeers = 3; -#else -int tsNumOfMPeers = 1; -#endif - int tsMaxShellConns = 2000; int tsMaxTables = 100000; @@ -556,7 +551,7 @@ static void doInitGlobalConfig() { tsInitConfigOption(cfg++, "tblocks", &tsNumOfBlocksPerMeter, TSDB_CFG_VTYPE_SHORT, TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW, 32, 4096, 0, TSDB_CFG_UTYPE_NONE); -#ifdef _MPEER +#ifdef _SYNC tsInitConfigOption(cfg++, "numOfMPeers", &tsNumOfMPeers, TSDB_CFG_VTYPE_INT, TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW | TSDB_CFG_CTYPE_B_CLUSTER, 1, 3, 0, TSDB_CFG_UTYPE_NONE); diff --git a/src/util/src/ttimer.c b/src/util/src/ttimer.c index 04cad7565514e7dc4eea5385d4f8c19eb875556d..25862fbec3c969439a3a3c4186c5726869740315 100644 --- a/src/util/src/ttimer.c +++ b/src/util/src/ttimer.c @@ -84,8 +84,6 @@ static tmr_ctrl_t* tmrCtrls; static tmr_ctrl_t* unusedTmrCtrl = NULL; static void* tmrQhandle; static int numOfTmrCtrl = 0; -//static void* tmrContext = NULL; -static int athread = 0; int taosTmrThreads = 1; @@ -519,7 +517,7 @@ static void taosTmrModuleInit(void) { } tmrQhandle = taosInitScheduler(10000, taosTmrThreads, "tmr"); - athread = taosInitTimer(taosTimerLoopFunc, MSECONDS_PER_TICK); + taosInitTimer(taosTimerLoopFunc, MSECONDS_PER_TICK); tmrTrace("timer module is initialized, number of threads: %d", taosTmrThreads); } @@ -562,19 +560,29 @@ void taosTmrCleanUp(void* handle) { pthread_mutex_unlock(&tmrCtrlMutex); if (numOfTmrCtrl <=0) { -// pthread_cancel(athread); + taosUninitTimer(); + taosCleanUpScheduler(tmrQhandle); + for (int i = 0; i < tListLen(wheels); i++) { time_wheel_t* wheel = wheels + i; pthread_mutex_destroy(&wheel->mutex); free(wheel->slots); } - pthread_mutex_destroy(&tmrCtrlMutex); - free(timerMap.slots); + pthread_mutex_destroy(&tmrCtrlMutex); + + for (size_t i = 0; i < timerMap.size; i++) { + timer_list_t* list = timerMap.slots + i; + tmr_obj_t* t = list->timers; + while (t != NULL) { + tmr_obj_t* next = t->mnext; + free(t); + t = next; + } + } + free(timerMap.slots); free(tmrCtrls); - taosCleanUpScheduler(tmrQhandle); - tmrModuleInit = PTHREAD_ONCE_INIT; tmrTrace("timer module is cleaned up"); } diff --git a/src/vnode/src/vnodeMain.c b/src/vnode/src/vnodeMain.c index 7ec9b0fef79d387e553d0c0f000bbe1d3187cb88..0827d90ebcee8732cd2fe867e7baa1084c6cbf5f 100644 --- a/src/vnode/src/vnodeMain.c +++ b/src/vnode/src/vnodeMain.c @@ -42,7 +42,7 @@ static void vnodeNotifyRole(void *ahandle, int8_t role); static pthread_once_t vnodeModuleInit = PTHREAD_ONCE_INIT; -#ifndef _VPEER +#ifndef _SYNC tsync_h syncStart(const SSyncInfo *info) { return NULL; } int syncForwardToPeer(tsync_h shandle, void *pHead, void *mhandle) { return 0; } #endif diff --git a/src/wal/src/walMain.c b/src/wal/src/walMain.c index edca4e371cdbc09cfe98f26e7b7972348c1e8098..9a9c658f1be4b3e403566af3ed7036f89b695a70 100644 --- a/src/wal/src/walMain.c +++ b/src/wal/src/walMain.c @@ -52,6 +52,7 @@ static uint32_t walSignature = 0xFAFBFDFE; static int walHandleExistingFiles(const char *path); static int walRestoreWalFile(const char *name, void *pVnode, FWalWrite writeFp); static int walRemoveWalFiles(const char *path); +static int walMoveOldWalFilesBack(const char *path); void *walOpen(const char *path, const SWalCfg *pCfg) { SWal *pWal = calloc(sizeof(SWal), 1); @@ -213,7 +214,11 @@ int walRestore(void *handle, void *pVnode, int (*writeFp)(void *, void *, int)) } if (code == 0) { - code = walRemoveWalFiles(opath); + if (pWal->keep) { + code = walMoveOldWalFilesBack(pWal->path); + } else { + code = walRemoveWalFiles(opath); + } if (code == 0) { if (remove(opath) < 0) { wError("wal:%s, failed to remove directory(%s)", opath, strerror(errno)); @@ -365,4 +370,40 @@ static int walRemoveWalFiles(const char *path) { return code; } +int walMoveOldWalFilesBack(const char *path) { + char oname[TSDB_FILENAME_LEN * 3]; + char nname[TSDB_FILENAME_LEN * 3]; + char opath[TSDB_FILENAME_LEN]; + struct dirent *ent; + int plen = strlen(walPrefix); + int code = 0; + + sprintf(opath, "%s/old", path); + + if (access(opath, F_OK) == 0) { + // move all old files to wal directory + int count = 0; + + DIR *dir = opendir(opath); + while ((ent = readdir(dir))!= NULL) { + if ( strncmp(ent->d_name, walPrefix, plen) == 0) { + sprintf(oname, "%s/%s", opath, ent->d_name); + sprintf(nname, "%s/%s", path, ent->d_name); + if (rename(oname, nname) < 0) { + wError("wal:%s, failed to move to new:%s", oname, nname); + code = -1; + break; + } + + count++; + } + } + + wTrace("wal:%s, %d old files are move back for keep option is set", path, count); + closedir(dir); + } + + return code; +} + diff --git a/tests/pytest/insert/basic.py b/tests/pytest/insert/basic.py index c6dbd76de4c4699f2bde3c864a1ff43e6424cbb8..5ec83fd249d200cf2612b0688b97bb92cb14f75b 100644 --- a/tests/pytest/insert/basic.py +++ b/tests/pytest/insert/basic.py @@ -41,8 +41,8 @@ class TDTestCase: # tdSql.execute('insert into tb values (now - 7m , 10)') # tdSql.execute('insert into tb values (now - 8m , 10)') -# tdSql.query("select * from tb") -# tdSql.checkRows(insertRows) + tdSql.query("select * from tb") + tdSql.checkRows(insertRows) def stop(self): tdSql.close() diff --git a/tests/pytest/simpletest.sh b/tests/pytest/simpletest.sh index 0a905beaa1230adcd8f9e5341e92ac0613bd1d51..bffb3689b2f24136851e736b5b516c4aa96c621c 100755 --- a/tests/pytest/simpletest.sh +++ b/tests/pytest/simpletest.sh @@ -1 +1 @@ -sudo python3 ./test.py -f insert/basic.py +sudo python ./test.py -f insert/basic.py diff --git a/tests/test-all.sh b/tests/test-all.sh new file mode 100755 index 0000000000000000000000000000000000000000..8bd01119c4cee2e836d39ce181ca30941271ed85 --- /dev/null +++ b/tests/test-all.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# Color setting +RED='\033[0;31m' +GREEN='\033[1;32m' +GREEN_DARK='\033[0;32m' +GREEN_UNDERLINE='\033[4;32m' +NC='\033[0m' + +cd script +sudo ./test.sh 2>&1 | grep 'success\|failed' | tee out.txt + +total_success=`grep success out.txt | wc -l` + +if [ "$total_success" -gt "0" ]; then + total_success=`expr $total_success - 1` + echo -e "${GREEN} ### Total $total_success TSIM case(s) succeed! ### ${NC}" +fi + +total_failed=`grep failed out.txt | wc -l` +if [ "$total_failed" -ne "0" ]; then + echo -e "${RED} ### Total $total_failed TSIM case(s) failed! ### ${NC}" + exit $total_failed +fi + +cd ../pytest +sudo ./simpletest.sh 2>&1 | grep 'successfully executed\|failed' | tee pytest-out.txt +total_py_success=`grep 'successfully executed' pytest-out.txt | wc -l` + +if [ "$total_py_success" -gt "0" ]; then + echo -e "${GREEN} ### Total $total_py_success python case(s) succeed! ### ${NC}" +fi + +total_py_failed=`grep 'failed' pytest-out.txt | wc -l` +if [ "$total_py_failed" -ne "0" ]; then + echo -e "${RED} ### Total $total_py_failed python case(s) failed! ### ${NC}" + exit $total_py_failed +fi + diff --git a/tests/tsim/inc/sim.h b/tests/tsim/inc/sim.h index 9d5227ff1e6124d717b1d0877b904666c30e2523..01fd0789a96c515d0895c3b5e92641fa29339247 100644 --- a/tests/tsim/inc/sim.h +++ b/tests/tsim/inc/sim.h @@ -23,7 +23,6 @@ #include "taos.h" #include "tidpool.h" #include "tlog.h" -#include "tmodule.h" #include "tutil.h" #define MAX_MAIN_SCRIPT_NUM 10