Merge branch 'main' into feature/3_liaohj
This commit is contained in:
commit
497c9ea9c8
|
@ -2,7 +2,7 @@
|
||||||
# taos-tools
|
# taos-tools
|
||||||
ExternalProject_Add(taos-tools
|
ExternalProject_Add(taos-tools
|
||||||
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
||||||
GIT_TAG 6ae60ac
|
GIT_TAG 149ac34
|
||||||
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
|
|
@ -177,6 +177,16 @@ typedef enum _mgmt_table {
|
||||||
#define TSDB_ALTER_USER_SYSINFO 0xA
|
#define TSDB_ALTER_USER_SYSINFO 0xA
|
||||||
#define TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC 0xB
|
#define TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC 0xB
|
||||||
#define TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC 0xC
|
#define TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC 0xC
|
||||||
|
#define TSDB_ALTER_USER_ADD_READ_TABLE 0xD
|
||||||
|
#define TSDB_ALTER_USER_REMOVE_READ_TABLE 0xE
|
||||||
|
#define TSDB_ALTER_USER_ADD_WRITE_TABLE 0xF
|
||||||
|
#define TSDB_ALTER_USER_REMOVE_WRITE_TABLE 0x10
|
||||||
|
#define TSDB_ALTER_USER_ADD_READ_TAG 0x11
|
||||||
|
#define TSDB_ALTER_USER_REMOVE_READ_TAG 0x12
|
||||||
|
#define TSDB_ALTER_USER_ADD_WRITE_TAG 0x13
|
||||||
|
#define TSDB_ALTER_USER_REMOVE_WRITE_TAG 0x14
|
||||||
|
#define TSDB_ALTER_USER_ADD_ALL_TABLE 0x15
|
||||||
|
#define TSDB_ALTER_USER_REMOVE_ALL_TABLE 0x16
|
||||||
|
|
||||||
#define TSDB_ALTER_USER_PRIVILEGES 0x2
|
#define TSDB_ALTER_USER_PRIVILEGES 0x2
|
||||||
|
|
||||||
|
@ -676,6 +686,9 @@ typedef struct {
|
||||||
char user[TSDB_USER_LEN];
|
char user[TSDB_USER_LEN];
|
||||||
char pass[TSDB_USET_PASSWORD_LEN];
|
char pass[TSDB_USET_PASSWORD_LEN];
|
||||||
char objname[TSDB_DB_FNAME_LEN]; // db or topic
|
char objname[TSDB_DB_FNAME_LEN]; // db or topic
|
||||||
|
char tabName[TSDB_TABLE_NAME_LEN];
|
||||||
|
char* tagCond;
|
||||||
|
int32_t tagCondLen;
|
||||||
} SAlterUserReq;
|
} SAlterUserReq;
|
||||||
|
|
||||||
int32_t tSerializeSAlterUserReq(void* buf, int32_t bufLen, SAlterUserReq* pReq);
|
int32_t tSerializeSAlterUserReq(void* buf, int32_t bufLen, SAlterUserReq* pReq);
|
||||||
|
@ -698,6 +711,8 @@ typedef struct {
|
||||||
SHashObj* createdDbs;
|
SHashObj* createdDbs;
|
||||||
SHashObj* readDbs;
|
SHashObj* readDbs;
|
||||||
SHashObj* writeDbs;
|
SHashObj* writeDbs;
|
||||||
|
SHashObj* readTbs;
|
||||||
|
SHashObj* writeTbs;
|
||||||
} SGetUserAuthRsp;
|
} SGetUserAuthRsp;
|
||||||
|
|
||||||
int32_t tSerializeSGetUserAuthRsp(void* buf, int32_t bufLen, SGetUserAuthRsp* pRsp);
|
int32_t tSerializeSGetUserAuthRsp(void* buf, int32_t bufLen, SGetUserAuthRsp* pRsp);
|
||||||
|
|
|
@ -63,55 +63,55 @@
|
||||||
#define TK_READ 45
|
#define TK_READ 45
|
||||||
#define TK_WRITE 46
|
#define TK_WRITE 46
|
||||||
#define TK_NK_DOT 47
|
#define TK_NK_DOT 47
|
||||||
#define TK_DNODE 48
|
#define TK_WITH 48
|
||||||
#define TK_PORT 49
|
#define TK_DNODE 49
|
||||||
#define TK_DNODES 50
|
#define TK_PORT 50
|
||||||
#define TK_NK_IPTOKEN 51
|
#define TK_DNODES 51
|
||||||
#define TK_FORCE 52
|
#define TK_NK_IPTOKEN 52
|
||||||
#define TK_LOCAL 53
|
#define TK_FORCE 53
|
||||||
#define TK_QNODE 54
|
#define TK_LOCAL 54
|
||||||
#define TK_BNODE 55
|
#define TK_QNODE 55
|
||||||
#define TK_SNODE 56
|
#define TK_BNODE 56
|
||||||
#define TK_MNODE 57
|
#define TK_SNODE 57
|
||||||
#define TK_DATABASE 58
|
#define TK_MNODE 58
|
||||||
#define TK_USE 59
|
#define TK_DATABASE 59
|
||||||
#define TK_FLUSH 60
|
#define TK_USE 60
|
||||||
#define TK_TRIM 61
|
#define TK_FLUSH 61
|
||||||
#define TK_COMPACT 62
|
#define TK_TRIM 62
|
||||||
#define TK_IF 63
|
#define TK_COMPACT 63
|
||||||
#define TK_NOT 64
|
#define TK_IF 64
|
||||||
#define TK_EXISTS 65
|
#define TK_NOT 65
|
||||||
#define TK_BUFFER 66
|
#define TK_EXISTS 66
|
||||||
#define TK_CACHEMODEL 67
|
#define TK_BUFFER 67
|
||||||
#define TK_CACHESIZE 68
|
#define TK_CACHEMODEL 68
|
||||||
#define TK_COMP 69
|
#define TK_CACHESIZE 69
|
||||||
#define TK_DURATION 70
|
#define TK_COMP 70
|
||||||
#define TK_NK_VARIABLE 71
|
#define TK_DURATION 71
|
||||||
#define TK_MAXROWS 72
|
#define TK_NK_VARIABLE 72
|
||||||
#define TK_MINROWS 73
|
#define TK_MAXROWS 73
|
||||||
#define TK_KEEP 74
|
#define TK_MINROWS 74
|
||||||
#define TK_PAGES 75
|
#define TK_KEEP 75
|
||||||
#define TK_PAGESIZE 76
|
#define TK_PAGES 76
|
||||||
#define TK_TSDB_PAGESIZE 77
|
#define TK_PAGESIZE 77
|
||||||
#define TK_PRECISION 78
|
#define TK_TSDB_PAGESIZE 78
|
||||||
#define TK_REPLICA 79
|
#define TK_PRECISION 79
|
||||||
#define TK_VGROUPS 80
|
#define TK_REPLICA 80
|
||||||
#define TK_SINGLE_STABLE 81
|
#define TK_VGROUPS 81
|
||||||
#define TK_RETENTIONS 82
|
#define TK_SINGLE_STABLE 82
|
||||||
#define TK_SCHEMALESS 83
|
#define TK_RETENTIONS 83
|
||||||
#define TK_WAL_LEVEL 84
|
#define TK_SCHEMALESS 84
|
||||||
#define TK_WAL_FSYNC_PERIOD 85
|
#define TK_WAL_LEVEL 85
|
||||||
#define TK_WAL_RETENTION_PERIOD 86
|
#define TK_WAL_FSYNC_PERIOD 86
|
||||||
#define TK_WAL_RETENTION_SIZE 87
|
#define TK_WAL_RETENTION_PERIOD 87
|
||||||
#define TK_WAL_ROLL_PERIOD 88
|
#define TK_WAL_RETENTION_SIZE 88
|
||||||
#define TK_WAL_SEGMENT_SIZE 89
|
#define TK_WAL_ROLL_PERIOD 89
|
||||||
#define TK_STT_TRIGGER 90
|
#define TK_WAL_SEGMENT_SIZE 90
|
||||||
#define TK_TABLE_PREFIX 91
|
#define TK_STT_TRIGGER 91
|
||||||
#define TK_TABLE_SUFFIX 92
|
#define TK_TABLE_PREFIX 92
|
||||||
#define TK_NK_COLON 93
|
#define TK_TABLE_SUFFIX 93
|
||||||
#define TK_MAX_SPEED 94
|
#define TK_NK_COLON 94
|
||||||
#define TK_START 95
|
#define TK_MAX_SPEED 95
|
||||||
#define TK_WITH 96
|
#define TK_START 96
|
||||||
#define TK_TIMESTAMP 97
|
#define TK_TIMESTAMP 97
|
||||||
#define TK_END 98
|
#define TK_END 98
|
||||||
#define TK_TABLE 99
|
#define TK_TABLE 99
|
||||||
|
|
|
@ -29,6 +29,7 @@ extern "C" {
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
#include "tname.h"
|
#include "tname.h"
|
||||||
#include "transport.h"
|
#include "transport.h"
|
||||||
|
#include "nodes.h"
|
||||||
|
|
||||||
typedef struct SCatalog SCatalog;
|
typedef struct SCatalog SCatalog;
|
||||||
|
|
||||||
|
@ -49,10 +50,15 @@ typedef enum {
|
||||||
|
|
||||||
typedef struct SUserAuthInfo {
|
typedef struct SUserAuthInfo {
|
||||||
char user[TSDB_USER_LEN];
|
char user[TSDB_USER_LEN];
|
||||||
char dbFName[TSDB_DB_FNAME_LEN];
|
SName tbName;
|
||||||
AUTH_TYPE type;
|
AUTH_TYPE type;
|
||||||
} SUserAuthInfo;
|
} SUserAuthInfo;
|
||||||
|
|
||||||
|
typedef struct SUserAuthRes {
|
||||||
|
bool pass;
|
||||||
|
SNode* pCond;
|
||||||
|
} SUserAuthRes;
|
||||||
|
|
||||||
typedef struct SDbInfo {
|
typedef struct SDbInfo {
|
||||||
int32_t vgVer;
|
int32_t vgVer;
|
||||||
int32_t tbNum;
|
int32_t tbNum;
|
||||||
|
@ -96,7 +102,7 @@ typedef struct SMetaData {
|
||||||
SArray* pTableIndex; // pRes = SArray<STableIndexInfo>*
|
SArray* pTableIndex; // pRes = SArray<STableIndexInfo>*
|
||||||
SArray* pUdfList; // pRes = SFuncInfo*
|
SArray* pUdfList; // pRes = SFuncInfo*
|
||||||
SArray* pIndex; // pRes = SIndexInfo*
|
SArray* pIndex; // pRes = SIndexInfo*
|
||||||
SArray* pUser; // pRes = bool*
|
SArray* pUser; // pRes = SUserAuthRes*
|
||||||
SArray* pQnodeList; // pRes = SArray<SQueryNodeLoad>*
|
SArray* pQnodeList; // pRes = SArray<SQueryNodeLoad>*
|
||||||
SArray* pTableCfg; // pRes = STableCfg*
|
SArray* pTableCfg; // pRes = STableCfg*
|
||||||
SArray* pDnodeList; // pRes = SArray<SEpSet>*
|
SArray* pDnodeList; // pRes = SArray<SEpSet>*
|
||||||
|
@ -312,11 +318,9 @@ int32_t catalogUpdateTableIndex(SCatalog* pCtg, STableIndexRsp* pRsp);
|
||||||
|
|
||||||
int32_t catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* funcName, SFuncInfo* pInfo);
|
int32_t catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* funcName, SFuncInfo* pInfo);
|
||||||
|
|
||||||
int32_t catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, const char* dbFName, AUTH_TYPE type,
|
int32_t catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, SUserAuthInfo *pAuth, SUserAuthRes* pRes);
|
||||||
bool* pass);
|
|
||||||
|
|
||||||
int32_t catalogChkAuthFromCache(SCatalog* pCtg, const char* user, const char* dbFName, AUTH_TYPE type, bool* pass,
|
int32_t catalogChkAuthFromCache(SCatalog* pCtg, SUserAuthInfo *pAuth, SUserAuthRes* pRes, bool* exists);
|
||||||
bool* exists);
|
|
||||||
|
|
||||||
int32_t catalogUpdateUserAuthInfo(SCatalog* pCtg, SGetUserAuthRsp* pAuth);
|
int32_t catalogUpdateUserAuthInfo(SCatalog* pCtg, SGetUserAuthRsp* pAuth);
|
||||||
|
|
||||||
|
|
|
@ -456,7 +456,9 @@ typedef struct SGrantStmt {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
char userName[TSDB_USER_LEN];
|
char userName[TSDB_USER_LEN];
|
||||||
char objName[TSDB_DB_NAME_LEN]; // db or topic
|
char objName[TSDB_DB_NAME_LEN]; // db or topic
|
||||||
|
char tabName[TSDB_TABLE_NAME_LEN];
|
||||||
int64_t privileges;
|
int64_t privileges;
|
||||||
|
SNode* pTagCond;
|
||||||
} SGrantStmt;
|
} SGrantStmt;
|
||||||
|
|
||||||
typedef SGrantStmt SRevokeStmt;
|
typedef SGrantStmt SRevokeStmt;
|
||||||
|
|
|
@ -298,6 +298,7 @@ typedef struct SSelectStmt {
|
||||||
bool hasUniqueFunc;
|
bool hasUniqueFunc;
|
||||||
bool hasTailFunc;
|
bool hasTailFunc;
|
||||||
bool hasInterpFunc;
|
bool hasInterpFunc;
|
||||||
|
bool hasInterpPseudoColFunc;
|
||||||
bool hasLastRowFunc;
|
bool hasLastRowFunc;
|
||||||
bool hasLastFunc;
|
bool hasLastFunc;
|
||||||
bool hasTimeLineFunc;
|
bool hasTimeLineFunc;
|
||||||
|
|
|
@ -31,21 +31,49 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CUS_NAME) || defined(CUS_PROMPT) || defined(CUS_EMAIL)
|
||||||
|
#include "cus_name.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
|
|
||||||
#define TD_TMP_DIR_PATH "C:\\Windows\\Temp\\"
|
#define TD_TMP_DIR_PATH "C:\\Windows\\Temp\\"
|
||||||
|
#ifdef CUS_NAME
|
||||||
|
#define TD_CFG_DIR_PATH "C:\\"CUS_NAME"\\cfg\\"
|
||||||
|
#define TD_DATA_DIR_PATH "C:\\"CUS_NAME"\\data\\"
|
||||||
|
#define TD_LOG_DIR_PATH "C:\\"CUS_NAME"\\log\\"
|
||||||
|
#else
|
||||||
#define TD_CFG_DIR_PATH "C:\\TDengine\\cfg\\"
|
#define TD_CFG_DIR_PATH "C:\\TDengine\\cfg\\"
|
||||||
#define TD_DATA_DIR_PATH "C:\\TDengine\\data\\"
|
#define TD_DATA_DIR_PATH "C:\\TDengine\\data\\"
|
||||||
#define TD_LOG_DIR_PATH "C:\\TDengine\\log\\"
|
#define TD_LOG_DIR_PATH "C:\\TDengine\\log\\"
|
||||||
|
#endif // CUS_NAME
|
||||||
|
|
||||||
#elif defined(_TD_DARWIN_64)
|
#elif defined(_TD_DARWIN_64)
|
||||||
|
|
||||||
|
#ifdef CUS_PROMPT
|
||||||
|
#define TD_TMP_DIR_PATH "/tmp/"CUS_PROMPT"d/"
|
||||||
|
#define TD_CFG_DIR_PATH "/etc/"CUS_PROMPT"/"
|
||||||
|
#define TD_DATA_DIR_PATH "/var/lib/"CUS_PROMPT"/"
|
||||||
|
#define TD_LOG_DIR_PATH "/var/log/"CUS_PROMPT"/"
|
||||||
|
#else
|
||||||
#define TD_TMP_DIR_PATH "/tmp/taosd/"
|
#define TD_TMP_DIR_PATH "/tmp/taosd/"
|
||||||
#define TD_CFG_DIR_PATH "/etc/taos/"
|
#define TD_CFG_DIR_PATH "/etc/taos/"
|
||||||
#define TD_DATA_DIR_PATH "/var/lib/taos/"
|
#define TD_DATA_DIR_PATH "/var/lib/taos/"
|
||||||
#define TD_LOG_DIR_PATH "/var/log/taos/"
|
#define TD_LOG_DIR_PATH "/var/log/taos/"
|
||||||
|
#endif // CUS_PROMPT
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define TD_TMP_DIR_PATH "/tmp/"
|
#define TD_TMP_DIR_PATH "/tmp/"
|
||||||
|
#ifdef CUS_PROMPT
|
||||||
|
#define TD_CFG_DIR_PATH "/etc/"CUS_PROMPT"/"
|
||||||
|
#define TD_DATA_DIR_PATH "/var/lib/"CUS_PROMPT"/"
|
||||||
|
#define TD_LOG_DIR_PATH "/var/log/"CUS_PROMPT"/"
|
||||||
|
#else
|
||||||
#define TD_CFG_DIR_PATH "/etc/taos/"
|
#define TD_CFG_DIR_PATH "/etc/taos/"
|
||||||
#define TD_DATA_DIR_PATH "/var/lib/taos/"
|
#define TD_DATA_DIR_PATH "/var/lib/taos/"
|
||||||
#define TD_LOG_DIR_PATH "/var/log/taos/"
|
#define TD_LOG_DIR_PATH "/var/log/taos/"
|
||||||
|
#endif // CUS_PROMPT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct TdDir *TdDirPtr;
|
typedef struct TdDir *TdDirPtr;
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CUS_NAME_H_
|
||||||
|
#define _CUS_NAME_H_
|
||||||
|
|
||||||
|
#ifndef CUS_NAME
|
||||||
|
#define CUS_NAME "TDengine"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CUS_PROMPT
|
||||||
|
#define CUS_PROMPT "taos"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CUS_EMAIL
|
||||||
|
#define CUS_EMAIL "<support@taosdata.com>"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _CUS_NAME_H_
|
|
@ -241,6 +241,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_MND_INVALID_ALTER_OPER TAOS_DEF_ERROR_CODE(0, 0x0356)
|
#define TSDB_CODE_MND_INVALID_ALTER_OPER TAOS_DEF_ERROR_CODE(0, 0x0356)
|
||||||
#define TSDB_CODE_MND_AUTH_FAILURE TAOS_DEF_ERROR_CODE(0, 0x0357)
|
#define TSDB_CODE_MND_AUTH_FAILURE TAOS_DEF_ERROR_CODE(0, 0x0357)
|
||||||
#define TSDB_CODE_MND_USER_NOT_AVAILABLE TAOS_DEF_ERROR_CODE(0, 0x0358)
|
#define TSDB_CODE_MND_USER_NOT_AVAILABLE TAOS_DEF_ERROR_CODE(0, 0x0358)
|
||||||
|
#define TSDB_CODE_MND_PRIVILEDGE_EXIST TAOS_DEF_ERROR_CODE(0, 0x0359)
|
||||||
|
|
||||||
// mnode-stable-part1
|
// mnode-stable-part1
|
||||||
#define TSDB_CODE_MND_STB_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0360)
|
#define TSDB_CODE_MND_STB_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0360)
|
||||||
|
|
|
@ -198,6 +198,7 @@ typedef enum ELogicConditionType {
|
||||||
#define TSDB_STREAM_NAME_LEN 193 // it is a null-terminated string
|
#define TSDB_STREAM_NAME_LEN 193 // it is a null-terminated string
|
||||||
#define TSDB_DB_NAME_LEN 65
|
#define TSDB_DB_NAME_LEN 65
|
||||||
#define TSDB_DB_FNAME_LEN (TSDB_ACCT_ID_LEN + TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN)
|
#define TSDB_DB_FNAME_LEN (TSDB_ACCT_ID_LEN + TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN)
|
||||||
|
#define TSDB_PRIVILEDGE_CONDITION_LEN 200
|
||||||
|
|
||||||
#define TSDB_FUNC_NAME_LEN 65
|
#define TSDB_FUNC_NAME_LEN 65
|
||||||
#define TSDB_FUNC_COMMENT_LEN 1024 * 1024
|
#define TSDB_FUNC_COMMENT_LEN 1024 * 1024
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
########################################################
|
########################################################
|
||||||
# #
|
# #
|
||||||
# Configuration #
|
# Configuration #
|
||||||
# Any questions, please email support@taosdata.com #
|
|
||||||
# #
|
# #
|
||||||
########################################################
|
########################################################
|
||||||
|
|
||||||
|
@ -13,7 +12,7 @@
|
||||||
|
|
||||||
############### 1. Cluster End point ############################
|
############### 1. Cluster End point ############################
|
||||||
|
|
||||||
# The end point of the first dnode in the cluster to be connected to when this dnode or a CLI `taos` is started
|
# The end point of the first dnode in the cluster to be connected to when this dnode or the CLI utility is started
|
||||||
# firstEp hostname:6030
|
# firstEp hostname:6030
|
||||||
|
|
||||||
# The end point of the second dnode to be connected to if the firstEp is not available
|
# The end point of the second dnode to be connected to if the firstEp is not available
|
||||||
|
@ -139,7 +138,7 @@
|
||||||
# debug flag for query
|
# debug flag for query
|
||||||
# qDebugFlag 131
|
# qDebugFlag 131
|
||||||
|
|
||||||
# debug flag for taosc driver
|
# debug flag for client driver
|
||||||
# cDebugFlag 131
|
# cDebugFlag 131
|
||||||
|
|
||||||
# debug flag for dnode messages
|
# debug flag for dnode messages
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=TDengine server service
|
Description=server service
|
||||||
After=network-online.target
|
After=network-online.target
|
||||||
Wants=network-online.target
|
Wants=network-online.target
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
# is required to use systemd to manage services at boot
|
# is required to use systemd to manage services at boot
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
#set -x
|
# set -x
|
||||||
|
|
||||||
verMode=edge
|
verMode=edge
|
||||||
pagMode=full
|
pagMode=full
|
||||||
|
@ -34,21 +34,25 @@ benchmarkName="taosBenchmark"
|
||||||
dumpName="taosdump"
|
dumpName="taosdump"
|
||||||
demoName="taosdemo"
|
demoName="taosdemo"
|
||||||
xname="taosx"
|
xname="taosx"
|
||||||
explorerName="${clientName}-explorer"
|
|
||||||
|
|
||||||
clientName2="taos"
|
clientName2="taos"
|
||||||
serverName2="taosd"
|
serverName2="${clientName2}d"
|
||||||
|
configFile2="${clientName2}.cfg"
|
||||||
productName2="TDengine"
|
productName2="TDengine"
|
||||||
emailName2="taosdata.com"
|
emailName2="taosdata.com"
|
||||||
|
xname2="${clientName2}x"
|
||||||
|
adapterName2="${clientName2}adapter"
|
||||||
|
|
||||||
|
explorerName="${clientName2}-explorer"
|
||||||
benchmarkName2="${clientName2}Benchmark"
|
benchmarkName2="${clientName2}Benchmark"
|
||||||
|
demoName2="${clientName2}demo"
|
||||||
dumpName2="${clientName2}dump"
|
dumpName2="${clientName2}dump"
|
||||||
uninstallScript2="rm${clientName2}"
|
uninstallScript2="rm${clientName2}"
|
||||||
|
|
||||||
historyFile="${clientName2}_history"
|
historyFile="${clientName2}_history"
|
||||||
logDir="/var/log/${clientName2}"
|
logDir="/var/log/${clientName2}"
|
||||||
configDir="/etc/${clientName2}"
|
configDir="/etc/${clientName2}"
|
||||||
installDir="/usr/local/${clientName}"
|
installDir="/usr/local/${clientName2}"
|
||||||
|
|
||||||
data_dir=${dataDir}
|
data_dir=${dataDir}
|
||||||
log_dir=${logDir}
|
log_dir=${logDir}
|
||||||
|
@ -206,15 +210,15 @@ function install_main_path() {
|
||||||
|
|
||||||
function install_bin() {
|
function install_bin() {
|
||||||
# Remove links
|
# Remove links
|
||||||
${csudo}rm -f ${bin_link_dir}/${clientName} || :
|
${csudo}rm -f ${bin_link_dir}/${clientName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${serverName} || :
|
${csudo}rm -f ${bin_link_dir}/${serverName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${udfdName} || :
|
${csudo}rm -f ${bin_link_dir}/${udfdName} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${adapterName} || :
|
${csudo}rm -f ${bin_link_dir}/${adapterName} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${uninstallScript} || :
|
${csudo}rm -f ${bin_link_dir}/${uninstallScript2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${demoName} || :
|
${csudo}rm -f ${bin_link_dir}/${demoName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${benchmarkName} || :
|
${csudo}rm -f ${bin_link_dir}/${benchmarkName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${dumpName} || :
|
${csudo}rm -f ${bin_link_dir}/${dumpName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${xname} || :
|
${csudo}rm -f ${bin_link_dir}/${xname2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${explorerName} || :
|
${csudo}rm -f ${bin_link_dir}/${explorerName} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/set_core || :
|
${csudo}rm -f ${bin_link_dir}/set_core || :
|
||||||
${csudo}rm -f ${bin_link_dir}/TDinsight.sh || :
|
${csudo}rm -f ${bin_link_dir}/TDinsight.sh || :
|
||||||
|
@ -222,24 +226,23 @@ function install_bin() {
|
||||||
${csudo}cp -r ${script_dir}/bin/* ${install_main_dir}/bin && ${csudo}chmod 0555 ${install_main_dir}/bin/*
|
${csudo}cp -r ${script_dir}/bin/* ${install_main_dir}/bin && ${csudo}chmod 0555 ${install_main_dir}/bin/*
|
||||||
|
|
||||||
#Make link
|
#Make link
|
||||||
[ -x ${install_main_dir}/bin/${clientName} ] && ${csudo}ln -sf ${install_main_dir}/bin/${clientName} ${bin_link_dir}/${clientName} || :
|
[ -x ${install_main_dir}/bin/${clientName2} ] && ${csudo}ln -sf ${install_main_dir}/bin/${clientName2} ${bin_link_dir}/${clientName2} || :
|
||||||
[ -x ${install_main_dir}/bin/${serverName} ] && ${csudo}ln -sf ${install_main_dir}/bin/${serverName} ${bin_link_dir}/${serverName} || :
|
[ -x ${install_main_dir}/bin/${serverName2} ] && ${csudo}ln -sf ${install_main_dir}/bin/${serverName2} ${bin_link_dir}/${serverName2} || :
|
||||||
[ -x ${install_main_dir}/bin/${udfdName} ] && ${csudo}ln -sf ${install_main_dir}/bin/${udfdName} ${bin_link_dir}/${udfdName} || :
|
[ -x ${install_main_dir}/bin/${udfdName} ] && ${csudo}ln -sf ${install_main_dir}/bin/${udfdName} ${bin_link_dir}/${udfdName} || :
|
||||||
[ -x ${install_main_dir}/bin/${adapterName} ] && ${csudo}ln -sf ${install_main_dir}/bin/${adapterName} ${bin_link_dir}/${adapterName} || :
|
[ -x ${install_main_dir}/bin/${adapterName2} ] && ${csudo}ln -sf ${install_main_dir}/bin/${adapterName2} ${bin_link_dir}/${adapterName2} || :
|
||||||
[ -x ${install_main_dir}/bin/${benchmarkName} ] && ${csudo}ln -sf ${install_main_dir}/bin/${benchmarkName} ${bin_link_dir}/${demoName} || :
|
[ -x ${install_main_dir}/bin/${benchmarkName2} ] && ${csudo}ln -sf ${install_main_dir}/bin/${benchmarkName2} ${bin_link_dir}/${demoName2} || :
|
||||||
[ -x ${install_main_dir}/bin/${benchmarkName} ] && ${csudo}ln -sf ${install_main_dir}/bin/${benchmarkName} ${bin_link_dir}/${benchmarkName} || :
|
[ -x ${install_main_dir}/bin/${benchmarkName2} ] && ${csudo}ln -sf ${install_main_dir}/bin/${benchmarkName2} ${bin_link_dir}/${benchmarkName2} || :
|
||||||
[ -x ${install_main_dir}/bin/${dumpName} ] && ${csudo}ln -sf ${install_main_dir}/bin/${dumpName} ${bin_link_dir}/${dumpName} || :
|
[ -x ${install_main_dir}/bin/${dumpName2} ] && ${csudo}ln -sf ${install_main_dir}/bin/${dumpName2} ${bin_link_dir}/${dumpName2} || :
|
||||||
[ -x ${install_main_dir}/bin/${xname} ] && ${csudo}ln -sf ${install_main_dir}/bin/${xname} ${bin_link_dir}/${xname} || :
|
[ -x ${install_main_dir}/bin/${xname2} ] && ${csudo}ln -sf ${install_main_dir}/bin/${xname2} ${bin_link_dir}/${xname2} || :
|
||||||
[ -x ${install_main_dir}/bin/${explorerName} ] && ${csudo}ln -sf ${install_main_dir}/bin/${explorerName} ${bin_link_dir}/${explorerName} || :
|
[ -x ${install_main_dir}/bin/${explorerName} ] && ${csudo}ln -sf ${install_main_dir}/bin/${explorerName} ${bin_link_dir}/${explorerName} || :
|
||||||
[ -x ${install_main_dir}/bin/TDinsight.sh ] && ${csudo}ln -sf ${install_main_dir}/bin/TDinsight.sh ${bin_link_dir}/TDinsight.sh || :
|
[ -x ${install_main_dir}/bin/TDinsight.sh ] && ${csudo}ln -sf ${install_main_dir}/bin/TDinsight.sh ${bin_link_dir}/TDinsight.sh || :
|
||||||
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -sf ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript} || :
|
if [ "$clientName2" == "${clientName}" ]; then
|
||||||
[ -x ${install_main_dir}/bin/set_core.sh ] && ${csudo}ln -sf ${install_main_dir}/bin/set_core.sh ${bin_link_dir}/set_core || :
|
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript} || :
|
||||||
|
fi
|
||||||
|
[ -x ${install_main_dir}/bin/set_core.sh ] && ${csudo}ln -s ${install_main_dir}/bin/set_core.sh ${bin_link_dir}/set_core || :
|
||||||
|
|
||||||
if [ "$verMode" == "cluster" ] && [ "$clientName" != "$clientName2" ]; then
|
if [ "$verMode" == "cluster" ] && [ "$clientName" != "$clientName2" ]; then
|
||||||
[ -x ${install_main_dir}/bin/${clientName} ] && ${csudo}ln -sf ${install_main_dir}/bin/${clientName} ${bin_link_dir}/${clientName2} || :
|
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript2} || :
|
||||||
[ -x ${install_main_dir}/bin/${benchmarkName} ] && ${csudo}ln -sf ${install_main_dir}/bin/${benchmarkName} ${bin_link_dir}/${benchmarkName2} || :
|
|
||||||
[ -x ${install_main_dir}/bin/${dumpName} ] && ${csudo}ln -sf ${install_main_dir}/bin/${dumpName} ${bin_link_dir}/${dumpName2} || :
|
|
||||||
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -sf ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript2} || :
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -399,7 +402,7 @@ function set_hostname() {
|
||||||
${csudo}sed -i -r "s/#*\s*(HOSTNAME=\s*).*/\1$newHostname/" /etc/sysconfig/network || :
|
${csudo}sed -i -r "s/#*\s*(HOSTNAME=\s*).*/\1$newHostname/" /etc/sysconfig/network || :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
${csudo}sed -i -r "s/#*\s*(fqdn\s*).*/\1$newHostname/" ${cfg_install_dir}/${configFile}
|
${csudo}sed -i -r "s/#*\s*(fqdn\s*).*/\1$newHostname/" ${cfg_install_dir}/${configFile2}
|
||||||
serverFqdn=$newHostname
|
serverFqdn=$newHostname
|
||||||
|
|
||||||
if [[ -e /etc/hosts ]]; then
|
if [[ -e /etc/hosts ]]; then
|
||||||
|
@ -433,7 +436,7 @@ function set_ipAsFqdn() {
|
||||||
echo -e -n "${GREEN}Unable to get local ip, use 127.0.0.1${NC}"
|
echo -e -n "${GREEN}Unable to get local ip, use 127.0.0.1${NC}"
|
||||||
localFqdn="127.0.0.1"
|
localFqdn="127.0.0.1"
|
||||||
# Write the local FQDN to configuration file
|
# Write the local FQDN to configuration file
|
||||||
${csudo}sed -i -r "s/#*\s*(fqdn\s*).*/\1$localFqdn/" ${cfg_install_dir}/${configFile}
|
${csudo}sed -i -r "s/#*\s*(fqdn\s*).*/\1$localFqdn/" ${cfg_install_dir}/${configFile2}
|
||||||
serverFqdn=$localFqdn
|
serverFqdn=$localFqdn
|
||||||
echo
|
echo
|
||||||
return
|
return
|
||||||
|
@ -455,7 +458,7 @@ function set_ipAsFqdn() {
|
||||||
read -p "Please choose an IP from local IP list:" localFqdn
|
read -p "Please choose an IP from local IP list:" localFqdn
|
||||||
else
|
else
|
||||||
# Write the local FQDN to configuration file
|
# Write the local FQDN to configuration file
|
||||||
${csudo}sed -i -r "s/#*\s*(fqdn\s*).*/\1$localFqdn/" ${cfg_install_dir}/${configFile}
|
${csudo}sed -i -r "s/#*\s*(fqdn\s*).*/\1$localFqdn/" ${cfg_install_dir}/${configFile2}
|
||||||
serverFqdn=$localFqdn
|
serverFqdn=$localFqdn
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
|
@ -519,15 +522,15 @@ function install_adapter_config() {
|
||||||
|
|
||||||
function install_config() {
|
function install_config() {
|
||||||
|
|
||||||
if [ ! -f "${cfg_install_dir}/${configFile}" ]; then
|
if [ ! -f "${cfg_install_dir}/${configFile2}" ]; then
|
||||||
${csudo}mkdir -p ${cfg_install_dir}
|
${csudo}mkdir -p ${cfg_install_dir}
|
||||||
[ -f ${script_dir}/cfg/${configFile} ] && ${csudo}cp ${script_dir}/cfg/${configFile} ${cfg_install_dir}
|
[ -f ${script_dir}/cfg/${configFile2} ] && ${csudo}cp ${script_dir}/cfg/${configFile2} ${cfg_install_dir}
|
||||||
${csudo}chmod 644 ${cfg_install_dir}/*
|
${csudo}chmod 644 ${cfg_install_dir}/*
|
||||||
else
|
else
|
||||||
${csudo}cp -f ${script_dir}/cfg/${configFile} ${cfg_install_dir}/${configFile}.new
|
${csudo}cp -f ${script_dir}/cfg/${configFile2} ${cfg_install_dir}/${configFile2}.new
|
||||||
fi
|
fi
|
||||||
|
|
||||||
${csudo}ln -sf ${cfg_install_dir}/${configFile} ${install_main_dir}/cfg
|
${csudo}ln -sf ${cfg_install_dir}/${configFile2} ${install_main_dir}/cfg
|
||||||
|
|
||||||
[ ! -z $1 ] && return 0 || : # only install client
|
[ ! -z $1 ] && return 0 || : # only install client
|
||||||
|
|
||||||
|
@ -548,7 +551,7 @@ function install_config() {
|
||||||
read firstEp
|
read firstEp
|
||||||
while true; do
|
while true; do
|
||||||
if [ ! -z "$firstEp" ]; then
|
if [ ! -z "$firstEp" ]; then
|
||||||
${csudo}sed -i -r "s/#*\s*(firstEp\s*).*/\1$firstEp/" ${cfg_install_dir}/${configFile}
|
${csudo}sed -i -r "s/#*\s*(firstEp\s*).*/\1$firstEp/" ${cfg_install_dir}/${configFile2}
|
||||||
break
|
break
|
||||||
else
|
else
|
||||||
break
|
break
|
||||||
|
@ -569,6 +572,19 @@ function install_config() {
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function install_share_etc() {
|
||||||
|
for c in `ls ${script_dir}/share/etc/`; do
|
||||||
|
if [ -e /etc/$c ]; then
|
||||||
|
out=/etc/$c.new.`date +%F`
|
||||||
|
${csudo}cp -f ${script_dir}/share/etc/$c $out
|
||||||
|
else
|
||||||
|
${csudo}cp -f ${script_dir}/share/etc/$c /etc/$c
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
${csudo} cp ${script_dir}/share/srv/* ${service_config_dir}
|
||||||
|
}
|
||||||
|
|
||||||
function install_log() {
|
function install_log() {
|
||||||
${csudo}rm -rf ${log_dir} || :
|
${csudo}rm -rf ${log_dir} || :
|
||||||
${csudo}mkdir -p ${log_dir} && ${csudo}chmod 777 ${log_dir}
|
${csudo}mkdir -p ${log_dir} && ${csudo}chmod 777 ${log_dir}
|
||||||
|
@ -600,8 +616,8 @@ function install_web() {
|
||||||
|
|
||||||
|
|
||||||
function clean_service_on_sysvinit() {
|
function clean_service_on_sysvinit() {
|
||||||
if ps aux | grep -v grep | grep ${serverName} &>/dev/null; then
|
if ps aux | grep -v grep | grep ${serverName2} &>/dev/null; then
|
||||||
${csudo}service ${serverName} stop || :
|
${csudo}service ${serverName2} stop || :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ps aux | grep -v grep | grep tarbitrator &>/dev/null; then
|
if ps aux | grep -v grep | grep tarbitrator &>/dev/null; then
|
||||||
|
@ -609,30 +625,30 @@ function clean_service_on_sysvinit() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ((${initd_mod} == 1)); then
|
if ((${initd_mod} == 1)); then
|
||||||
if [ -e ${service_config_dir}/${serverName} ]; then
|
if [ -e ${service_config_dir}/${serverName2} ]; then
|
||||||
${csudo}chkconfig --del ${serverName} || :
|
${csudo}chkconfig --del ${serverName2} || :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -e ${service_config_dir}/tarbitratord ]; then
|
if [ -e ${service_config_dir}/tarbitratord ]; then
|
||||||
${csudo}chkconfig --del tarbitratord || :
|
${csudo}chkconfig --del tarbitratord || :
|
||||||
fi
|
fi
|
||||||
elif ((${initd_mod} == 2)); then
|
elif ((${initd_mod} == 2)); then
|
||||||
if [ -e ${service_config_dir}/${serverName} ]; then
|
if [ -e ${service_config_dir}/${serverName2} ]; then
|
||||||
${csudo}insserv -r ${serverName} || :
|
${csudo}insserv -r ${serverName2} || :
|
||||||
fi
|
fi
|
||||||
if [ -e ${service_config_dir}/tarbitratord ]; then
|
if [ -e ${service_config_dir}/tarbitratord ]; then
|
||||||
${csudo}insserv -r tarbitratord || :
|
${csudo}insserv -r tarbitratord || :
|
||||||
fi
|
fi
|
||||||
elif ((${initd_mod} == 3)); then
|
elif ((${initd_mod} == 3)); then
|
||||||
if [ -e ${service_config_dir}/${serverName} ]; then
|
if [ -e ${service_config_dir}/${serverName2} ]; then
|
||||||
${csudo}update-rc.d -f ${serverName} remove || :
|
${csudo}update-rc.d -f ${serverName2} remove || :
|
||||||
fi
|
fi
|
||||||
if [ -e ${service_config_dir}/tarbitratord ]; then
|
if [ -e ${service_config_dir}/tarbitratord ]; then
|
||||||
${csudo}update-rc.d -f tarbitratord remove || :
|
${csudo}update-rc.d -f tarbitratord remove || :
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
${csudo}rm -f ${service_config_dir}/${serverName} || :
|
${csudo}rm -f ${service_config_dir}/${serverName2} || :
|
||||||
${csudo}rm -f ${service_config_dir}/tarbitratord || :
|
${csudo}rm -f ${service_config_dir}/tarbitratord || :
|
||||||
|
|
||||||
if $(which init &>/dev/null); then
|
if $(which init &>/dev/null); then
|
||||||
|
@ -653,24 +669,24 @@ function install_service_on_sysvinit() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ((${initd_mod} == 1)); then
|
if ((${initd_mod} == 1)); then
|
||||||
${csudo}chkconfig --add ${serverName} || :
|
${csudo}chkconfig --add ${serverName2} || :
|
||||||
${csudo}chkconfig --level 2345 ${serverName} on || :
|
${csudo}chkconfig --level 2345 ${serverName2} on || :
|
||||||
elif ((${initd_mod} == 2)); then
|
elif ((${initd_mod} == 2)); then
|
||||||
${csudo}insserv ${serverName} || :
|
${csudo}insserv ${serverName2} || :
|
||||||
${csudo}insserv -d ${serverName} || :
|
${csudo}insserv -d ${serverName2} || :
|
||||||
elif ((${initd_mod} == 3)); then
|
elif ((${initd_mod} == 3)); then
|
||||||
${csudo}update-rc.d ${serverName} defaults || :
|
${csudo}update-rc.d ${serverName2} defaults || :
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function clean_service_on_systemd() {
|
function clean_service_on_systemd() {
|
||||||
taosd_service_config="${service_config_dir}/${serverName}.service"
|
service_config="${service_config_dir}/${serverName2}.service"
|
||||||
if systemctl is-active --quiet ${serverName}; then
|
if systemctl is-active --quiet ${serverName2}; then
|
||||||
echo "${productName} is running, stopping it..."
|
echo "${productName} is running, stopping it..."
|
||||||
${csudo}systemctl stop ${serverName} &>/dev/null || echo &>/dev/null
|
${csudo}systemctl stop ${serverName2} &>/dev/null || echo &>/dev/null
|
||||||
fi
|
fi
|
||||||
${csudo}systemctl disable ${serverName} &>/dev/null || echo &>/dev/null
|
${csudo}systemctl disable ${serverName2} &>/dev/null || echo &>/dev/null
|
||||||
${csudo}rm -f ${taosd_service_config}
|
${csudo}rm -f ${service_config}
|
||||||
|
|
||||||
tarbitratord_service_config="${service_config_dir}/tarbitratord.service"
|
tarbitratord_service_config="${service_config_dir}/tarbitratord.service"
|
||||||
if systemctl is-active --quiet tarbitratord; then
|
if systemctl is-active --quiet tarbitratord; then
|
||||||
|
@ -682,24 +698,46 @@ function clean_service_on_systemd() {
|
||||||
# if [ "$verMode" == "cluster" ] && [ "$clientName" != "$clientName2" ]; then
|
# if [ "$verMode" == "cluster" ] && [ "$clientName" != "$clientName2" ]; then
|
||||||
# ${csudo}rm -f ${service_config_dir}/${serverName2}.service
|
# ${csudo}rm -f ${service_config_dir}/${serverName2}.service
|
||||||
# fi
|
# fi
|
||||||
|
x_service_config="${service_config_dir}/${xName2}.service"
|
||||||
|
if [ -e "$x_service_config" ]; then
|
||||||
|
if systemctl is-active --quiet ${xName2}; then
|
||||||
|
echo "${productName2} ${xName2} is running, stopping it..."
|
||||||
|
${csudo}systemctl stop ${xName2} &>/dev/null || echo &>/dev/null
|
||||||
|
fi
|
||||||
|
${csudo}systemctl disable ${xName2} &>/dev/null || echo &>/dev/null
|
||||||
|
${csudo}rm -f ${x_service_config}
|
||||||
|
fi
|
||||||
|
|
||||||
|
explorer_service_config="${service_config_dir}/${explorerName2}.service"
|
||||||
|
if [ -e "$explorer_service_config" ]; then
|
||||||
|
if systemctl is-active --quiet ${explorerName2}; then
|
||||||
|
echo "${productName2} ${explorerName2} is running, stopping it..."
|
||||||
|
${csudo}systemctl stop ${explorerName2} &>/dev/null || echo &>/dev/null
|
||||||
|
fi
|
||||||
|
${csudo}systemctl disable ${explorerName2} &>/dev/null || echo &>/dev/null
|
||||||
|
${csudo}rm -f ${explorer_service_config}
|
||||||
|
${csudo}rm -f /etc/${clientName2}/explorer.toml
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function install_service_on_systemd() {
|
function install_service_on_systemd() {
|
||||||
clean_service_on_systemd
|
clean_service_on_systemd
|
||||||
|
|
||||||
[ -f ${script_dir}/cfg/${serverName}.service ] &&
|
install_share_etc
|
||||||
${csudo}cp ${script_dir}/cfg/${serverName}.service \
|
|
||||||
|
[ -f ${script_dir}/cfg/${serverName2}.service ] &&
|
||||||
|
${csudo}cp ${script_dir}/cfg/${serverName2}.service \
|
||||||
${service_config_dir}/ || :
|
${service_config_dir}/ || :
|
||||||
|
|
||||||
# if [ "$verMode" == "cluster" ] && [ "$clientName" != "$clientName2" ]; then
|
# if [ "$verMode" == "cluster" ] && [ "$clientName" != "$clientName2" ]; then
|
||||||
# [ -f ${script_dir}/cfg/${serverName}.service ] &&
|
# [ -f ${script_dir}/cfg/${serverName2}.service ] &&
|
||||||
# ${csudo}cp ${script_dir}/cfg/${serverName}.service \
|
# ${csudo}cp ${script_dir}/cfg/${serverName2}.service \
|
||||||
# ${service_config_dir}/${serverName2}.service || :
|
# ${service_config_dir}/${serverName2}.service || :
|
||||||
# fi
|
# fi
|
||||||
|
|
||||||
${csudo}systemctl daemon-reload
|
${csudo}systemctl daemon-reload
|
||||||
|
|
||||||
${csudo}systemctl enable ${serverName}
|
${csudo}systemctl enable ${serverName2}
|
||||||
|
|
||||||
${csudo}systemctl daemon-reload
|
${csudo}systemctl daemon-reload
|
||||||
}
|
}
|
||||||
|
@ -719,7 +757,7 @@ function install_service() {
|
||||||
elif ((${service_mod} == 1)); then
|
elif ((${service_mod} == 1)); then
|
||||||
install_service_on_sysvinit
|
install_service_on_sysvinit
|
||||||
else
|
else
|
||||||
kill_process ${serverName}
|
kill_process ${serverName2}
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -756,10 +794,10 @@ function is_version_compatible() {
|
||||||
if [ -f ${script_dir}/driver/vercomp.txt ]; then
|
if [ -f ${script_dir}/driver/vercomp.txt ]; then
|
||||||
min_compatible_version=$(cat ${script_dir}/driver/vercomp.txt)
|
min_compatible_version=$(cat ${script_dir}/driver/vercomp.txt)
|
||||||
else
|
else
|
||||||
min_compatible_version=$(${script_dir}/bin/${serverName} -V | head -1 | cut -d ' ' -f 5)
|
min_compatible_version=$(${script_dir}/bin/${serverName2} -V | head -1 | cut -d ' ' -f 5)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exist_version=$(${installDir}/bin/${serverName} -V | head -1 | cut -d ' ' -f 3)
|
exist_version=$(${installDir}/bin/${serverName2} -V | head -1 | cut -d ' ' -f 3)
|
||||||
vercomp $exist_version "3.0.0.0"
|
vercomp $exist_version "3.0.0.0"
|
||||||
case $? in
|
case $? in
|
||||||
2)
|
2)
|
||||||
|
@ -829,13 +867,13 @@ function updateProduct() {
|
||||||
|
|
||||||
echo -e "${GREEN}Start to update ${productName2}...${NC}"
|
echo -e "${GREEN}Start to update ${productName2}...${NC}"
|
||||||
# Stop the service if running
|
# Stop the service if running
|
||||||
if ps aux | grep -v grep | grep ${serverName} &>/dev/null; then
|
if ps aux | grep -v grep | grep ${serverName2} &>/dev/null; then
|
||||||
if ((${service_mod} == 0)); then
|
if ((${service_mod} == 0)); then
|
||||||
${csudo}systemctl stop ${serverName} || :
|
${csudo}systemctl stop ${serverName2} || :
|
||||||
elif ((${service_mod} == 1)); then
|
elif ((${service_mod} == 1)); then
|
||||||
${csudo}service ${serverName} stop || :
|
${csudo}service ${serverName2} stop || :
|
||||||
else
|
else
|
||||||
kill_process ${serverName}
|
kill_process ${serverName2}
|
||||||
fi
|
fi
|
||||||
sleep 1
|
sleep 1
|
||||||
fi
|
fi
|
||||||
|
@ -862,21 +900,21 @@ function updateProduct() {
|
||||||
openresty_work=false
|
openresty_work=false
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo -e "${GREEN_DARK}To configure ${productName2} ${NC}: edit ${cfg_install_dir}/${configFile}"
|
echo -e "${GREEN_DARK}To configure ${productName2} ${NC}: edit ${cfg_install_dir}/${configFile2}"
|
||||||
[ -f ${configDir}/taosadapter.toml ] && [ -f ${installDir}/bin/taosadapter ] && \
|
[ -f ${configDir}/${clientName2}adapter.toml ] && [ -f ${installDir}/bin/${clientName2}adapter ] && \
|
||||||
echo -e "${GREEN_DARK}To configure ${clientName2} Adapter ${NC}: edit ${configDir}/taosadapter.toml"
|
echo -e "${GREEN_DARK}To configure ${clientName2} Adapter ${NC}: edit ${configDir}/${clientName2}adapter.toml"
|
||||||
if ((${service_mod} == 0)); then
|
if ((${service_mod} == 0)); then
|
||||||
echo -e "${GREEN_DARK}To start ${productName2} ${NC}: ${csudo}systemctl start ${serverName}${NC}"
|
echo -e "${GREEN_DARK}To start ${productName2} ${NC}: ${csudo}systemctl start ${serverName2}${NC}"
|
||||||
[ -f ${service_config_dir}/taosadapter.service ] && [ -f ${installDir}/bin/taosadapter ] && \
|
[ -f ${service_config_dir}/${clientName2}adapter.service ] && [ -f ${installDir}/bin/${clientName2}adapter ] && \
|
||||||
echo -e "${GREEN_DARK}To start ${clientName2} Adapter ${NC}: ${csudo}systemctl start taosadapter ${NC}"
|
echo -e "${GREEN_DARK}To start ${clientName2} Adapter ${NC}: ${csudo}systemctl start ${clientName2}adapter ${NC}"
|
||||||
elif ((${service_mod} == 1)); then
|
elif ((${service_mod} == 1)); then
|
||||||
echo -e "${GREEN_DARK}To start ${productName2} ${NC}: ${csudo}service ${serverName} start${NC}"
|
echo -e "${GREEN_DARK}To start ${productName2} ${NC}: ${csudo}service ${serverName2} start${NC}"
|
||||||
[ -f ${service_config_dir}/taosadapter.service ] && [ -f ${installDir}/bin/taosadapter ] && \
|
[ -f ${service_config_dir}/${clientName2}adapter.service ] && [ -f ${installDir}/bin/${clientName2}adapter ] && \
|
||||||
echo -e "${GREEN_DARK}To start ${clientName2} Adapter ${NC}: ${csudo}service taosadapter start${NC}"
|
echo -e "${GREEN_DARK}To start ${clientName2} Adapter ${NC}: ${csudo}service ${clientName2}adapter start${NC}"
|
||||||
else
|
else
|
||||||
echo -e "${GREEN_DARK}To start ${productName2} ${NC}: ./${serverName}${NC}"
|
echo -e "${GREEN_DARK}To start ${productName2} ${NC}: ./${serverName2}${NC}"
|
||||||
[ -f ${installDir}/bin/taosadapter ] && \
|
[ -f ${installDir}/bin/${clientName2}adapter ] && \
|
||||||
echo -e "${GREEN_DARK}To start ${clientName2} Adapter ${NC}: taosadapter &${NC}"
|
echo -e "${GREEN_DARK}To start ${clientName2} Adapter ${NC}: ${clientName2}adapter &${NC}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ${openresty_work} = 'true' ]; then
|
if [ ${openresty_work} = 'true' ]; then
|
||||||
|
@ -887,7 +925,7 @@ function updateProduct() {
|
||||||
|
|
||||||
if ((${prompt_force} == 1)); then
|
if ((${prompt_force} == 1)); then
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${RED}Please run '${serverName} --force-keep-file' at first time for the exist ${productName2} $exist_version!${NC}"
|
echo -e "${RED}Please run '${serverName2} --force-keep-file' at first time for the exist ${productName2} $exist_version!${NC}"
|
||||||
fi
|
fi
|
||||||
echo
|
echo
|
||||||
echo -e "\033[44;32;1m${productName2} is updated successfully!${NC}"
|
echo -e "\033[44;32;1m${productName2} is updated successfully!${NC}"
|
||||||
|
@ -899,7 +937,7 @@ function updateProduct() {
|
||||||
echo -e "\033[44;32;1m${productName2} client is updated successfully!${NC}"
|
echo -e "\033[44;32;1m${productName2} client is updated successfully!${NC}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -rf $(tar -tf ${tarName} | grep -v "^\./$")
|
rm -rf $(tar -tf ${tarName} | grep -Ev "^\./$|^\/")
|
||||||
}
|
}
|
||||||
|
|
||||||
function installProduct() {
|
function installProduct() {
|
||||||
|
@ -944,21 +982,21 @@ function installProduct() {
|
||||||
|
|
||||||
# Ask if to start the service
|
# Ask if to start the service
|
||||||
echo
|
echo
|
||||||
echo -e "${GREEN_DARK}To configure ${productName2} ${NC}: edit ${cfg_install_dir}/${configFile}"
|
echo -e "${GREEN_DARK}To configure ${productName2} ${NC}: edit ${cfg_install_dir}/${configFile2}"
|
||||||
[ -f ${configDir}/taosadapter.toml ] && [ -f ${installDir}/bin/taosadapter ] && \
|
[ -f ${configDir}/${clientName2}adapter.toml ] && [ -f ${installDir}/bin/${clientName2}adapter ] && \
|
||||||
echo -e "${GREEN_DARK}To configure ${clientName2} Adapter ${NC}: edit ${configDir}/taosadapter.toml"
|
echo -e "${GREEN_DARK}To configure ${clientName2} Adapter ${NC}: edit ${configDir}/${clientName2}adapter.toml"
|
||||||
if ((${service_mod} == 0)); then
|
if ((${service_mod} == 0)); then
|
||||||
echo -e "${GREEN_DARK}To start ${productName2} ${NC}: ${csudo}systemctl start ${serverName}${NC}"
|
echo -e "${GREEN_DARK}To start ${productName2} ${NC}: ${csudo}systemctl start ${serverName2}${NC}"
|
||||||
[ -f ${service_config_dir}/taosadapter.service ] && [ -f ${installDir}/bin/taosadapter ] && \
|
[ -f ${service_config_dir}/${clientName2}adapter.service ] && [ -f ${installDir}/bin/${clientName2}adapter ] && \
|
||||||
echo -e "${GREEN_DARK}To start ${clientName2} Adapter ${NC}: ${csudo}systemctl start taosadapter ${NC}"
|
echo -e "${GREEN_DARK}To start ${clientName2} Adapter ${NC}: ${csudo}systemctl start ${clientName2}adapter ${NC}"
|
||||||
elif ((${service_mod} == 1)); then
|
elif ((${service_mod} == 1)); then
|
||||||
echo -e "${GREEN_DARK}To start ${productName2} ${NC}: ${csudo}service ${serverName} start${NC}"
|
echo -e "${GREEN_DARK}To start ${productName2} ${NC}: ${csudo}service ${serverName2} start${NC}"
|
||||||
[ -f ${service_config_dir}/taosadapter.service ] && [ -f ${installDir}/bin/taosadapter ] && \
|
[ -f ${service_config_dir}/${clientName2}adapter.service ] && [ -f ${installDir}/bin/${clientName2}adapter ] && \
|
||||||
echo -e "${GREEN_DARK}To start ${clientName2} Adapter ${NC}: ${csudo}service taosadapter start${NC}"
|
echo -e "${GREEN_DARK}To start ${clientName2} Adapter ${NC}: ${csudo}service ${clientName2}adapter start${NC}"
|
||||||
else
|
else
|
||||||
echo -e "${GREEN_DARK}To start ${productName2} ${NC}: ${serverName}${NC}"
|
echo -e "${GREEN_DARK}To start ${productName2} ${NC}: ${serverName2}${NC}"
|
||||||
[ -f ${installDir}/bin/taosadapter ] && \
|
[ -f ${installDir}/bin/${clientName2}adapter ] && \
|
||||||
echo -e "${GREEN_DARK}To start ${clientName2} Adapter ${NC}: taosadapter &${NC}"
|
echo -e "${GREEN_DARK}To start ${clientName2} Adapter ${NC}: ${clientName2}adapter &${NC}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -z "$firstEp" ]; then
|
if [ ! -z "$firstEp" ]; then
|
||||||
|
@ -991,7 +1029,7 @@ function installProduct() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
touch ~/.${historyFile}
|
touch ~/.${historyFile}
|
||||||
rm -rf $(tar -tf ${tarName} | grep -v "^\./$")
|
rm -rf $(tar -tf ${tarName} | grep -Ev "^\./$|^\/")
|
||||||
}
|
}
|
||||||
|
|
||||||
## ==============================Main program starts from here============================
|
## ==============================Main program starts from here============================
|
||||||
|
@ -1002,7 +1040,7 @@ if [ "$verType" == "server" ]; then
|
||||||
echo -e "\033[44;31;5mThe default data directory ${data_dir} contains old data of ${productName2} 2.x, please clear it before installing!\033[0m"
|
echo -e "\033[44;31;5mThe default data directory ${data_dir} contains old data of ${productName2} 2.x, please clear it before installing!\033[0m"
|
||||||
else
|
else
|
||||||
# Install server and client
|
# Install server and client
|
||||||
if [ -x ${bin_dir}/${serverName} ]; then
|
if [ -x ${bin_dir}/${serverName2} ]; then
|
||||||
update_flag=1
|
update_flag=1
|
||||||
updateProduct
|
updateProduct
|
||||||
else
|
else
|
||||||
|
@ -1012,7 +1050,7 @@ if [ "$verType" == "server" ]; then
|
||||||
elif [ "$verType" == "client" ]; then
|
elif [ "$verType" == "client" ]; then
|
||||||
interactiveFqdn=no
|
interactiveFqdn=no
|
||||||
# Only install client
|
# Only install client
|
||||||
if [ -x ${bin_dir}/${clientName} ]; then
|
if [ -x ${bin_dir}/${clientName2} ]; then
|
||||||
update_flag=1
|
update_flag=1
|
||||||
updateProduct client
|
updateProduct client
|
||||||
else
|
else
|
||||||
|
|
|
@ -23,9 +23,12 @@ clientName2="${12}"
|
||||||
|
|
||||||
productName="TDengine"
|
productName="TDengine"
|
||||||
clientName="taos"
|
clientName="taos"
|
||||||
|
benchmarkName="taosBenchmark"
|
||||||
configFile="taos.cfg"
|
configFile="taos.cfg"
|
||||||
tarName="package.tar.gz"
|
tarName="package.tar.gz"
|
||||||
|
|
||||||
|
benchmarkName2="${clientName2}Benchmark"
|
||||||
|
|
||||||
if [ "$osType" != "Darwin" ]; then
|
if [ "$osType" != "Darwin" ]; then
|
||||||
script_dir="$(dirname $(readlink -f $0))"
|
script_dir="$(dirname $(readlink -f $0))"
|
||||||
top_dir="$(readlink -f ${script_dir}/../..)"
|
top_dir="$(readlink -f ${script_dir}/../..)"
|
||||||
|
@ -53,11 +56,12 @@ fi
|
||||||
|
|
||||||
# Directories and files.
|
# Directories and files.
|
||||||
|
|
||||||
if [ "$verMode" == "cluster" ]; then
|
#if [ "$verMode" == "cluster" ]; then
|
||||||
sed -i 's/verMode=edge/verMode=cluster/g' ${script_dir}/remove_client.sh
|
# sed -i 's/verMode=edge/verMode=cluster/g' ${script_dir}/remove_client.sh
|
||||||
sed -i "s/clientName2=\"taos\"/clientName2=\"${clientName2}\"/g" ${script_dir}/remove_client.sh
|
# sed -i "s/clientName2=\"taos\"/clientName2=\"${clientName2}\"/g" ${script_dir}/remove_client.sh
|
||||||
sed -i "s/productName2=\"TDengine\"/productName2=\"${productName2}\"/g" ${script_dir}/remove_client.sh
|
# sed -i "s/configFile2=\"taos\"/configFile2=\"${clientName2}\"/g" ${script_dir}/remove_client.sh
|
||||||
fi
|
# sed -i "s/productName2=\"TDengine\"/productName2=\"${productName2}\"/g" ${script_dir}/remove_client.sh
|
||||||
|
#fi
|
||||||
|
|
||||||
if [ "$osType" != "Darwin" ]; then
|
if [ "$osType" != "Darwin" ]; then
|
||||||
if [ "$pagMode" == "lite" ]; then
|
if [ "$pagMode" == "lite" ]; then
|
||||||
|
@ -66,6 +70,7 @@ if [ "$osType" != "Darwin" ]; then
|
||||||
${script_dir}/remove_client.sh"
|
${script_dir}/remove_client.sh"
|
||||||
else
|
else
|
||||||
bin_files="${build_dir}/bin/${clientName} \
|
bin_files="${build_dir}/bin/${clientName} \
|
||||||
|
${build_dir}/bin/${benchmarkName} \
|
||||||
${script_dir}/remove_client.sh \
|
${script_dir}/remove_client.sh \
|
||||||
${script_dir}/set_core.sh \
|
${script_dir}/set_core.sh \
|
||||||
${script_dir}/get_client.sh"
|
${script_dir}/get_client.sh"
|
||||||
|
@ -153,6 +158,7 @@ if [ "$verMode" == "cluster" ]; then
|
||||||
sed -i 's/verMode=edge/verMode=cluster/g' install_client_temp.sh
|
sed -i 's/verMode=edge/verMode=cluster/g' install_client_temp.sh
|
||||||
sed -i "s/serverName2=\"taosd\"/serverName2=\"${serverName2}\"/g" install_client_temp.sh
|
sed -i "s/serverName2=\"taosd\"/serverName2=\"${serverName2}\"/g" install_client_temp.sh
|
||||||
sed -i "s/clientName2=\"taos\"/clientName2=\"${clientName2}\"/g" install_client_temp.sh
|
sed -i "s/clientName2=\"taos\"/clientName2=\"${clientName2}\"/g" install_client_temp.sh
|
||||||
|
sed -i "s/configFile2=\"taos.cfg\"/configFile2=\"${clientName2}.cfg\"/g" install_client_temp.sh
|
||||||
sed -i "s/productName2=\"TDengine\"/productName2=\"${productName2}\"/g" install_client_temp.sh
|
sed -i "s/productName2=\"TDengine\"/productName2=\"${productName2}\"/g" install_client_temp.sh
|
||||||
sed -i "s/emailName2=\"taosdata.com\"/emailName2=\"${cusEmail2}\"/g" install_client_temp.sh
|
sed -i "s/emailName2=\"taosdata.com\"/emailName2=\"${cusEmail2}\"/g" install_client_temp.sh
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ if [ -d ${top_dir}/tools/taos-tools/packaging/deb ]; then
|
||||||
cd ${top_dir}/tools/taos-tools/packaging/deb
|
cd ${top_dir}/tools/taos-tools/packaging/deb
|
||||||
|
|
||||||
taostools_ver=$(git for-each-ref --sort=taggerdate --format '%(tag)' refs/tags|grep -v taos | tail -1)
|
taostools_ver=$(git for-each-ref --sort=taggerdate --format '%(tag)' refs/tags|grep -v taos | tail -1)
|
||||||
[ -z "$taos_tools_ver" ] && taos_tools_ver="0.1.0"
|
[ -z "$taostools_ver" ] && taostools_ver="0.1.0"
|
||||||
taostools_install_dir="${release_dir}/${clientName2}Tools-${taostools_ver}"
|
taostools_install_dir="${release_dir}/${clientName2}Tools-${taostools_ver}"
|
||||||
|
|
||||||
cd ${curr_dir}
|
cd ${curr_dir}
|
||||||
|
@ -96,7 +96,7 @@ else
|
||||||
${taostools_bin_files} \
|
${taostools_bin_files} \
|
||||||
${taosx_bin} \
|
${taosx_bin} \
|
||||||
${explorer_bin_files} \
|
${explorer_bin_files} \
|
||||||
${build_dir}/bin/taosadapter \
|
${build_dir}/bin/${clientName}adapter \
|
||||||
${build_dir}/bin/udfd \
|
${build_dir}/bin/udfd \
|
||||||
${script_dir}/remove.sh \
|
${script_dir}/remove.sh \
|
||||||
${script_dir}/set_core.sh \
|
${script_dir}/set_core.sh \
|
||||||
|
@ -135,12 +135,12 @@ mkdir -p ${install_dir}/inc && cp ${header_files} ${install_dir}/inc
|
||||||
|
|
||||||
mkdir -p ${install_dir}/cfg && cp ${cfg_dir}/${configFile} ${install_dir}/cfg/${configFile}
|
mkdir -p ${install_dir}/cfg && cp ${cfg_dir}/${configFile} ${install_dir}/cfg/${configFile}
|
||||||
|
|
||||||
if [ -f "${compile_dir}/test/cfg/taosadapter.toml" ]; then
|
if [ -f "${compile_dir}/test/cfg/${clientName}adapter.toml" ]; then
|
||||||
cp ${compile_dir}/test/cfg/taosadapter.toml ${install_dir}/cfg || :
|
cp ${compile_dir}/test/cfg/${clientName}adapter.toml ${install_dir}/cfg || :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -f "${compile_dir}/test/cfg/taosadapter.service" ]; then
|
if [ -f "${compile_dir}/test/cfg/${clientName}adapter.service" ]; then
|
||||||
cp ${compile_dir}/test/cfg/taosadapter.service ${install_dir}/cfg || :
|
cp ${compile_dir}/test/cfg/${clientName}adapter.service ${install_dir}/cfg || :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -f "${cfg_dir}/${serverName}.service" ]; then
|
if [ -f "${cfg_dir}/${serverName}.service" ]; then
|
||||||
|
@ -150,18 +150,19 @@ fi
|
||||||
mkdir -p ${install_dir}/bin && cp ${bin_files} ${install_dir}/bin && chmod a+x ${install_dir}/bin/* || :
|
mkdir -p ${install_dir}/bin && cp ${bin_files} ${install_dir}/bin && chmod a+x ${install_dir}/bin/* || :
|
||||||
mkdir -p ${install_dir}/init.d && cp ${init_file_deb} ${install_dir}/init.d/${serverName}.deb
|
mkdir -p ${install_dir}/init.d && cp ${init_file_deb} ${install_dir}/init.d/${serverName}.deb
|
||||||
mkdir -p ${install_dir}/init.d && cp ${init_file_rpm} ${install_dir}/init.d/${serverName}.rpm
|
mkdir -p ${install_dir}/init.d && cp ${init_file_rpm} ${install_dir}/init.d/${serverName}.rpm
|
||||||
|
mkdir -p ${install_dir}/share && cp -rf ${build_dir}/share/{etc,srv} ${install_dir}/share
|
||||||
|
|
||||||
if [ $adapterName != "taosadapter" ]; then
|
if [ $adapterName != "taosadapter" ]; then
|
||||||
mv ${install_dir}/cfg/taosadapter.toml ${install_dir}/cfg/$adapterName.toml
|
mv ${install_dir}/cfg/${clientName2}adapter.toml ${install_dir}/cfg/$adapterName.toml
|
||||||
sed -i "s/path = \"\/var\/log\/taos\"/path = \"\/var\/log\/${productName}\"/g" ${install_dir}/cfg/$adapterName.toml
|
sed -i "s/path = \"\/var\/log\/taos\"/path = \"\/var\/log\/${productName}\"/g" ${install_dir}/cfg/$adapterName.toml
|
||||||
sed -i "s/password = \"taosdata\"/password = \"${defaultPasswd}\"/g" ${install_dir}/cfg/$adapterName.toml
|
sed -i "s/password = \"taosdata\"/password = \"${defaultPasswd}\"/g" ${install_dir}/cfg/$adapterName.toml
|
||||||
|
|
||||||
mv ${install_dir}/cfg/taosadapter.service ${install_dir}/cfg/$adapterName.service
|
mv ${install_dir}/cfg/${clientName2}adapter.service ${install_dir}/cfg/$adapterName.service
|
||||||
sed -i "s/TDengine/${productName}/g" ${install_dir}/cfg/$adapterName.service
|
sed -i "s/TDengine/${productName}/g" ${install_dir}/cfg/$adapterName.service
|
||||||
sed -i "s/taosAdapter/${adapterName}/g" ${install_dir}/cfg/$adapterName.service
|
sed -i "s/taosAdapter/${adapterName}/g" ${install_dir}/cfg/$adapterName.service
|
||||||
sed -i "s/taosadapter/${adapterName}/g" ${install_dir}/cfg/$adapterName.service
|
sed -i "s/taosadapter/${adapterName}/g" ${install_dir}/cfg/$adapterName.service
|
||||||
|
|
||||||
mv ${install_dir}/bin/taosadapter ${install_dir}/bin/${adapterName}
|
mv ${install_dir}/bin/${clientName2}adapter ${install_dir}/bin/${adapterName}
|
||||||
mv ${install_dir}/bin/taosd-dump-cfg.gdb ${install_dir}/bin/${serverName}-dump-cfg.gdb
|
mv ${install_dir}/bin/taosd-dump-cfg.gdb ${install_dir}/bin/${serverName}-dump-cfg.gdb
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -233,8 +234,10 @@ if [ "$verMode" == "cluster" ]; then
|
||||||
sed 's/verMode=edge/verMode=cluster/g' ${install_dir}/bin/remove.sh >>remove_temp.sh
|
sed 's/verMode=edge/verMode=cluster/g' ${install_dir}/bin/remove.sh >>remove_temp.sh
|
||||||
sed -i "s/serverName2=\"taosd\"/serverName2=\"${serverName2}\"/g" remove_temp.sh
|
sed -i "s/serverName2=\"taosd\"/serverName2=\"${serverName2}\"/g" remove_temp.sh
|
||||||
sed -i "s/clientName2=\"taos\"/clientName2=\"${clientName2}\"/g" remove_temp.sh
|
sed -i "s/clientName2=\"taos\"/clientName2=\"${clientName2}\"/g" remove_temp.sh
|
||||||
|
sed -i "s/configFile2=\"taos.cfg\"/configFile2=\"${clientName2}.cfg\"/g" remove_temp.sh
|
||||||
sed -i "s/productName2=\"TDengine\"/productName2=\"${productName2}\"/g" remove_temp.sh
|
sed -i "s/productName2=\"TDengine\"/productName2=\"${productName2}\"/g" remove_temp.sh
|
||||||
sed -i "s/emailName2=\"taosdata.com\"/emailName2=\"${cusEmail2}\"/g" remove_temp.sh
|
cusDomain=`echo "${cusEmail2}" | sed 's/^[^@]*@//'`
|
||||||
|
sed -i "s/emailName2=\"taosdata.com\"/emailName2=\"${cusDomain}\"/g" remove_temp.sh
|
||||||
mv remove_temp.sh ${install_dir}/bin/remove.sh
|
mv remove_temp.sh ${install_dir}/bin/remove.sh
|
||||||
fi
|
fi
|
||||||
if [ "$verMode" == "cloud" ]; then
|
if [ "$verMode" == "cloud" ]; then
|
||||||
|
@ -262,8 +265,10 @@ if [ "$verMode" == "cluster" ]; then
|
||||||
sed -i 's/verMode=edge/verMode=cluster/g' install_temp.sh
|
sed -i 's/verMode=edge/verMode=cluster/g' install_temp.sh
|
||||||
sed -i "s/serverName2=\"taosd\"/serverName2=\"${serverName2}\"/g" install_temp.sh
|
sed -i "s/serverName2=\"taosd\"/serverName2=\"${serverName2}\"/g" install_temp.sh
|
||||||
sed -i "s/clientName2=\"taos\"/clientName2=\"${clientName2}\"/g" install_temp.sh
|
sed -i "s/clientName2=\"taos\"/clientName2=\"${clientName2}\"/g" install_temp.sh
|
||||||
|
sed -i "s/configFile2=\"taos.cfg\"/configFile2=\"${clientName2}.cfg\"/g" install_temp.sh
|
||||||
sed -i "s/productName2=\"TDengine\"/productName2=\"${productName2}\"/g" install_temp.sh
|
sed -i "s/productName2=\"TDengine\"/productName2=\"${productName2}\"/g" install_temp.sh
|
||||||
sed -i "s/emailName2=\"taosdata.com\"/emailName2=\"${cusEmail2}\"/g" install_temp.sh
|
cusDomain=`echo "${cusEmail2}" | sed 's/^[^@]*@//'`
|
||||||
|
sed -i "s/emailName2=\"taosdata.com\"/emailName2=\"${cusDomain}\"/g" install_temp.sh
|
||||||
mv install_temp.sh ${install_dir}/install.sh
|
mv install_temp.sh ${install_dir}/install.sh
|
||||||
fi
|
fi
|
||||||
if [ "$verMode" == "cloud" ]; then
|
if [ "$verMode" == "cloud" ]; then
|
||||||
|
|
|
@ -40,11 +40,16 @@ serverName2="taosd"
|
||||||
clientName2="taos"
|
clientName2="taos"
|
||||||
productName2="TDengine"
|
productName2="TDengine"
|
||||||
|
|
||||||
|
adapterName2="${clientName2}adapter"
|
||||||
|
demoName2="${clientName2}demo"
|
||||||
benchmarkName2="${clientName2}Benchmark"
|
benchmarkName2="${clientName2}Benchmark"
|
||||||
dumpName2="${clientName2}dump"
|
dumpName2="${clientName2}dump"
|
||||||
|
keeperName2="${clientName2}keeper"
|
||||||
|
xName2="${clientName2}x"
|
||||||
|
explorerName2="${clientName2}-explorer"
|
||||||
uninstallScript2="rm${clientName2}"
|
uninstallScript2="rm${clientName2}"
|
||||||
|
|
||||||
installDir="/usr/local/${clientName}"
|
installDir="/usr/local/${clientName2}"
|
||||||
|
|
||||||
#install main path
|
#install main path
|
||||||
install_main_dir=${installDir}
|
install_main_dir=${installDir}
|
||||||
|
@ -55,8 +60,8 @@ local_bin_link_dir="/usr/local/bin"
|
||||||
|
|
||||||
|
|
||||||
service_config_dir="/etc/systemd/system"
|
service_config_dir="/etc/systemd/system"
|
||||||
taos_service_name=${serverName}
|
taos_service_name=${serverName2}
|
||||||
taosadapter_service_name="taosadapter"
|
taosadapter_service_name="${clientName2}adapter"
|
||||||
tarbitrator_service_name="tarbitratord"
|
tarbitrator_service_name="tarbitratord"
|
||||||
csudo=""
|
csudo=""
|
||||||
if command -v sudo >/dev/null; then
|
if command -v sudo >/dev/null; then
|
||||||
|
@ -84,14 +89,14 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
function kill_taosadapter() {
|
function kill_taosadapter() {
|
||||||
pid=$(ps -ef | grep "taosadapter" | grep -v "grep" | awk '{print $2}')
|
pid=$(ps -ef | grep "${adapterName2}" | grep -v "grep" | awk '{print $2}')
|
||||||
if [ -n "$pid" ]; then
|
if [ -n "$pid" ]; then
|
||||||
${csudo}kill -9 $pid || :
|
${csudo}kill -9 $pid || :
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function kill_taosd() {
|
function kill_taosd() {
|
||||||
pid=$(ps -ef | grep ${serverName} | grep -v "grep" | awk '{print $2}')
|
pid=$(ps -ef | grep ${serverName2} | grep -v "grep" | awk '{print $2}')
|
||||||
if [ -n "$pid" ]; then
|
if [ -n "$pid" ]; then
|
||||||
${csudo}kill -9 $pid || :
|
${csudo}kill -9 $pid || :
|
||||||
fi
|
fi
|
||||||
|
@ -109,17 +114,17 @@ function clean_bin() {
|
||||||
${csudo}rm -f ${bin_link_dir}/${clientName} || :
|
${csudo}rm -f ${bin_link_dir}/${clientName} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${serverName} || :
|
${csudo}rm -f ${bin_link_dir}/${serverName} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/udfd || :
|
${csudo}rm -f ${bin_link_dir}/udfd || :
|
||||||
${csudo}rm -f ${bin_link_dir}/taosadapter || :
|
${csudo}rm -f ${bin_link_dir}/${adapterName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/taosBenchmark || :
|
${csudo}rm -f ${bin_link_dir}/${benchmarkName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/taosdemo || :
|
${csudo}rm -f ${bin_link_dir}/${demoName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/taosdump || :
|
${csudo}rm -f ${bin_link_dir}/${dumpName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${uninstallScript} || :
|
${csudo}rm -f ${bin_link_dir}/${uninstallScript} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/tarbitrator || :
|
${csudo}rm -f ${bin_link_dir}/tarbitrator || :
|
||||||
${csudo}rm -f ${bin_link_dir}/set_core || :
|
${csudo}rm -f ${bin_link_dir}/set_core || :
|
||||||
${csudo}rm -f ${bin_link_dir}/TDinsight.sh || :
|
${csudo}rm -f ${bin_link_dir}/TDinsight.sh || :
|
||||||
${csudo}rm -f ${bin_link_dir}/taoskeeper || :
|
${csudo}rm -f ${bin_link_dir}/${keeperName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/taosx || :
|
${csudo}rm -f ${bin_link_dir}/${xName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/taos-explorer || :
|
${csudo}rm -f ${bin_link_dir}/${explorerName2} || :
|
||||||
|
|
||||||
if [ "$verMode" == "cluster" ] && [ "$clientName" != "$clientName2" ]; then
|
if [ "$verMode" == "cluster" ] && [ "$clientName" != "$clientName2" ]; then
|
||||||
${csudo}rm -f ${bin_link_dir}/${clientName2} || :
|
${csudo}rm -f ${bin_link_dir}/${clientName2} || :
|
||||||
|
@ -130,8 +135,8 @@ function clean_bin() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function clean_local_bin() {
|
function clean_local_bin() {
|
||||||
${csudo}rm -f ${local_bin_link_dir}/taosBenchmark || :
|
${csudo}rm -f ${local_bin_link_dir}/${benchmarkName2} || :
|
||||||
${csudo}rm -f ${local_bin_link_dir}/taosdemo || :
|
${csudo}rm -f ${local_bin_link_dir}/${demoName2} || :
|
||||||
}
|
}
|
||||||
|
|
||||||
function clean_lib() {
|
function clean_lib() {
|
||||||
|
@ -173,7 +178,7 @@ function clean_service_on_systemd() {
|
||||||
${csudo}systemctl disable ${taos_service_name} &>/dev/null || echo &>/dev/null
|
${csudo}systemctl disable ${taos_service_name} &>/dev/null || echo &>/dev/null
|
||||||
${csudo}rm -f ${taosd_service_config}
|
${csudo}rm -f ${taosd_service_config}
|
||||||
|
|
||||||
taosadapter_service_config="${service_config_dir}/taosadapter.service"
|
taosadapter_service_config="${service_config_dir}/${clientName2}adapter.service"
|
||||||
if systemctl is-active --quiet ${taosadapter_service_name}; then
|
if systemctl is-active --quiet ${taosadapter_service_name}; then
|
||||||
echo "${productName2} ${clientName2}Adapter is running, stopping it..."
|
echo "${productName2} ${clientName2}Adapter is running, stopping it..."
|
||||||
${csudo}systemctl stop ${taosadapter_service_name} &>/dev/null || echo &>/dev/null
|
${csudo}systemctl stop ${taosadapter_service_name} &>/dev/null || echo &>/dev/null
|
||||||
|
@ -187,7 +192,27 @@ function clean_service_on_systemd() {
|
||||||
${csudo}systemctl stop ${tarbitrator_service_name} &>/dev/null || echo &>/dev/null
|
${csudo}systemctl stop ${tarbitrator_service_name} &>/dev/null || echo &>/dev/null
|
||||||
fi
|
fi
|
||||||
${csudo}systemctl disable ${tarbitrator_service_name} &>/dev/null || echo &>/dev/null
|
${csudo}systemctl disable ${tarbitrator_service_name} &>/dev/null || echo &>/dev/null
|
||||||
${csudo}rm -f ${tarbitratord_service_config}
|
|
||||||
|
x_service_config="${service_config_dir}/${xName2}.service"
|
||||||
|
if [ -e "$x_service_config" ]; then
|
||||||
|
if systemctl is-active --quiet ${xName2}; then
|
||||||
|
echo "${productName2} ${xName2} is running, stopping it..."
|
||||||
|
${csudo}systemctl stop ${xName2} &>/dev/null || echo &>/dev/null
|
||||||
|
fi
|
||||||
|
${csudo}systemctl disable ${xName2} &>/dev/null || echo &>/dev/null
|
||||||
|
${csudo}rm -f ${x_service_config}
|
||||||
|
fi
|
||||||
|
|
||||||
|
explorer_service_config="${service_config_dir}/${explorerName2}.service"
|
||||||
|
if [ -e "$explorer_service_config" ]; then
|
||||||
|
if systemctl is-active --quiet ${explorerName2}; then
|
||||||
|
echo "${productName2} ${explorerName2} is running, stopping it..."
|
||||||
|
${csudo}systemctl stop ${explorerName2} &>/dev/null || echo &>/dev/null
|
||||||
|
fi
|
||||||
|
${csudo}systemctl disable ${explorerName2} &>/dev/null || echo &>/dev/null
|
||||||
|
${csudo}rm -f ${explorer_service_config}
|
||||||
|
${csudo}rm -f /etc/${clientName2}/explorer.toml
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function clean_service_on_sysvinit() {
|
function clean_service_on_sysvinit() {
|
||||||
|
@ -235,8 +260,8 @@ function clean_service_on_sysvinit() {
|
||||||
function clean_service_on_launchctl() {
|
function clean_service_on_launchctl() {
|
||||||
${csudouser}launchctl unload -w /Library/LaunchDaemons/com.taosdata.taosd.plist > /dev/null 2>&1 || :
|
${csudouser}launchctl unload -w /Library/LaunchDaemons/com.taosdata.taosd.plist > /dev/null 2>&1 || :
|
||||||
${csudo}rm /Library/LaunchDaemons/com.taosdata.taosd.plist > /dev/null 2>&1 || :
|
${csudo}rm /Library/LaunchDaemons/com.taosdata.taosd.plist > /dev/null 2>&1 || :
|
||||||
${csudouser}launchctl unload -w /Library/LaunchDaemons/com.taosdata.taosadapter.plist > /dev/null 2>&1 || :
|
${csudouser}launchctl unload -w /Library/LaunchDaemons/com.taosdata.${clientName2}adapter.plist > /dev/null 2>&1 || :
|
||||||
${csudo}rm /Library/LaunchDaemons/com.taosdata.taosadapter.plist > /dev/null 2>&1 || :
|
${csudo}rm /Library/LaunchDaemons/com.taosdata.${clientName2}adapter.plist > /dev/null 2>&1 || :
|
||||||
}
|
}
|
||||||
|
|
||||||
function clean_service() {
|
function clean_service() {
|
||||||
|
|
|
@ -15,11 +15,12 @@ uninstallScript="rmtaos"
|
||||||
clientName2="taos"
|
clientName2="taos"
|
||||||
productName2="TDengine"
|
productName2="TDengine"
|
||||||
|
|
||||||
benchmarkName2="${clientName}Benchmark"
|
benchmarkName2="${clientName2}Benchmark"
|
||||||
dumpName2="${clientName}dump"
|
demoName2="${clientName2}demo"
|
||||||
uninstallScript2="rm${clientName}"
|
dumpName2="${clientName2}dump"
|
||||||
|
uninstallScript2="rm${clientName2}"
|
||||||
|
|
||||||
installDir="/usr/local/${clientName}"
|
installDir="/usr/local/${clientName2}"
|
||||||
|
|
||||||
#install main path
|
#install main path
|
||||||
install_main_dir=${installDir}
|
install_main_dir=${installDir}
|
||||||
|
@ -44,14 +45,17 @@ function kill_client() {
|
||||||
|
|
||||||
function clean_bin() {
|
function clean_bin() {
|
||||||
# Remove link
|
# Remove link
|
||||||
${csudo}rm -f ${bin_link_dir}/${clientName} || :
|
${csudo}rm -f ${bin_link_dir}/${clientName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/taosdemo || :
|
${csudo}rm -f ${bin_link_dir}/${demoName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/taosdump || :
|
${csudo}rm -f ${bin_link_dir}/${benchmarkName2} || :
|
||||||
|
${csudo}rm -f ${bin_link_dir}/${dumpName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${uninstallScript} || :
|
${csudo}rm -f ${bin_link_dir}/${uninstallScript} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/set_core || :
|
${csudo}rm -f ${bin_link_dir}/set_core || :
|
||||||
|
|
||||||
if [ "$verMode" == "cluster" ] && [ "$clientName" != "$clientName2" ]; then
|
if [ "$verMode" == "cluster" ] && [ "$clientName" != "$clientName2" ]; then
|
||||||
${csudo}rm -f ${bin_link_dir}/${clientName2} || :
|
${csudo}rm -f ${bin_link_dir}/${clientName2} || :
|
||||||
|
${csudo}rm -f ${bin_link_dir}/${demoName2} || :
|
||||||
|
${csudo}rm -f ${bin_link_dir}/${benchmarkName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${dumpName2} || :
|
${csudo}rm -f ${bin_link_dir}/${dumpName2} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/${uninstallScript2} || :
|
${csudo}rm -f ${bin_link_dir}/${uninstallScript2} || :
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -30,6 +30,10 @@
|
||||||
#include "tsched.h"
|
#include "tsched.h"
|
||||||
#include "ttime.h"
|
#include "ttime.h"
|
||||||
|
|
||||||
|
#if defined(CUS_NAME) || defined(CUS_PROMPT) || defined(CUS_EMAIL)
|
||||||
|
#include "cus_name.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define TSC_VAR_NOT_RELEASE 1
|
#define TSC_VAR_NOT_RELEASE 1
|
||||||
#define TSC_VAR_RELEASED 0
|
#define TSC_VAR_RELEASED 0
|
||||||
|
|
||||||
|
@ -542,9 +546,15 @@ void taos_init_imp(void) {
|
||||||
|
|
||||||
deltaToUtcInitOnce();
|
deltaToUtcInitOnce();
|
||||||
|
|
||||||
if (taosCreateLog("taoslog", 10, configDir, NULL, NULL, NULL, NULL, 1) != 0) {
|
char logDirName[64] = {0};
|
||||||
|
#ifdef CUS_PROMPT
|
||||||
|
snprintf(logDirName, 64, "%slog", CUS_PROMPT);
|
||||||
|
#else
|
||||||
|
snprintf(logDirName, 64, "taoslog");
|
||||||
|
#endif
|
||||||
|
if (taosCreateLog(logDirName, 10, configDir, NULL, NULL, NULL, NULL, 1) != 0) {
|
||||||
// ignore create log failed, only print
|
// ignore create log failed, only print
|
||||||
printf(" WARING: Create taoslog failed:%s. configDir=%s\n", strerror(errno), configDir);
|
printf(" WARING: Create %s failed:%s. configDir=%s\n", logDirName, strerror(errno), configDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (taosInitCfg(configDir, NULL, NULL, NULL, NULL, 1) != 0) {
|
if (taosInitCfg(configDir, NULL, NULL, NULL, NULL, 1) != 0) {
|
||||||
|
|
|
@ -174,6 +174,7 @@ static int32_t smlParseTableName(SArray *tags, char *childTableName) {
|
||||||
if (childTableNameLen == tag->keyLen && strncmp(tag->key, tsSmlChildTableName, tag->keyLen) == 0) {
|
if (childTableNameLen == tag->keyLen && strncmp(tag->key, tsSmlChildTableName, tag->keyLen) == 0) {
|
||||||
memset(childTableName, 0, TSDB_TABLE_NAME_LEN);
|
memset(childTableName, 0, TSDB_TABLE_NAME_LEN);
|
||||||
strncpy(childTableName, tag->value, (tag->length < TSDB_TABLE_NAME_LEN ? tag->length : TSDB_TABLE_NAME_LEN));
|
strncpy(childTableName, tag->value, (tag->length < TSDB_TABLE_NAME_LEN ? tag->length : TSDB_TABLE_NAME_LEN));
|
||||||
|
taosArrayRemove(tags, i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1148,6 +1148,7 @@ int32_t tmq_subscribe(tmq_t* tmq, const tmq_list_t* topic_list) {
|
||||||
};
|
};
|
||||||
|
|
||||||
if (tsem_init(¶m.rspSem, 0, 0) != 0) {
|
if (tsem_init(¶m.rspSem, 0, 0) != 0) {
|
||||||
|
code = TSDB_CODE_TSC_INTERNAL_ERROR;
|
||||||
goto FAIL;
|
goto FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1183,6 +1184,8 @@ int32_t tmq_subscribe(tmq_t* tmq, const tmq_list_t* topic_list) {
|
||||||
int32_t retryCnt = 0;
|
int32_t retryCnt = 0;
|
||||||
while (TSDB_CODE_MND_CONSUMER_NOT_READY == doAskEp(tmq)) {
|
while (TSDB_CODE_MND_CONSUMER_NOT_READY == doAskEp(tmq)) {
|
||||||
if (retryCnt++ > MAX_RETRY_COUNT) {
|
if (retryCnt++ > MAX_RETRY_COUNT) {
|
||||||
|
tscError("consumer:0x%" PRIx64 ", mnd not ready for subscribe, retry:%d in 500ms", tmq->consumerId, retryCnt);
|
||||||
|
code = TSDB_CODE_TSC_INTERNAL_ERROR;
|
||||||
goto FAIL;
|
goto FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1423,6 +1426,9 @@ static bool doUpdateLocalEp(tmq_t* tmq, int32_t epoch, const SMqAskEpRsp* pRsp)
|
||||||
char vgKey[TSDB_TOPIC_FNAME_LEN + 22];
|
char vgKey[TSDB_TOPIC_FNAME_LEN + 22];
|
||||||
tscDebug("consumer:0x%" PRIx64 " update ep epoch from %d to epoch %d, incoming topics:%d, existed topics:%d",
|
tscDebug("consumer:0x%" PRIx64 " update ep epoch from %d to epoch %d, incoming topics:%d, existed topics:%d",
|
||||||
tmq->consumerId, tmq->epoch, epoch, topicNumGet, topicNumCur);
|
tmq->consumerId, tmq->epoch, epoch, topicNumGet, topicNumCur);
|
||||||
|
if (epoch <= tmq->epoch) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
SArray* newTopics = taosArrayInit(topicNumGet, sizeof(SMqClientTopic));
|
SArray* newTopics = taosArrayInit(topicNumGet, sizeof(SMqClientTopic));
|
||||||
if (newTopics == NULL) {
|
if (newTopics == NULL) {
|
||||||
|
@ -1526,8 +1532,8 @@ int32_t askEpCallbackFn(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
} else {
|
} else {
|
||||||
tscDebug("consumer:0x%" PRIx64 ", recv ep, msg epoch %d, current epoch %d, update local ep", tmq->consumerId,
|
tscDebug("consumer:0x%" PRIx64 ", recv ep, msg epoch %d, current epoch %d, update local ep", tmq->consumerId,
|
||||||
head->epoch, epoch);
|
head->epoch, epoch);
|
||||||
pParam->pUserFn(tmq, code, pMsg, pParam->pParam);
|
|
||||||
}
|
}
|
||||||
|
pParam->pUserFn(tmq, code, pMsg, pParam->pParam);
|
||||||
|
|
||||||
taosReleaseRef(tmqMgmt.rsetId, pParam->refId);
|
taosReleaseRef(tmqMgmt.rsetId, pParam->refId);
|
||||||
|
|
||||||
|
|
|
@ -296,7 +296,9 @@ static const SSysDbTableSchema vnodesSchema[] = {
|
||||||
static const SSysDbTableSchema userUserPrivilegesSchema[] = {
|
static const SSysDbTableSchema userUserPrivilegesSchema[] = {
|
||||||
{.name = "user_name", .bytes = TSDB_USER_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
|
{.name = "user_name", .bytes = TSDB_USER_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
|
||||||
{.name = "privilege", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
|
{.name = "privilege", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
|
||||||
{.name = "object_name", .bytes = TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
|
{.name = "db_name", .bytes = TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
|
||||||
|
{.name = "table_name", .bytes = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
|
||||||
|
{.name = "condition", .bytes = TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SSysTableMeta infosMeta[] = {
|
static const SSysTableMeta infosMeta[] = {
|
||||||
|
|
|
@ -1590,12 +1590,13 @@ static void doShiftBitmap(char* nullBitmap, size_t n, size_t total) {
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
} else if (n > 8) {
|
} else if (n > 8) {
|
||||||
int32_t gap = len - newLen;
|
int32_t remain = (total % 8 != 0 && total % 8 <= tail) ? 1 : 0;
|
||||||
|
int32_t gap = len - newLen - remain;
|
||||||
while (i < newLen) {
|
while (i < newLen) {
|
||||||
uint8_t v = p[i + gap];
|
uint8_t v = p[i + gap];
|
||||||
p[i] = (v << tail);
|
p[i] = (v << tail);
|
||||||
|
|
||||||
if (i < newLen - 1) {
|
if (i < newLen - 1 + remain) {
|
||||||
uint8_t next = p[i + gap + 1];
|
uint8_t next = p[i + gap + 1];
|
||||||
p[i] |= (next >> (8 - tail));
|
p[i] |= (next >> (8 - tail));
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,10 @@
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
#include "tmisce.h"
|
#include "tmisce.h"
|
||||||
|
|
||||||
|
#if defined(CUS_NAME) || defined(CUS_PROMPT) || defined(CUS_EMAIL)
|
||||||
|
#include "cus_name.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
GRANT_CFG_DECLARE;
|
GRANT_CFG_DECLARE;
|
||||||
|
|
||||||
SConfig *tsCfg = NULL;
|
SConfig *tsCfg = NULL;
|
||||||
|
@ -228,7 +232,11 @@ static int32_t taosLoadCfg(SConfig *pCfg, const char **envCmd, const char *input
|
||||||
|
|
||||||
taosExpandDir(inputCfgDir, cfgDir, PATH_MAX);
|
taosExpandDir(inputCfgDir, cfgDir, PATH_MAX);
|
||||||
if (taosIsDir(cfgDir)) {
|
if (taosIsDir(cfgDir)) {
|
||||||
|
#ifdef CUS_PROMPT
|
||||||
|
snprintf(cfgFile, sizeof(cfgFile), "%s" TD_DIRSEP "%s.cfg", cfgDir, CUS_PROMPT);
|
||||||
|
#else
|
||||||
snprintf(cfgFile, sizeof(cfgFile), "%s" TD_DIRSEP "taos.cfg", cfgDir);
|
snprintf(cfgFile, sizeof(cfgFile), "%s" TD_DIRSEP "taos.cfg", cfgDir);
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
tstrncpy(cfgFile, cfgDir, sizeof(cfgDir));
|
tstrncpy(cfgFile, cfgDir, sizeof(cfgDir));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1150,7 +1150,7 @@ int32_t tDeserializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) {
|
||||||
if (tDecodeI64(&decoder, &vload.compStorage) < 0) return -1;
|
if (tDecodeI64(&decoder, &vload.compStorage) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &vload.pointsWritten) < 0) return -1;
|
if (tDecodeI64(&decoder, &vload.pointsWritten) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &vload.numOfCachedTables) < 0) return -1;
|
if (tDecodeI32(&decoder, &vload.numOfCachedTables) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, (int32_t*)&reserved) < 0) return -1;
|
if (tDecodeI32(&decoder, (int32_t *)&reserved) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &reserved) < 0) return -1;
|
if (tDecodeI64(&decoder, &reserved) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &reserved) < 0) return -1;
|
if (tDecodeI64(&decoder, &reserved) < 0) return -1;
|
||||||
if (taosArrayPush(pReq->pVloads, &vload) == NULL) {
|
if (taosArrayPush(pReq->pVloads, &vload) == NULL) {
|
||||||
|
@ -1368,6 +1368,12 @@ int32_t tSerializeSAlterUserReq(void *buf, int32_t bufLen, SAlterUserReq *pReq)
|
||||||
if (tEncodeCStr(&encoder, pReq->user) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->user) < 0) return -1;
|
||||||
if (tEncodeCStr(&encoder, pReq->pass) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->pass) < 0) return -1;
|
||||||
if (tEncodeCStr(&encoder, pReq->objname) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->objname) < 0) return -1;
|
||||||
|
int32_t len = strlen(pReq->tabName);
|
||||||
|
if (tEncodeI32(&encoder, len) < 0) return -1;
|
||||||
|
if (len > 0) {
|
||||||
|
if (tEncodeCStr(&encoder, pReq->tabName) < 0) return -1;
|
||||||
|
}
|
||||||
|
if (tEncodeBinary(&encoder, pReq->tagCond, pReq->tagCondLen) < 0) return -1;
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
int32_t tlen = encoder.pos;
|
int32_t tlen = encoder.pos;
|
||||||
|
@ -1387,6 +1393,16 @@ int32_t tDeserializeSAlterUserReq(void *buf, int32_t bufLen, SAlterUserReq *pReq
|
||||||
if (tDecodeCStrTo(&decoder, pReq->user) < 0) return -1;
|
if (tDecodeCStrTo(&decoder, pReq->user) < 0) return -1;
|
||||||
if (tDecodeCStrTo(&decoder, pReq->pass) < 0) return -1;
|
if (tDecodeCStrTo(&decoder, pReq->pass) < 0) return -1;
|
||||||
if (tDecodeCStrTo(&decoder, pReq->objname) < 0) return -1;
|
if (tDecodeCStrTo(&decoder, pReq->objname) < 0) return -1;
|
||||||
|
if (!tDecodeIsEnd(&decoder)) {
|
||||||
|
int32_t len = 0;
|
||||||
|
if (tDecodeI32(&decoder, &len) < 0) return -1;
|
||||||
|
if (len > 0) {
|
||||||
|
if (tDecodeCStrTo(&decoder, pReq->tabName) < 0) return -1;
|
||||||
|
}
|
||||||
|
uint64_t tagCondLen = 0;
|
||||||
|
if (tDecodeBinaryAlloc(&decoder, (void **)&pReq->tagCond, &tagCondLen) < 0) return -1;
|
||||||
|
pReq->tagCondLen = tagCondLen;
|
||||||
|
}
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
|
@ -1429,9 +1445,14 @@ int32_t tSerializeSGetUserAuthRspImpl(SEncoder *pEncoder, SGetUserAuthRsp *pRsp)
|
||||||
int32_t numOfCreatedDbs = taosHashGetSize(pRsp->createdDbs);
|
int32_t numOfCreatedDbs = taosHashGetSize(pRsp->createdDbs);
|
||||||
int32_t numOfReadDbs = taosHashGetSize(pRsp->readDbs);
|
int32_t numOfReadDbs = taosHashGetSize(pRsp->readDbs);
|
||||||
int32_t numOfWriteDbs = taosHashGetSize(pRsp->writeDbs);
|
int32_t numOfWriteDbs = taosHashGetSize(pRsp->writeDbs);
|
||||||
|
int32_t numOfReadTbs = taosHashGetSize(pRsp->readTbs);
|
||||||
|
int32_t numOfWriteTbs = taosHashGetSize(pRsp->writeTbs);
|
||||||
|
|
||||||
if (tEncodeI32(pEncoder, numOfCreatedDbs) < 0) return -1;
|
if (tEncodeI32(pEncoder, numOfCreatedDbs) < 0) return -1;
|
||||||
if (tEncodeI32(pEncoder, numOfReadDbs) < 0) return -1;
|
if (tEncodeI32(pEncoder, numOfReadDbs) < 0) return -1;
|
||||||
if (tEncodeI32(pEncoder, numOfWriteDbs) < 0) return -1;
|
if (tEncodeI32(pEncoder, numOfWriteDbs) < 0) return -1;
|
||||||
|
if (tEncodeI32(pEncoder, numOfReadTbs) < 0) return -1;
|
||||||
|
if (tEncodeI32(pEncoder, numOfWriteTbs) < 0) return -1;
|
||||||
|
|
||||||
char *db = taosHashIterate(pRsp->createdDbs, NULL);
|
char *db = taosHashIterate(pRsp->createdDbs, NULL);
|
||||||
while (db != NULL) {
|
while (db != NULL) {
|
||||||
|
@ -1451,6 +1472,36 @@ int32_t tSerializeSGetUserAuthRspImpl(SEncoder *pEncoder, SGetUserAuthRsp *pRsp)
|
||||||
db = taosHashIterate(pRsp->writeDbs, db);
|
db = taosHashIterate(pRsp->writeDbs, db);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *tb = taosHashIterate(pRsp->readTbs, NULL);
|
||||||
|
while (tb != NULL) {
|
||||||
|
size_t keyLen = 0;
|
||||||
|
void *key = taosHashGetKey(tb, &keyLen);
|
||||||
|
if (tEncodeI32(pEncoder, keyLen) < 0) return -1;
|
||||||
|
if (tEncodeCStr(pEncoder, key) < 0) return -1;
|
||||||
|
|
||||||
|
size_t valueLen = 0;
|
||||||
|
valueLen = strlen(tb);
|
||||||
|
if (tEncodeI32(pEncoder, valueLen) < 0) return -1;
|
||||||
|
if (tEncodeCStr(pEncoder, tb) < 0) return -1;
|
||||||
|
|
||||||
|
tb = taosHashIterate(pRsp->readTbs, tb);
|
||||||
|
}
|
||||||
|
|
||||||
|
tb = taosHashIterate(pRsp->writeTbs, NULL);
|
||||||
|
while (tb != NULL) {
|
||||||
|
size_t keyLen = 0;
|
||||||
|
void *key = taosHashGetKey(tb, &keyLen);
|
||||||
|
if (tEncodeI32(pEncoder, keyLen) < 0) return -1;
|
||||||
|
if (tEncodeCStr(pEncoder, key) < 0) return -1;
|
||||||
|
|
||||||
|
size_t valueLen = 0;
|
||||||
|
valueLen = strlen(tb);
|
||||||
|
if (tEncodeI32(pEncoder, valueLen) < 0) return -1;
|
||||||
|
if (tEncodeCStr(pEncoder, tb) < 0) return -1;
|
||||||
|
|
||||||
|
tb = taosHashIterate(pRsp->writeTbs, tb);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1473,6 +1524,8 @@ int32_t tDeserializeSGetUserAuthRspImpl(SDecoder *pDecoder, SGetUserAuthRsp *pRs
|
||||||
pRsp->createdDbs = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
pRsp->createdDbs = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
||||||
pRsp->readDbs = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
pRsp->readDbs = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
||||||
pRsp->writeDbs = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
pRsp->writeDbs = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
||||||
|
pRsp->readTbs = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
||||||
|
pRsp->writeTbs = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
||||||
if (pRsp->readDbs == NULL || pRsp->writeDbs == NULL) {
|
if (pRsp->readDbs == NULL || pRsp->writeDbs == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1487,9 +1540,13 @@ int32_t tDeserializeSGetUserAuthRspImpl(SDecoder *pDecoder, SGetUserAuthRsp *pRs
|
||||||
int32_t numOfCreatedDbs = 0;
|
int32_t numOfCreatedDbs = 0;
|
||||||
int32_t numOfReadDbs = 0;
|
int32_t numOfReadDbs = 0;
|
||||||
int32_t numOfWriteDbs = 0;
|
int32_t numOfWriteDbs = 0;
|
||||||
|
int32_t numOfReadTbs = 0;
|
||||||
|
int32_t numOfWriteTbs = 0;
|
||||||
if (tDecodeI32(pDecoder, &numOfCreatedDbs) < 0) return -1;
|
if (tDecodeI32(pDecoder, &numOfCreatedDbs) < 0) return -1;
|
||||||
if (tDecodeI32(pDecoder, &numOfReadDbs) < 0) return -1;
|
if (tDecodeI32(pDecoder, &numOfReadDbs) < 0) return -1;
|
||||||
if (tDecodeI32(pDecoder, &numOfWriteDbs) < 0) return -1;
|
if (tDecodeI32(pDecoder, &numOfWriteDbs) < 0) return -1;
|
||||||
|
if (tDecodeI32(pDecoder, &numOfReadTbs) < 0) return -1;
|
||||||
|
if (tDecodeI32(pDecoder, &numOfWriteTbs) < 0) return -1;
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfCreatedDbs; ++i) {
|
for (int32_t i = 0; i < numOfCreatedDbs; ++i) {
|
||||||
char db[TSDB_DB_FNAME_LEN] = {0};
|
char db[TSDB_DB_FNAME_LEN] = {0};
|
||||||
|
@ -1512,6 +1569,42 @@ int32_t tDeserializeSGetUserAuthRspImpl(SDecoder *pDecoder, SGetUserAuthRsp *pRs
|
||||||
taosHashPut(pRsp->writeDbs, db, len, db, len);
|
taosHashPut(pRsp->writeDbs, db, len, db, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numOfReadTbs; ++i) {
|
||||||
|
int32_t keyLen = 0;
|
||||||
|
if (tDecodeI32(pDecoder, &keyLen) < 0) return -1;
|
||||||
|
|
||||||
|
char *key = taosMemoryCalloc(keyLen + 1, sizeof(char));
|
||||||
|
if (tDecodeCStrTo(pDecoder, key) < 0) return -1;
|
||||||
|
|
||||||
|
int32_t valuelen = 0;
|
||||||
|
if (tDecodeI32(pDecoder, &valuelen) < 0) return -1;
|
||||||
|
char *value = taosMemoryCalloc(valuelen + 1, sizeof(char));
|
||||||
|
if (tDecodeCStrTo(pDecoder, value) < 0) return -1;
|
||||||
|
|
||||||
|
taosHashPut(pRsp->readTbs, key, strlen(key), value, valuelen);
|
||||||
|
|
||||||
|
taosMemoryFree(key);
|
||||||
|
taosMemoryFree(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numOfWriteTbs; ++i) {
|
||||||
|
int32_t keyLen = 0;
|
||||||
|
if (tDecodeI32(pDecoder, &keyLen) < 0) return -1;
|
||||||
|
|
||||||
|
char *key = taosMemoryCalloc(keyLen + 1, sizeof(char));
|
||||||
|
if (tDecodeCStrTo(pDecoder, key) < 0) return -1;
|
||||||
|
|
||||||
|
int32_t valuelen = 0;
|
||||||
|
if (tDecodeI32(pDecoder, &valuelen) < 0) return -1;
|
||||||
|
char *value = taosMemoryCalloc(valuelen + 1, sizeof(char));
|
||||||
|
if (tDecodeCStrTo(pDecoder, value) < 0) return -1;
|
||||||
|
|
||||||
|
taosHashPut(pRsp->writeTbs, key, strlen(key), value, valuelen);
|
||||||
|
|
||||||
|
taosMemoryFree(key);
|
||||||
|
taosMemoryFree(value);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1533,6 +1626,8 @@ void tFreeSGetUserAuthRsp(SGetUserAuthRsp *pRsp) {
|
||||||
taosHashCleanup(pRsp->createdDbs);
|
taosHashCleanup(pRsp->createdDbs);
|
||||||
taosHashCleanup(pRsp->readDbs);
|
taosHashCleanup(pRsp->readDbs);
|
||||||
taosHashCleanup(pRsp->writeDbs);
|
taosHashCleanup(pRsp->writeDbs);
|
||||||
|
taosHashCleanup(pRsp->writeTbs);
|
||||||
|
taosHashCleanup(pRsp->readTbs);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tSerializeSCreateDropMQSNodeReq(void *buf, int32_t bufLen, SMCreateQnodeReq *pReq) {
|
int32_t tSerializeSCreateDropMQSNodeReq(void *buf, int32_t bufLen, SMCreateQnodeReq *pReq) {
|
||||||
|
@ -6824,7 +6919,7 @@ int32_t tDecodeSMqDataRsp(SDecoder *pDecoder, SMqDataRsp *pRsp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void tDeleteSMqDataRsp(SMqDataRsp *pRsp) {
|
void tDeleteSMqDataRsp(SMqDataRsp *pRsp) {
|
||||||
pRsp->blockDataLen = taosArrayDestroy(pRsp->blockDataLen);;
|
pRsp->blockDataLen = taosArrayDestroy(pRsp->blockDataLen);
|
||||||
taosArrayDestroyP(pRsp->blockData, (FDelete)taosMemoryFree);
|
taosArrayDestroyP(pRsp->blockData, (FDelete)taosMemoryFree);
|
||||||
pRsp->blockData = NULL;
|
pRsp->blockData = NULL;
|
||||||
taosArrayDestroyP(pRsp->blockSchema, (FDelete)tDeleteSSchemaWrapper);
|
taosArrayDestroyP(pRsp->blockSchema, (FDelete)tDeleteSSchemaWrapper);
|
||||||
|
|
|
@ -20,6 +20,21 @@
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
#if defined(CUS_NAME) || defined(CUS_PROMPT) || defined(CUS_EMAIL)
|
||||||
|
#include "cus_name.h"
|
||||||
|
#else
|
||||||
|
#ifndef CUS_NAME
|
||||||
|
#define CUS_NAME "TDengine"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CUS_PROMPT
|
||||||
|
#define CUS_PROMPT "taos"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CUS_EMAIL
|
||||||
|
#define CUS_EMAIL "<support@taosdata.com>"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
// clang-format off
|
// clang-format off
|
||||||
#define DM_APOLLO_URL "The apollo string to use when configuring the server, such as: -a 'jsonFile:./tests/cfg.json', cfg.json text can be '{\"fqdn\":\"td1\"}'."
|
#define DM_APOLLO_URL "The apollo string to use when configuring the server, such as: -a 'jsonFile:./tests/cfg.json', cfg.json text can be '{\"fqdn\":\"td1\"}'."
|
||||||
#define DM_CFG_DIR "Configuration directory."
|
#define DM_CFG_DIR "Configuration directory."
|
||||||
|
@ -232,7 +247,7 @@ static void dmDumpCfg() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t dmInitLog() {
|
static int32_t dmInitLog() {
|
||||||
return taosCreateLog("taosdlog", 1, configDir, global.envCmd, global.envFile, global.apolloUrl, global.pArgs, 0);
|
return taosCreateLog(CUS_PROMPT"dlog", 1, configDir, global.envCmd, global.envFile, global.apolloUrl, global.pArgs, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void taosCleanupArgs() {
|
static void taosCleanupArgs() {
|
||||||
|
|
|
@ -280,6 +280,8 @@ typedef struct {
|
||||||
SHashObj* readDbs;
|
SHashObj* readDbs;
|
||||||
SHashObj* writeDbs;
|
SHashObj* writeDbs;
|
||||||
SHashObj* topics;
|
SHashObj* topics;
|
||||||
|
SHashObj* readTbs;
|
||||||
|
SHashObj* writeTbs;
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
} SUserObj;
|
} SUserObj;
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,7 @@ void mndFreeStb(SStbObj *pStb);
|
||||||
int32_t mndBuildSMCreateStbRsp(SMnode *pMnode, char *dbFName, char *stbFName, void **pCont, int32_t *pLen);
|
int32_t mndBuildSMCreateStbRsp(SMnode *pMnode, char *dbFName, char *stbFName, void **pCont, int32_t *pLen);
|
||||||
|
|
||||||
void mndExtractDbNameFromStbFullName(const char *stbFullName, char *dst);
|
void mndExtractDbNameFromStbFullName(const char *stbFullName, char *dst);
|
||||||
|
void mndExtractShortDbNameFromStbFullName(const char *stbFullName, char *dst);
|
||||||
void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t dstSize);
|
void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t dstSize);
|
||||||
|
|
||||||
const char *mndGetStbStr(const char *src);
|
const char *mndGetStbStr(const char *src);
|
||||||
|
|
|
@ -31,6 +31,7 @@ void mndReleaseUser(SMnode *pMnode, SUserObj *pUser);
|
||||||
// for trans test
|
// for trans test
|
||||||
SSdbRaw *mndUserActionEncode(SUserObj *pUser);
|
SSdbRaw *mndUserActionEncode(SUserObj *pUser);
|
||||||
SHashObj *mndDupDbHash(SHashObj *pOld);
|
SHashObj *mndDupDbHash(SHashObj *pOld);
|
||||||
|
SHashObj *mndDupTableHash(SHashObj *pOld);
|
||||||
SHashObj *mndDupTopicHash(SHashObj *pOld);
|
SHashObj *mndDupTopicHash(SHashObj *pOld);
|
||||||
int32_t mndValidateUserAuthInfo(SMnode *pMnode, SUserAuthVersion *pUsers, int32_t numOfUses, void **ppRsp,
|
int32_t mndValidateUserAuthInfo(SMnode *pMnode, SUserAuthVersion *pUsers, int32_t numOfUses, void **ppRsp,
|
||||||
int32_t *pRspLen);
|
int32_t *pRspLen);
|
||||||
|
|
|
@ -35,6 +35,7 @@ int32_t mndCheckTopicPrivilegeByName(SMnode *pMnode, const char *user, EOperType
|
||||||
int32_t mndSetUserAuthRsp(SMnode *pMnode, SUserObj *pUser, SGetUserAuthRsp *pRsp) {
|
int32_t mndSetUserAuthRsp(SMnode *pMnode, SUserObj *pUser, SGetUserAuthRsp *pRsp) {
|
||||||
memcpy(pRsp->user, pUser->user, TSDB_USER_LEN);
|
memcpy(pRsp->user, pUser->user, TSDB_USER_LEN);
|
||||||
pRsp->superAuth = 1;
|
pRsp->superAuth = 1;
|
||||||
|
pRsp->enable = pUser->enable;
|
||||||
pRsp->version = pUser->authVersion;
|
pRsp->version = pUser->authVersion;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2613,6 +2613,13 @@ void mndExtractDbNameFromStbFullName(const char *stbFullName, char *dst) {
|
||||||
tNameGetFullDbName(&name, dst);
|
tNameGetFullDbName(&name, dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mndExtractShortDbNameFromStbFullName(const char *stbFullName, char *dst) {
|
||||||
|
SName name = {0};
|
||||||
|
tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
||||||
|
|
||||||
|
tNameGetDbName(&name, dst);
|
||||||
|
}
|
||||||
|
|
||||||
void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t dstSize) {
|
void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t dstSize) {
|
||||||
int32_t pos = -1;
|
int32_t pos = -1;
|
||||||
int32_t num = 0;
|
int32_t num = 0;
|
||||||
|
|
|
@ -18,11 +18,12 @@
|
||||||
#include "mndDb.h"
|
#include "mndDb.h"
|
||||||
#include "mndPrivilege.h"
|
#include "mndPrivilege.h"
|
||||||
#include "mndShow.h"
|
#include "mndShow.h"
|
||||||
|
#include "mndStb.h"
|
||||||
#include "mndTopic.h"
|
#include "mndTopic.h"
|
||||||
#include "mndTrans.h"
|
#include "mndTrans.h"
|
||||||
#include "tbase64.h"
|
#include "tbase64.h"
|
||||||
|
|
||||||
#define USER_VER_NUMBER 2
|
#define USER_VER_NUMBER 3
|
||||||
#define USER_RESERVE_SIZE 64
|
#define USER_RESERVE_SIZE 64
|
||||||
|
|
||||||
static int32_t mndCreateDefaultUsers(SMnode *pMnode);
|
static int32_t mndCreateDefaultUsers(SMnode *pMnode);
|
||||||
|
@ -124,10 +125,40 @@ SSdbRaw *mndUserActionEncode(SUserObj *pUser) {
|
||||||
|
|
||||||
int32_t numOfReadDbs = taosHashGetSize(pUser->readDbs);
|
int32_t numOfReadDbs = taosHashGetSize(pUser->readDbs);
|
||||||
int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs);
|
int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs);
|
||||||
|
int32_t numOfReadStbs = taosHashGetSize(pUser->readTbs);
|
||||||
|
int32_t numOfWriteStbs = taosHashGetSize(pUser->writeTbs);
|
||||||
int32_t numOfTopics = taosHashGetSize(pUser->topics);
|
int32_t numOfTopics = taosHashGetSize(pUser->topics);
|
||||||
int32_t size = sizeof(SUserObj) + USER_RESERVE_SIZE + (numOfReadDbs + numOfWriteDbs) * TSDB_DB_FNAME_LEN +
|
int32_t size = sizeof(SUserObj) + USER_RESERVE_SIZE + (numOfReadDbs + numOfWriteDbs) * TSDB_DB_FNAME_LEN +
|
||||||
numOfTopics * TSDB_TOPIC_FNAME_LEN;
|
numOfTopics * TSDB_TOPIC_FNAME_LEN;
|
||||||
|
|
||||||
|
char *stb = taosHashIterate(pUser->readTbs, NULL);
|
||||||
|
while (stb != NULL) {
|
||||||
|
size_t keyLen = 0;
|
||||||
|
void *key = taosHashGetKey(stb, &keyLen);
|
||||||
|
size += sizeof(int32_t);
|
||||||
|
size += keyLen;
|
||||||
|
|
||||||
|
size_t valueLen = 0;
|
||||||
|
valueLen = strlen(stb);
|
||||||
|
size += sizeof(int32_t);
|
||||||
|
size += valueLen;
|
||||||
|
stb = taosHashIterate(pUser->readTbs, stb);
|
||||||
|
}
|
||||||
|
|
||||||
|
stb = taosHashIterate(pUser->writeTbs, NULL);
|
||||||
|
while (stb != NULL) {
|
||||||
|
size_t keyLen = 0;
|
||||||
|
void *key = taosHashGetKey(stb, &keyLen);
|
||||||
|
size += sizeof(int32_t);
|
||||||
|
size += keyLen;
|
||||||
|
|
||||||
|
size_t valueLen = 0;
|
||||||
|
valueLen = strlen(stb);
|
||||||
|
size += sizeof(int32_t);
|
||||||
|
size += keyLen;
|
||||||
|
stb = taosHashIterate(pUser->writeTbs, stb);
|
||||||
|
}
|
||||||
|
|
||||||
SSdbRaw *pRaw = sdbAllocRaw(SDB_USER, USER_VER_NUMBER, size);
|
SSdbRaw *pRaw = sdbAllocRaw(SDB_USER, USER_VER_NUMBER, size);
|
||||||
if (pRaw == NULL) goto _OVER;
|
if (pRaw == NULL) goto _OVER;
|
||||||
|
|
||||||
|
@ -145,6 +176,8 @@ SSdbRaw *mndUserActionEncode(SUserObj *pUser) {
|
||||||
SDB_SET_INT32(pRaw, dataPos, numOfReadDbs, _OVER)
|
SDB_SET_INT32(pRaw, dataPos, numOfReadDbs, _OVER)
|
||||||
SDB_SET_INT32(pRaw, dataPos, numOfWriteDbs, _OVER)
|
SDB_SET_INT32(pRaw, dataPos, numOfWriteDbs, _OVER)
|
||||||
SDB_SET_INT32(pRaw, dataPos, numOfTopics, _OVER)
|
SDB_SET_INT32(pRaw, dataPos, numOfTopics, _OVER)
|
||||||
|
SDB_SET_INT32(pRaw, dataPos, numOfReadStbs, _OVER)
|
||||||
|
SDB_SET_INT32(pRaw, dataPos, numOfWriteStbs, _OVER)
|
||||||
|
|
||||||
char *db = taosHashIterate(pUser->readDbs, NULL);
|
char *db = taosHashIterate(pUser->readDbs, NULL);
|
||||||
while (db != NULL) {
|
while (db != NULL) {
|
||||||
|
@ -164,6 +197,34 @@ SSdbRaw *mndUserActionEncode(SUserObj *pUser) {
|
||||||
topic = taosHashIterate(pUser->topics, topic);
|
topic = taosHashIterate(pUser->topics, topic);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stb = taosHashIterate(pUser->readTbs, NULL);
|
||||||
|
while (stb != NULL) {
|
||||||
|
size_t keyLen = 0;
|
||||||
|
void *key = taosHashGetKey(stb, &keyLen);
|
||||||
|
SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
|
||||||
|
SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
|
||||||
|
|
||||||
|
size_t valueLen = 0;
|
||||||
|
valueLen = strlen(stb) + 1;
|
||||||
|
SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
|
||||||
|
SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
|
||||||
|
stb = taosHashIterate(pUser->readTbs, stb);
|
||||||
|
}
|
||||||
|
|
||||||
|
stb = taosHashIterate(pUser->writeTbs, NULL);
|
||||||
|
while (stb != NULL) {
|
||||||
|
size_t keyLen = 0;
|
||||||
|
void *key = taosHashGetKey(stb, &keyLen);
|
||||||
|
SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
|
||||||
|
SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
|
||||||
|
|
||||||
|
size_t valueLen = 0;
|
||||||
|
valueLen = strlen(stb) + 1;
|
||||||
|
SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
|
||||||
|
SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
|
||||||
|
stb = taosHashIterate(pUser->writeTbs, stb);
|
||||||
|
}
|
||||||
|
|
||||||
SDB_SET_RESERVE(pRaw, dataPos, USER_RESERVE_SIZE, _OVER)
|
SDB_SET_RESERVE(pRaw, dataPos, USER_RESERVE_SIZE, _OVER)
|
||||||
SDB_SET_DATALEN(pRaw, dataPos, _OVER)
|
SDB_SET_DATALEN(pRaw, dataPos, _OVER)
|
||||||
|
|
||||||
|
@ -188,7 +249,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) {
|
||||||
int8_t sver = 0;
|
int8_t sver = 0;
|
||||||
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
|
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
|
||||||
|
|
||||||
if (sver != 1 && sver != 2) {
|
if (sver != 1 && sver != 2 && sver != 3) {
|
||||||
terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
|
terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
@ -214,16 +275,26 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) {
|
||||||
int32_t numOfReadDbs = 0;
|
int32_t numOfReadDbs = 0;
|
||||||
int32_t numOfWriteDbs = 0;
|
int32_t numOfWriteDbs = 0;
|
||||||
int32_t numOfTopics = 0;
|
int32_t numOfTopics = 0;
|
||||||
|
int32_t numOfReadStbs = 0;
|
||||||
|
int32_t numOfWriteStbs = 0;
|
||||||
SDB_GET_INT32(pRaw, dataPos, &numOfReadDbs, _OVER)
|
SDB_GET_INT32(pRaw, dataPos, &numOfReadDbs, _OVER)
|
||||||
SDB_GET_INT32(pRaw, dataPos, &numOfWriteDbs, _OVER)
|
SDB_GET_INT32(pRaw, dataPos, &numOfWriteDbs, _OVER)
|
||||||
if (sver >= 2) {
|
if (sver >= 2) {
|
||||||
SDB_GET_INT32(pRaw, dataPos, &numOfTopics, _OVER)
|
SDB_GET_INT32(pRaw, dataPos, &numOfTopics, _OVER)
|
||||||
}
|
}
|
||||||
|
if (sver >= 3) {
|
||||||
|
SDB_GET_INT32(pRaw, dataPos, &numOfReadStbs, _OVER)
|
||||||
|
SDB_GET_INT32(pRaw, dataPos, &numOfWriteStbs, _OVER)
|
||||||
|
}
|
||||||
|
|
||||||
pUser->readDbs = taosHashInit(numOfReadDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
pUser->readDbs = taosHashInit(numOfReadDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
||||||
pUser->writeDbs =
|
pUser->writeDbs =
|
||||||
taosHashInit(numOfWriteDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
taosHashInit(numOfWriteDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
||||||
pUser->topics = taosHashInit(numOfTopics, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
pUser->topics = taosHashInit(numOfTopics, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
||||||
|
pUser->readTbs =
|
||||||
|
taosHashInit(numOfReadStbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
||||||
|
pUser->writeTbs =
|
||||||
|
taosHashInit(numOfWriteStbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
||||||
if (pUser->readDbs == NULL || pUser->writeDbs == NULL || pUser->topics == NULL) goto _OVER;
|
if (pUser->readDbs == NULL || pUser->writeDbs == NULL || pUser->topics == NULL) goto _OVER;
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfReadDbs; ++i) {
|
for (int32_t i = 0; i < numOfReadDbs; ++i) {
|
||||||
|
@ -249,6 +320,48 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sver >= 3) {
|
||||||
|
for (int32_t i = 0; i < numOfReadStbs; ++i) {
|
||||||
|
int32_t keyLen = 0;
|
||||||
|
SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
|
||||||
|
|
||||||
|
char *key = taosMemoryCalloc(keyLen, sizeof(char));
|
||||||
|
memset(key, 0, keyLen);
|
||||||
|
SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
|
||||||
|
|
||||||
|
int32_t valuelen = 0;
|
||||||
|
SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
|
||||||
|
char *value = taosMemoryCalloc(valuelen, sizeof(char));
|
||||||
|
memset(value, 0, keyLen);
|
||||||
|
SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
|
||||||
|
|
||||||
|
taosHashPut(pUser->readTbs, key, keyLen, value, valuelen);
|
||||||
|
|
||||||
|
taosMemoryFree(key);
|
||||||
|
taosMemoryFree(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numOfWriteStbs; ++i) {
|
||||||
|
int32_t keyLen = 0;
|
||||||
|
SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
|
||||||
|
|
||||||
|
char *key = taosMemoryCalloc(keyLen, sizeof(char));
|
||||||
|
memset(key, 0, keyLen);
|
||||||
|
SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
|
||||||
|
|
||||||
|
int32_t valuelen = 0;
|
||||||
|
SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
|
||||||
|
char *value = taosMemoryCalloc(valuelen, sizeof(char));
|
||||||
|
memset(value, 0, keyLen);
|
||||||
|
SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
|
||||||
|
|
||||||
|
taosHashPut(pUser->writeTbs, key, keyLen, value, valuelen);
|
||||||
|
|
||||||
|
taosMemoryFree(key);
|
||||||
|
taosMemoryFree(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SDB_GET_RESERVE(pRaw, dataPos, USER_RESERVE_SIZE, _OVER)
|
SDB_GET_RESERVE(pRaw, dataPos, USER_RESERVE_SIZE, _OVER)
|
||||||
taosInitRWLatch(&pUser->lock);
|
taosInitRWLatch(&pUser->lock);
|
||||||
|
|
||||||
|
@ -261,6 +374,8 @@ _OVER:
|
||||||
taosHashCleanup(pUser->readDbs);
|
taosHashCleanup(pUser->readDbs);
|
||||||
taosHashCleanup(pUser->writeDbs);
|
taosHashCleanup(pUser->writeDbs);
|
||||||
taosHashCleanup(pUser->topics);
|
taosHashCleanup(pUser->topics);
|
||||||
|
taosHashCleanup(pUser->readTbs);
|
||||||
|
taosHashCleanup(pUser->writeTbs);
|
||||||
}
|
}
|
||||||
taosMemoryFreeClear(pRow);
|
taosMemoryFreeClear(pRow);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -285,6 +400,32 @@ static int32_t mndUserActionInsert(SSdb *pSdb, SUserObj *pUser) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHashObj *mndDupTableHash(SHashObj *pOld) {
|
||||||
|
SHashObj *pNew =
|
||||||
|
taosHashInit(taosHashGetSize(pOld), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
|
||||||
|
if (pNew == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *tb = taosHashIterate(pOld, NULL);
|
||||||
|
while (tb != NULL) {
|
||||||
|
size_t keyLen = 0;
|
||||||
|
char *key = taosHashGetKey(tb, &keyLen);
|
||||||
|
|
||||||
|
int32_t valueLen = strlen(tb) + 1;
|
||||||
|
if (taosHashPut(pNew, key, keyLen, tb, valueLen) != 0) {
|
||||||
|
taosHashCancelIterate(pOld, tb);
|
||||||
|
taosHashCleanup(pNew);
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
tb = taosHashIterate(pOld, tb);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pNew;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndUserDupObj(SUserObj *pUser, SUserObj *pNew) {
|
static int32_t mndUserDupObj(SUserObj *pUser, SUserObj *pNew) {
|
||||||
memcpy(pNew, pUser, sizeof(SUserObj));
|
memcpy(pNew, pUser, sizeof(SUserObj));
|
||||||
pNew->authVersion++;
|
pNew->authVersion++;
|
||||||
|
@ -293,6 +434,8 @@ static int32_t mndUserDupObj(SUserObj *pUser, SUserObj *pNew) {
|
||||||
taosRLockLatch(&pUser->lock);
|
taosRLockLatch(&pUser->lock);
|
||||||
pNew->readDbs = mndDupDbHash(pUser->readDbs);
|
pNew->readDbs = mndDupDbHash(pUser->readDbs);
|
||||||
pNew->writeDbs = mndDupDbHash(pUser->writeDbs);
|
pNew->writeDbs = mndDupDbHash(pUser->writeDbs);
|
||||||
|
pNew->readTbs = mndDupTableHash(pUser->readTbs);
|
||||||
|
pNew->writeTbs = mndDupTableHash(pUser->writeTbs);
|
||||||
pNew->topics = mndDupTopicHash(pUser->topics);
|
pNew->topics = mndDupTopicHash(pUser->topics);
|
||||||
taosRUnLockLatch(&pUser->lock);
|
taosRUnLockLatch(&pUser->lock);
|
||||||
|
|
||||||
|
@ -306,9 +449,13 @@ static void mndUserFreeObj(SUserObj *pUser) {
|
||||||
taosHashCleanup(pUser->readDbs);
|
taosHashCleanup(pUser->readDbs);
|
||||||
taosHashCleanup(pUser->writeDbs);
|
taosHashCleanup(pUser->writeDbs);
|
||||||
taosHashCleanup(pUser->topics);
|
taosHashCleanup(pUser->topics);
|
||||||
|
taosHashCleanup(pUser->readTbs);
|
||||||
|
taosHashCleanup(pUser->writeTbs);
|
||||||
pUser->readDbs = NULL;
|
pUser->readDbs = NULL;
|
||||||
pUser->writeDbs = NULL;
|
pUser->writeDbs = NULL;
|
||||||
pUser->topics = NULL;
|
pUser->topics = NULL;
|
||||||
|
pUser->readTbs = NULL;
|
||||||
|
pUser->writeTbs = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndUserActionDelete(SSdb *pSdb, SUserObj *pUser) {
|
static int32_t mndUserActionDelete(SSdb *pSdb, SUserObj *pUser) {
|
||||||
|
@ -328,6 +475,8 @@ static int32_t mndUserActionUpdate(SSdb *pSdb, SUserObj *pOld, SUserObj *pNew) {
|
||||||
TSWAP(pOld->readDbs, pNew->readDbs);
|
TSWAP(pOld->readDbs, pNew->readDbs);
|
||||||
TSWAP(pOld->writeDbs, pNew->writeDbs);
|
TSWAP(pOld->writeDbs, pNew->writeDbs);
|
||||||
TSWAP(pOld->topics, pNew->topics);
|
TSWAP(pOld->topics, pNew->topics);
|
||||||
|
TSWAP(pOld->readTbs, pNew->readTbs);
|
||||||
|
TSWAP(pOld->writeTbs, pNew->writeTbs);
|
||||||
taosWUnLockLatch(&pOld->lock);
|
taosWUnLockLatch(&pOld->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -498,6 +647,77 @@ SHashObj *mndDupDbHash(SHashObj *pOld) { return mndDupObjHash(pOld, TSDB_DB_FNAM
|
||||||
|
|
||||||
SHashObj *mndDupTopicHash(SHashObj *pOld) { return mndDupObjHash(pOld, TSDB_TOPIC_FNAME_LEN); }
|
SHashObj *mndDupTopicHash(SHashObj *pOld) { return mndDupObjHash(pOld, TSDB_TOPIC_FNAME_LEN); }
|
||||||
|
|
||||||
|
static int32_t mndTagPriviledge(SMnode *pMnode, SHashObj *hash, SAlterUserReq *alterReq) {
|
||||||
|
char tbFName[TSDB_TABLE_FNAME_LEN] = {0};
|
||||||
|
snprintf(tbFName, TSDB_TABLE_FNAME_LEN, "%s.%s", alterReq->objname, alterReq->tabName);
|
||||||
|
int32_t len = strlen(tbFName) + 1;
|
||||||
|
|
||||||
|
SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
|
||||||
|
if (pStb == NULL) {
|
||||||
|
mndReleaseStb(pMnode, pStb);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (alterReq->tagCond == NULL) {
|
||||||
|
mndReleaseStb(pMnode, pStb);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *value = taosHashGet(hash, tbFName, len);
|
||||||
|
if (value != NULL) {
|
||||||
|
mndReleaseStb(pMnode, pStb);
|
||||||
|
terrno = TSDB_CODE_MND_PRIVILEDGE_EXIST;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t condLen = alterReq->tagCondLen + 1;
|
||||||
|
if (taosHashPut(hash, tbFName, len, alterReq->tagCond, condLen) != 0) {
|
||||||
|
mndReleaseStb(pMnode, pStb);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
mndReleaseStb(pMnode, pStb);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mndTablePriviledge(SMnode *pMnode, SHashObj *hash, SAlterUserReq *alterReq, SSdb *pSdb) {
|
||||||
|
void *pIter = NULL;
|
||||||
|
char tbFName[TSDB_TABLE_FNAME_LEN] = {0};
|
||||||
|
|
||||||
|
snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq->objname, alterReq->tabName);
|
||||||
|
int32_t len = strlen(tbFName) + 1;
|
||||||
|
|
||||||
|
if (alterReq->tagCond != NULL && alterReq->tagCondLen != 0) {
|
||||||
|
char *value = taosHashGet(hash, tbFName, len);
|
||||||
|
if (value != NULL) {
|
||||||
|
terrno = TSDB_CODE_MND_PRIVILEDGE_EXIST;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t condLen = alterReq->tagCondLen + 1;
|
||||||
|
if (taosHashPut(hash, tbFName, len, alterReq->tagCond, condLen) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (taosHashPut(hash, tbFName, len, "t", 2) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mndRemoveTablePriviledge(SMnode *pMnode, SHashObj *hash, SAlterUserReq *alterReq, SSdb *pSdb) {
|
||||||
|
void *pIter = NULL;
|
||||||
|
char tbFName[TSDB_TABLE_FNAME_LEN] = {0};
|
||||||
|
snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq->objname, alterReq->tabName);
|
||||||
|
int32_t len = strlen(tbFName) + 1;
|
||||||
|
|
||||||
|
if (taosHashRemove(hash, tbFName, len) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) {
|
static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
|
@ -637,6 +857,24 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (alterReq.alterType == TSDB_ALTER_USER_ADD_READ_TABLE) {
|
||||||
|
if (mndTablePriviledge(pMnode, newUser.readTbs, &alterReq, pSdb) != 0) goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alterReq.alterType == TSDB_ALTER_USER_ADD_WRITE_TABLE) {
|
||||||
|
if (mndTablePriviledge(pMnode, newUser.writeTbs, &alterReq, pSdb) != 0) goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alterReq.alterType == TSDB_ALTER_USER_REMOVE_READ_TABLE ||
|
||||||
|
alterReq.alterType == TSDB_ALTER_USER_REMOVE_READ_TAG) {
|
||||||
|
if (mndRemoveTablePriviledge(pMnode, newUser.readTbs, &alterReq, pSdb) != 0) goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alterReq.alterType == TSDB_ALTER_USER_REMOVE_WRITE_TABLE ||
|
||||||
|
alterReq.alterType == TSDB_ALTER_USER_REMOVE_WRITE_TAG) {
|
||||||
|
if (mndRemoveTablePriviledge(pMnode, newUser.writeTbs, &alterReq, pSdb) != 0) goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
if (alterReq.alterType == TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC) {
|
if (alterReq.alterType == TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC) {
|
||||||
int32_t len = strlen(alterReq.objname) + 1;
|
int32_t len = strlen(alterReq.objname) + 1;
|
||||||
SMqTopicObj *pTopic = mndAcquireTopic(pMnode, alterReq.objname);
|
SMqTopicObj *pTopic = mndAcquireTopic(pMnode, alterReq.objname);
|
||||||
|
@ -647,6 +885,14 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) {
|
||||||
taosHashPut(newUser.topics, pTopic->name, len, pTopic->name, TSDB_TOPIC_FNAME_LEN);
|
taosHashPut(newUser.topics, pTopic->name, len, pTopic->name, TSDB_TOPIC_FNAME_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (alterReq.alterType == TSDB_ALTER_USER_ADD_READ_TAG) {
|
||||||
|
if (mndTagPriviledge(pMnode, newUser.readTbs, &alterReq) != 0) goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alterReq.alterType == TSDB_ALTER_USER_ADD_WRITE_TAG) {
|
||||||
|
if (mndTagPriviledge(pMnode, newUser.writeTbs, &alterReq) != 0) goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
if (alterReq.alterType == TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC) {
|
if (alterReq.alterType == TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC) {
|
||||||
int32_t len = strlen(alterReq.objname) + 1;
|
int32_t len = strlen(alterReq.objname) + 1;
|
||||||
SMqTopicObj *pTopic = mndAcquireTopic(pMnode, alterReq.objname);
|
SMqTopicObj *pTopic = mndAcquireTopic(pMnode, alterReq.objname);
|
||||||
|
@ -830,6 +1076,72 @@ static void mndCancelGetNextUser(SMnode *pMnode, void *pIter) {
|
||||||
sdbCancelFetch(pSdb, pIter);
|
sdbCancelFetch(pSdb, pIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mndLoopHash(SHashObj *hash, char *priType, SSDataBlock *pBlock, int32_t *numOfRows, char *user,
|
||||||
|
SShowObj *pShow) {
|
||||||
|
char *value = taosHashIterate(hash, NULL);
|
||||||
|
int32_t cols = 0;
|
||||||
|
|
||||||
|
while (value != NULL) {
|
||||||
|
cols = 0;
|
||||||
|
char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(userName, user, pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, *numOfRows, (const char *)userName, false);
|
||||||
|
|
||||||
|
char privilege[20] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(privilege, priType, pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, *numOfRows, (const char *)privilege, false);
|
||||||
|
|
||||||
|
size_t keyLen = 0;
|
||||||
|
void *key = taosHashGetKey(value, &keyLen);
|
||||||
|
|
||||||
|
char dbName[TSDB_DB_NAME_LEN] = {0};
|
||||||
|
mndExtractShortDbNameFromStbFullName(key, dbName);
|
||||||
|
char dbNameContent[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(dbNameContent, dbName, pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, *numOfRows, (const char *)dbNameContent, false);
|
||||||
|
|
||||||
|
char tableName[TSDB_TABLE_NAME_LEN] = {0};
|
||||||
|
mndExtractTbNameFromStbFullName(key, tableName, TSDB_TABLE_NAME_LEN);
|
||||||
|
char tableNameContent[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(tableNameContent, tableName, pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, *numOfRows, (const char *)tableNameContent, false);
|
||||||
|
|
||||||
|
if (strcmp("t", value) != 0) {
|
||||||
|
SNode *pAst = NULL;
|
||||||
|
int32_t sqlLen = 0;
|
||||||
|
char sql[TSDB_EXPLAIN_RESULT_ROW_SIZE] = {0};
|
||||||
|
|
||||||
|
if (nodesStringToNode(value, &pAst) == 0) {
|
||||||
|
nodesNodeToSQL(pAst, sql, TSDB_EXPLAIN_RESULT_ROW_SIZE, &sqlLen);
|
||||||
|
nodesDestroyNode(pAst);
|
||||||
|
} else {
|
||||||
|
sqlLen = 5;
|
||||||
|
sprintf(sql, "error");
|
||||||
|
}
|
||||||
|
|
||||||
|
// char *obj = taosMemoryMalloc(sqlLen + VARSTR_HEADER_SIZE + 1);
|
||||||
|
char obj[TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(obj, sql, pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, *numOfRows, (const char *)obj, false);
|
||||||
|
// taosMemoryFree(obj);
|
||||||
|
} else {
|
||||||
|
char condition[20] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(condition, "", pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, *numOfRows, (const char *)condition, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
(*numOfRows)++;
|
||||||
|
value = taosHashIterate(hash, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
|
static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
|
@ -845,7 +1157,9 @@ static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
|
||||||
int32_t numOfReadDbs = taosHashGetSize(pUser->readDbs);
|
int32_t numOfReadDbs = taosHashGetSize(pUser->readDbs);
|
||||||
int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs);
|
int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs);
|
||||||
int32_t numOfTopics = taosHashGetSize(pUser->topics);
|
int32_t numOfTopics = taosHashGetSize(pUser->topics);
|
||||||
if (numOfRows + numOfReadDbs + numOfWriteDbs + numOfTopics >= rows) break;
|
int32_t numOfReadTbs = taosHashGetSize(pUser->readTbs);
|
||||||
|
int32_t numOfWriteTbs = taosHashGetSize(pUser->writeTbs);
|
||||||
|
if (numOfRows + numOfReadDbs + numOfWriteDbs + numOfTopics + numOfReadTbs + numOfWriteTbs >= rows) break;
|
||||||
|
|
||||||
if (pUser->superUser) {
|
if (pUser->superUser) {
|
||||||
cols = 0;
|
cols = 0;
|
||||||
|
@ -864,6 +1178,16 @@ static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataSetVal(pColInfo, numOfRows, (const char *)objName, false);
|
colDataSetVal(pColInfo, numOfRows, (const char *)objName, false);
|
||||||
|
|
||||||
|
char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(tableName, "", pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, numOfRows, (const char *)tableName, false);
|
||||||
|
|
||||||
|
char condition[TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(condition, "", pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, numOfRows, (const char *)condition, false);
|
||||||
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -888,6 +1212,16 @@ static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataSetVal(pColInfo, numOfRows, (const char *)objName, false);
|
colDataSetVal(pColInfo, numOfRows, (const char *)objName, false);
|
||||||
|
|
||||||
|
char tableName[20] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(tableName, "", pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, numOfRows, (const char *)tableName, false);
|
||||||
|
|
||||||
|
char condition[20] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(condition, "", pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, numOfRows, (const char *)condition, false);
|
||||||
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
db = taosHashIterate(pUser->readDbs, db);
|
db = taosHashIterate(pUser->readDbs, db);
|
||||||
}
|
}
|
||||||
|
@ -913,10 +1247,24 @@ static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataSetVal(pColInfo, numOfRows, (const char *)objName, false);
|
colDataSetVal(pColInfo, numOfRows, (const char *)objName, false);
|
||||||
|
|
||||||
|
char tableName[20] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(tableName, "", pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, numOfRows, (const char *)tableName, false);
|
||||||
|
|
||||||
|
char condition[20] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(condition, "", pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, numOfRows, (const char *)condition, false);
|
||||||
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
db = taosHashIterate(pUser->writeDbs, db);
|
db = taosHashIterate(pUser->writeDbs, db);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mndLoopHash(pUser->readTbs, "read", pBlock, &numOfRows, pUser->user, pShow);
|
||||||
|
|
||||||
|
mndLoopHash(pUser->writeTbs, "write", pBlock, &numOfRows, pUser->user, pShow);
|
||||||
|
|
||||||
char *topic = taosHashIterate(pUser->topics, NULL);
|
char *topic = taosHashIterate(pUser->topics, NULL);
|
||||||
while (topic != NULL) {
|
while (topic != NULL) {
|
||||||
cols = 0;
|
cols = 0;
|
||||||
|
@ -936,6 +1284,16 @@ static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataSetVal(pColInfo, numOfRows, (const char *)topicName, false);
|
colDataSetVal(pColInfo, numOfRows, (const char *)topicName, false);
|
||||||
|
|
||||||
|
char tableName[20] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(tableName, "", pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, numOfRows, (const char *)tableName, false);
|
||||||
|
|
||||||
|
char condition[20] = {0};
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(condition, "", pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataSetVal(pColInfo, numOfRows, (const char *)condition, false);
|
||||||
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
topic = taosHashIterate(pUser->topics, topic);
|
topic = taosHashIterate(pUser->topics, topic);
|
||||||
}
|
}
|
||||||
|
@ -1039,6 +1397,8 @@ int32_t mndUserRemoveDb(SMnode *pMnode, STrans *pTrans, char *db) {
|
||||||
if (inRead || inWrite) {
|
if (inRead || inWrite) {
|
||||||
(void)taosHashRemove(newUser.readDbs, db, len);
|
(void)taosHashRemove(newUser.readDbs, db, len);
|
||||||
(void)taosHashRemove(newUser.writeDbs, db, len);
|
(void)taosHashRemove(newUser.writeDbs, db, len);
|
||||||
|
(void)taosHashRemove(newUser.readTbs, db, len);
|
||||||
|
(void)taosHashRemove(newUser.writeTbs, db, len);
|
||||||
|
|
||||||
SSdbRaw *pCommitRaw = mndUserActionEncode(&newUser);
|
SSdbRaw *pCommitRaw = mndUserActionEncode(&newUser);
|
||||||
if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) break;
|
if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) break;
|
||||||
|
|
|
@ -123,12 +123,12 @@ int32_t tsdbRowIterOpen(STSDBRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema)
|
||||||
void tsdbRowClose(STSDBRowIter *pIter);
|
void tsdbRowClose(STSDBRowIter *pIter);
|
||||||
SColVal *tsdbRowIterNext(STSDBRowIter *pIter);
|
SColVal *tsdbRowIterNext(STSDBRowIter *pIter);
|
||||||
// SRowMerger
|
// SRowMerger
|
||||||
int32_t tsdbRowMergerInit2(SRowMerger *pMerger, STSchema *pResTSchema, TSDBROW *pRow, STSchema *pTSchema);
|
int32_t tsdbRowMergerInit(SRowMerger *pMerger, STSchema *pResTSchema, TSDBROW *pRow, STSchema *pTSchema);
|
||||||
int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema);
|
int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema);
|
||||||
|
|
||||||
int32_t tsdbRowMergerInit(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema);
|
// int32_t tsdbRowMergerInit(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema);
|
||||||
void tsdbRowMergerClear(SRowMerger *pMerger);
|
void tsdbRowMergerClear(SRowMerger *pMerger);
|
||||||
int32_t tsdbRowMerge(SRowMerger *pMerger, TSDBROW *pRow);
|
// int32_t tsdbRowMerge(SRowMerger *pMerger, TSDBROW *pRow);
|
||||||
int32_t tsdbRowMergerGetRow(SRowMerger *pMerger, SRow **ppRow);
|
int32_t tsdbRowMergerGetRow(SRowMerger *pMerger, SRow **ppRow);
|
||||||
// TABLEID
|
// TABLEID
|
||||||
int32_t tTABLEIDCmprFn(const void *p1, const void *p2);
|
int32_t tTABLEIDCmprFn(const void *p1, const void *p2);
|
||||||
|
@ -224,7 +224,7 @@ int32_t tsdbTbDataIterCreate(STbData *pTbData, TSDBKEY *pFrom, int8_t backward,
|
||||||
void *tsdbTbDataIterDestroy(STbDataIter *pIter);
|
void *tsdbTbDataIterDestroy(STbDataIter *pIter);
|
||||||
void tsdbTbDataIterOpen(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter *pIter);
|
void tsdbTbDataIterOpen(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter *pIter);
|
||||||
bool tsdbTbDataIterNext(STbDataIter *pIter);
|
bool tsdbTbDataIterNext(STbDataIter *pIter);
|
||||||
void tsdbMemTableCountRows(SMemTable *pMemTable, SHashObj* pTableMap, int64_t *rowsNum);
|
void tsdbMemTableCountRows(SMemTable *pMemTable, SHashObj *pTableMap, int64_t *rowsNum);
|
||||||
|
|
||||||
// STbData
|
// STbData
|
||||||
int32_t tsdbGetNRowsInTbData(STbData *pTbData);
|
int32_t tsdbGetNRowsInTbData(STbData *pTbData);
|
||||||
|
|
|
@ -170,7 +170,7 @@ int32_t tqScanTaosx(STQ* pTq, const STqHandle* pHandle, STaosxRsp* pRsp, SMqMeta
|
||||||
qStreamExtractOffset(task, &tmp->rspOffset);
|
qStreamExtractOffset(task, &tmp->rspOffset);
|
||||||
*pMetaRsp = *tmp;
|
*pMetaRsp = *tmp;
|
||||||
|
|
||||||
tqDebug("tmqsnap task get data");
|
tqDebug("tmqsnap task get meta");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -966,7 +966,8 @@ static int32_t doCopyColVal(SColumnInfoData* pColInfoData, int32_t rowIndex, int
|
||||||
} else {
|
} else {
|
||||||
varDataSetLen(pSup->buildBuf[colIndex], pColVal->value.nData);
|
varDataSetLen(pSup->buildBuf[colIndex], pColVal->value.nData);
|
||||||
if (pColVal->value.nData > pColInfoData->info.bytes) {
|
if (pColVal->value.nData > pColInfoData->info.bytes) {
|
||||||
tsdbWarn("column cid:%d actual data len %d is bigger than schema len %d", pColVal->cid, pColVal->value.nData, pColInfoData->info.bytes);
|
tsdbWarn("column cid:%d actual data len %d is bigger than schema len %d", pColVal->cid, pColVal->value.nData,
|
||||||
|
pColInfoData->info.bytes);
|
||||||
return TSDB_CODE_TDB_INVALID_TABLE_SCHEMA_VER;
|
return TSDB_CODE_TDB_INVALID_TABLE_SCHEMA_VER;
|
||||||
}
|
}
|
||||||
if (pColVal->value.nData > 0) { // pData may be null, if nData is 0
|
if (pColVal->value.nData > 0) { // pData may be null, if nData is 0
|
||||||
|
@ -1794,7 +1795,7 @@ static int32_t buildDataBlockFromBuf(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool tryCopyDistinctRowFromFileBlock(STsdbReader* pReader, SBlockData* pBlockData, int64_t key,
|
static bool tryCopyDistinctRowFromFileBlock(STsdbReader* pReader, SBlockData* pBlockData, int64_t key,
|
||||||
SFileBlockDumpInfo* pDumpInfo, bool *copied) {
|
SFileBlockDumpInfo* pDumpInfo, bool* copied) {
|
||||||
// opt version
|
// opt version
|
||||||
// 1. it is not a border point
|
// 1. it is not a border point
|
||||||
// 2. the direct next point is not an duplicated timestamp
|
// 2. the direct next point is not an duplicated timestamp
|
||||||
|
@ -1843,7 +1844,8 @@ static bool nextRowFromLastBlocks(SLastBlockReader* pLastBlockReader, STableBloc
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool tryCopyDistinctRowFromSttBlock(TSDBROW* fRow, SLastBlockReader* pLastBlockReader,
|
static bool tryCopyDistinctRowFromSttBlock(TSDBROW* fRow, SLastBlockReader* pLastBlockReader,
|
||||||
STableBlockScanInfo* pScanInfo, int64_t ts, STsdbReader* pReader, bool *copied) {
|
STableBlockScanInfo* pScanInfo, int64_t ts, STsdbReader* pReader,
|
||||||
|
bool* copied) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
*copied = false;
|
*copied = false;
|
||||||
|
@ -1967,7 +1969,7 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
if (pReader->order == TSDB_ORDER_ASC) {
|
if (pReader->order == TSDB_ORDER_ASC) {
|
||||||
if (minKey == key) {
|
if (minKey == key) {
|
||||||
init = true;
|
init = true;
|
||||||
int32_t code = tsdbRowMergerInit(&merge, &fRow, pReader->pSchema);
|
int32_t code = tsdbRowMergerInit(&merge, NULL, &fRow, pReader->pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -1977,10 +1979,10 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
if (minKey == tsLast) {
|
if (minKey == tsLast) {
|
||||||
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
||||||
if (init) {
|
if (init) {
|
||||||
tsdbRowMerge(&merge, &fRow1);
|
tsdbRowMergerAdd(&merge, &fRow1, NULL);
|
||||||
} else {
|
} else {
|
||||||
init = true;
|
init = true;
|
||||||
int32_t code = tsdbRowMergerInit(&merge, &fRow1, pReader->pSchema);
|
int32_t code = tsdbRowMergerInit(&merge, NULL, &fRow1, pReader->pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -1997,7 +1999,7 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
tsdbRowMergerAdd(&merge, pRow, pSchema);
|
tsdbRowMergerAdd(&merge, pRow, pSchema);
|
||||||
} else {
|
} else {
|
||||||
init = true;
|
init = true;
|
||||||
int32_t code = tsdbRowMergerInit(&merge, pRow, pSchema);
|
int32_t code = tsdbRowMergerInit(&merge, NULL, pRow, pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2011,7 +2013,7 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
if (minKey == k.ts) {
|
if (minKey == k.ts) {
|
||||||
init = true;
|
init = true;
|
||||||
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(pRow), pReader, pBlockScanInfo->uid);
|
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(pRow), pReader, pBlockScanInfo->uid);
|
||||||
int32_t code = tsdbRowMergerInit(&merge, pRow, pSchema);
|
int32_t code = tsdbRowMergerInit(&merge, NULL, pRow, pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2025,10 +2027,10 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
if (minKey == tsLast) {
|
if (minKey == tsLast) {
|
||||||
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
||||||
if (init) {
|
if (init) {
|
||||||
tsdbRowMerge(&merge, &fRow1);
|
tsdbRowMergerAdd(&merge, &fRow1, NULL);
|
||||||
} else {
|
} else {
|
||||||
init = true;
|
init = true;
|
||||||
int32_t code = tsdbRowMergerInit(&merge, &fRow1, pReader->pSchema);
|
int32_t code = tsdbRowMergerInit(&merge, NULL, &fRow1, pReader->pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2038,10 +2040,10 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
|
|
||||||
if (minKey == key) {
|
if (minKey == key) {
|
||||||
if (init) {
|
if (init) {
|
||||||
tsdbRowMerge(&merge, &fRow);
|
tsdbRowMergerAdd(&merge, &fRow, NULL);
|
||||||
} else {
|
} else {
|
||||||
init = true;
|
init = true;
|
||||||
int32_t code = tsdbRowMergerInit(&merge, &fRow, pReader->pSchema);
|
int32_t code = tsdbRowMergerInit(&merge, NULL, &fRow, pReader->pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2086,13 +2088,13 @@ static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader,
|
||||||
pBlockScanInfo->lastKey = tsLastBlock;
|
pBlockScanInfo->lastKey = tsLastBlock;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
int32_t code = tsdbRowMergerInit(&merge, &fRow, pReader->pSchema);
|
int32_t code = tsdbRowMergerInit(&merge, NULL, &fRow, pReader->pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
||||||
tsdbRowMerge(&merge, &fRow1);
|
tsdbRowMergerAdd(&merge, &fRow1, NULL);
|
||||||
doMergeRowsInLastBlock(pLastBlockReader, pBlockScanInfo, tsLastBlock, &merge, &pReader->verRange, pReader->idStr);
|
doMergeRowsInLastBlock(pLastBlockReader, pBlockScanInfo, tsLastBlock, &merge, &pReader->verRange, pReader->idStr);
|
||||||
|
|
||||||
code = tsdbRowMergerGetRow(&merge, &pTSRow);
|
code = tsdbRowMergerGetRow(&merge, &pTSRow);
|
||||||
|
@ -2108,10 +2110,9 @@ static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader,
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} else { // not merge block data
|
} else { // not merge block data
|
||||||
int32_t code = tsdbRowMergerInit(&merge, &fRow, pReader->pSchema);
|
int32_t code = tsdbRowMergerInit(&merge, NULL, &fRow, pReader->pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2163,7 +2164,7 @@ static int32_t mergeFileBlockAndLastBlock(STsdbReader* pReader, SLastBlockReader
|
||||||
SRow* pTSRow = NULL;
|
SRow* pTSRow = NULL;
|
||||||
SRowMerger merge = {0};
|
SRowMerger merge = {0};
|
||||||
|
|
||||||
int32_t code = tsdbRowMergerInit(&merge, &fRow, pReader->pSchema);
|
int32_t code = tsdbRowMergerInit(&merge, NULL, &fRow, pReader->pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2171,7 +2172,7 @@ static int32_t mergeFileBlockAndLastBlock(STsdbReader* pReader, SLastBlockReader
|
||||||
doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge);
|
doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge);
|
||||||
|
|
||||||
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
||||||
tsdbRowMerge(&merge, &fRow1);
|
tsdbRowMergerAdd(&merge, &fRow1, NULL);
|
||||||
|
|
||||||
doMergeRowsInLastBlock(pLastBlockReader, pBlockScanInfo, ts, &merge, &pReader->verRange, pReader->idStr);
|
doMergeRowsInLastBlock(pLastBlockReader, pBlockScanInfo, ts, &merge, &pReader->verRange, pReader->idStr);
|
||||||
|
|
||||||
|
@ -2216,6 +2217,14 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
|
|
||||||
TSDBKEY k = TSDBROW_KEY(pRow);
|
TSDBKEY k = TSDBROW_KEY(pRow);
|
||||||
TSDBKEY ik = TSDBROW_KEY(piRow);
|
TSDBKEY ik = TSDBROW_KEY(piRow);
|
||||||
|
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(pRow), pReader, pBlockScanInfo->uid);
|
||||||
|
if (pSchema == NULL) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
STSchema* piSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(piRow), pReader, pBlockScanInfo->uid);
|
||||||
|
if (piSchema == NULL) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int64_t minKey = 0;
|
int64_t minKey = 0;
|
||||||
if (ASCENDING_TRAVERSE(pReader->order)) {
|
if (ASCENDING_TRAVERSE(pReader->order)) {
|
||||||
|
@ -2262,7 +2271,7 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
if (minKey == key) {
|
if (minKey == key) {
|
||||||
init = true;
|
init = true;
|
||||||
TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex);
|
TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex);
|
||||||
code = tsdbRowMergerInit(&merge, &fRow, pReader->pSchema);
|
code = tsdbRowMergerInit(&merge, NULL, &fRow, pReader->pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2273,10 +2282,10 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
if (minKey == tsLast) {
|
if (minKey == tsLast) {
|
||||||
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
||||||
if (init) {
|
if (init) {
|
||||||
tsdbRowMerge(&merge, &fRow1);
|
tsdbRowMergerAdd(&merge, &fRow1, NULL);
|
||||||
} else {
|
} else {
|
||||||
init = true;
|
init = true;
|
||||||
code = tsdbRowMergerInit(&merge, &fRow1, pReader->pSchema);
|
code = tsdbRowMergerInit(&merge, NULL, &fRow1, pReader->pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2287,15 +2296,10 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
|
|
||||||
if (minKey == ik.ts) {
|
if (minKey == ik.ts) {
|
||||||
if (init) {
|
if (init) {
|
||||||
tsdbRowMerge(&merge, piRow);
|
tsdbRowMergerAdd(&merge, piRow, piSchema);
|
||||||
} else {
|
} else {
|
||||||
init = true;
|
init = true;
|
||||||
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(piRow), pReader, pBlockScanInfo->uid);
|
code = tsdbRowMergerInit(&merge, pSchema, piRow, piSchema);
|
||||||
if (pSchema == NULL) {
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
code = tsdbRowMergerInit(&merge, piRow, pSchema);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2314,10 +2318,10 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbRowMerge(&merge, pRow);
|
tsdbRowMergerAdd(&merge, pRow, pSchema);
|
||||||
} else {
|
} else {
|
||||||
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(pRow), pReader, pBlockScanInfo->uid);
|
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(pRow), pReader, pBlockScanInfo->uid);
|
||||||
code = tsdbRowMergerInit(&merge, pRow, pSchema);
|
code = tsdbRowMergerInit(&merge, NULL, pRow, pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2331,8 +2335,7 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
} else {
|
} else {
|
||||||
if (minKey == k.ts) {
|
if (minKey == k.ts) {
|
||||||
init = true;
|
init = true;
|
||||||
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(pRow), pReader, pBlockScanInfo->uid);
|
code = tsdbRowMergerInit(&merge, NULL, pRow, pSchema);
|
||||||
code = tsdbRowMergerInit(&merge, pRow, pSchema);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2346,11 +2349,11 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
|
|
||||||
if (minKey == ik.ts) {
|
if (minKey == ik.ts) {
|
||||||
if (init) {
|
if (init) {
|
||||||
tsdbRowMerge(&merge, piRow);
|
tsdbRowMergerAdd(&merge, piRow, piSchema);
|
||||||
} else {
|
} else {
|
||||||
init = true;
|
init = true;
|
||||||
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(piRow), pReader, pBlockScanInfo->uid);
|
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(piRow), pReader, pBlockScanInfo->uid);
|
||||||
code = tsdbRowMergerInit(&merge, piRow, pSchema);
|
code = tsdbRowMergerInit(&merge, pSchema, piRow, piSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2365,10 +2368,10 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
if (minKey == tsLast) {
|
if (minKey == tsLast) {
|
||||||
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
||||||
if (init) {
|
if (init) {
|
||||||
tsdbRowMerge(&merge, &fRow1);
|
tsdbRowMergerAdd(&merge, &fRow1, NULL);
|
||||||
} else {
|
} else {
|
||||||
init = true;
|
init = true;
|
||||||
code = tsdbRowMergerInit(&merge, &fRow1, pReader->pSchema);
|
code = tsdbRowMergerInit(&merge, NULL, &fRow1, pReader->pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2379,7 +2382,7 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
if (minKey == key) {
|
if (minKey == key) {
|
||||||
TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex);
|
TSDBROW fRow = tsdbRowFromBlockData(pBlockData, pDumpInfo->rowIndex);
|
||||||
if (!init) {
|
if (!init) {
|
||||||
code = tsdbRowMergerInit(&merge, &fRow, pReader->pSchema);
|
code = tsdbRowMergerInit(&merge, NULL, &fRow, pReader->pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2387,7 +2390,7 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
if (merge.pTSchema == NULL) {
|
if (merge.pTSchema == NULL) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
tsdbRowMerge(&merge, &fRow);
|
tsdbRowMergerAdd(&merge, &fRow, NULL);
|
||||||
}
|
}
|
||||||
doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge);
|
doMergeRowsInFileBlocks(pBlockData, pBlockScanInfo, pReader, &merge);
|
||||||
}
|
}
|
||||||
|
@ -2572,7 +2575,7 @@ int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBloc
|
||||||
SRow* pTSRow = NULL;
|
SRow* pTSRow = NULL;
|
||||||
SRowMerger merge = {0};
|
SRowMerger merge = {0};
|
||||||
|
|
||||||
int32_t code = tsdbRowMergerInit(&merge, &fRow, pReader->pSchema);
|
int32_t code = tsdbRowMergerInit(&merge, NULL, &fRow, pReader->pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2776,8 +2779,8 @@ _end:
|
||||||
updateComposedBlockInfo(pReader, el, pBlockScanInfo);
|
updateComposedBlockInfo(pReader, el, pBlockScanInfo);
|
||||||
|
|
||||||
if (pResBlock->info.rows > 0) {
|
if (pResBlock->info.rows > 0) {
|
||||||
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64
|
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64 " rows:%" PRId64
|
||||||
" rows:%" PRId64 ", elapsed time:%.2f ms %s",
|
", elapsed time:%.2f ms %s",
|
||||||
pReader, pResBlock->info.id.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
|
pReader, pResBlock->info.id.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
|
||||||
pResBlock->info.rows, el, pReader->idStr);
|
pResBlock->info.rows, el, pReader->idStr);
|
||||||
}
|
}
|
||||||
|
@ -3028,8 +3031,8 @@ static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) {
|
||||||
updateComposedBlockInfo(pReader, el, pScanInfo);
|
updateComposedBlockInfo(pReader, el, pScanInfo);
|
||||||
|
|
||||||
if (pResBlock->info.rows > 0) {
|
if (pResBlock->info.rows > 0) {
|
||||||
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64
|
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64 " rows:%" PRId64
|
||||||
" rows:%" PRId64 ", elapsed time:%.2f ms %s",
|
", elapsed time:%.2f ms %s",
|
||||||
pReader, pResBlock->info.id.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
|
pReader, pResBlock->info.id.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
|
||||||
pResBlock->info.rows, el, pReader->idStr);
|
pResBlock->info.rows, el, pReader->idStr);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -3112,8 +3115,8 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) {
|
||||||
updateComposedBlockInfo(pReader, el, pScanInfo);
|
updateComposedBlockInfo(pReader, el, pScanInfo);
|
||||||
|
|
||||||
if (pResBlock->info.rows > 0) {
|
if (pResBlock->info.rows > 0) {
|
||||||
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64
|
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64 " rows:%" PRId64
|
||||||
" rows:%" PRId64 ", elapsed time:%.2f ms %s",
|
", elapsed time:%.2f ms %s",
|
||||||
pReader, pResBlock->info.id.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
|
pReader, pResBlock->info.id.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
|
||||||
pResBlock->info.rows, el, pReader->idStr);
|
pResBlock->info.rows, el, pReader->idStr);
|
||||||
}
|
}
|
||||||
|
@ -3139,7 +3142,6 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int32_t doSumFileBlockRows(STsdbReader* pReader, SDataFReader* pFileReader) {
|
static int32_t doSumFileBlockRows(STsdbReader* pReader, SDataFReader* pFileReader) {
|
||||||
int64_t st = taosGetTimestampUs();
|
int64_t st = taosGetTimestampUs();
|
||||||
LRUHandle* handle = NULL;
|
LRUHandle* handle = NULL;
|
||||||
|
@ -3170,7 +3172,7 @@ static int32_t doSumFileBlockRows(STsdbReader* pReader, SDataFReader* pFileReade
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
STableBlockScanInfo *pScanInfo = *p;
|
STableBlockScanInfo* pScanInfo = *p;
|
||||||
tMapDataReset(&pScanInfo->mapData);
|
tMapDataReset(&pScanInfo->mapData);
|
||||||
tsdbReadDataBlk(pReader->pFileReader, pBlockIdx, &pScanInfo->mapData);
|
tsdbReadDataBlk(pReader->pFileReader, pBlockIdx, &pScanInfo->mapData);
|
||||||
|
|
||||||
|
@ -3186,7 +3188,6 @@ _end:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int32_t doSumSttBlockRows(STsdbReader* pReader) {
|
static int32_t doSumSttBlockRows(STsdbReader* pReader) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SLastBlockReader* pLastBlockReader = pReader->status.fileIter.pLastBlockReader;
|
SLastBlockReader* pLastBlockReader = pReader->status.fileIter.pLastBlockReader;
|
||||||
|
@ -3202,8 +3203,8 @@ static int32_t doSumSttBlockRows(STsdbReader* pReader) {
|
||||||
|
|
||||||
size_t size = taosArrayGetSize(pBlockLoadInfo->aSttBlk);
|
size_t size = taosArrayGetSize(pBlockLoadInfo->aSttBlk);
|
||||||
if (size >= 1) {
|
if (size >= 1) {
|
||||||
SSttBlk *pStart = taosArrayGet(pBlockLoadInfo->aSttBlk, 0);
|
SSttBlk* pStart = taosArrayGet(pBlockLoadInfo->aSttBlk, 0);
|
||||||
SSttBlk *pEnd = taosArrayGet(pBlockLoadInfo->aSttBlk, size - 1);
|
SSttBlk* pEnd = taosArrayGet(pBlockLoadInfo->aSttBlk, size - 1);
|
||||||
|
|
||||||
// all identical
|
// all identical
|
||||||
if (pStart->suid == pEnd->suid) {
|
if (pStart->suid == pEnd->suid) {
|
||||||
|
@ -3213,12 +3214,12 @@ static int32_t doSumSttBlockRows(STsdbReader* pReader) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
SSttBlk *p = taosArrayGet(pBlockLoadInfo->aSttBlk, i);
|
SSttBlk* p = taosArrayGet(pBlockLoadInfo->aSttBlk, i);
|
||||||
pReader->rowsNum += p->nRow;
|
pReader->rowsNum += p->nRow;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
SSttBlk *p = taosArrayGet(pBlockLoadInfo->aSttBlk, i);
|
SSttBlk* p = taosArrayGet(pBlockLoadInfo->aSttBlk, i);
|
||||||
uint64_t s = p->suid;
|
uint64_t s = p->suid;
|
||||||
if (s < pReader->suid) {
|
if (s < pReader->suid) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -3283,7 +3284,6 @@ static int32_t readRowsCountFromMem(STsdbReader* pReader) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int32_t buildBlockFromBufferSequentially(STsdbReader* pReader) {
|
static int32_t buildBlockFromBufferSequentially(STsdbReader* pReader) {
|
||||||
SReaderStatus* pStatus = &pReader->status;
|
SReaderStatus* pStatus = &pReader->status;
|
||||||
STableUidList* pUidList = &pStatus->uidList;
|
STableUidList* pUidList = &pStatus->uidList;
|
||||||
|
@ -3696,7 +3696,7 @@ int32_t doMergeRowsInBuf(SIterInfo* pIter, uint64_t uid, int64_t ts, SArray* pDe
|
||||||
|
|
||||||
tsdbRowMergerAdd(pMerger, pRow, pTSchema);
|
tsdbRowMergerAdd(pMerger, pRow, pTSchema);
|
||||||
} else { // column format
|
} else { // column format
|
||||||
tsdbRowMerge(pMerger, pRow);
|
tsdbRowMergerAdd(pMerger, pRow, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3712,7 +3712,7 @@ static int32_t doMergeRowsInFileBlockImpl(SBlockData* pBlockData, int32_t rowInd
|
||||||
}
|
}
|
||||||
|
|
||||||
TSDBROW fRow = tsdbRowFromBlockData(pBlockData, rowIndex);
|
TSDBROW fRow = tsdbRowFromBlockData(pBlockData, rowIndex);
|
||||||
tsdbRowMerge(pMerger, &fRow);
|
tsdbRowMergerAdd(pMerger, &fRow, NULL);
|
||||||
rowIndex += step;
|
rowIndex += step;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3790,7 +3790,7 @@ int32_t doMergeRowsInLastBlock(SLastBlockReader* pLastBlockReader, STableBlockSc
|
||||||
int64_t next1 = getCurrentKeyInLastBlock(pLastBlockReader);
|
int64_t next1 = getCurrentKeyInLastBlock(pLastBlockReader);
|
||||||
if (next1 == ts) {
|
if (next1 == ts) {
|
||||||
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
TSDBROW fRow1 = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
||||||
tsdbRowMerge(pMerger, &fRow1);
|
tsdbRowMergerAdd(pMerger, &fRow1, NULL);
|
||||||
} else {
|
} else {
|
||||||
tsdbTrace("uid:%" PRIu64 " last del index:%d, del range:%d, lastKeyInStt:%" PRId64 ", %s", pScanInfo->uid,
|
tsdbTrace("uid:%" PRIu64 " last del index:%d, del range:%d, lastKeyInStt:%" PRId64 ", %s", pScanInfo->uid,
|
||||||
pScanInfo->lastBlockDelIndex, (int32_t)taosArrayGetSize(pScanInfo->delSkyline), pScanInfo->lastKeyInStt,
|
pScanInfo->lastBlockDelIndex, (int32_t)taosArrayGetSize(pScanInfo->delSkyline), pScanInfo->lastKeyInStt,
|
||||||
|
@ -3846,7 +3846,7 @@ int32_t doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter,
|
||||||
pReader->pSchema = pTSchema;
|
pReader->pSchema = pTSchema;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tsdbRowMergerInit2(&merge, pReader->pSchema, ¤t, pTSchema);
|
code = tsdbRowMergerInit(&merge, pReader->pSchema, ¤t, pTSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -3858,12 +3858,12 @@ int32_t doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter,
|
||||||
|
|
||||||
tsdbRowMergerAdd(&merge, pNextRow, pTSchema1);
|
tsdbRowMergerAdd(&merge, pNextRow, pTSchema1);
|
||||||
} else { // let's merge rows in file block
|
} else { // let's merge rows in file block
|
||||||
code = tsdbRowMergerInit(&merge, ¤t, pReader->pSchema);
|
code = tsdbRowMergerInit(&merge, NULL, ¤t, pReader->pSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbRowMerge(&merge, pNextRow);
|
tsdbRowMergerAdd(&merge, pNextRow, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
code = doMergeRowsInBuf(pIter, uid, TSDBROW_TS(¤t), pDelList, &merge, pReader);
|
code = doMergeRowsInBuf(pIter, uid, TSDBROW_TS(¤t), pDelList, &merge, pReader);
|
||||||
|
@ -3889,12 +3889,11 @@ int32_t doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* p
|
||||||
|
|
||||||
TSDBKEY k = TSDBROW_KEY(pRow);
|
TSDBKEY k = TSDBROW_KEY(pRow);
|
||||||
TSDBKEY ik = TSDBROW_KEY(piRow);
|
TSDBKEY ik = TSDBROW_KEY(piRow);
|
||||||
|
|
||||||
if (ASCENDING_TRAVERSE(pReader->order)) { // ascending order imem --> mem
|
|
||||||
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(pRow), pReader, pBlockScanInfo->uid);
|
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(pRow), pReader, pBlockScanInfo->uid);
|
||||||
STSchema* piSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(piRow), pReader, pBlockScanInfo->uid);
|
STSchema* piSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(piRow), pReader, pBlockScanInfo->uid);
|
||||||
|
|
||||||
int32_t code = tsdbRowMergerInit2(&merge, pSchema, piRow, piSchema);
|
if (ASCENDING_TRAVERSE(pReader->order)) { // ascending order imem --> mem
|
||||||
|
int32_t code = tsdbRowMergerInit(&merge, pSchema, piRow, piSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -3913,9 +3912,7 @@ int32_t doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* p
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(pRow), pReader, pBlockScanInfo->uid);
|
int32_t code = tsdbRowMergerInit(&merge, NULL, pRow, pSchema);
|
||||||
|
|
||||||
int32_t code = tsdbRowMergerInit(&merge, pRow, pSchema);
|
|
||||||
if (code != TSDB_CODE_SUCCESS || merge.pTSchema == NULL) {
|
if (code != TSDB_CODE_SUCCESS || merge.pTSchema == NULL) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -3926,7 +3923,7 @@ int32_t doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* p
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbRowMerge(&merge, piRow);
|
tsdbRowMergerAdd(&merge, piRow, piSchema);
|
||||||
code = doMergeRowsInBuf(&pBlockScanInfo->iiter, pBlockScanInfo->uid, ik.ts, pBlockScanInfo->delSkyline, &merge,
|
code = doMergeRowsInBuf(&pBlockScanInfo->iiter, pBlockScanInfo->uid, ik.ts, pBlockScanInfo->delSkyline, &merge,
|
||||||
pReader);
|
pReader);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -4670,7 +4667,7 @@ static bool tsdbReadRowsCountOnly(STsdbReader* pReader) {
|
||||||
return pBlock->info.rows > 0;
|
return pBlock->info.rows > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t doTsdbNextDataBlock(STsdbReader* pReader, bool *hasNext) {
|
static int32_t doTsdbNextDataBlock(STsdbReader* pReader, bool* hasNext) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
// cleanup the data that belongs to the previous data block
|
// cleanup the data that belongs to the previous data block
|
||||||
|
@ -4707,7 +4704,7 @@ static int32_t doTsdbNextDataBlock(STsdbReader* pReader, bool *hasNext) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbNextDataBlock(STsdbReader* pReader, bool *hasNext) {
|
int32_t tsdbNextDataBlock(STsdbReader* pReader, bool* hasNext) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
*hasNext = false;
|
*hasNext = false;
|
||||||
|
|
|
@ -638,13 +638,17 @@ SColVal *tsdbRowIterNext(STSDBRowIter *pIter) {
|
||||||
|
|
||||||
// SRowMerger ======================================================
|
// SRowMerger ======================================================
|
||||||
|
|
||||||
int32_t tsdbRowMergerInit2(SRowMerger *pMerger, STSchema *pResTSchema, TSDBROW *pRow, STSchema *pTSchema) {
|
int32_t tsdbRowMergerInit(SRowMerger *pMerger, STSchema *pResTSchema, TSDBROW *pRow, STSchema *pTSchema) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
TSDBKEY key = TSDBROW_KEY(pRow);
|
TSDBKEY key = TSDBROW_KEY(pRow);
|
||||||
SColVal *pColVal = &(SColVal){0};
|
SColVal *pColVal = &(SColVal){0};
|
||||||
STColumn *pTColumn;
|
STColumn *pTColumn;
|
||||||
int32_t iCol, jCol = 0;
|
int32_t iCol, jCol = 0;
|
||||||
|
|
||||||
|
if (NULL == pResTSchema) {
|
||||||
|
pResTSchema = pTSchema;
|
||||||
|
}
|
||||||
|
|
||||||
pMerger->pTSchema = pResTSchema;
|
pMerger->pTSchema = pResTSchema;
|
||||||
pMerger->version = key.version;
|
pMerger->version = key.version;
|
||||||
|
|
||||||
|
@ -712,6 +716,9 @@ int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema)
|
||||||
STColumn *pTColumn;
|
STColumn *pTColumn;
|
||||||
int32_t iCol, jCol = 1;
|
int32_t iCol, jCol = 1;
|
||||||
|
|
||||||
|
if (NULL == pTSchema) {
|
||||||
|
pTSchema = pMerger->pTSchema;
|
||||||
|
}
|
||||||
ASSERT(((SColVal *)pMerger->pArray->pData)->value.val == key.ts);
|
ASSERT(((SColVal *)pMerger->pArray->pData)->value.val == key.ts);
|
||||||
|
|
||||||
for (iCol = 1; iCol < pMerger->pTSchema->numOfCols && jCol < pTSchema->numOfCols; ++iCol) {
|
for (iCol = 1; iCol < pMerger->pTSchema->numOfCols && jCol < pTSchema->numOfCols; ++iCol) {
|
||||||
|
@ -727,23 +734,6 @@ int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema)
|
||||||
tsdbRowGetColVal(pRow, pTSchema, jCol++, pColVal);
|
tsdbRowGetColVal(pRow, pTSchema, jCol++, pColVal);
|
||||||
|
|
||||||
if (key.version > pMerger->version) {
|
if (key.version > pMerger->version) {
|
||||||
#if 0
|
|
||||||
if (!COL_VAL_IS_NONE(pColVal)) {
|
|
||||||
if ((!COL_VAL_IS_NULL(pColVal)) && IS_VAR_DATA_TYPE(pColVal->type)) {
|
|
||||||
SColVal *tColVal = taosArrayGet(pMerger->pArray, iCol);
|
|
||||||
code = tRealloc(&tColVal->value.pData, pColVal->value.nData);
|
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
tColVal->value.nData = pColVal->value.nData;
|
|
||||||
if (pColVal->value.nData) {
|
|
||||||
memcpy(tColVal->value.pData, pColVal->value.pData, pColVal->value.nData);
|
|
||||||
}
|
|
||||||
tColVal->flag = 0;
|
|
||||||
} else {
|
|
||||||
taosArraySet(pMerger->pArray, iCol, pColVal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (!COL_VAL_IS_NONE(pColVal)) {
|
if (!COL_VAL_IS_NONE(pColVal)) {
|
||||||
if (IS_VAR_DATA_TYPE(pColVal->type)) {
|
if (IS_VAR_DATA_TYPE(pColVal->type)) {
|
||||||
SColVal *pTColVal = taosArrayGet(pMerger->pArray, iCol);
|
SColVal *pTColVal = taosArrayGet(pMerger->pArray, iCol);
|
||||||
|
@ -758,7 +748,6 @@ int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema)
|
||||||
pTColVal->flag = 0;
|
pTColVal->flag = 0;
|
||||||
} else {
|
} else {
|
||||||
tFree(pTColVal->value.pData);
|
tFree(pTColVal->value.pData);
|
||||||
pTColVal->value.pData = NULL;
|
|
||||||
taosArraySet(pMerger->pArray, iCol, pColVal);
|
taosArraySet(pMerger->pArray, iCol, pColVal);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -789,7 +778,7 @@ int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema)
|
||||||
pMerger->version = key.version;
|
pMerger->version = key.version;
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
int32_t tsdbRowMergerInit(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema) {
|
int32_t tsdbRowMergerInit(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
TSDBKEY key = TSDBROW_KEY(pRow);
|
TSDBKEY key = TSDBROW_KEY(pRow);
|
||||||
|
@ -840,7 +829,7 @@ int32_t tsdbRowMergerInit(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema
|
||||||
_exit:
|
_exit:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
void tsdbRowMergerClear(SRowMerger *pMerger) {
|
void tsdbRowMergerClear(SRowMerger *pMerger) {
|
||||||
for (int32_t iCol = 1; iCol < pMerger->pTSchema->numOfCols; iCol++) {
|
for (int32_t iCol = 1; iCol < pMerger->pTSchema->numOfCols; iCol++) {
|
||||||
SColVal *pTColVal = taosArrayGet(pMerger->pArray, iCol);
|
SColVal *pTColVal = taosArrayGet(pMerger->pArray, iCol);
|
||||||
|
@ -851,7 +840,7 @@ void tsdbRowMergerClear(SRowMerger *pMerger) {
|
||||||
|
|
||||||
taosArrayDestroy(pMerger->pArray);
|
taosArrayDestroy(pMerger->pArray);
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
int32_t tsdbRowMerge(SRowMerger *pMerger, TSDBROW *pRow) {
|
int32_t tsdbRowMerge(SRowMerger *pMerger, TSDBROW *pRow) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
TSDBKEY key = TSDBROW_KEY(pRow);
|
TSDBKEY key = TSDBROW_KEY(pRow);
|
||||||
|
@ -916,7 +905,7 @@ int32_t tsdbRowMerge(SRowMerger *pMerger, TSDBROW *pRow) {
|
||||||
_exit:
|
_exit:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
int32_t tsdbRowMergerGetRow(SRowMerger *pMerger, SRow **ppRow) {
|
int32_t tsdbRowMergerGetRow(SRowMerger *pMerger, SRow **ppRow) {
|
||||||
return tRowBuild(pMerger->pArray, pMerger->pTSchema, ppRow);
|
return tRowBuild(pMerger->pArray, pMerger->pTSchema, ppRow);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ target_include_directories(
|
||||||
|
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
catalog
|
catalog
|
||||||
PRIVATE os util transport qcom
|
PRIVATE os util transport qcom nodes
|
||||||
)
|
)
|
||||||
|
|
||||||
if(${BUILD_TEST})
|
if(${BUILD_TEST})
|
||||||
|
|
|
@ -99,6 +99,20 @@ typedef struct SCtgDebug {
|
||||||
uint32_t showCachePeriodSec;
|
uint32_t showCachePeriodSec;
|
||||||
} SCtgDebug;
|
} SCtgDebug;
|
||||||
|
|
||||||
|
typedef struct SCtgAuthReq {
|
||||||
|
SRequestConnInfo* pConn;
|
||||||
|
SUserAuthInfo* pRawReq;
|
||||||
|
SGetUserAuthRsp authInfo;
|
||||||
|
AUTH_TYPE singleType;
|
||||||
|
bool onlyCache;
|
||||||
|
} SCtgAuthReq;
|
||||||
|
|
||||||
|
typedef struct SCtgAuthRsp {
|
||||||
|
SUserAuthRes* pRawRes;
|
||||||
|
bool metaNotExists;
|
||||||
|
} SCtgAuthRsp;
|
||||||
|
|
||||||
|
|
||||||
typedef struct SCtgTbCacheInfo {
|
typedef struct SCtgTbCacheInfo {
|
||||||
bool inCache;
|
bool inCache;
|
||||||
uint64_t dbId;
|
uint64_t dbId;
|
||||||
|
@ -214,12 +228,8 @@ typedef struct SCtgRentMgmt {
|
||||||
} SCtgRentMgmt;
|
} SCtgRentMgmt;
|
||||||
|
|
||||||
typedef struct SCtgUserAuth {
|
typedef struct SCtgUserAuth {
|
||||||
int32_t version;
|
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
bool superUser;
|
SGetUserAuthRsp userAuth;
|
||||||
SHashObj* createdDbs;
|
|
||||||
SHashObj* readDbs;
|
|
||||||
SHashObj* writeDbs;
|
|
||||||
} SCtgUserAuth;
|
} SCtgUserAuth;
|
||||||
|
|
||||||
typedef struct SCatalog {
|
typedef struct SCatalog {
|
||||||
|
@ -703,7 +713,7 @@ int32_t ctgTbMetaExistInCache(SCatalog* pCtg, char* dbFName, char* tbName, int32
|
||||||
int32_t ctgReadTbMetaFromCache(SCatalog* pCtg, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta);
|
int32_t ctgReadTbMetaFromCache(SCatalog* pCtg, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta);
|
||||||
int32_t ctgReadTbVerFromCache(SCatalog* pCtg, SName* pTableName, int32_t* sver, int32_t* tver, int32_t* tbType,
|
int32_t ctgReadTbVerFromCache(SCatalog* pCtg, SName* pTableName, int32_t* sver, int32_t* tver, int32_t* tbType,
|
||||||
uint64_t* suid, char* stbName);
|
uint64_t* suid, char* stbName);
|
||||||
int32_t ctgChkAuthFromCache(SCatalog* pCtg, char* user, char* dbFName, AUTH_TYPE type, bool* inCache, bool* pass);
|
int32_t ctgChkAuthFromCache(SCatalog *pCtg, SUserAuthInfo *pReq, bool *inCache, SCtgAuthRsp* pRes);
|
||||||
int32_t ctgDropDbCacheEnqueue(SCatalog* pCtg, const char* dbFName, int64_t dbId);
|
int32_t ctgDropDbCacheEnqueue(SCatalog* pCtg, const char* dbFName, int64_t dbId);
|
||||||
int32_t ctgDropDbVgroupEnqueue(SCatalog* pCtg, const char* dbFName, bool syncReq);
|
int32_t ctgDropDbVgroupEnqueue(SCatalog* pCtg, const char* dbFName, bool syncReq);
|
||||||
int32_t ctgDropStbMetaEnqueue(SCatalog* pCtg, const char* dbFName, int64_t dbId, const char* stbName, uint64_t suid,
|
int32_t ctgDropStbMetaEnqueue(SCatalog* pCtg, const char* dbFName, int64_t dbId, const char* stbName, uint64_t suid,
|
||||||
|
@ -806,6 +816,7 @@ int32_t ctgAcquireVgMetaFromCache(SCatalog *pCtg, const char *dbFName, const cha
|
||||||
int32_t ctgCopyTbMeta(SCatalog *pCtg, SCtgTbMetaCtx *ctx, SCtgDBCache **pDb, SCtgTbCache **pTb, STableMeta **pTableMeta, char* dbFName);
|
int32_t ctgCopyTbMeta(SCatalog *pCtg, SCtgTbMetaCtx *ctx, SCtgDBCache **pDb, SCtgTbCache **pTb, STableMeta **pTableMeta, char* dbFName);
|
||||||
void ctgReleaseVgMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, SCtgTbCache *pCache);
|
void ctgReleaseVgMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, SCtgTbCache *pCache);
|
||||||
void ctgReleaseTbMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, SCtgTbCache *pCache);
|
void ctgReleaseTbMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, SCtgTbCache *pCache);
|
||||||
|
int32_t ctgChkSetAuthRes(SCatalog *pCtg, SCtgAuthReq *req, SCtgAuthRsp* res);
|
||||||
|
|
||||||
extern SCatalogMgmt gCtgMgmt;
|
extern SCatalogMgmt gCtgMgmt;
|
||||||
extern SCtgDebug gCTGDebug;
|
extern SCtgDebug gCTGDebug;
|
||||||
|
|
|
@ -319,14 +319,13 @@ _return:
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, const char* dbFName, AUTH_TYPE type,
|
int32_t ctgChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, SUserAuthInfo *pReq, SUserAuthRes* pRes, bool* exists) {
|
||||||
bool* pass, bool* exists) {
|
|
||||||
bool inCache = false;
|
bool inCache = false;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
SCtgAuthRsp rsp = {0};
|
||||||
|
rsp.pRawRes = pRes;
|
||||||
|
|
||||||
*pass = false;
|
CTG_ERR_RET(ctgChkAuthFromCache(pCtg, pReq, &inCache, &rsp));
|
||||||
|
|
||||||
CTG_ERR_RET(ctgChkAuthFromCache(pCtg, (char*)user, (char*)dbFName, type, &inCache, pass));
|
|
||||||
|
|
||||||
if (inCache) {
|
if (inCache) {
|
||||||
if (exists) {
|
if (exists) {
|
||||||
|
@ -339,30 +338,22 @@ int32_t ctgChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, co
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SGetUserAuthRsp authRsp = {0};
|
SCtgAuthReq req = {0};
|
||||||
CTG_ERR_RET(ctgGetUserDbAuthFromMnode(pCtg, pConn, user, &authRsp, NULL));
|
req.pRawReq = pReq;
|
||||||
|
req.pConn = pConn;
|
||||||
|
req.onlyCache = exists ? true : false;
|
||||||
|
CTG_ERR_RET(ctgGetUserDbAuthFromMnode(pCtg, pConn, pReq->user, &req.authInfo, NULL));
|
||||||
|
|
||||||
if (authRsp.superAuth) {
|
CTG_ERR_JRET(ctgChkSetAuthRes(pCtg, &req, &rsp));
|
||||||
*pass = true;
|
if (rsp.metaNotExists && exists) {
|
||||||
goto _return;
|
*exists = false;
|
||||||
}
|
|
||||||
|
|
||||||
if (authRsp.createdDbs && taosHashGet(authRsp.createdDbs, dbFName, strlen(dbFName))) {
|
|
||||||
*pass = true;
|
|
||||||
goto _return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CTG_AUTH_READ(type) && authRsp.readDbs && taosHashGet(authRsp.readDbs, dbFName, strlen(dbFName))) {
|
|
||||||
*pass = true;
|
|
||||||
} else if (CTG_AUTH_WRITE(type) && authRsp.writeDbs && taosHashGet(authRsp.writeDbs, dbFName, strlen(dbFName))) {
|
|
||||||
*pass = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
ctgUpdateUserEnqueue(pCtg, &authRsp, false);
|
ctgUpdateUserEnqueue(pCtg, &req.authInfo, false);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgGetTbType(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, int32_t* tbType) {
|
int32_t ctgGetTbType(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, int32_t* tbType) {
|
||||||
|
@ -1368,7 +1359,7 @@ int32_t catalogGetExpiredUsers(SCatalog* pCtg, SUserAuthVersion** users, uint32_
|
||||||
void* key = taosHashGetKey(pAuth, &len);
|
void* key = taosHashGetKey(pAuth, &len);
|
||||||
strncpy((*users)[i].user, key, len);
|
strncpy((*users)[i].user, key, len);
|
||||||
(*users)[i].user[len] = 0;
|
(*users)[i].user[len] = 0;
|
||||||
(*users)[i].version = pAuth->version;
|
(*users)[i].version = pAuth->userAuth.version;
|
||||||
++i;
|
++i;
|
||||||
if (i >= *num) {
|
if (i >= *num) {
|
||||||
taosHashCancelIterate(pCtg->userCache, pAuth);
|
taosHashCancelIterate(pCtg->userCache, pAuth);
|
||||||
|
@ -1448,32 +1439,30 @@ _return:
|
||||||
CTG_API_LEAVE(code);
|
CTG_API_LEAVE(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, const char* dbFName, AUTH_TYPE type,
|
int32_t catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, SUserAuthInfo *pAuth, SUserAuthRes* pRes) {
|
||||||
bool* pass) {
|
|
||||||
CTG_API_ENTER();
|
CTG_API_ENTER();
|
||||||
|
|
||||||
if (NULL == pCtg || NULL == pConn || NULL == user || NULL == dbFName || NULL == pass) {
|
if (NULL == pCtg || NULL == pConn || NULL == pAuth || NULL == pRes) {
|
||||||
CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
|
CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
CTG_ERR_JRET(ctgChkAuth(pCtg, pConn, user, dbFName, type, pass, NULL));
|
CTG_ERR_JRET(ctgChkAuth(pCtg, pConn, pAuth, pRes, NULL));
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
CTG_API_LEAVE(code);
|
CTG_API_LEAVE(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t catalogChkAuthFromCache(SCatalog* pCtg, const char* user, const char* dbFName, AUTH_TYPE type,
|
int32_t catalogChkAuthFromCache(SCatalog* pCtg, SUserAuthInfo *pAuth, SUserAuthRes* pRes, bool* exists) {
|
||||||
bool* pass, bool* exists) {
|
|
||||||
CTG_API_ENTER();
|
CTG_API_ENTER();
|
||||||
|
|
||||||
if (NULL == pCtg || NULL == user || NULL == dbFName || NULL == pass || NULL == exists) {
|
if (NULL == pCtg || NULL == pAuth || NULL == pRes || NULL == exists) {
|
||||||
CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
|
CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
CTG_ERR_JRET(ctgChkAuth(pCtg, NULL, user, dbFName, type, pass, exists));
|
CTG_ERR_JRET(ctgChkAuth(pCtg, NULL, pAuth, pRes, exists));
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
|
|
|
@ -1550,45 +1550,20 @@ _return:
|
||||||
int32_t ctgHandleGetUserRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf* pMsg, int32_t rspCode) {
|
int32_t ctgHandleGetUserRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf* pMsg, int32_t rspCode) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SCtgTask* pTask = tReq->pTask;
|
SCtgTask* pTask = tReq->pTask;
|
||||||
SCtgUserCtx* ctx = (SCtgUserCtx*)pTask->taskCtx;
|
|
||||||
SCatalog* pCtg = pTask->pJob->pCtg;
|
SCatalog* pCtg = pTask->pJob->pCtg;
|
||||||
bool pass = false;
|
|
||||||
SGetUserAuthRsp* pOut = (SGetUserAuthRsp*)pTask->msgCtx.out;
|
SGetUserAuthRsp* pOut = (SGetUserAuthRsp*)pTask->msgCtx.out;
|
||||||
|
|
||||||
CTG_ERR_JRET(ctgProcessRspMsg(pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target));
|
CTG_ERR_JRET(ctgProcessRspMsg(pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target));
|
||||||
|
|
||||||
if (pOut->superAuth) {
|
ctgUpdateUserEnqueue(pCtg, pOut, true);
|
||||||
pass = true;
|
taosMemoryFreeClear(pTask->msgCtx.out);
|
||||||
goto _return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pOut->createdDbs && taosHashGet(pOut->createdDbs, ctx->user.dbFName, strlen(ctx->user.dbFName))) {
|
CTG_ERR_JRET((*gCtgAsyncFps[pTask->type].launchFp)(pTask));
|
||||||
pass = true;
|
|
||||||
goto _return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CTG_AUTH_READ(ctx->user.type) && pOut->readDbs &&
|
return TSDB_CODE_SUCCESS;
|
||||||
taosHashGet(pOut->readDbs, ctx->user.dbFName, strlen(ctx->user.dbFName))) {
|
|
||||||
pass = true;
|
|
||||||
} else if (CTG_AUTH_WRITE(ctx->user.type) && pOut->writeDbs &&
|
|
||||||
taosHashGet(pOut->writeDbs, ctx->user.dbFName, strlen(ctx->user.dbFName))) {
|
|
||||||
pass = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
pTask->res = taosMemoryCalloc(1, sizeof(bool));
|
|
||||||
if (NULL == pTask->res) {
|
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
} else {
|
|
||||||
*(bool*)pTask->res = pass;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ctgUpdateUserEnqueue(pCtg, pOut, false);
|
|
||||||
taosMemoryFreeClear(pTask->msgCtx.out);
|
|
||||||
|
|
||||||
ctgHandleTaskEnd(pTask, code);
|
ctgHandleTaskEnd(pTask, code);
|
||||||
|
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
|
@ -2067,30 +2042,38 @@ int32_t ctgLaunchGetUdfTask(SCtgTask* pTask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgLaunchGetUserTask(SCtgTask* pTask) {
|
int32_t ctgLaunchGetUserTask(SCtgTask* pTask) {
|
||||||
|
int32_t code = 0;
|
||||||
SCatalog* pCtg = pTask->pJob->pCtg;
|
SCatalog* pCtg = pTask->pJob->pCtg;
|
||||||
SRequestConnInfo* pConn = &pTask->pJob->conn;
|
SRequestConnInfo* pConn = &pTask->pJob->conn;
|
||||||
SCtgUserCtx* pCtx = (SCtgUserCtx*)pTask->taskCtx;
|
SCtgUserCtx* pCtx = (SCtgUserCtx*)pTask->taskCtx;
|
||||||
bool inCache = false;
|
bool inCache = false;
|
||||||
bool pass = false;
|
SCtgAuthRsp rsp = {0};
|
||||||
SCtgJob* pJob = pTask->pJob;
|
SCtgJob* pJob = pTask->pJob;
|
||||||
SCtgMsgCtx* pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, -1);
|
SCtgMsgCtx* pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, -1);
|
||||||
if (NULL == pMsgCtx->pBatchs) {
|
if (NULL == pMsgCtx->pBatchs) {
|
||||||
pMsgCtx->pBatchs = pJob->pBatchs;
|
pMsgCtx->pBatchs = pJob->pBatchs;
|
||||||
}
|
}
|
||||||
|
|
||||||
CTG_ERR_RET(ctgChkAuthFromCache(pCtg, pCtx->user.user, pCtx->user.dbFName, pCtx->user.type, &inCache, &pass));
|
rsp.pRawRes = taosMemoryCalloc(1, sizeof(SUserAuthRes));
|
||||||
if (inCache) {
|
if (NULL == rsp.pRawRes) {
|
||||||
pTask->res = taosMemoryCalloc(1, sizeof(bool));
|
|
||||||
if (NULL == pTask->res) {
|
|
||||||
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
*(bool*)pTask->res = pass;
|
|
||||||
|
CTG_ERR_RET(ctgChkAuthFromCache(pCtg, &pCtx->user, &inCache, &rsp));
|
||||||
|
if (inCache) {
|
||||||
|
pTask->res = rsp.pRawRes;
|
||||||
|
|
||||||
CTG_ERR_RET(ctgHandleTaskEnd(pTask, 0));
|
CTG_ERR_RET(ctgHandleTaskEnd(pTask, 0));
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosMemoryFreeClear(rsp.pRawRes);
|
||||||
|
|
||||||
|
if (rsp.metaNotExists) {
|
||||||
|
CTG_ERR_RET(ctgLaunchSubTask(pTask, CTG_TASK_GET_TB_META, ctgGetTbCfgCb, &pCtx->user.tbName));
|
||||||
|
} else {
|
||||||
CTG_ERR_RET(ctgGetUserDbAuthFromMnode(pCtg, pConn, pCtx->user.user, NULL, pTask));
|
CTG_ERR_RET(ctgGetUserDbAuthFromMnode(pCtg, pConn, pCtx->user.user, NULL, pTask));
|
||||||
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -2139,6 +2122,20 @@ _return:
|
||||||
CTG_RET(ctgHandleTaskEnd(pTask, pTask->subRes.code));
|
CTG_RET(ctgHandleTaskEnd(pTask, pTask->subRes.code));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t ctgGetUserCb(SCtgTask* pTask) {
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
CTG_ERR_JRET(pTask->subRes.code);
|
||||||
|
|
||||||
|
CTG_RET(ctgLaunchGetUserTask(pTask));
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
CTG_RET(ctgHandleTaskEnd(pTask, pTask->subRes.code));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgCompDbVgTasks(SCtgTask* pTask, void* param, bool* equal) {
|
int32_t ctgCompDbVgTasks(SCtgTask* pTask, void* param, bool* equal) {
|
||||||
SCtgDbVgCtx* ctx = pTask->taskCtx;
|
SCtgDbVgCtx* ctx = pTask->taskCtx;
|
||||||
|
|
||||||
|
|
|
@ -678,55 +678,40 @@ _return:
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgChkAuthFromCache(SCatalog *pCtg, char *user, char *dbFName, AUTH_TYPE type, bool *inCache, bool *pass) {
|
int32_t ctgChkAuthFromCache(SCatalog *pCtg, SUserAuthInfo *pReq, bool *inCache, SCtgAuthRsp* pRes) {
|
||||||
char *p = strchr(dbFName, '.');
|
if (IS_SYS_DBNAME(pReq->tbName.dbname)) {
|
||||||
if (p) {
|
|
||||||
++p;
|
|
||||||
} else {
|
|
||||||
p = dbFName;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IS_SYS_DBNAME(p)) {
|
|
||||||
*inCache = true;
|
*inCache = true;
|
||||||
*pass = true;
|
pRes->pRawRes->pass = true;
|
||||||
ctgDebug("sysdb %s, pass", dbFName);
|
ctgDebug("sysdb %s, pass", pReq->tbName.dbname);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCtgUserAuth *pUser = (SCtgUserAuth *)taosHashGet(pCtg->userCache, user, strlen(user));
|
SCtgUserAuth *pUser = (SCtgUserAuth *)taosHashGet(pCtg->userCache, pReq->user, strlen(pReq->user));
|
||||||
if (NULL == pUser) {
|
if (NULL == pUser) {
|
||||||
ctgDebug("user not in cache, user:%s", user);
|
ctgDebug("user not in cache, user:%s", pReq->user);
|
||||||
goto _return;
|
goto _return;
|
||||||
}
|
}
|
||||||
|
|
||||||
*inCache = true;
|
*inCache = true;
|
||||||
|
|
||||||
ctgDebug("Got user from cache, user:%s", user);
|
ctgDebug("Got user from cache, user:%s", pReq->user);
|
||||||
CTG_CACHE_STAT_INC(numOfUserHit, 1);
|
CTG_CACHE_STAT_INC(numOfUserHit, 1);
|
||||||
|
|
||||||
if (pUser->superUser) {
|
SCtgAuthReq req = {0};
|
||||||
*pass = true;
|
req.pRawReq = pReq;
|
||||||
return TSDB_CODE_SUCCESS;
|
req.onlyCache = true;
|
||||||
}
|
|
||||||
|
|
||||||
CTG_LOCK(CTG_READ, &pUser->lock);
|
CTG_LOCK(CTG_READ, &pUser->lock);
|
||||||
if (pUser->createdDbs && taosHashGet(pUser->createdDbs, dbFName, strlen(dbFName))) {
|
memcpy(&req.authInfo, &pUser->userAuth, sizeof(pUser->userAuth));
|
||||||
*pass = true;
|
int32_t code = ctgChkSetAuthRes(pCtg, &req, pRes);
|
||||||
CTG_UNLOCK(CTG_READ, &pUser->lock);
|
CTG_UNLOCK(CTG_READ, &pUser->lock);
|
||||||
return TSDB_CODE_SUCCESS;
|
CTG_ERR_JRET(code);
|
||||||
|
|
||||||
|
if (pRes->metaNotExists) {
|
||||||
|
goto _return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pUser->readDbs && taosHashGet(pUser->readDbs, dbFName, strlen(dbFName)) && CTG_AUTH_READ(type)) {
|
CTG_RET(code);
|
||||||
*pass = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pUser->writeDbs && taosHashGet(pUser->writeDbs, dbFName, strlen(dbFName)) && CTG_AUTH_WRITE(type)) {
|
|
||||||
*pass = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
CTG_UNLOCK(CTG_READ, &pUser->lock);
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
|
@ -2024,11 +2009,7 @@ int32_t ctgOpUpdateUser(SCtgCacheOperation *operation) {
|
||||||
if (NULL == pUser) {
|
if (NULL == pUser) {
|
||||||
SCtgUserAuth userAuth = {0};
|
SCtgUserAuth userAuth = {0};
|
||||||
|
|
||||||
userAuth.version = msg->userAuth.version;
|
memcpy(&userAuth.userAuth, &msg->userAuth, sizeof(msg->userAuth));
|
||||||
userAuth.superUser = msg->userAuth.superAuth;
|
|
||||||
userAuth.createdDbs = msg->userAuth.createdDbs;
|
|
||||||
userAuth.readDbs = msg->userAuth.readDbs;
|
|
||||||
userAuth.writeDbs = msg->userAuth.writeDbs;
|
|
||||||
|
|
||||||
if (taosHashPut(pCtg->userCache, msg->userAuth.user, strlen(msg->userAuth.user), &userAuth, sizeof(userAuth))) {
|
if (taosHashPut(pCtg->userCache, msg->userAuth.user, strlen(msg->userAuth.user), &userAuth, sizeof(userAuth))) {
|
||||||
ctgError("taosHashPut user %s to cache failed", msg->userAuth.user);
|
ctgError("taosHashPut user %s to cache failed", msg->userAuth.user);
|
||||||
|
@ -2040,22 +2021,28 @@ int32_t ctgOpUpdateUser(SCtgCacheOperation *operation) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
pUser->version = msg->userAuth.version;
|
|
||||||
|
|
||||||
CTG_LOCK(CTG_WRITE, &pUser->lock);
|
CTG_LOCK(CTG_WRITE, &pUser->lock);
|
||||||
|
|
||||||
taosHashCleanup(pUser->createdDbs);
|
taosHashCleanup(pUser->userAuth.createdDbs);
|
||||||
pUser->createdDbs = msg->userAuth.createdDbs;
|
pUser->userAuth.createdDbs = msg->userAuth.createdDbs;
|
||||||
msg->userAuth.createdDbs = NULL;
|
msg->userAuth.createdDbs = NULL;
|
||||||
|
|
||||||
taosHashCleanup(pUser->readDbs);
|
taosHashCleanup(pUser->userAuth.readDbs);
|
||||||
pUser->readDbs = msg->userAuth.readDbs;
|
pUser->userAuth.readDbs = msg->userAuth.readDbs;
|
||||||
msg->userAuth.readDbs = NULL;
|
msg->userAuth.readDbs = NULL;
|
||||||
|
|
||||||
taosHashCleanup(pUser->writeDbs);
|
taosHashCleanup(pUser->userAuth.writeDbs);
|
||||||
pUser->writeDbs = msg->userAuth.writeDbs;
|
pUser->userAuth.writeDbs = msg->userAuth.writeDbs;
|
||||||
msg->userAuth.writeDbs = NULL;
|
msg->userAuth.writeDbs = NULL;
|
||||||
|
|
||||||
|
taosHashCleanup(pUser->userAuth.readTbs);
|
||||||
|
pUser->userAuth.readTbs = msg->userAuth.readTbs;
|
||||||
|
msg->userAuth.readTbs = NULL;
|
||||||
|
|
||||||
|
taosHashCleanup(pUser->userAuth.writeTbs);
|
||||||
|
pUser->userAuth.writeTbs = msg->userAuth.writeTbs;
|
||||||
|
msg->userAuth.writeTbs = NULL;
|
||||||
|
|
||||||
CTG_UNLOCK(CTG_WRITE, &pUser->lock);
|
CTG_UNLOCK(CTG_WRITE, &pUser->lock);
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
@ -2063,6 +2050,8 @@ _return:
|
||||||
taosHashCleanup(msg->userAuth.createdDbs);
|
taosHashCleanup(msg->userAuth.createdDbs);
|
||||||
taosHashCleanup(msg->userAuth.readDbs);
|
taosHashCleanup(msg->userAuth.readDbs);
|
||||||
taosHashCleanup(msg->userAuth.writeDbs);
|
taosHashCleanup(msg->userAuth.writeDbs);
|
||||||
|
taosHashCleanup(msg->userAuth.readTbs);
|
||||||
|
taosHashCleanup(msg->userAuth.writeTbs);
|
||||||
|
|
||||||
taosMemoryFreeClear(msg);
|
taosMemoryFreeClear(msg);
|
||||||
|
|
||||||
|
@ -2255,6 +2244,8 @@ void ctgFreeCacheOperationData(SCtgCacheOperation *op) {
|
||||||
taosHashCleanup(msg->userAuth.createdDbs);
|
taosHashCleanup(msg->userAuth.createdDbs);
|
||||||
taosHashCleanup(msg->userAuth.readDbs);
|
taosHashCleanup(msg->userAuth.readDbs);
|
||||||
taosHashCleanup(msg->userAuth.writeDbs);
|
taosHashCleanup(msg->userAuth.writeDbs);
|
||||||
|
taosHashCleanup(msg->userAuth.readTbs);
|
||||||
|
taosHashCleanup(msg->userAuth.writeTbs);
|
||||||
taosMemoryFreeClear(op->data);
|
taosMemoryFreeClear(op->data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,9 +174,11 @@ void ctgFreeSMetaData(SMetaData* pData) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctgFreeSCtgUserAuth(SCtgUserAuth* userCache) {
|
void ctgFreeSCtgUserAuth(SCtgUserAuth* userCache) {
|
||||||
taosHashCleanup(userCache->createdDbs);
|
taosHashCleanup(userCache->userAuth.createdDbs);
|
||||||
taosHashCleanup(userCache->readDbs);
|
taosHashCleanup(userCache->userAuth.readDbs);
|
||||||
taosHashCleanup(userCache->writeDbs);
|
taosHashCleanup(userCache->userAuth.writeDbs);
|
||||||
|
taosHashCleanup(userCache->userAuth.readTbs);
|
||||||
|
taosHashCleanup(userCache->userAuth.writeTbs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctgFreeMetaRent(SCtgRentMgmt* mgmt) {
|
void ctgFreeMetaRent(SCtgRentMgmt* mgmt) {
|
||||||
|
@ -423,6 +425,8 @@ void ctgFreeMsgCtx(SCtgMsgCtx* pCtx) {
|
||||||
taosHashCleanup(pOut->createdDbs);
|
taosHashCleanup(pOut->createdDbs);
|
||||||
taosHashCleanup(pOut->readDbs);
|
taosHashCleanup(pOut->readDbs);
|
||||||
taosHashCleanup(pOut->writeDbs);
|
taosHashCleanup(pOut->writeDbs);
|
||||||
|
taosHashCleanup(pOut->readTbs);
|
||||||
|
taosHashCleanup(pOut->writeTbs);
|
||||||
taosMemoryFreeClear(pCtx->out);
|
taosMemoryFreeClear(pCtx->out);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1330,6 +1334,133 @@ static void* ctgCloneDnodeList(void* pSrc) { return taosArrayDup((const SArray*)
|
||||||
|
|
||||||
static void ctgFreeDnodeList(void* p) { taosArrayDestroy((SArray*)((SMetaRes*)p)->pRes); }
|
static void ctgFreeDnodeList(void* p) { taosArrayDestroy((SArray*)((SMetaRes*)p)->pRes); }
|
||||||
|
|
||||||
|
int32_t ctgChkSetTbAuthRes(SCatalog *pCtg, SCtgAuthReq *req, SCtgAuthRsp* res) {
|
||||||
|
int32_t code = 0;
|
||||||
|
STableMeta *pMeta = NULL;
|
||||||
|
SGetUserAuthRsp *pInfo = &req->authInfo;
|
||||||
|
SHashObj *pTbs = (AUTH_TYPE_READ == req->singleType) ? pInfo->readTbs : pInfo->writeTbs;
|
||||||
|
|
||||||
|
char tbFullName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
tNameExtractFullName(&req->pRawReq->tbName, tbFullName);
|
||||||
|
char *pCond = taosHashGet(pTbs, tbFullName, strlen(tbFullName));
|
||||||
|
if (pCond) {
|
||||||
|
if (strlen(pCond) > 1) {
|
||||||
|
CTG_ERR_RET(nodesStringToNode(pCond, &res->pRawRes->pCond));
|
||||||
|
}
|
||||||
|
|
||||||
|
res->pRawRes->pass = true;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_ERR_RET(catalogGetCachedTableMeta(pCtg, &req->pRawReq->tbName, &pMeta));
|
||||||
|
if (NULL == pMeta) {
|
||||||
|
if (req->onlyCache) {
|
||||||
|
res->metaNotExists = true;
|
||||||
|
ctgDebug("db %s tb %s meta not in cache for auth", req->pRawReq->tbName.dbname, req->pRawReq->tbName.tname);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_ERR_RET(catalogGetTableMeta(pCtg, req->pConn, &req->pRawReq->tbName, &pMeta));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_SUPER_TABLE == pMeta->tableType || TSDB_NORMAL_TABLE == pMeta->tableType) {
|
||||||
|
res->pRawRes->pass = false;
|
||||||
|
goto _return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_CHILD_TABLE == pMeta->tableType) {
|
||||||
|
res->pRawRes->pass = true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
char stbName[TSDB_TABLE_NAME_LEN] = {0};
|
||||||
|
CTG_ERR_JRET(ctgGetCachedStbNameFromSuid(pCtg, pMeta->suid, stbName));
|
||||||
|
if (0 == stbName[0]) {
|
||||||
|
if (req->onlyCache) {
|
||||||
|
res->notExists = true;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_ERR_RET(catalogRefreshTableMeta(pCtg, req->pConn, &req->pRawReq->tbName, 0));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
taosMemoryFree(pMeta);
|
||||||
|
|
||||||
|
CTG_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ctgChkSetAuthRes(SCatalog *pCtg, SCtgAuthReq *req, SCtgAuthRsp* res) {
|
||||||
|
int32_t code = 0;
|
||||||
|
SUserAuthInfo* pReq = req->pRawReq;
|
||||||
|
SUserAuthRes* pRes = res->pRawRes;
|
||||||
|
SGetUserAuthRsp *pInfo = &req->authInfo;
|
||||||
|
|
||||||
|
pRes->pass = false;
|
||||||
|
pRes->pCond = NULL;
|
||||||
|
|
||||||
|
if (!pInfo->enable) {
|
||||||
|
pRes->pass = false;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pInfo->superAuth) {
|
||||||
|
pRes->pass = true;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
tNameGetFullDbName(&pReq->tbName, dbFName);
|
||||||
|
|
||||||
|
if (pInfo->createdDbs && taosHashGet(pInfo->createdDbs, dbFName, strlen(dbFName))) {
|
||||||
|
pRes->pass = true;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (pReq->type) {
|
||||||
|
case AUTH_TYPE_READ: {
|
||||||
|
if (pInfo->readDbs && taosHashGet(pInfo->readDbs, dbFName, strlen(dbFName))) {
|
||||||
|
pRes->pass = true;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
if (pInfo->readTbs && taosHashGetSize(pInfo->readTbs) > 0) {
|
||||||
|
req->singleType = AUTH_TYPE_READ;
|
||||||
|
CTG_RET(ctgChkSetTbAuthRes(pCtg, req, res));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AUTH_TYPE_WRITE: {
|
||||||
|
if (pInfo->writeDbs && taosHashGet(pInfo->writeDbs, dbFName, strlen(dbFName))) {
|
||||||
|
pRes->pass = true;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
if (pInfo->writeTbs && taosHashGetSize(pInfo->writeTbs) > 0) {
|
||||||
|
req->singleType = AUTH_TYPE_WRITE;
|
||||||
|
CTG_RET(ctgChkSetTbAuthRes(pCtg, req, res));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AUTH_TYPE_READ_OR_WRITE: {
|
||||||
|
if ((pInfo->readDbs && taosHashGet(pInfo->readDbs, dbFName, strlen(dbFName))) ||
|
||||||
|
(pInfo->writeDbs && taosHashGet(pInfo->writeDbs, dbFName, strlen(dbFName)))){
|
||||||
|
pRes->pass = true;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static int32_t ctgCloneMetaDataArray(SArray* pSrc, __array_item_dup_fn_t copyFunc, SArray** pDst) {
|
static int32_t ctgCloneMetaDataArray(SArray* pSrc, __array_item_dup_fn_t copyFunc, SArray** pDst) {
|
||||||
if (NULL == pSrc) {
|
if (NULL == pSrc) {
|
||||||
|
|
|
@ -9,7 +9,7 @@ IF(NOT TD_DARWIN)
|
||||||
ADD_EXECUTABLE(catalogTest ${SOURCE_LIST})
|
ADD_EXECUTABLE(catalogTest ${SOURCE_LIST})
|
||||||
TARGET_LINK_LIBRARIES(
|
TARGET_LINK_LIBRARIES(
|
||||||
catalogTest
|
catalogTest
|
||||||
PUBLIC os util common catalog transport gtest qcom taos_static
|
PUBLIC os util common nodes catalog transport gtest qcom taos_static
|
||||||
)
|
)
|
||||||
|
|
||||||
TARGET_INCLUDE_DIRECTORIES(
|
TARGET_INCLUDE_DIRECTORIES(
|
||||||
|
|
|
@ -27,8 +27,8 @@
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
#define TD_USE_WINSOCK
|
#define TD_USE_WINSOCK
|
||||||
#endif
|
#endif
|
||||||
#include "catalogInt.h"
|
|
||||||
#include "catalog.h"
|
#include "catalog.h"
|
||||||
|
#include "catalogInt.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "stub.h"
|
#include "stub.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
|
@ -450,7 +450,7 @@ void ctgTestRspSTableMeta(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg
|
||||||
metaRsp.sversion = ctgTestSVersion;
|
metaRsp.sversion = ctgTestSVersion;
|
||||||
metaRsp.tversion = ctgTestTVersion;
|
metaRsp.tversion = ctgTestTVersion;
|
||||||
metaRsp.suid = ctgTestSuid;
|
metaRsp.suid = ctgTestSuid;
|
||||||
metaRsp.tuid = ctgTestSuid+1;
|
metaRsp.tuid = ctgTestSuid + 1;
|
||||||
metaRsp.vgId = 0;
|
metaRsp.vgId = 0;
|
||||||
metaRsp.pSchemas = (SSchema *)taosMemoryMalloc((metaRsp.numOfTags + metaRsp.numOfColumns) * sizeof(SSchema));
|
metaRsp.pSchemas = (SSchema *)taosMemoryMalloc((metaRsp.numOfTags + metaRsp.numOfColumns) * sizeof(SSchema));
|
||||||
|
|
||||||
|
@ -536,7 +536,6 @@ void ctgTestRspMultiSTableMeta(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRp
|
||||||
tFreeSTableMetaRsp(&metaRsp);
|
tFreeSTableMetaRsp(&metaRsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ctgTestRspErrIndexInfo(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg *pRsp) {
|
void ctgTestRspErrIndexInfo(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg *pRsp) {
|
||||||
rpcFreeCont(pMsg->pCont);
|
rpcFreeCont(pMsg->pCont);
|
||||||
|
|
||||||
|
@ -545,7 +544,6 @@ void ctgTestRspErrIndexInfo(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMs
|
||||||
pRsp->pCont = NULL;
|
pRsp->pCont = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ctgTestRspUserAuth(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg *pRsp) {
|
void ctgTestRspUserAuth(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg *pRsp) {
|
||||||
rpcFreeCont(pMsg->pCont);
|
rpcFreeCont(pMsg->pCont);
|
||||||
|
|
||||||
|
@ -553,6 +551,7 @@ void ctgTestRspUserAuth(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg *p
|
||||||
strcpy(userRsp.user, ctgTestUsername);
|
strcpy(userRsp.user, ctgTestUsername);
|
||||||
userRsp.version = 1;
|
userRsp.version = 1;
|
||||||
userRsp.superAuth = 1;
|
userRsp.superAuth = 1;
|
||||||
|
userRsp.enable = 1;
|
||||||
|
|
||||||
int32_t contLen = tSerializeSGetUserAuthRsp(NULL, 0, &userRsp);
|
int32_t contLen = tSerializeSGetUserAuthRsp(NULL, 0, &userRsp);
|
||||||
void *pReq = rpcMallocCont(contLen);
|
void *pReq = rpcMallocCont(contLen);
|
||||||
|
@ -611,7 +610,7 @@ void ctgTestRspTableIndex(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg
|
||||||
STableIndexInfo info = {0};
|
STableIndexInfo info = {0};
|
||||||
for (int32_t i = 0; i < ctgTestIndexNum; ++i) {
|
for (int32_t i = 0; i < ctgTestIndexNum; ++i) {
|
||||||
info.interval = 1 + i;
|
info.interval = 1 + i;
|
||||||
info.expr = (char*)taosMemoryCalloc(1, 10);
|
info.expr = (char *)taosMemoryCalloc(1, 10);
|
||||||
taosArrayPush(tblRsp.pIndex, &info);
|
taosArrayPush(tblRsp.pIndex, &info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -727,8 +726,6 @@ void ctgTestRspDndeList(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg *p
|
||||||
tFreeSDnodeListRsp(&dRsp);
|
tFreeSDnodeListRsp(&dRsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctgTestRspAuto(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg *pRsp) {
|
void ctgTestRspAuto(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg *pRsp) {
|
||||||
switch (pMsg->msgType) {
|
switch (pMsg->msgType) {
|
||||||
case TDMT_MND_USE_DB:
|
case TDMT_MND_USE_DB:
|
||||||
|
@ -763,7 +760,6 @@ void ctgTestRspAuto(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg *pRsp)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ctgTestRspByIdx(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg *pRsp) {
|
void ctgTestRspByIdx(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg *pRsp) {
|
||||||
switch (ctgTestRspFunc[ctgTestRspIdx]) {
|
switch (ctgTestRspFunc[ctgTestRspIdx]) {
|
||||||
case CTGT_RSP_VGINFO:
|
case CTGT_RSP_VGINFO:
|
||||||
|
@ -1204,7 +1200,6 @@ void *ctgTestSetCtableMetaThread(void *param) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ctgTestFetchRows(TAOS_RES *result, int32_t *rows) {
|
void ctgTestFetchRows(TAOS_RES *result, int32_t *rows) {
|
||||||
TAOS_ROW row;
|
TAOS_ROW row;
|
||||||
int num_fields = taos_num_fields(result);
|
int num_fields = taos_num_fields(result);
|
||||||
|
@ -1220,7 +1215,7 @@ void ctgTestFetchRows(TAOS_RES *result, int32_t *rows) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctgTestExecQuery(TAOS * taos, char* sql, bool fetch, int32_t *rows) {
|
void ctgTestExecQuery(TAOS *taos, char *sql, bool fetch, int32_t *rows) {
|
||||||
TAOS_RES *result = taos_query(taos, sql);
|
TAOS_RES *result = taos_query(taos, sql);
|
||||||
int code = taos_errno(result);
|
int code = taos_errno(result);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
@ -1232,7 +1227,6 @@ void ctgTestExecQuery(TAOS * taos, char* sql, bool fetch, int32_t *rows) {
|
||||||
taos_free_result(result);
|
taos_free_result(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST(tableMeta, normalTable) {
|
TEST(tableMeta, normalTable) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
|
@ -2045,7 +2039,6 @@ TEST(refreshGetMeta, normal2child) {
|
||||||
ctgTestCurrentSTableName = NULL;
|
ctgTestCurrentSTableName = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST(refreshGetMeta, stable2child) {
|
TEST(refreshGetMeta, stable2child) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo connInfo = {0};
|
SRequestConnInfo connInfo = {0};
|
||||||
|
@ -2800,15 +2793,19 @@ TEST(apiTest, catalogChkAuth_test) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
bool pass = false;
|
SUserAuthInfo authInfo = {0};
|
||||||
|
SUserAuthRes authRes = {0};
|
||||||
|
strcpy(authInfo.user, ctgTestUsername);
|
||||||
|
toName(1, ctgTestDbname, ctgTestSTablename, &authInfo.tbName);
|
||||||
|
authInfo.type = AUTH_TYPE_READ;
|
||||||
bool exists = false;
|
bool exists = false;
|
||||||
code = catalogChkAuthFromCache(pCtg, ctgTestUsername, ctgTestDbname, AUTH_TYPE_READ, &pass, &exists);
|
code = catalogChkAuthFromCache(pCtg, &authInfo, &authRes, &exists);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
ASSERT_EQ(exists, false);
|
ASSERT_EQ(exists, false);
|
||||||
|
|
||||||
code = catalogChkAuth(pCtg, mockPointer, ctgTestUsername, ctgTestDbname, AUTH_TYPE_READ, &pass);
|
code = catalogChkAuth(pCtg, mockPointer, &authInfo, &authRes);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
ASSERT_EQ(pass, true);
|
ASSERT_EQ(authRes.pass, true);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
uint64_t n = 0;
|
uint64_t n = 0;
|
||||||
|
@ -2820,9 +2817,9 @@ TEST(apiTest, catalogChkAuth_test) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
code = catalogChkAuthFromCache(pCtg, ctgTestUsername, ctgTestDbname, AUTH_TYPE_READ, &pass, &exists);
|
code = catalogChkAuthFromCache(pCtg, &authInfo, &authRes, &exists);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
ASSERT_EQ(pass, true);
|
ASSERT_EQ(authRes.pass, true);
|
||||||
ASSERT_EQ(exists, true);
|
ASSERT_EQ(exists, true);
|
||||||
|
|
||||||
catalogDestroy();
|
catalogDestroy();
|
||||||
|
@ -2962,14 +2959,13 @@ TEST(apiTest, catalogGetQnodeList_test) {
|
||||||
ASSERT_EQ(taosArrayGetSize(qnodeList), ctgTestQnodeNum);
|
ASSERT_EQ(taosArrayGetSize(qnodeList), ctgTestQnodeNum);
|
||||||
|
|
||||||
for (int32_t i = 0; i < ctgTestQnodeNum; ++i) {
|
for (int32_t i = 0; i < ctgTestQnodeNum; ++i) {
|
||||||
SQueryNodeLoad * pLoad = (SQueryNodeLoad *)taosArrayGet(qnodeList, i);
|
SQueryNodeLoad *pLoad = (SQueryNodeLoad *)taosArrayGet(qnodeList, i);
|
||||||
ASSERT_EQ(pLoad->addr.nodeId, i);
|
ASSERT_EQ(pLoad->addr.nodeId, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
catalogDestroy();
|
catalogDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST(apiTest, catalogGetUdfInfo_test) {
|
TEST(apiTest, catalogGetUdfInfo_test) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo connInfo = {0};
|
SRequestConnInfo connInfo = {0};
|
||||||
|
@ -2999,7 +2995,6 @@ TEST(apiTest, catalogGetUdfInfo_test) {
|
||||||
catalogDestroy();
|
catalogDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST(apiTest, catalogGetServerVersion_test) {
|
TEST(apiTest, catalogGetServerVersion_test) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo connInfo = {0};
|
SRequestConnInfo connInfo = {0};
|
||||||
|
@ -3021,7 +3016,7 @@ TEST(apiTest, catalogGetServerVersion_test) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
char* ver = NULL;
|
char *ver = NULL;
|
||||||
code = catalogGetServerVersion(pCtg, mockPointer, &ver);
|
code = catalogGetServerVersion(pCtg, mockPointer, &ver);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
ASSERT_TRUE(0 == strcmp(ver, "1.0"));
|
ASSERT_TRUE(0 == strcmp(ver, "1.0"));
|
||||||
|
@ -3061,7 +3056,6 @@ TEST(apiTest, catalogUpdateTableIndex_test) {
|
||||||
catalogDestroy();
|
catalogDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST(apiTest, catalogGetDnodeList_test) {
|
TEST(apiTest, catalogGetDnodeList_test) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo connInfo = {0};
|
SRequestConnInfo connInfo = {0};
|
||||||
|
@ -3083,7 +3077,7 @@ TEST(apiTest, catalogGetDnodeList_test) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SArray* pList = NULL;
|
SArray *pList = NULL;
|
||||||
code = catalogGetDnodeList(pCtg, mockPointer, &pList);
|
code = catalogGetDnodeList(pCtg, mockPointer, &pList);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
ASSERT_EQ(taosArrayGetSize(pList), 1);
|
ASSERT_EQ(taosArrayGetSize(pList), 1);
|
||||||
|
@ -3145,7 +3139,6 @@ TEST(intTest, autoCreateTableTest) {
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
testing::InitGoogleTest(&argc, argv);
|
testing::InitGoogleTest(&argc, argv);
|
||||||
return RUN_ALL_TESTS();
|
return RUN_ALL_TESTS();
|
||||||
|
|
|
@ -172,9 +172,9 @@ int32_t doOpenAggregateOptr(SOperatorInfo* pOperator) {
|
||||||
int32_t scanFlag = MAIN_SCAN;
|
int32_t scanFlag = MAIN_SCAN;
|
||||||
|
|
||||||
bool hasValidBlock = false;
|
bool hasValidBlock = false;
|
||||||
bool blockAllocated = false;
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
bool blockAllocated = false;
|
||||||
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
|
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
|
||||||
if (pBlock == NULL) {
|
if (pBlock == NULL) {
|
||||||
if (!hasValidBlock) {
|
if (!hasValidBlock) {
|
||||||
|
|
|
@ -1188,7 +1188,7 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
|
||||||
tableListClear(pTableListInfo);
|
tableListClear(pTableListInfo);
|
||||||
|
|
||||||
if (mtInfo.uid == 0) {
|
if (mtInfo.uid == 0) {
|
||||||
return 0; // no data
|
goto end; // no data
|
||||||
}
|
}
|
||||||
|
|
||||||
initQueryTableDataCondForTmq(&pTaskInfo->streamInfo.tableCond, sContext, &mtInfo);
|
initQueryTableDataCondForTmq(&pTaskInfo->streamInfo.tableCond, sContext, &mtInfo);
|
||||||
|
@ -1222,6 +1222,8 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
|
||||||
qDebug("tmqsnap qStreamPrepareScan snapshot log, %s", id);
|
qDebug("tmqsnap qStreamPrepareScan snapshot log, %s", id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
pTaskInfo->streamInfo.currentOffset = *pOffset;
|
pTaskInfo->streamInfo.currentOffset = *pOffset;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -923,7 +923,13 @@ void nodesDestroyNode(SNode* pNode) {
|
||||||
taosMemoryFree(((SDescribeStmt*)pNode)->pMeta);
|
taosMemoryFree(((SDescribeStmt*)pNode)->pMeta);
|
||||||
break;
|
break;
|
||||||
case QUERY_NODE_RESET_QUERY_CACHE_STMT: // no pointer field
|
case QUERY_NODE_RESET_QUERY_CACHE_STMT: // no pointer field
|
||||||
case QUERY_NODE_COMPACT_DATABASE_STMT: // no pointer field
|
break;
|
||||||
|
case QUERY_NODE_COMPACT_DATABASE_STMT: {
|
||||||
|
SCompactDatabaseStmt* pStmt = (SCompactDatabaseStmt*)pNode;
|
||||||
|
nodesDestroyNode(pStmt->pStart);
|
||||||
|
nodesDestroyNode(pStmt->pEnd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case QUERY_NODE_CREATE_FUNCTION_STMT: // no pointer field
|
case QUERY_NODE_CREATE_FUNCTION_STMT: // no pointer field
|
||||||
case QUERY_NODE_DROP_FUNCTION_STMT: // no pointer field
|
case QUERY_NODE_DROP_FUNCTION_STMT: // no pointer field
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -82,6 +82,11 @@ typedef struct SAlterOption {
|
||||||
SNodeList* pList;
|
SNodeList* pList;
|
||||||
} SAlterOption;
|
} SAlterOption;
|
||||||
|
|
||||||
|
typedef struct STokenPair {
|
||||||
|
SToken first;
|
||||||
|
SToken second;
|
||||||
|
} STokenPair;
|
||||||
|
|
||||||
extern SToken nil_token;
|
extern SToken nil_token;
|
||||||
|
|
||||||
void initAstCreateContext(SParseContext* pParseCxt, SAstCreateContext* pCxt);
|
void initAstCreateContext(SParseContext* pParseCxt, SAstCreateContext* pCxt);
|
||||||
|
@ -227,8 +232,10 @@ SNode* createMergeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId1, cons
|
||||||
SNode* createRedistributeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId, SNodeList* pDnodes);
|
SNode* createRedistributeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId, SNodeList* pDnodes);
|
||||||
SNode* createSplitVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId);
|
SNode* createSplitVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId);
|
||||||
SNode* createSyncdbStmt(SAstCreateContext* pCxt, const SToken* pDbName);
|
SNode* createSyncdbStmt(SAstCreateContext* pCxt, const SToken* pDbName);
|
||||||
SNode* createGrantStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbName, SToken* pUserName);
|
SNode* createGrantStmt(SAstCreateContext* pCxt, int64_t privileges, STokenPair* pPrivLevel, SToken* pUserName,
|
||||||
SNode* createRevokeStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbName, SToken* pUserName);
|
SNode* pTagCond);
|
||||||
|
SNode* createRevokeStmt(SAstCreateContext* pCxt, int64_t privileges, STokenPair* pPrivLevel, SToken* pUserName,
|
||||||
|
SNode* pTagCond);
|
||||||
SNode* createDeleteStmt(SAstCreateContext* pCxt, SNode* pTable, SNode* pWhere);
|
SNode* createDeleteStmt(SAstCreateContext* pCxt, SNode* pTable, SNode* pWhere);
|
||||||
SNode* createInsertStmt(SAstCreateContext* pCxt, SNode* pTable, SNodeList* pCols, SNode* pQuery);
|
SNode* createInsertStmt(SAstCreateContext* pCxt, SNode* pTable, SNodeList* pCols, SNode* pQuery);
|
||||||
|
|
||||||
|
|
|
@ -97,9 +97,8 @@ int32_t reserveTableVgroupInCache(int32_t acctId, const char* pDb, const char* p
|
||||||
int32_t reserveTableVgroupInCacheExt(const SName* pName, SParseMetaCache* pMetaCache);
|
int32_t reserveTableVgroupInCacheExt(const SName* pName, SParseMetaCache* pMetaCache);
|
||||||
int32_t reserveDbVgVersionInCache(int32_t acctId, const char* pDb, SParseMetaCache* pMetaCache);
|
int32_t reserveDbVgVersionInCache(int32_t acctId, const char* pDb, SParseMetaCache* pMetaCache);
|
||||||
int32_t reserveDbCfgInCache(int32_t acctId, const char* pDb, SParseMetaCache* pMetaCache);
|
int32_t reserveDbCfgInCache(int32_t acctId, const char* pDb, SParseMetaCache* pMetaCache);
|
||||||
int32_t reserveUserAuthInCache(int32_t acctId, const char* pUser, const char* pDb, AUTH_TYPE type,
|
int32_t reserveUserAuthInCache(int32_t acctId, const char* pUser, const char* pDb, const char* pTable, AUTH_TYPE type,
|
||||||
SParseMetaCache* pMetaCache);
|
SParseMetaCache* pMetaCache);
|
||||||
int32_t reserveUserAuthInCacheExt(const char* pUser, const SName* pName, AUTH_TYPE type, SParseMetaCache* pMetaCache);
|
|
||||||
int32_t reserveUdfInCache(const char* pFunc, SParseMetaCache* pMetaCache);
|
int32_t reserveUdfInCache(const char* pFunc, SParseMetaCache* pMetaCache);
|
||||||
int32_t reserveTableIndexInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache);
|
int32_t reserveTableIndexInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache);
|
||||||
int32_t reserveTableCfgInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache);
|
int32_t reserveTableCfgInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache);
|
||||||
|
@ -110,8 +109,7 @@ int32_t getTableVgroupFromCache(SParseMetaCache* pMetaCache, const SName* pName,
|
||||||
int32_t getDbVgVersionFromCache(SParseMetaCache* pMetaCache, const char* pDbFName, int32_t* pVersion, int64_t* pDbId,
|
int32_t getDbVgVersionFromCache(SParseMetaCache* pMetaCache, const char* pDbFName, int32_t* pVersion, int64_t* pDbId,
|
||||||
int32_t* pTableNum, int64_t* pStateTs);
|
int32_t* pTableNum, int64_t* pStateTs);
|
||||||
int32_t getDbCfgFromCache(SParseMetaCache* pMetaCache, const char* pDbFName, SDbCfgInfo* pInfo);
|
int32_t getDbCfgFromCache(SParseMetaCache* pMetaCache, const char* pDbFName, SDbCfgInfo* pInfo);
|
||||||
int32_t getUserAuthFromCache(SParseMetaCache* pMetaCache, const char* pUser, const char* pDbFName, AUTH_TYPE type,
|
int32_t getUserAuthFromCache(SParseMetaCache* pMetaCache, SUserAuthInfo* pAuthReq, SUserAuthRes* pAuthRes);
|
||||||
bool* pPass);
|
|
||||||
int32_t getUdfInfoFromCache(SParseMetaCache* pMetaCache, const char* pFunc, SFuncInfo* pInfo);
|
int32_t getUdfInfoFromCache(SParseMetaCache* pMetaCache, const char* pFunc, SFuncInfo* pInfo);
|
||||||
int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName, SArray** pIndexes);
|
int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName, SArray** pIndexes);
|
||||||
int32_t getTableCfgFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableCfg** pOutput);
|
int32_t getTableCfgFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableCfg** pOutput);
|
||||||
|
|
|
@ -94,8 +94,8 @@ sysinfo_opt(A) ::= .
|
||||||
sysinfo_opt(A) ::= SYSINFO NK_INTEGER(B). { A = taosStr2Int8(B.z, NULL, 10); }
|
sysinfo_opt(A) ::= SYSINFO NK_INTEGER(B). { A = taosStr2Int8(B.z, NULL, 10); }
|
||||||
|
|
||||||
/************************************************ grant/revoke ********************************************************/
|
/************************************************ grant/revoke ********************************************************/
|
||||||
cmd ::= GRANT privileges(A) ON priv_level(B) TO user_name(C). { pCxt->pRootNode = createGrantStmt(pCxt, A, &B, &C); }
|
cmd ::= GRANT privileges(A) ON priv_level(B) with_opt(D) TO user_name(C). { pCxt->pRootNode = createGrantStmt(pCxt, A, &B, &C, D); }
|
||||||
cmd ::= REVOKE privileges(A) ON priv_level(B) FROM user_name(C). { pCxt->pRootNode = createRevokeStmt(pCxt, A, &B, &C); }
|
cmd ::= REVOKE privileges(A) ON priv_level(B) with_opt(D) FROM user_name(C). { pCxt->pRootNode = createRevokeStmt(pCxt, A, &B, &C, D); }
|
||||||
|
|
||||||
%type privileges { int64_t }
|
%type privileges { int64_t }
|
||||||
%destructor privileges { }
|
%destructor privileges { }
|
||||||
|
@ -113,11 +113,15 @@ priv_type_list(A) ::= priv_type_list(B) NK_COMMA priv_type(C).
|
||||||
priv_type(A) ::= READ. { A = PRIVILEGE_TYPE_READ; }
|
priv_type(A) ::= READ. { A = PRIVILEGE_TYPE_READ; }
|
||||||
priv_type(A) ::= WRITE. { A = PRIVILEGE_TYPE_WRITE; }
|
priv_type(A) ::= WRITE. { A = PRIVILEGE_TYPE_WRITE; }
|
||||||
|
|
||||||
%type priv_level { SToken }
|
%type priv_level { STokenPair }
|
||||||
%destructor priv_level { }
|
%destructor priv_level { }
|
||||||
priv_level(A) ::= NK_STAR(B) NK_DOT NK_STAR. { A = B; }
|
priv_level(A) ::= NK_STAR(B) NK_DOT NK_STAR(C). { A.first = B; A.second = C; }
|
||||||
priv_level(A) ::= db_name(B) NK_DOT NK_STAR. { A = B; }
|
priv_level(A) ::= db_name(B) NK_DOT NK_STAR(C). { A.first = B; A.second = C; }
|
||||||
priv_level(A) ::= topic_name(B). { A = B; }
|
priv_level(A) ::= db_name(B) NK_DOT table_name(C). { A.first = B; A.second = C; }
|
||||||
|
priv_level(A) ::= topic_name(B). { A.first = B; A.second = nil_token; }
|
||||||
|
|
||||||
|
with_opt(A) ::= . { A = NULL; }
|
||||||
|
with_opt(A) ::= WITH search_condition(B). { A = B; }
|
||||||
|
|
||||||
/************************************************ create/drop/alter dnode *********************************************/
|
/************************************************ create/drop/alter dnode *********************************************/
|
||||||
cmd ::= CREATE DNODE dnode_endpoint(A). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, NULL); }
|
cmd ::= CREATE DNODE dnode_endpoint(A). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, NULL); }
|
||||||
|
|
|
@ -1961,29 +1961,39 @@ SNode* createSyncdbStmt(SAstCreateContext* pCxt, const SToken* pDbName) {
|
||||||
return pStmt;
|
return pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createGrantStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbName, SToken* pUserName) {
|
SNode* createGrantStmt(SAstCreateContext* pCxt, int64_t privileges, STokenPair* pPrivLevel, SToken* pUserName,
|
||||||
|
SNode* pTagCond) {
|
||||||
CHECK_PARSER_STATUS(pCxt);
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkDbName(pCxt, pDbName, false) || !checkUserName(pCxt, pUserName)) {
|
if (!checkDbName(pCxt, &pPrivLevel->first, false) || !checkUserName(pCxt, pUserName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SGrantStmt* pStmt = (SGrantStmt*)nodesMakeNode(QUERY_NODE_GRANT_STMT);
|
SGrantStmt* pStmt = (SGrantStmt*)nodesMakeNode(QUERY_NODE_GRANT_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->privileges = privileges;
|
pStmt->privileges = privileges;
|
||||||
COPY_STRING_FORM_ID_TOKEN(pStmt->objName, pDbName);
|
COPY_STRING_FORM_ID_TOKEN(pStmt->objName, &pPrivLevel->first);
|
||||||
|
if (TK_NK_NIL != pPrivLevel->second.type && TK_NK_STAR != pPrivLevel->second.type) {
|
||||||
|
COPY_STRING_FORM_ID_TOKEN(pStmt->tabName, &pPrivLevel->second);
|
||||||
|
}
|
||||||
COPY_STRING_FORM_ID_TOKEN(pStmt->userName, pUserName);
|
COPY_STRING_FORM_ID_TOKEN(pStmt->userName, pUserName);
|
||||||
|
pStmt->pTagCond = pTagCond;
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode* createRevokeStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbName, SToken* pUserName) {
|
SNode* createRevokeStmt(SAstCreateContext* pCxt, int64_t privileges, STokenPair* pPrivLevel, SToken* pUserName,
|
||||||
|
SNode* pTagCond) {
|
||||||
CHECK_PARSER_STATUS(pCxt);
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
if (!checkDbName(pCxt, pDbName, false) || !checkUserName(pCxt, pUserName)) {
|
if (!checkDbName(pCxt, &pPrivLevel->first, false) || !checkUserName(pCxt, pUserName)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SRevokeStmt* pStmt = (SRevokeStmt*)nodesMakeNode(QUERY_NODE_REVOKE_STMT);
|
SRevokeStmt* pStmt = (SRevokeStmt*)nodesMakeNode(QUERY_NODE_REVOKE_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->privileges = privileges;
|
pStmt->privileges = privileges;
|
||||||
COPY_STRING_FORM_ID_TOKEN(pStmt->objName, pDbName);
|
COPY_STRING_FORM_ID_TOKEN(pStmt->objName, &pPrivLevel->first);
|
||||||
|
if (TK_NK_NIL != pPrivLevel->second.type && TK_NK_STAR != pPrivLevel->second.type) {
|
||||||
|
COPY_STRING_FORM_ID_TOKEN(pStmt->tabName, &pPrivLevel->second);
|
||||||
|
}
|
||||||
COPY_STRING_FORM_ID_TOKEN(pStmt->userName, pUserName);
|
COPY_STRING_FORM_ID_TOKEN(pStmt->userName, pUserName);
|
||||||
|
pStmt->pTagCond = pTagCond;
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,7 +154,8 @@ static int32_t collectMetaKeyFromRealTableImpl(SCollectMetaKeyCxt* pCxt, const c
|
||||||
code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pDb, pTable, pCxt->pMetaCache);
|
code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pDb, pTable, pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pDb, authType, pCxt->pMetaCache);
|
code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pDb, pTable, authType,
|
||||||
|
pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, pDb, pCxt->pMetaCache);
|
code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, pDb, pCxt->pMetaCache);
|
||||||
|
@ -247,7 +248,7 @@ static int32_t collectMetaKeyFromCreateTable(SCollectMetaKeyCxt* pCxt, SCreateTa
|
||||||
code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
|
code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, AUTH_TYPE_WRITE,
|
code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, NULL, AUTH_TYPE_WRITE,
|
||||||
pCxt->pMetaCache);
|
pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
|
@ -267,8 +268,8 @@ static int32_t collectMetaKeyFromCreateMultiTable(SCollectMetaKeyCxt* pCxt, SCre
|
||||||
code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pClause->dbName, pClause->tableName, pCxt->pMetaCache);
|
code = reserveTableVgroupInCache(pCxt->pParseCxt->acctId, pClause->dbName, pClause->tableName, pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pClause->dbName, AUTH_TYPE_WRITE,
|
code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pClause->dbName, NULL,
|
||||||
pCxt->pMetaCache);
|
AUTH_TYPE_WRITE, pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
break;
|
break;
|
||||||
|
@ -439,8 +440,9 @@ static int32_t collectMetaKeyFromShowStables(SCollectMetaKeyCxt* pCxt, SShowStmt
|
||||||
int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_STABLES,
|
int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_STABLES,
|
||||||
pCxt->pMetaCache);
|
pCxt->pMetaCache);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser,
|
code =
|
||||||
((SValueNode*)pStmt->pDbName)->literal, AUTH_TYPE_READ_OR_WRITE, pCxt->pMetaCache);
|
reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, ((SValueNode*)pStmt->pDbName)->literal,
|
||||||
|
NULL, AUTH_TYPE_READ_OR_WRITE, pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -457,8 +459,9 @@ static int32_t collectMetaKeyFromShowTables(SCollectMetaKeyCxt* pCxt, SShowStmt*
|
||||||
code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, ((SValueNode*)pStmt->pDbName)->literal, pCxt->pMetaCache);
|
code = reserveDbVgInfoInCache(pCxt->pParseCxt->acctId, ((SValueNode*)pStmt->pDbName)->literal, pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser,
|
code =
|
||||||
((SValueNode*)pStmt->pDbName)->literal, AUTH_TYPE_READ_OR_WRITE, pCxt->pMetaCache);
|
reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, ((SValueNode*)pStmt->pDbName)->literal,
|
||||||
|
NULL, AUTH_TYPE_READ_OR_WRITE, pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -561,7 +564,8 @@ static int32_t collectMetaKeyFromShowCreateTable(SCollectMetaKeyCxt* pCxt, SShow
|
||||||
code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
|
code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = reserveUserAuthInCacheExt(pCxt->pParseCxt->pUser, &name, AUTH_TYPE_READ, pCxt->pMetaCache);
|
code = reserveUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, NULL, AUTH_TYPE_READ,
|
||||||
|
pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -610,6 +614,13 @@ static int32_t collectMetaKeyFromCompactDatabase(SCollectMetaKeyCxt* pCxt, SComp
|
||||||
return reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
|
return reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t collectMetaKeyFromGrant(SCollectMetaKeyCxt* pCxt, SGrantStmt* pStmt) {
|
||||||
|
if ('\0' == pStmt->tabName[0]) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
return reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->objName, pStmt->tabName, pCxt->pMetaCache);
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
|
static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
|
||||||
pCxt->pStmt = pStmt;
|
pCxt->pStmt = pStmt;
|
||||||
switch (nodeType(pStmt)) {
|
switch (nodeType(pStmt)) {
|
||||||
|
@ -645,6 +656,8 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
|
||||||
return collectMetaKeyFromCompactDatabase(pCxt, (SCompactDatabaseStmt*)pStmt);
|
return collectMetaKeyFromCompactDatabase(pCxt, (SCompactDatabaseStmt*)pStmt);
|
||||||
case QUERY_NODE_CREATE_STREAM_STMT:
|
case QUERY_NODE_CREATE_STREAM_STMT:
|
||||||
return collectMetaKeyFromCreateStream(pCxt, (SCreateStreamStmt*)pStmt);
|
return collectMetaKeyFromCreateStream(pCxt, (SCreateStreamStmt*)pStmt);
|
||||||
|
case QUERY_NODE_GRANT_STMT:
|
||||||
|
return collectMetaKeyFromGrant(pCxt, (SGrantStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_DNODES_STMT:
|
case QUERY_NODE_SHOW_DNODES_STMT:
|
||||||
return collectMetaKeyFromShowDnodes(pCxt, (SShowStmt*)pStmt);
|
return collectMetaKeyFromShowDnodes(pCxt, (SShowStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_MNODES_STMT:
|
case QUERY_NODE_SHOW_MNODES_STMT:
|
||||||
|
|
|
@ -23,49 +23,112 @@ typedef struct SAuthCxt {
|
||||||
int32_t errCode;
|
int32_t errCode;
|
||||||
} SAuthCxt;
|
} SAuthCxt;
|
||||||
|
|
||||||
|
typedef struct SSelectAuthCxt {
|
||||||
|
SAuthCxt* pAuthCxt;
|
||||||
|
SSelectStmt* pSelect;
|
||||||
|
} SSelectAuthCxt;
|
||||||
|
|
||||||
static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt);
|
static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt);
|
||||||
|
|
||||||
static int32_t checkAuth(SAuthCxt* pCxt, const char* pDbName, AUTH_TYPE type) {
|
static void setUserAuthInfo(SParseContext* pCxt, const char* pDbName, const char* pTabName, AUTH_TYPE type,
|
||||||
|
SUserAuthInfo* pAuth) {
|
||||||
|
snprintf(pAuth->user, sizeof(pAuth->user), "%s", pCxt->pUser);
|
||||||
|
if (NULL == pTabName) {
|
||||||
|
tNameSetDbName(&pAuth->tbName, pCxt->acctId, pDbName, strlen(pDbName));
|
||||||
|
} else {
|
||||||
|
toName(pCxt->acctId, pDbName, pTabName, &pAuth->tbName);
|
||||||
|
}
|
||||||
|
pAuth->type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t checkAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, AUTH_TYPE type, SNode** pCond) {
|
||||||
SParseContext* pParseCxt = pCxt->pParseCxt;
|
SParseContext* pParseCxt = pCxt->pParseCxt;
|
||||||
if (pParseCxt->isSuperUser) {
|
if (pParseCxt->isSuperUser) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
SName name;
|
|
||||||
tNameSetDbName(&name, pParseCxt->acctId, pDbName, strlen(pDbName));
|
SUserAuthInfo authInfo = {0};
|
||||||
char dbFname[TSDB_DB_FNAME_LEN] = {0};
|
setUserAuthInfo(pCxt->pParseCxt, pDbName, pTabName, type, &authInfo);
|
||||||
tNameGetFullDbName(&name, dbFname);
|
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
bool pass = false;
|
SUserAuthRes authRes = {0};
|
||||||
if (NULL != pCxt->pMetaCache) {
|
if (NULL != pCxt->pMetaCache) {
|
||||||
code = getUserAuthFromCache(pCxt->pMetaCache, pParseCxt->pUser, dbFname, type, &pass);
|
code = getUserAuthFromCache(pCxt->pMetaCache, &authInfo, &authRes);
|
||||||
} else {
|
} else {
|
||||||
SRequestConnInfo conn = {.pTrans = pParseCxt->pTransporter,
|
SRequestConnInfo conn = {.pTrans = pParseCxt->pTransporter,
|
||||||
.requestId = pParseCxt->requestId,
|
.requestId = pParseCxt->requestId,
|
||||||
.requestObjRefId = pParseCxt->requestRid,
|
.requestObjRefId = pParseCxt->requestRid,
|
||||||
.mgmtEps = pParseCxt->mgmtEpSet};
|
.mgmtEps = pParseCxt->mgmtEpSet};
|
||||||
|
code = catalogChkAuth(pParseCxt->pCatalog, &conn, &authInfo, &authRes);
|
||||||
code = catalogChkAuth(pParseCxt->pCatalog, &conn, pParseCxt->pUser, dbFname, type, &pass);
|
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS == code ? (pass ? TSDB_CODE_SUCCESS : TSDB_CODE_PAR_PERMISSION_DENIED) : code;
|
if (TSDB_CODE_SUCCESS == code && NULL != pCond) {
|
||||||
|
*pCond = authRes.pCond;
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS == code ? (authRes.pass ? TSDB_CODE_SUCCESS : TSDB_CODE_PAR_PERMISSION_DENIED) : code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static EDealRes authSubquery(SAuthCxt* pCxt, SNode* pStmt) {
|
static EDealRes authSubquery(SAuthCxt* pCxt, SNode* pStmt) {
|
||||||
return TSDB_CODE_SUCCESS == authQuery(pCxt, pStmt) ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
|
return TSDB_CODE_SUCCESS == authQuery(pCxt, pStmt) ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mergeStableTagCond(SNode** pWhere, SNode** pTagCond) {
|
||||||
|
SLogicConditionNode* pLogicCond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION);
|
||||||
|
if (NULL == pLogicCond) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL;
|
||||||
|
pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes;
|
||||||
|
pLogicCond->condType = LOGIC_COND_TYPE_AND;
|
||||||
|
int32_t code = nodesListMakeStrictAppend(&pLogicCond->pParameterList, *pTagCond);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = nodesListMakeAppend(&pLogicCond->pParameterList, *pWhere);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
*pWhere = (SNode*)pLogicCond;
|
||||||
|
} else {
|
||||||
|
nodesDestroyNode((SNode*)pLogicCond);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t appendStableTagCond(SNode** pWhere, SNode* pTagCond) {
|
||||||
|
SNode* pTagCondCopy = nodesCloneNode(pTagCond);
|
||||||
|
if (NULL == pTagCondCopy) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == *pWhere) {
|
||||||
|
*pWhere = pTagCondCopy;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QUERY_NODE_LOGIC_CONDITION == nodeType(*pWhere) &&
|
||||||
|
LOGIC_COND_TYPE_AND == ((SLogicConditionNode*)*pWhere)->condType) {
|
||||||
|
return nodesListStrictAppend(((SLogicConditionNode*)*pWhere)->pParameterList, pTagCondCopy);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mergeStableTagCond(pWhere, &pTagCondCopy);
|
||||||
|
}
|
||||||
|
|
||||||
static EDealRes authSelectImpl(SNode* pNode, void* pContext) {
|
static EDealRes authSelectImpl(SNode* pNode, void* pContext) {
|
||||||
SAuthCxt* pCxt = pContext;
|
SSelectAuthCxt* pCxt = pContext;
|
||||||
|
SAuthCxt* pAuthCxt = pCxt->pAuthCxt;
|
||||||
if (QUERY_NODE_REAL_TABLE == nodeType(pNode)) {
|
if (QUERY_NODE_REAL_TABLE == nodeType(pNode)) {
|
||||||
pCxt->errCode = checkAuth(pCxt, ((SRealTableNode*)pNode)->table.dbName, AUTH_TYPE_READ);
|
SNode* pTagCond = NULL;
|
||||||
return TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
|
STableNode* pTable = (STableNode*)pNode;
|
||||||
|
pAuthCxt->errCode = checkAuth(pAuthCxt, pTable->dbName, pTable->tableName, AUTH_TYPE_READ, &pTagCond);
|
||||||
|
if (TSDB_CODE_SUCCESS == pAuthCxt->errCode && NULL != pTagCond) {
|
||||||
|
pAuthCxt->errCode = appendStableTagCond(&pCxt->pSelect->pWhere, pTagCond);
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS == pAuthCxt->errCode ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
|
||||||
} else if (QUERY_NODE_TEMP_TABLE == nodeType(pNode)) {
|
} else if (QUERY_NODE_TEMP_TABLE == nodeType(pNode)) {
|
||||||
return authSubquery(pCxt, ((STempTableNode*)pNode)->pSubquery);
|
return authSubquery(pAuthCxt, ((STempTableNode*)pNode)->pSubquery);
|
||||||
}
|
}
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t authSelect(SAuthCxt* pCxt, SSelectStmt* pSelect) {
|
static int32_t authSelect(SAuthCxt* pCxt, SSelectStmt* pSelect) {
|
||||||
nodesWalkSelectStmt(pSelect, SQL_CLAUSE_FROM, authSelectImpl, pCxt);
|
SSelectAuthCxt cxt = {.pAuthCxt = pCxt, .pSelect = pSelect};
|
||||||
|
nodesWalkSelectStmt(pSelect, SQL_CLAUSE_FROM, authSelectImpl, &cxt);
|
||||||
return pCxt->errCode;
|
return pCxt->errCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,11 +148,20 @@ static int32_t authDropUser(SAuthCxt* pCxt, SDropUserStmt* pStmt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t authDelete(SAuthCxt* pCxt, SDeleteStmt* pDelete) {
|
static int32_t authDelete(SAuthCxt* pCxt, SDeleteStmt* pDelete) {
|
||||||
return checkAuth(pCxt, ((SRealTableNode*)pDelete->pFromTable)->table.dbName, AUTH_TYPE_WRITE);
|
SNode* pTagCond = NULL;
|
||||||
|
STableNode* pTable = (STableNode*)pDelete->pFromTable;
|
||||||
|
int32_t code = checkAuth(pCxt, pTable->dbName, pTable->tableName, AUTH_TYPE_WRITE, &pTagCond);
|
||||||
|
if (TSDB_CODE_SUCCESS == code && NULL != pTagCond) {
|
||||||
|
code = appendStableTagCond(&pDelete->pWhere, pTagCond);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t authInsert(SAuthCxt* pCxt, SInsertStmt* pInsert) {
|
static int32_t authInsert(SAuthCxt* pCxt, SInsertStmt* pInsert) {
|
||||||
int32_t code = checkAuth(pCxt, ((SRealTableNode*)pInsert->pTable)->table.dbName, AUTH_TYPE_WRITE);
|
SNode* pTagCond = NULL;
|
||||||
|
STableNode* pTable = (STableNode*)pInsert->pTable;
|
||||||
|
// todo check tag condition for subtable
|
||||||
|
int32_t code = checkAuth(pCxt, pTable->dbName, pTable->tableName, AUTH_TYPE_WRITE, &pTagCond);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = authQuery(pCxt, pInsert->pQuery);
|
code = authQuery(pCxt, pInsert->pQuery);
|
||||||
}
|
}
|
||||||
|
@ -97,22 +169,27 @@ static int32_t authInsert(SAuthCxt* pCxt, SInsertStmt* pInsert) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t authShowTables(SAuthCxt* pCxt, SShowStmt* pStmt) {
|
static int32_t authShowTables(SAuthCxt* pCxt, SShowStmt* pStmt) {
|
||||||
return checkAuth(pCxt, ((SValueNode*)pStmt->pDbName)->literal, AUTH_TYPE_READ_OR_WRITE);
|
return checkAuth(pCxt, ((SValueNode*)pStmt->pDbName)->literal, NULL, AUTH_TYPE_READ_OR_WRITE, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t authShowCreateTable(SAuthCxt* pCxt, SShowCreateTableStmt* pStmt) {
|
static int32_t authShowCreateTable(SAuthCxt* pCxt, SShowCreateTableStmt* pStmt) {
|
||||||
return checkAuth(pCxt, pStmt->dbName, AUTH_TYPE_READ);
|
SNode* pTagCond = NULL;
|
||||||
|
// todo check tag condition for subtable
|
||||||
|
return checkAuth(pCxt, pStmt->dbName, NULL, AUTH_TYPE_READ, &pTagCond);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t authCreateTable(SAuthCxt* pCxt, SCreateTableStmt* pStmt) {
|
static int32_t authCreateTable(SAuthCxt* pCxt, SCreateTableStmt* pStmt) {
|
||||||
return checkAuth(pCxt, pStmt->dbName, AUTH_TYPE_WRITE);
|
SNode* pTagCond = NULL;
|
||||||
|
// todo check tag condition for subtable
|
||||||
|
return checkAuth(pCxt, pStmt->dbName, NULL, AUTH_TYPE_WRITE, &pTagCond);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t authCreateMultiTable(SAuthCxt* pCxt, SCreateMultiTablesStmt* pStmt) {
|
static int32_t authCreateMultiTable(SAuthCxt* pCxt, SCreateMultiTablesStmt* pStmt) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SNode* pNode = NULL;
|
SNode* pNode = NULL;
|
||||||
FOREACH(pNode, pStmt->pSubTables) {
|
FOREACH(pNode, pStmt->pSubTables) {
|
||||||
code = checkAuth(pCxt, ((SCreateSubTableClause*)pNode)->dbName, AUTH_TYPE_WRITE);
|
SCreateSubTableClause* pClause = (SCreateSubTableClause*)pNode;
|
||||||
|
code = checkAuth(pCxt, pClause->dbName, NULL, AUTH_TYPE_WRITE, NULL);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,6 +125,12 @@ static int32_t smlBuildTagRow(SArray* cols, SBoundColInfo* tags, SSchema* pSchem
|
||||||
SSchema* pTagSchema = &pSchema[tags->pColIndex[i]];
|
SSchema* pTagSchema = &pSchema[tags->pColIndex[i]];
|
||||||
SSmlKv* kv = taosArrayGet(cols, i);
|
SSmlKv* kv = taosArrayGet(cols, i);
|
||||||
|
|
||||||
|
if(kv->keyLen != strlen(pTagSchema->name) || memcmp(kv->key, pTagSchema->name, kv->keyLen) != 0 || kv->type != pTagSchema->type){
|
||||||
|
code = TSDB_CODE_SML_INVALID_DATA;
|
||||||
|
uError("SML smlBuildCol error col not same %s", pTagSchema->name);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
taosArrayPush(*tagName, pTagSchema->name);
|
taosArrayPush(*tagName, pTagSchema->name);
|
||||||
STagVal val = {.cid = pTagSchema->colId, .type = pTagSchema->type};
|
STagVal val = {.cid = pTagSchema->colId, .type = pTagSchema->type};
|
||||||
// strcpy(val.colName, pTagSchema->name);
|
// strcpy(val.colName, pTagSchema->name);
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#include "parInsertUtil.h"
|
#include "parInsertUtil.h"
|
||||||
#include "parToken.h"
|
#include "parToken.h"
|
||||||
|
#include "scalar.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "ttime.h"
|
#include "ttime.h"
|
||||||
|
|
||||||
|
@ -565,6 +566,120 @@ static int32_t checkAndTrimValue(SToken* pToken, char* tmpTokenBuf, SMsgBuf* pMs
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct SRewriteTagCondCxt {
|
||||||
|
SArray* pTagVals;
|
||||||
|
SArray* pTagName;
|
||||||
|
int32_t code;
|
||||||
|
} SRewriteTagCondCxt;
|
||||||
|
|
||||||
|
static int32_t rewriteTagCondColumnImpl(STagVal* pVal, SNode** pNode) {
|
||||||
|
SValueNode* pValue = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
||||||
|
if (NULL == pValue) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
pValue->node.resType.type = pVal->type;
|
||||||
|
switch (pVal->type) {
|
||||||
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
|
pValue->datum.b = *(int8_t*)(&pVal->i64);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
pValue->datum.i = *(int8_t*)(&pVal->i64);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
pValue->datum.i = *(int16_t*)(&pVal->i64);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
pValue->datum.i = *(int32_t*)(&pVal->i64);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
pValue->datum.i = pVal->i64;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
pValue->datum.d = *(float*)(&pVal->i64);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
pValue->datum.d = *(double*)(&pVal->i64);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_VARCHAR:
|
||||||
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
|
pValue->datum.p = taosMemoryCalloc(1, pVal->nData + VARSTR_HEADER_SIZE);
|
||||||
|
if (NULL == pValue->datum.p) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
varDataSetLen(pValue->datum.p, pVal->nData);
|
||||||
|
memcpy(varDataVal(pValue->datum.p), pVal->pData, pVal->nData);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
pValue->datum.i = pVal->i64;
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
pValue->datum.i = *(uint8_t*)(&pVal->i64);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
pValue->datum.i = *(uint16_t*)(&pVal->i64);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
pValue->datum.i = *(uint32_t*)(&pVal->i64);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
pValue->datum.i = *(uint64_t*)(&pVal->i64);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_JSON:
|
||||||
|
case TSDB_DATA_TYPE_VARBINARY:
|
||||||
|
case TSDB_DATA_TYPE_DECIMAL:
|
||||||
|
case TSDB_DATA_TYPE_BLOB:
|
||||||
|
case TSDB_DATA_TYPE_MEDIUMBLOB:
|
||||||
|
default:
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t rewriteTagCondColumn(SArray* pTagVals, SArray* pTagName, SNode** pNode) {
|
||||||
|
SColumnNode* pCol = (SColumnNode*)*pNode;
|
||||||
|
int32_t ntags = taosArrayGetSize(pTagName);
|
||||||
|
for (int32_t i = 0; i < ntags; ++i) {
|
||||||
|
char* pTagColName = taosArrayGet(pTagName, i);
|
||||||
|
if (0 == strcmp(pTagColName, pCol->colName)) {
|
||||||
|
return rewriteTagCondColumnImpl(taosArrayGet(pTagVals, i), pNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TSDB_CODE_PAR_PERMISSION_DENIED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static EDealRes rewriteTagCond(SNode** pNode, void* pContext) {
|
||||||
|
if (QUERY_NODE_COLUMN == nodeType(*pNode)) {
|
||||||
|
SRewriteTagCondCxt* pCxt = pContext;
|
||||||
|
pCxt->code = rewriteTagCondColumn(pCxt->pTagVals, pCxt->pTagName, pNode);
|
||||||
|
return (TSDB_CODE_SUCCESS == pCxt->code ? DEAL_RES_IGNORE_CHILD : DEAL_RES_ERROR);
|
||||||
|
}
|
||||||
|
return DEAL_RES_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t setTagVal(SArray* pTagVals, SArray* pTagName, SNode* pCond) {
|
||||||
|
SRewriteTagCondCxt cxt = {.code = TSDB_CODE_SUCCESS, .pTagVals = pTagVals, .pTagName = pTagName};
|
||||||
|
nodesRewriteExpr(&pCond, rewriteTagCond, &cxt);
|
||||||
|
return cxt.code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t checkTagCondResult(SNode* pResult) {
|
||||||
|
return (QUERY_NODE_VALUE == nodeType(pResult) && ((SValueNode*)pResult)->datum.b) ? TSDB_CODE_SUCCESS
|
||||||
|
: TSDB_CODE_PAR_PERMISSION_DENIED;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t checkSubtablePrivilege(SArray* pTagVals, SArray* pTagName, SNode* pCond) {
|
||||||
|
int32_t code = setTagVal(pTagVals, pTagName, pCond);
|
||||||
|
SNode* pNew = NULL;
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = scalarCalculateConstants(pCond, &pNew);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = checkTagCondResult(pNew);
|
||||||
|
}
|
||||||
|
nodesDestroyNode(pNew);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
// pSql -> tag1_value, ...)
|
// pSql -> tag1_value, ...)
|
||||||
static int32_t parseTagsClauseImpl(SInsertParseContext* pCxt, SVnodeModifyOpStmt* pStmt) {
|
static int32_t parseTagsClauseImpl(SInsertParseContext* pCxt, SVnodeModifyOpStmt* pStmt) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
@ -722,25 +837,31 @@ static int32_t parseUsingClauseBottom(SInsertParseContext* pCxt, SVnodeModifyOpS
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setUserAuthInfo(SParseContext* pCxt, SName* pTbName, SUserAuthInfo* pInfo) {
|
||||||
|
snprintf(pInfo->user, sizeof(pInfo->user), "%s", pCxt->pUser);
|
||||||
|
memcpy(&pInfo->tbName, pTbName, sizeof(SName));
|
||||||
|
pInfo->type = AUTH_TYPE_WRITE;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t checkAuth(SParseContext* pCxt, SName* pTbName, bool* pMissCache) {
|
static int32_t checkAuth(SParseContext* pCxt, SName* pTbName, bool* pMissCache) {
|
||||||
char dbFName[TSDB_DB_FNAME_LEN];
|
|
||||||
tNameGetFullDbName(pTbName, dbFName);
|
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
bool pass = true;
|
SUserAuthInfo authInfo = {0};
|
||||||
|
setUserAuthInfo(pCxt, pTbName, &authInfo);
|
||||||
|
SUserAuthRes authRes = {0};
|
||||||
bool exists = true;
|
bool exists = true;
|
||||||
if (pCxt->async) {
|
if (pCxt->async) {
|
||||||
code = catalogChkAuthFromCache(pCxt->pCatalog, pCxt->pUser, dbFName, AUTH_TYPE_WRITE, &pass, &exists);
|
code = catalogChkAuthFromCache(pCxt->pCatalog, &authInfo, &authRes, &exists);
|
||||||
} else {
|
} else {
|
||||||
SRequestConnInfo conn = {.pTrans = pCxt->pTransporter,
|
SRequestConnInfo conn = {.pTrans = pCxt->pTransporter,
|
||||||
.requestId = pCxt->requestId,
|
.requestId = pCxt->requestId,
|
||||||
.requestObjRefId = pCxt->requestRid,
|
.requestObjRefId = pCxt->requestRid,
|
||||||
.mgmtEps = pCxt->mgmtEpSet};
|
.mgmtEps = pCxt->mgmtEpSet};
|
||||||
code = catalogChkAuth(pCxt->pCatalog, &conn, pCxt->pUser, dbFName, AUTH_TYPE_WRITE, &pass);
|
code = catalogChkAuth(pCxt->pCatalog, &conn, &authInfo, &authRes);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
if (!exists) {
|
if (!exists) {
|
||||||
*pMissCache = true;
|
*pMissCache = true;
|
||||||
} else if (!pass) {
|
} else if (!authRes.pass) {
|
||||||
code = TSDB_CODE_PAR_PERMISSION_DENIED;
|
code = TSDB_CODE_PAR_PERMISSION_DENIED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1901,7 +2022,7 @@ static int32_t buildInsertUserAuthReq(const char* pUser, SName* pName, SArray**
|
||||||
|
|
||||||
SUserAuthInfo userAuth = {.type = AUTH_TYPE_WRITE};
|
SUserAuthInfo userAuth = {.type = AUTH_TYPE_WRITE};
|
||||||
snprintf(userAuth.user, sizeof(userAuth.user), "%s", pUser);
|
snprintf(userAuth.user, sizeof(userAuth.user), "%s", pUser);
|
||||||
tNameGetFullDbName(pName, userAuth.dbFName);
|
// tNameGetFullDbName(pName, userAuth.dbFName);
|
||||||
taosArrayPush(*pUserAuth, &userAuth);
|
taosArrayPush(*pUserAuth, &userAuth);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
|
@ -978,7 +978,8 @@ static EDealRes translateColumnUseAlias(STranslateContext* pCxt, SColumnNode** p
|
||||||
}
|
}
|
||||||
|
|
||||||
static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode** pCol) {
|
static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode** pCol) {
|
||||||
if (NULL == pCxt->pCurrStmt || isSelectStmt(pCxt->pCurrStmt) && NULL == ((SSelectStmt*)pCxt->pCurrStmt)->pFromTable) {
|
if (NULL == pCxt->pCurrStmt ||
|
||||||
|
(isSelectStmt(pCxt->pCurrStmt) && NULL == ((SSelectStmt*)pCxt->pCurrStmt)->pFromTable)) {
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_COLUMN, (*pCol)->colName);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_COLUMN, (*pCol)->colName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1691,6 +1692,7 @@ static void setFuncClassification(SNode* pCurrStmt, SFunctionNode* pFunc) {
|
||||||
pSelect->hasUniqueFunc = pSelect->hasUniqueFunc ? true : (FUNCTION_TYPE_UNIQUE == pFunc->funcType);
|
pSelect->hasUniqueFunc = pSelect->hasUniqueFunc ? true : (FUNCTION_TYPE_UNIQUE == pFunc->funcType);
|
||||||
pSelect->hasTailFunc = pSelect->hasTailFunc ? true : (FUNCTION_TYPE_TAIL == pFunc->funcType);
|
pSelect->hasTailFunc = pSelect->hasTailFunc ? true : (FUNCTION_TYPE_TAIL == pFunc->funcType);
|
||||||
pSelect->hasInterpFunc = pSelect->hasInterpFunc ? true : (FUNCTION_TYPE_INTERP == pFunc->funcType);
|
pSelect->hasInterpFunc = pSelect->hasInterpFunc ? true : (FUNCTION_TYPE_INTERP == pFunc->funcType);
|
||||||
|
pSelect->hasInterpPseudoColFunc = pSelect->hasInterpPseudoColFunc ? true : fmIsInterpPseudoColumnFunc(pFunc->funcId);
|
||||||
pSelect->hasLastRowFunc = pSelect->hasLastRowFunc ? true : (FUNCTION_TYPE_LAST_ROW == pFunc->funcType);
|
pSelect->hasLastRowFunc = pSelect->hasLastRowFunc ? true : (FUNCTION_TYPE_LAST_ROW == pFunc->funcType);
|
||||||
pSelect->hasLastFunc = pSelect->hasLastFunc ? true : (FUNCTION_TYPE_LAST == pFunc->funcType);
|
pSelect->hasLastFunc = pSelect->hasLastFunc ? true : (FUNCTION_TYPE_LAST == pFunc->funcType);
|
||||||
pSelect->hasTimeLineFunc = pSelect->hasTimeLineFunc ? true : fmIsTimelineFunc(pFunc->funcId);
|
pSelect->hasTimeLineFunc = pSelect->hasTimeLineFunc ? true : fmIsTimelineFunc(pFunc->funcId);
|
||||||
|
@ -3369,6 +3371,9 @@ static int32_t translateInterp(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
if (NULL != pSelect->pRange || NULL != pSelect->pEvery || NULL != pSelect->pFill) {
|
if (NULL != pSelect->pRange || NULL != pSelect->pEvery || NULL != pSelect->pFill) {
|
||||||
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_INTERP_CLAUSE);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_INTERP_CLAUSE);
|
||||||
}
|
}
|
||||||
|
if (pSelect->hasInterpPseudoColFunc) {
|
||||||
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_ALLOWED_FUNC, "Has Interp pseudo column(s) but missing interp function");
|
||||||
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6470,22 +6475,69 @@ static int32_t translateDropFunction(STranslateContext* pCxt, SDropFunctionStmt*
|
||||||
return buildCmdMsg(pCxt, TDMT_MND_DROP_FUNC, (FSerializeFunc)tSerializeSDropFuncReq, &req);
|
return buildCmdMsg(pCxt, TDMT_MND_DROP_FUNC, (FSerializeFunc)tSerializeSDropFuncReq, &req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t createRealTableForGrantTable(SGrantStmt* pStmt, SRealTableNode** pTable) {
|
||||||
|
SRealTableNode* pRealTable = (SRealTableNode*)nodesMakeNode(QUERY_NODE_REAL_TABLE);
|
||||||
|
if (NULL == pRealTable) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
strcpy(pRealTable->table.dbName, pStmt->objName);
|
||||||
|
strcpy(pRealTable->table.tableName, pStmt->tabName);
|
||||||
|
strcpy(pRealTable->table.tableAlias, pStmt->tabName);
|
||||||
|
*pTable = pRealTable;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t translateGrantTagCond(STranslateContext* pCxt, SGrantStmt* pStmt, SAlterUserReq* pReq) {
|
||||||
|
if (NULL == pStmt->pTagCond) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
if ('\0' == pStmt->tabName[0] || '*' == pStmt->tabName[0]) {
|
||||||
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR,
|
||||||
|
"The With clause can only be used for table level privilege");
|
||||||
|
}
|
||||||
|
|
||||||
|
pCxt->pCurrStmt = (SNode*)pStmt;
|
||||||
|
SRealTableNode* pTable = NULL;
|
||||||
|
int32_t code = createRealTableForGrantTable(pStmt, &pTable);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
SName name;
|
||||||
|
code = getTableMetaImpl(pCxt, toName(pCxt->pParseCxt->acctId, pTable->table.dbName, pTable->table.tableName, &name),
|
||||||
|
&(pTable->pMeta));
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = addNamespace(pCxt, pTable);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = translateExpr(pCxt, &pStmt->pTagCond);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = nodesNodeToString(pStmt->pTagCond, false, &pReq->tagCond, &pReq->tagCondLen);
|
||||||
|
}
|
||||||
|
nodesDestroyNode((SNode*)pTable);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t translateGrant(STranslateContext* pCxt, SGrantStmt* pStmt) {
|
static int32_t translateGrant(STranslateContext* pCxt, SGrantStmt* pStmt) {
|
||||||
SAlterUserReq req = {0};
|
SAlterUserReq req = {0};
|
||||||
if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_ALL) ||
|
if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_ALL) ||
|
||||||
(BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_READ) &&
|
(BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_READ) &&
|
||||||
BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_WRITE))) {
|
BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_WRITE))) {
|
||||||
req.alterType = TSDB_ALTER_USER_ADD_ALL_DB;
|
req.alterType = ('\0' == pStmt->tabName[0] ? TSDB_ALTER_USER_ADD_ALL_DB : TSDB_ALTER_USER_ADD_ALL_TABLE);
|
||||||
} else if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_READ)) {
|
} else if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_READ)) {
|
||||||
req.alterType = TSDB_ALTER_USER_ADD_READ_DB;
|
req.alterType = ('\0' == pStmt->tabName[0] ? TSDB_ALTER_USER_ADD_READ_DB : TSDB_ALTER_USER_ADD_READ_TABLE);
|
||||||
} else if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_WRITE)) {
|
} else if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_WRITE)) {
|
||||||
req.alterType = TSDB_ALTER_USER_ADD_WRITE_DB;
|
req.alterType = ('\0' == pStmt->tabName[0] ? TSDB_ALTER_USER_ADD_WRITE_DB : TSDB_ALTER_USER_ADD_WRITE_TABLE);
|
||||||
} else if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_SUBSCRIBE)) {
|
} else if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_SUBSCRIBE)) {
|
||||||
req.alterType = TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC;
|
req.alterType = TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC;
|
||||||
}
|
}
|
||||||
strcpy(req.user, pStmt->userName);
|
strcpy(req.user, pStmt->userName);
|
||||||
sprintf(req.objname, "%d.%s", pCxt->pParseCxt->acctId, pStmt->objName);
|
sprintf(req.objname, "%d.%s", pCxt->pParseCxt->acctId, pStmt->objName);
|
||||||
return buildCmdMsg(pCxt, TDMT_MND_ALTER_USER, (FSerializeFunc)tSerializeSAlterUserReq, &req);
|
sprintf(req.tabName, "%s", pStmt->tabName);
|
||||||
|
int32_t code = translateGrantTagCond(pCxt, pStmt, &req);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = buildCmdMsg(pCxt, TDMT_MND_ALTER_USER, (FSerializeFunc)tSerializeSAlterUserReq, &req);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t translateRevoke(STranslateContext* pCxt, SRevokeStmt* pStmt) {
|
static int32_t translateRevoke(STranslateContext* pCxt, SRevokeStmt* pStmt) {
|
||||||
|
@ -6493,16 +6545,17 @@ static int32_t translateRevoke(STranslateContext* pCxt, SRevokeStmt* pStmt) {
|
||||||
if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_ALL) ||
|
if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_ALL) ||
|
||||||
(BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_READ) &&
|
(BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_READ) &&
|
||||||
BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_WRITE))) {
|
BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_WRITE))) {
|
||||||
req.alterType = TSDB_ALTER_USER_REMOVE_ALL_DB;
|
req.alterType = ('\0' == pStmt->tabName[0] ? TSDB_ALTER_USER_REMOVE_ALL_DB : TSDB_ALTER_USER_REMOVE_ALL_TABLE);
|
||||||
} else if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_READ)) {
|
} else if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_READ)) {
|
||||||
req.alterType = TSDB_ALTER_USER_REMOVE_READ_DB;
|
req.alterType = ('\0' == pStmt->tabName[0] ? TSDB_ALTER_USER_REMOVE_READ_DB : TSDB_ALTER_USER_REMOVE_READ_TABLE);
|
||||||
} else if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_WRITE)) {
|
} else if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_WRITE)) {
|
||||||
req.alterType = TSDB_ALTER_USER_REMOVE_WRITE_DB;
|
req.alterType = ('\0' == pStmt->tabName[0] ? TSDB_ALTER_USER_REMOVE_WRITE_DB : TSDB_ALTER_USER_REMOVE_WRITE_TABLE);
|
||||||
} else if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_SUBSCRIBE)) {
|
} else if (BIT_FLAG_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_SUBSCRIBE)) {
|
||||||
req.alterType = TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC;
|
req.alterType = TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC;
|
||||||
}
|
}
|
||||||
strcpy(req.user, pStmt->userName);
|
strcpy(req.user, pStmt->userName);
|
||||||
sprintf(req.objname, "%d.%s", pCxt->pParseCxt->acctId, pStmt->objName);
|
sprintf(req.objname, "%d.%s", pCxt->pParseCxt->acctId, pStmt->objName);
|
||||||
|
sprintf(req.tabName, "%s", pStmt->tabName);
|
||||||
return buildCmdMsg(pCxt, TDMT_MND_ALTER_USER, (FSerializeFunc)tSerializeSAlterUserReq, &req);
|
return buildCmdMsg(pCxt, TDMT_MND_ALTER_USER, (FSerializeFunc)tSerializeSAlterUserReq, &req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include "cJSON.h"
|
#include "cJSON.h"
|
||||||
#include "querynodes.h"
|
#include "querynodes.h"
|
||||||
|
|
||||||
#define USER_AUTH_KEY_MAX_LEN TSDB_USER_LEN + TSDB_DB_FNAME_LEN + 2
|
#define USER_AUTH_KEY_MAX_LEN TSDB_USER_LEN + TSDB_TABLE_FNAME_LEN + 2
|
||||||
|
|
||||||
const void* nullPointer = NULL;
|
const void* nullPointer = NULL;
|
||||||
|
|
||||||
|
@ -496,24 +496,44 @@ int32_t getVnodeSysTableTargetName(int32_t acctId, SNode* pWhere, SName* pName)
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t userAuthToString(int32_t acctId, const char* pUser, const char* pDb, AUTH_TYPE type, char* pStr) {
|
static int32_t userAuthToString(int32_t acctId, const char* pUser, const char* pDb, const char* pTable, AUTH_TYPE type,
|
||||||
return sprintf(pStr, "%s*%d.%s*%d", pUser, acctId, pDb, type);
|
char* pStr) {
|
||||||
|
return sprintf(pStr, "%s*%d*%s*%s*%d", pUser, acctId, pDb, (NULL != pTable && '\0' == pTable[0]) ? NULL : pTable,
|
||||||
|
type);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t userAuthToStringExt(const char* pUser, const char* pDbFName, AUTH_TYPE type, char* pStr) {
|
static int32_t getIntegerFromAuthStr(const char* pStart, char** pNext) {
|
||||||
return sprintf(pStr, "%s*%s*%d", pUser, pDbFName, type);
|
char* p = strchr(pStart, '*');
|
||||||
|
char buf[10] = {0};
|
||||||
|
if (NULL == p) {
|
||||||
|
strcpy(buf, pStart);
|
||||||
|
*pNext = NULL;
|
||||||
|
} else {
|
||||||
|
strncpy(buf, pStart, p - pStart);
|
||||||
|
*pNext = ++p;
|
||||||
|
}
|
||||||
|
return taosStr2Int32(buf, NULL, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void getStringFromAuthStr(const char* pStart, char* pStr, char** pNext) {
|
||||||
|
char* p = strchr(pStart, '*');
|
||||||
|
if (NULL == p) {
|
||||||
|
strcpy(pStr, pStart);
|
||||||
|
*pNext = NULL;
|
||||||
|
} else {
|
||||||
|
strncpy(pStr, pStart, p - pStart);
|
||||||
|
*pNext = ++p;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stringToUserAuth(const char* pStr, int32_t len, SUserAuthInfo* pUserAuth) {
|
static void stringToUserAuth(const char* pStr, int32_t len, SUserAuthInfo* pUserAuth) {
|
||||||
char* p1 = strchr(pStr, '*');
|
char* p = NULL;
|
||||||
strncpy(pUserAuth->user, pStr, p1 - pStr);
|
getStringFromAuthStr(pStr, pUserAuth->user, &p);
|
||||||
++p1;
|
pUserAuth->tbName.acctId = getIntegerFromAuthStr(p, &p);
|
||||||
char* p2 = strchr(p1, '*');
|
getStringFromAuthStr(p, pUserAuth->tbName.dbname, &p);
|
||||||
strncpy(pUserAuth->dbFName, p1, p2 - p1);
|
getStringFromAuthStr(p, pUserAuth->tbName.tname, &p);
|
||||||
++p2;
|
pUserAuth->tbName.type = TSDB_TABLE_NAME_T;
|
||||||
char buf[10] = {0};
|
pUserAuth->type = getIntegerFromAuthStr(p, &p);
|
||||||
strncpy(buf, p2, len - (p2 - pStr));
|
|
||||||
pUserAuth->type = taosStr2Int32(buf, NULL, 10);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t buildTableReq(SHashObj* pTablesHash, SArray** pTables) {
|
static int32_t buildTableReq(SHashObj* pTablesHash, SArray** pTables) {
|
||||||
|
@ -586,8 +606,10 @@ static int32_t buildUserAuthReq(SHashObj* pUserAuthHash, SArray** pUserAuth) {
|
||||||
while (NULL != p) {
|
while (NULL != p) {
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
char* pKey = taosHashGetKey(p, &len);
|
char* pKey = taosHashGetKey(p, &len);
|
||||||
|
char key[USER_AUTH_KEY_MAX_LEN] = {0};
|
||||||
|
strncpy(key, pKey, len);
|
||||||
SUserAuthInfo userAuth = {0};
|
SUserAuthInfo userAuth = {0};
|
||||||
stringToUserAuth(pKey, len, &userAuth);
|
stringToUserAuth(key, len, &userAuth);
|
||||||
taosArrayPush(*pUserAuth, &userAuth);
|
taosArrayPush(*pUserAuth, &userAuth);
|
||||||
p = taosHashIterate(pUserAuthHash, p);
|
p = taosHashIterate(pUserAuthHash, p);
|
||||||
}
|
}
|
||||||
|
@ -712,7 +734,8 @@ static int32_t putUserAuthToCache(const SArray* pUserAuthReq, const SArray* pUse
|
||||||
for (int32_t i = 0; i < nvgs; ++i) {
|
for (int32_t i = 0; i < nvgs; ++i) {
|
||||||
SUserAuthInfo* pUser = taosArrayGet(pUserAuthReq, i);
|
SUserAuthInfo* pUser = taosArrayGet(pUserAuthReq, i);
|
||||||
char key[USER_AUTH_KEY_MAX_LEN] = {0};
|
char key[USER_AUTH_KEY_MAX_LEN] = {0};
|
||||||
int32_t len = userAuthToStringExt(pUser->user, pUser->dbFName, pUser->type, key);
|
int32_t len = userAuthToString(pUser->tbName.acctId, pUser->user, pUser->tbName.dbname, pUser->tbName.tname,
|
||||||
|
pUser->type, key);
|
||||||
if (TSDB_CODE_SUCCESS != putMetaDataToHash(key, len, pUserAuthData, i, pUserAuth)) {
|
if (TSDB_CODE_SUCCESS != putMetaDataToHash(key, len, pUserAuthData, i, pUserAuth)) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
@ -910,33 +933,24 @@ static int32_t reserveUserAuthInCacheImpl(const char* pKey, int32_t len, SParseM
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool pass = false;
|
return taosHashPut(pMetaCache->pUserAuth, pKey, len, &nullPointer, POINTER_BYTES);
|
||||||
return taosHashPut(pMetaCache->pUserAuth, pKey, len, &pass, sizeof(pass));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t reserveUserAuthInCache(int32_t acctId, const char* pUser, const char* pDb, AUTH_TYPE type,
|
int32_t reserveUserAuthInCache(int32_t acctId, const char* pUser, const char* pDb, const char* pTable, AUTH_TYPE type,
|
||||||
SParseMetaCache* pMetaCache) {
|
SParseMetaCache* pMetaCache) {
|
||||||
char key[USER_AUTH_KEY_MAX_LEN] = {0};
|
char key[USER_AUTH_KEY_MAX_LEN] = {0};
|
||||||
int32_t len = userAuthToString(acctId, pUser, pDb, type, key);
|
int32_t len = userAuthToString(acctId, pUser, pDb, pTable, type, key);
|
||||||
return reserveUserAuthInCacheImpl(key, len, pMetaCache);
|
return reserveUserAuthInCacheImpl(key, len, pMetaCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t reserveUserAuthInCacheExt(const char* pUser, const SName* pName, AUTH_TYPE type, SParseMetaCache* pMetaCache) {
|
int32_t getUserAuthFromCache(SParseMetaCache* pMetaCache, SUserAuthInfo* pAuthReq, SUserAuthRes* pAuthRes) {
|
||||||
char dbFName[TSDB_DB_FNAME_LEN] = {0};
|
|
||||||
tNameGetFullDbName(pName, dbFName);
|
|
||||||
char key[USER_AUTH_KEY_MAX_LEN] = {0};
|
char key[USER_AUTH_KEY_MAX_LEN] = {0};
|
||||||
int32_t len = userAuthToStringExt(pUser, dbFName, type, key);
|
int32_t len = userAuthToString(pAuthReq->tbName.acctId, pAuthReq->user, pAuthReq->tbName.dbname,
|
||||||
return reserveUserAuthInCacheImpl(key, len, pMetaCache);
|
pAuthReq->tbName.tname, pAuthReq->type, key);
|
||||||
}
|
SUserAuthRes* pAuth = NULL;
|
||||||
|
int32_t code = getMetaDataFromHash(key, len, pMetaCache->pUserAuth, (void**)&pAuth);
|
||||||
int32_t getUserAuthFromCache(SParseMetaCache* pMetaCache, const char* pUser, const char* pDbFName, AUTH_TYPE type,
|
|
||||||
bool* pPass) {
|
|
||||||
char key[USER_AUTH_KEY_MAX_LEN] = {0};
|
|
||||||
int32_t len = userAuthToStringExt(pUser, pDbFName, type, key);
|
|
||||||
bool* pRes = NULL;
|
|
||||||
int32_t code = getMetaDataFromHash(key, len, pMetaCache->pUserAuth, (void**)&pRes);
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
*pPass = *pRes;
|
memcpy(pAuthRes, pAuth, sizeof(SUserAuthRes));
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -279,15 +279,13 @@ int32_t __catalogGetDBCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const char* d
|
||||||
return g_mockCatalogService->catalogGetDBCfg(dbFName, pDbCfg);
|
return g_mockCatalogService->catalogGetDBCfg(dbFName, pDbCfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t __catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, const char* dbFName, AUTH_TYPE type,
|
int32_t __catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, SUserAuthInfo *pAuth, SUserAuthRes* pRes) {
|
||||||
bool* pass) {
|
pRes->pass = true;
|
||||||
*pass = true;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t __catalogChkAuthFromCache(SCatalog* pCtg, const char* user, const char* dbFName, AUTH_TYPE type, bool* pass,
|
int32_t __catalogChkAuthFromCache(SCatalog* pCtg, SUserAuthInfo *pAuth, SUserAuthRes* pRes, bool* exists) {
|
||||||
bool* exists) {
|
pRes->pass = true;
|
||||||
*pass = true;
|
|
||||||
*exists = true;
|
*exists = true;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -589,8 +589,8 @@ class MockCatalogServiceImpl {
|
||||||
*pUserAuthData = taosArrayInit(num, sizeof(SMetaRes));
|
*pUserAuthData = taosArrayInit(num, sizeof(SMetaRes));
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
SMetaRes res = {0};
|
SMetaRes res = {0};
|
||||||
res.pRes = taosMemoryCalloc(1, sizeof(bool));
|
res.pRes = taosMemoryCalloc(1, sizeof(SUserAuthRes));
|
||||||
*(bool*)(res.pRes) = true;
|
((SUserAuthRes*)res.pRes)->pass = true;
|
||||||
taosArrayPush(*pUserAuthData, &res);
|
taosArrayPush(*pUserAuthData, &res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,36 +59,36 @@ typedef struct SSyncLogBuffer {
|
||||||
} SSyncLogBuffer;
|
} SSyncLogBuffer;
|
||||||
|
|
||||||
// SSyncLogRepMgr
|
// SSyncLogRepMgr
|
||||||
SSyncLogReplMgr* syncLogReplMgrCreate();
|
SSyncLogReplMgr* syncLogReplCreate();
|
||||||
void syncLogReplMgrDestroy(SSyncLogReplMgr* pMgr);
|
void syncLogReplDestroy(SSyncLogReplMgr* pMgr);
|
||||||
void syncLogReplMgrReset(SSyncLogReplMgr* pMgr);
|
void syncLogReplReset(SSyncLogReplMgr* pMgr);
|
||||||
|
|
||||||
int32_t syncNodeLogReplMgrInit(SSyncNode* pNode);
|
int32_t syncNodeLogReplInit(SSyncNode* pNode);
|
||||||
void syncNodeLogReplMgrDestroy(SSyncNode* pNode);
|
void syncNodeLogReplDestroy(SSyncNode* pNode);
|
||||||
|
|
||||||
// access
|
// access
|
||||||
static FORCE_INLINE int64_t syncLogGetRetryBackoffTimeMs(SSyncLogReplMgr* pMgr) {
|
static FORCE_INLINE int64_t syncLogReplGetRetryBackoffTimeMs(SSyncLogReplMgr* pMgr) {
|
||||||
return ((int64_t)1 << pMgr->retryBackoff) * SYNC_LOG_REPL_RETRY_WAIT_MS;
|
return ((int64_t)1 << pMgr->retryBackoff) * SYNC_LOG_REPL_RETRY_WAIT_MS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t syncLogGetNextRetryBackoff(SSyncLogReplMgr* pMgr) {
|
static FORCE_INLINE int32_t syncLogReplGetNextRetryBackoff(SSyncLogReplMgr* pMgr) {
|
||||||
return TMIN(pMgr->retryBackoff + 1, SYNC_MAX_RETRY_BACKOFF);
|
return TMIN(pMgr->retryBackoff + 1, SYNC_MAX_RETRY_BACKOFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index);
|
SyncTerm syncLogReplGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index);
|
||||||
|
|
||||||
int32_t syncLogReplMgrReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode);
|
int32_t syncLogReplReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode);
|
||||||
int32_t syncLogReplMgrReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm,
|
int32_t syncLogReplReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm,
|
||||||
SRaftId* pDestId, bool* pBarrier);
|
SRaftId* pDestId, bool* pBarrier);
|
||||||
int32_t syncLogReplMgrReplicateAttempt(SSyncLogReplMgr* pMgr, SSyncNode* pNode);
|
int32_t syncLogReplReplicateAttempt(SSyncLogReplMgr* pMgr, SSyncNode* pNode);
|
||||||
int32_t syncLogReplMgrReplicateProbe(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index);
|
int32_t syncLogReplReplicateProbe(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index);
|
||||||
|
|
||||||
int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg);
|
int32_t syncLogReplProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg);
|
||||||
int32_t syncLogReplMgrProcessReplyAsRecovery(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg);
|
int32_t syncLogReplProcessReplyAsRecovery(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg);
|
||||||
int32_t syncLogReplMgrProcessReplyAsNormal(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg);
|
int32_t syncLogReplProcessReplyAsNormal(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg);
|
||||||
|
|
||||||
int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg);
|
int32_t syncLogReplProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg);
|
||||||
int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode);
|
int32_t syncLogReplRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode);
|
||||||
|
|
||||||
// SSyncLogBuffer
|
// SSyncLogBuffer
|
||||||
SSyncLogBuffer* syncLogBufferCreate();
|
SSyncLogBuffer* syncLogBufferCreate();
|
||||||
|
@ -111,7 +111,7 @@ SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode,
|
||||||
int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf);
|
int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf);
|
||||||
int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex toIndex);
|
int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex toIndex);
|
||||||
|
|
||||||
int32_t syncLogFsmExecute(SSyncNode* pNode, SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncRaftEntry* pEntry,
|
int32_t syncFsmExecute(SSyncNode* pNode, SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncRaftEntry* pEntry,
|
||||||
int32_t applyCode);
|
int32_t applyCode);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,7 +85,7 @@ int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
||||||
sError("vgId:%d, failed to get log repl mgr for src addr: 0x%016" PRIx64, ths->vgId, pMsg->srcId.addr);
|
sError("vgId:%d, failed to get log repl mgr for src addr: 0x%016" PRIx64, ths->vgId, pMsg->srcId.addr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
(void)syncLogReplMgrProcessReply(pMgr, ths, pMsg);
|
(void)syncLogReplProcessReply(pMgr, ths, pMsg);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -949,7 +949,7 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) {
|
||||||
pSyncNode->changing = false;
|
pSyncNode->changing = false;
|
||||||
|
|
||||||
// replication mgr
|
// replication mgr
|
||||||
if (syncNodeLogReplMgrInit(pSyncNode) < 0) {
|
if (syncNodeLogReplInit(pSyncNode) < 0) {
|
||||||
sError("vgId:%d, failed to init repl mgr since %s.", pSyncNode->vgId, terrstr());
|
sError("vgId:%d, failed to init repl mgr since %s.", pSyncNode->vgId, terrstr());
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
@ -1122,7 +1122,7 @@ void syncNodeClose(SSyncNode* pSyncNode) {
|
||||||
syncNodeStopPingTimer(pSyncNode);
|
syncNodeStopPingTimer(pSyncNode);
|
||||||
syncNodeStopElectTimer(pSyncNode);
|
syncNodeStopElectTimer(pSyncNode);
|
||||||
syncNodeStopHeartbeatTimer(pSyncNode);
|
syncNodeStopHeartbeatTimer(pSyncNode);
|
||||||
syncNodeLogReplMgrDestroy(pSyncNode);
|
syncNodeLogReplDestroy(pSyncNode);
|
||||||
|
|
||||||
syncRespMgrDestroy(pSyncNode->pSyncRespMgr);
|
syncRespMgrDestroy(pSyncNode->pSyncRespMgr);
|
||||||
pSyncNode->pSyncRespMgr = NULL;
|
pSyncNode->pSyncRespMgr = NULL;
|
||||||
|
@ -2164,7 +2164,7 @@ int32_t syncNodeAppend(SSyncNode* ths, SSyncRaftEntry* pEntry) {
|
||||||
if (syncLogBufferAppend(ths->pLogBuf, ths, pEntry) < 0) {
|
if (syncLogBufferAppend(ths->pLogBuf, ths, pEntry) < 0) {
|
||||||
sError("vgId:%d, failed to enqueue sync log buffer, index:%" PRId64, ths->vgId, pEntry->index);
|
sError("vgId:%d, failed to enqueue sync log buffer, index:%" PRId64, ths->vgId, pEntry->index);
|
||||||
ASSERT(terrno != 0);
|
ASSERT(terrno != 0);
|
||||||
(void)syncLogFsmExecute(ths, ths->pFsm, ths->state, raftStoreGetTerm(ths), pEntry, terrno);
|
(void)syncFsmExecute(ths, ths->pFsm, ths->state, raftStoreGetTerm(ths), pEntry, terrno);
|
||||||
syncEntryDestroy(pEntry);
|
syncEntryDestroy(pEntry);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -2374,7 +2374,7 @@ int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
||||||
|
|
||||||
syncIndexMgrSetRecvTime(ths->pMatchIndex, &pMsg->srcId, tsMs);
|
syncIndexMgrSetRecvTime(ths->pMatchIndex, &pMsg->srcId, tsMs);
|
||||||
|
|
||||||
return syncLogReplMgrProcessHeartbeatReply(pMgr, ths, pMsg);
|
return syncLogReplProcessHeartbeatReply(pMgr, ths, pMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncNodeOnHeartbeatReplyOld(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
int32_t syncNodeOnHeartbeatReplyOld(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
||||||
|
|
|
@ -86,7 +86,7 @@ _err:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncTerm syncLogReplMgrGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index) {
|
SyncTerm syncLogReplGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index) {
|
||||||
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
||||||
SSyncRaftEntry* pEntry = NULL;
|
SSyncRaftEntry* pEntry = NULL;
|
||||||
SyncIndex prevIndex = index - 1;
|
SyncIndex prevIndex = index - 1;
|
||||||
|
@ -316,7 +316,7 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt
|
||||||
" %" PRId64 ", %" PRId64 ")",
|
" %" PRId64 ", %" PRId64 ")",
|
||||||
pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex,
|
pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex,
|
||||||
pBuf->endIndex);
|
pBuf->endIndex);
|
||||||
SyncTerm term = syncLogReplMgrGetPrevLogTerm(NULL, pNode, index + 1);
|
SyncTerm term = syncLogReplGetPrevLogTerm(NULL, pNode, index + 1);
|
||||||
ASSERT(pEntry->term >= 0);
|
ASSERT(pEntry->term >= 0);
|
||||||
if (term == pEntry->term) {
|
if (term == pEntry->term) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -351,7 +351,7 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt
|
||||||
" %" PRId64 " %" PRId64 ", %" PRId64 ")",
|
" %" PRId64 " %" PRId64 ", %" PRId64 ")",
|
||||||
pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex,
|
pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex,
|
||||||
pBuf->endIndex);
|
pBuf->endIndex);
|
||||||
SyncTerm existPrevTerm = syncLogReplMgrGetPrevLogTerm(NULL, pNode, index);
|
SyncTerm existPrevTerm = syncLogReplGetPrevLogTerm(NULL, pNode, index);
|
||||||
ASSERT(pEntry->term == pExist->term && (pEntry->index > pBuf->matchIndex || prevTerm == existPrevTerm));
|
ASSERT(pEntry->term == pExist->term && (pEntry->index > pBuf->matchIndex || prevTerm == existPrevTerm));
|
||||||
ret = 0;
|
ret = 0;
|
||||||
goto _out;
|
goto _out;
|
||||||
|
@ -482,7 +482,7 @@ _out:
|
||||||
return matchIndex;
|
return matchIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncLogFsmExecute(SSyncNode* pNode, SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncRaftEntry* pEntry,
|
int32_t syncFsmExecute(SSyncNode* pNode, SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncRaftEntry* pEntry,
|
||||||
int32_t applyCode) {
|
int32_t applyCode) {
|
||||||
if (pNode->replicaNum == 1 && pNode->restoreFinish && pNode->vgId != 1) {
|
if (pNode->replicaNum == 1 && pNode->restoreFinish && pNode->vgId != 1) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -564,7 +564,7 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm
|
||||||
pEntry->term, TMSG_INFO(pEntry->originalRpcType));
|
pEntry->term, TMSG_INFO(pEntry->originalRpcType));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (syncLogFsmExecute(pNode, pFsm, role, currentTerm, pEntry, 0) != 0) {
|
if (syncFsmExecute(pNode, pFsm, role, currentTerm, pEntry, 0) != 0) {
|
||||||
sError("vgId:%d, failed to execute sync log entry. index:%" PRId64 ", term:%" PRId64
|
sError("vgId:%d, failed to execute sync log entry. index:%" PRId64 ", term:%" PRId64
|
||||||
", role:%d, current term:%" PRId64,
|
", role:%d, current term:%" PRId64,
|
||||||
vgId, pEntry->index, pEntry->term, role, currentTerm);
|
vgId, pEntry->index, pEntry->term, role, currentTerm);
|
||||||
|
@ -611,7 +611,7 @@ _out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncLogReplMgrReset(SSyncLogReplMgr* pMgr) {
|
void syncLogReplReset(SSyncLogReplMgr* pMgr) {
|
||||||
if (pMgr == NULL) return;
|
if (pMgr == NULL) return;
|
||||||
|
|
||||||
ASSERT(pMgr->startIndex >= 0);
|
ASSERT(pMgr->startIndex >= 0);
|
||||||
|
@ -625,14 +625,14 @@ void syncLogReplMgrReset(SSyncLogReplMgr* pMgr) {
|
||||||
pMgr->retryBackoff = 0;
|
pMgr->retryBackoff = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) {
|
int32_t syncLogReplRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) {
|
||||||
if (pMgr->endIndex <= pMgr->startIndex) {
|
if (pMgr->endIndex <= pMgr->startIndex) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SRaftId* pDestId = &pNode->replicasId[pMgr->peerId];
|
SRaftId* pDestId = &pNode->replicasId[pMgr->peerId];
|
||||||
if (pMgr->retryBackoff == SYNC_MAX_RETRY_BACKOFF) {
|
if (pMgr->retryBackoff == SYNC_MAX_RETRY_BACKOFF) {
|
||||||
syncLogReplMgrReset(pMgr);
|
syncLogReplReset(pMgr);
|
||||||
sWarn("vgId:%d, reset sync log repl mgr since retry backoff exceeding limit. peer:%" PRIx64, pNode->vgId,
|
sWarn("vgId:%d, reset sync log repl mgr since retry backoff exceeding limit. peer:%" PRIx64, pNode->vgId,
|
||||||
pDestId->addr);
|
pDestId->addr);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -640,7 +640,7 @@ int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) {
|
||||||
|
|
||||||
int32_t ret = -1;
|
int32_t ret = -1;
|
||||||
bool retried = false;
|
bool retried = false;
|
||||||
int64_t retryWaitMs = syncLogGetRetryBackoffTimeMs(pMgr);
|
int64_t retryWaitMs = syncLogReplGetRetryBackoffTimeMs(pMgr);
|
||||||
int64_t nowMs = taosGetMonoTimestampMs();
|
int64_t nowMs = taosGetMonoTimestampMs();
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int64_t firstIndex = -1;
|
int64_t firstIndex = -1;
|
||||||
|
@ -657,7 +657,7 @@ int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) {
|
||||||
|
|
||||||
if (pMgr->states[pos].acked) {
|
if (pMgr->states[pos].acked) {
|
||||||
if (pMgr->matchIndex < index && pMgr->states[pos].timeMs + (syncGetRetryMaxWaitMs() << 3) < nowMs) {
|
if (pMgr->matchIndex < index && pMgr->states[pos].timeMs + (syncGetRetryMaxWaitMs() << 3) < nowMs) {
|
||||||
syncLogReplMgrReset(pMgr);
|
syncLogReplReset(pMgr);
|
||||||
sWarn("vgId:%d, reset sync log repl mgr since stagnation. index:%" PRId64 ", peer:%" PRIx64, pNode->vgId,
|
sWarn("vgId:%d, reset sync log repl mgr since stagnation. index:%" PRId64 ", peer:%" PRIx64, pNode->vgId,
|
||||||
index, pDestId->addr);
|
index, pDestId->addr);
|
||||||
goto _out;
|
goto _out;
|
||||||
|
@ -666,7 +666,7 @@ int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool barrier = false;
|
bool barrier = false;
|
||||||
if (syncLogReplMgrReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) {
|
if (syncLogReplReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) {
|
||||||
sError("vgId:%d, failed to replicate sync log entry since %s. index:%" PRId64 ", dest:%" PRIx64 "", pNode->vgId,
|
sError("vgId:%d, failed to replicate sync log entry since %s. index:%" PRId64 ", dest:%" PRIx64 "", pNode->vgId,
|
||||||
terrstr(), index, pDestId->addr);
|
terrstr(), index, pDestId->addr);
|
||||||
goto _out;
|
goto _out;
|
||||||
|
@ -687,7 +687,7 @@ int32_t syncLogReplMgrRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
_out:
|
_out:
|
||||||
if (retried) {
|
if (retried) {
|
||||||
pMgr->retryBackoff = syncLogGetNextRetryBackoff(pMgr);
|
pMgr->retryBackoff = syncLogReplGetNextRetryBackoff(pMgr);
|
||||||
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
||||||
sInfo("vgId:%d, resend %d sync log entries. dest:%" PRIx64 ", indexes:%" PRId64 " ..., terms: ... %" PRId64
|
sInfo("vgId:%d, resend %d sync log entries. dest:%" PRIx64 ", indexes:%" PRId64 " ..., terms: ... %" PRId64
|
||||||
", retryWaitMs:%" PRId64 ", mgr: [%" PRId64 " %" PRId64 ", %" PRId64 "), buffer: [%" PRId64 " %" PRId64
|
", retryWaitMs:%" PRId64 ", mgr: [%" PRId64 " %" PRId64 ", %" PRId64 "), buffer: [%" PRId64 " %" PRId64
|
||||||
|
@ -698,7 +698,7 @@ _out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncLogReplMgrProcessReplyAsRecovery(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) {
|
int32_t syncLogReplProcessReplyAsRecovery(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) {
|
||||||
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
||||||
SRaftId destId = pMsg->srcId;
|
SRaftId destId = pMsg->srcId;
|
||||||
ASSERT(pMgr->restored == false);
|
ASSERT(pMgr->restored == false);
|
||||||
|
@ -716,7 +716,7 @@ int32_t syncLogReplMgrProcessReplyAsRecovery(SSyncLogReplMgr* pMgr, SSyncNode* p
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (pMsg->lastSendIndex < pMgr->startIndex || pMsg->lastSendIndex >= pMgr->endIndex) {
|
if (pMsg->lastSendIndex < pMgr->startIndex || pMsg->lastSendIndex >= pMgr->endIndex) {
|
||||||
syncLogReplMgrRetryOnNeed(pMgr, pNode);
|
syncLogReplRetryOnNeed(pMgr, pNode);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -750,7 +750,7 @@ int32_t syncLogReplMgrProcessReplyAsRecovery(SSyncLogReplMgr* pMgr, SSyncNode* p
|
||||||
SyncIndex index = TMIN(pMsg->matchIndex, pNode->pLogBuf->matchIndex);
|
SyncIndex index = TMIN(pMsg->matchIndex, pNode->pLogBuf->matchIndex);
|
||||||
|
|
||||||
if (pMsg->matchIndex < pNode->pLogBuf->matchIndex) {
|
if (pMsg->matchIndex < pNode->pLogBuf->matchIndex) {
|
||||||
term = syncLogReplMgrGetPrevLogTerm(pMgr, pNode, index + 1);
|
term = syncLogReplGetPrevLogTerm(pMgr, pNode, index + 1);
|
||||||
if ((index + 1 < firstVer) || (term < 0) ||
|
if ((index + 1 < firstVer) || (term < 0) ||
|
||||||
(term != pMsg->lastMatchTerm && (index + 1 == firstVer || index == firstVer))) {
|
(term != pMsg->lastMatchTerm && (index + 1 == firstVer || index == firstVer))) {
|
||||||
ASSERT(term >= 0 || terrno == TSDB_CODE_WAL_LOG_NOT_EXIST);
|
ASSERT(term >= 0 || terrno == TSDB_CODE_WAL_LOG_NOT_EXIST);
|
||||||
|
@ -773,53 +773,53 @@ int32_t syncLogReplMgrProcessReplyAsRecovery(SSyncLogReplMgr* pMgr, SSyncNode* p
|
||||||
}
|
}
|
||||||
|
|
||||||
// attempt to replicate the raft log at index
|
// attempt to replicate the raft log at index
|
||||||
(void)syncLogReplMgrReset(pMgr);
|
(void)syncLogReplReset(pMgr);
|
||||||
return syncLogReplMgrReplicateProbe(pMgr, pNode, index);
|
return syncLogReplReplicateProbe(pMgr, pNode, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncLogReplMgrProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg) {
|
int32_t syncLogReplProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg) {
|
||||||
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
||||||
taosThreadMutexLock(&pBuf->mutex);
|
taosThreadMutexLock(&pBuf->mutex);
|
||||||
if (pMsg->startTime != 0 && pMsg->startTime != pMgr->peerStartTime) {
|
if (pMsg->startTime != 0 && pMsg->startTime != pMgr->peerStartTime) {
|
||||||
sInfo("vgId:%d, reset sync log repl mgr in heartbeat. peer:%" PRIx64 ", start time:%" PRId64 ", old:%" PRId64 "",
|
sInfo("vgId:%d, reset sync log repl mgr in heartbeat. peer:%" PRIx64 ", start time:%" PRId64 ", old:%" PRId64 "",
|
||||||
pNode->vgId, pMsg->srcId.addr, pMsg->startTime, pMgr->peerStartTime);
|
pNode->vgId, pMsg->srcId.addr, pMsg->startTime, pMgr->peerStartTime);
|
||||||
syncLogReplMgrReset(pMgr);
|
syncLogReplReset(pMgr);
|
||||||
pMgr->peerStartTime = pMsg->startTime;
|
pMgr->peerStartTime = pMsg->startTime;
|
||||||
}
|
}
|
||||||
taosThreadMutexUnlock(&pBuf->mutex);
|
taosThreadMutexUnlock(&pBuf->mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncLogReplMgrProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) {
|
int32_t syncLogReplProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) {
|
||||||
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
||||||
taosThreadMutexLock(&pBuf->mutex);
|
taosThreadMutexLock(&pBuf->mutex);
|
||||||
if (pMsg->startTime != pMgr->peerStartTime) {
|
if (pMsg->startTime != pMgr->peerStartTime) {
|
||||||
sInfo("vgId:%d, reset sync log repl mgr in appendlog reply. peer:%" PRIx64 ", start time:%" PRId64
|
sInfo("vgId:%d, reset sync log repl mgr in appendlog reply. peer:%" PRIx64 ", start time:%" PRId64
|
||||||
", old:%" PRId64,
|
", old:%" PRId64,
|
||||||
pNode->vgId, pMsg->srcId.addr, pMsg->startTime, pMgr->peerStartTime);
|
pNode->vgId, pMsg->srcId.addr, pMsg->startTime, pMgr->peerStartTime);
|
||||||
syncLogReplMgrReset(pMgr);
|
syncLogReplReset(pMgr);
|
||||||
pMgr->peerStartTime = pMsg->startTime;
|
pMgr->peerStartTime = pMsg->startTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pMgr->restored) {
|
if (pMgr->restored) {
|
||||||
(void)syncLogReplMgrProcessReplyAsNormal(pMgr, pNode, pMsg);
|
(void)syncLogReplProcessReplyAsNormal(pMgr, pNode, pMsg);
|
||||||
} else {
|
} else {
|
||||||
(void)syncLogReplMgrProcessReplyAsRecovery(pMgr, pNode, pMsg);
|
(void)syncLogReplProcessReplyAsRecovery(pMgr, pNode, pMsg);
|
||||||
}
|
}
|
||||||
taosThreadMutexUnlock(&pBuf->mutex);
|
taosThreadMutexUnlock(&pBuf->mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncLogReplMgrReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) {
|
int32_t syncLogReplReplicateOnce(SSyncLogReplMgr* pMgr, SSyncNode* pNode) {
|
||||||
if (pMgr->restored) {
|
if (pMgr->restored) {
|
||||||
(void)syncLogReplMgrReplicateAttempt(pMgr, pNode);
|
(void)syncLogReplReplicateAttempt(pMgr, pNode);
|
||||||
} else {
|
} else {
|
||||||
(void)syncLogReplMgrReplicateProbe(pMgr, pNode, pNode->pLogBuf->matchIndex);
|
(void)syncLogReplReplicateProbe(pMgr, pNode, pNode->pLogBuf->matchIndex);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncLogReplMgrReplicateProbe(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index) {
|
int32_t syncLogReplReplicateProbe(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index) {
|
||||||
ASSERT(!pMgr->restored);
|
ASSERT(!pMgr->restored);
|
||||||
ASSERT(pMgr->startIndex >= 0);
|
ASSERT(pMgr->startIndex >= 0);
|
||||||
int64_t retryMaxWaitMs = syncGetRetryMaxWaitMs();
|
int64_t retryMaxWaitMs = syncGetRetryMaxWaitMs();
|
||||||
|
@ -829,12 +829,12 @@ int32_t syncLogReplMgrReplicateProbe(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Sy
|
||||||
nowMs < pMgr->states[pMgr->startIndex % pMgr->size].timeMs + retryMaxWaitMs) {
|
nowMs < pMgr->states[pMgr->startIndex % pMgr->size].timeMs + retryMaxWaitMs) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
(void)syncLogReplMgrReset(pMgr);
|
(void)syncLogReplReset(pMgr);
|
||||||
|
|
||||||
SRaftId* pDestId = &pNode->replicasId[pMgr->peerId];
|
SRaftId* pDestId = &pNode->replicasId[pMgr->peerId];
|
||||||
bool barrier = false;
|
bool barrier = false;
|
||||||
SyncTerm term = -1;
|
SyncTerm term = -1;
|
||||||
if (syncLogReplMgrReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) {
|
if (syncLogReplReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) {
|
||||||
sError("vgId:%d, failed to replicate log entry since %s. index:%" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId,
|
sError("vgId:%d, failed to replicate log entry since %s. index:%" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId,
|
||||||
terrstr(), index, pDestId->addr);
|
terrstr(), index, pDestId->addr);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -857,7 +857,7 @@ int32_t syncLogReplMgrReplicateProbe(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Sy
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncLogReplMgrReplicateAttempt(SSyncLogReplMgr* pMgr, SSyncNode* pNode) {
|
int32_t syncLogReplReplicateAttempt(SSyncLogReplMgr* pMgr, SSyncNode* pNode) {
|
||||||
ASSERT(pMgr->restored);
|
ASSERT(pMgr->restored);
|
||||||
|
|
||||||
SRaftId* pDestId = &pNode->replicasId[pMgr->peerId];
|
SRaftId* pDestId = &pNode->replicasId[pMgr->peerId];
|
||||||
|
@ -879,7 +879,7 @@ int32_t syncLogReplMgrReplicateAttempt(SSyncLogReplMgr* pMgr, SSyncNode* pNode)
|
||||||
SRaftId* pDestId = &pNode->replicasId[pMgr->peerId];
|
SRaftId* pDestId = &pNode->replicasId[pMgr->peerId];
|
||||||
bool barrier = false;
|
bool barrier = false;
|
||||||
SyncTerm term = -1;
|
SyncTerm term = -1;
|
||||||
if (syncLogReplMgrReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) {
|
if (syncLogReplReplicateOneTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) {
|
||||||
sError("vgId:%d, failed to replicate log entry since %s. index:%" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId,
|
sError("vgId:%d, failed to replicate log entry since %s. index:%" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId,
|
||||||
terrstr(), index, pDestId->addr);
|
terrstr(), index, pDestId->addr);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -902,7 +902,7 @@ int32_t syncLogReplMgrReplicateAttempt(SSyncLogReplMgr* pMgr, SSyncNode* pNode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
syncLogReplMgrRetryOnNeed(pMgr, pNode);
|
syncLogReplRetryOnNeed(pMgr, pNode);
|
||||||
|
|
||||||
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
||||||
sTrace("vgId:%d, replicated %d msgs to peer:%" PRIx64 ". indexes:%" PRId64 "..., terms: ...%" PRId64
|
sTrace("vgId:%d, replicated %d msgs to peer:%" PRIx64 ". indexes:%" PRId64 "..., terms: ...%" PRId64
|
||||||
|
@ -913,7 +913,7 @@ int32_t syncLogReplMgrReplicateAttempt(SSyncLogReplMgr* pMgr, SSyncNode* pNode)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncLogReplMgrProcessReplyAsNormal(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) {
|
int32_t syncLogReplProcessReplyAsNormal(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) {
|
||||||
ASSERT(pMgr->restored == true);
|
ASSERT(pMgr->restored == true);
|
||||||
if (pMgr->startIndex <= pMsg->lastSendIndex && pMsg->lastSendIndex < pMgr->endIndex) {
|
if (pMgr->startIndex <= pMsg->lastSendIndex && pMsg->lastSendIndex < pMgr->endIndex) {
|
||||||
if (pMgr->startIndex < pMgr->matchIndex && pMgr->retryBackoff > 0) {
|
if (pMgr->startIndex < pMgr->matchIndex && pMgr->retryBackoff > 0) {
|
||||||
|
@ -932,10 +932,10 @@ int32_t syncLogReplMgrProcessReplyAsNormal(SSyncLogReplMgr* pMgr, SSyncNode* pNo
|
||||||
pMgr->startIndex = pMgr->matchIndex;
|
pMgr->startIndex = pMgr->matchIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
return syncLogReplMgrReplicateAttempt(pMgr, pNode);
|
return syncLogReplReplicateAttempt(pMgr, pNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSyncLogReplMgr* syncLogReplMgrCreate() {
|
SSyncLogReplMgr* syncLogReplCreate() {
|
||||||
SSyncLogReplMgr* pMgr = taosMemoryCalloc(1, sizeof(SSyncLogReplMgr));
|
SSyncLogReplMgr* pMgr = taosMemoryCalloc(1, sizeof(SSyncLogReplMgr));
|
||||||
if (pMgr == NULL) {
|
if (pMgr == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -949,7 +949,7 @@ SSyncLogReplMgr* syncLogReplMgrCreate() {
|
||||||
return pMgr;
|
return pMgr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncLogReplMgrDestroy(SSyncLogReplMgr* pMgr) {
|
void syncLogReplDestroy(SSyncLogReplMgr* pMgr) {
|
||||||
if (pMgr == NULL) {
|
if (pMgr == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -957,10 +957,10 @@ void syncLogReplMgrDestroy(SSyncLogReplMgr* pMgr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncNodeLogReplMgrInit(SSyncNode* pNode) {
|
int32_t syncNodeLogReplInit(SSyncNode* pNode) {
|
||||||
for (int i = 0; i < TSDB_MAX_REPLICA; i++) {
|
for (int i = 0; i < TSDB_MAX_REPLICA; i++) {
|
||||||
ASSERT(pNode->logReplMgrs[i] == NULL);
|
ASSERT(pNode->logReplMgrs[i] == NULL);
|
||||||
pNode->logReplMgrs[i] = syncLogReplMgrCreate();
|
pNode->logReplMgrs[i] = syncLogReplCreate();
|
||||||
if (pNode->logReplMgrs[i] == NULL) {
|
if (pNode->logReplMgrs[i] == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -970,9 +970,9 @@ int32_t syncNodeLogReplMgrInit(SSyncNode* pNode) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncNodeLogReplMgrDestroy(SSyncNode* pNode) {
|
void syncNodeLogReplDestroy(SSyncNode* pNode) {
|
||||||
for (int i = 0; i < TSDB_MAX_REPLICA; i++) {
|
for (int i = 0; i < TSDB_MAX_REPLICA; i++) {
|
||||||
syncLogReplMgrDestroy(pNode->logReplMgrs[i]);
|
syncLogReplDestroy(pNode->logReplMgrs[i]);
|
||||||
pNode->logReplMgrs[i] = NULL;
|
pNode->logReplMgrs[i] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1103,7 +1103,7 @@ int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode) {
|
||||||
// reset repl mgr
|
// reset repl mgr
|
||||||
for (int i = 0; i < pNode->replicaNum; i++) {
|
for (int i = 0; i < pNode->replicaNum; i++) {
|
||||||
SSyncLogReplMgr* pMgr = pNode->logReplMgrs[i];
|
SSyncLogReplMgr* pMgr = pNode->logReplMgrs[i];
|
||||||
syncLogReplMgrReset(pMgr);
|
syncLogReplReset(pMgr);
|
||||||
}
|
}
|
||||||
syncLogBufferValidate(pBuf);
|
syncLogBufferValidate(pBuf);
|
||||||
taosThreadMutexUnlock(&pBuf->mutex);
|
taosThreadMutexUnlock(&pBuf->mutex);
|
||||||
|
@ -1127,7 +1127,7 @@ SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode,
|
||||||
return pEntry;
|
return pEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncLogReplMgrReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm,
|
int32_t syncLogReplReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm,
|
||||||
SRaftId* pDestId, bool* pBarrier) {
|
SRaftId* pDestId, bool* pBarrier) {
|
||||||
SSyncRaftEntry* pEntry = NULL;
|
SSyncRaftEntry* pEntry = NULL;
|
||||||
SRpcMsg msgOut = {0};
|
SRpcMsg msgOut = {0};
|
||||||
|
@ -1143,14 +1143,14 @@ int32_t syncLogReplMgrReplicateOneTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Sy
|
||||||
if (pMgr) {
|
if (pMgr) {
|
||||||
sInfo("vgId:%d, reset sync log repl mgr of peer:%" PRIx64 " since %s. index:%" PRId64, pNode->vgId,
|
sInfo("vgId:%d, reset sync log repl mgr of peer:%" PRIx64 " since %s. index:%" PRId64, pNode->vgId,
|
||||||
pDestId->addr, terrstr(), index);
|
pDestId->addr, terrstr(), index);
|
||||||
(void)syncLogReplMgrReset(pMgr);
|
(void)syncLogReplReset(pMgr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
*pBarrier = syncLogIsReplicationBarrier(pEntry);
|
*pBarrier = syncLogIsReplicationBarrier(pEntry);
|
||||||
|
|
||||||
prevLogTerm = syncLogReplMgrGetPrevLogTerm(pMgr, pNode, index);
|
prevLogTerm = syncLogReplGetPrevLogTerm(pMgr, pNode, index);
|
||||||
if (prevLogTerm < 0) {
|
if (prevLogTerm < 0) {
|
||||||
sError("vgId:%d, failed to get prev log term since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index);
|
sError("vgId:%d, failed to get prev log term since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index);
|
||||||
goto _err;
|
goto _err;
|
||||||
|
|
|
@ -52,7 +52,7 @@ int32_t syncNodeReplicateReset(SSyncNode* pNode, SRaftId* pDestId) {
|
||||||
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
SSyncLogBuffer* pBuf = pNode->pLogBuf;
|
||||||
taosThreadMutexLock(&pBuf->mutex);
|
taosThreadMutexLock(&pBuf->mutex);
|
||||||
SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(pNode, pDestId);
|
SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(pNode, pDestId);
|
||||||
syncLogReplMgrReset(pMgr);
|
syncLogReplReset(pMgr);
|
||||||
taosThreadMutexUnlock(&pBuf->mutex);
|
taosThreadMutexUnlock(&pBuf->mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ int32_t syncNodeReplicateWithoutLock(SSyncNode* pNode) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
SSyncLogReplMgr* pMgr = pNode->logReplMgrs[i];
|
SSyncLogReplMgr* pMgr = pNode->logReplMgrs[i];
|
||||||
(void)syncLogReplMgrReplicateOnce(pMgr, pNode);
|
(void)syncLogReplReplicateOnce(pMgr, pNode);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,7 +125,7 @@ static void syncLogBufferStates2Str(SSyncNode* pSyncNode, char* buf, int32_t buf
|
||||||
pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex);
|
pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void syncLogReplMgrStates2Str(SSyncNode* pSyncNode, char* buf, int32_t bufLen) {
|
static void syncLogReplStates2Str(SSyncNode* pSyncNode, char* buf, int32_t bufLen) {
|
||||||
int len = 0;
|
int len = 0;
|
||||||
len += snprintf(buf + len, bufLen - len, "%s", "{");
|
len += snprintf(buf + len, bufLen - len, "%s", "{");
|
||||||
for (int32_t i = 0; i < pSyncNode->replicaNum; i++) {
|
for (int32_t i = 0; i < pSyncNode->replicaNum; i++) {
|
||||||
|
@ -178,7 +178,7 @@ void syncPrintNodeLog(const char* flags, ELogLevel level, int32_t dflag, SSyncNo
|
||||||
syncCfg2SimpleStr(&pNode->raftCfg.cfg, cfgStr, sizeof(cfgStr));
|
syncCfg2SimpleStr(&pNode->raftCfg.cfg, cfgStr, sizeof(cfgStr));
|
||||||
|
|
||||||
char replMgrStatesStr[1024] = "";
|
char replMgrStatesStr[1024] = "";
|
||||||
syncLogReplMgrStates2Str(pNode, replMgrStatesStr, sizeof(replMgrStatesStr));
|
syncLogReplStates2Str(pNode, replMgrStatesStr, sizeof(replMgrStatesStr));
|
||||||
|
|
||||||
char bufferStatesStr[256] = "";
|
char bufferStatesStr[256] = "";
|
||||||
syncLogBufferStates2Str(pNode, bufferStatesStr, sizeof(bufferStatesStr));
|
syncLogBufferStates2Str(pNode, bufferStatesStr, sizeof(bufferStatesStr));
|
||||||
|
|
|
@ -17,6 +17,10 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "taoserror.h"
|
#include "taoserror.h"
|
||||||
|
|
||||||
|
#if defined(CUS_NAME) || defined(CUS_PROMPT) || defined(CUS_EMAIL)
|
||||||
|
#include "cus_name.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define PROCESS_ITEM 12
|
#define PROCESS_ITEM 12
|
||||||
#define UUIDLEN37 37
|
#define UUIDLEN37 37
|
||||||
|
|
||||||
|
@ -252,7 +256,11 @@ int32_t taosGetEmail(char *email, int32_t maxLen) {
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
// ASSERT(0);
|
// ASSERT(0);
|
||||||
#elif defined(_TD_DARWIN_64)
|
#elif defined(_TD_DARWIN_64)
|
||||||
|
#ifdef CUS_PROMPT
|
||||||
|
const char *filepath = "/usr/local/"CUS_PROMPT"/email";
|
||||||
|
#else
|
||||||
const char *filepath = "/usr/local/taos/email";
|
const char *filepath = "/usr/local/taos/email";
|
||||||
|
#endif // CUS_PROMPT
|
||||||
|
|
||||||
TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ);
|
TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ);
|
||||||
if (pFile == NULL) return false;
|
if (pFile == NULL) return false;
|
||||||
|
@ -264,8 +272,12 @@ int32_t taosGetEmail(char *email, int32_t maxLen) {
|
||||||
|
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
return 0;
|
return 0;
|
||||||
|
#else
|
||||||
|
#ifdef CUS_PROMPT
|
||||||
|
const char *filepath = "/usr/local/"CUS_PROMPT"/email";
|
||||||
#else
|
#else
|
||||||
const char *filepath = "/usr/local/taos/email";
|
const char *filepath = "/usr/local/taos/email";
|
||||||
|
#endif // CUS_PROMPT
|
||||||
|
|
||||||
TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ);
|
TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ);
|
||||||
if (pFile == NULL) return false;
|
if (pFile == NULL) return false;
|
||||||
|
|
|
@ -190,6 +190,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_NO_USER_FROM_CONN, "Can not get user from
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_MANY_USERS, "Too many users")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_MANY_USERS, "Too many users")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_ALTER_OPER, "Invalid alter operation")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_ALTER_OPER, "Invalid alter operation")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_AUTH_FAILURE, "Authentication failure")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_AUTH_FAILURE, "Authentication failure")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_PRIVILEDGE_EXIST, "User already have this priviledge")
|
||||||
|
|
||||||
//mnode-stable-part1
|
//mnode-stable-part1
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_STB_ALREADY_EXIST, "STable already exists")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_STB_ALREADY_EXIST, "STable already exists")
|
||||||
|
|
|
@ -61,9 +61,9 @@ class TDTestCase:
|
||||||
os.system("%s" % cmd)
|
os.system("%s" % cmd)
|
||||||
tdSql.execute("reset query cache")
|
tdSql.execute("reset query cache")
|
||||||
tdSql.query("show db.tables")
|
tdSql.query("show db.tables")
|
||||||
tdSql.checkRows(10)
|
tdSql.checkRows(8)
|
||||||
tdSql.query("select count(*) from db.stb")
|
tdSql.query("select count(*) from db.stb")
|
||||||
tdSql.checkData(0, 0, 100)
|
tdSql.checkData(0, 0, 80)
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
|
|
|
@ -15,13 +15,18 @@
|
||||||
"num_of_records_per_req": 10,
|
"num_of_records_per_req": 10,
|
||||||
"databases": [{
|
"databases": [{
|
||||||
"dbinfo": {
|
"dbinfo": {
|
||||||
"name": "db"
|
"name": "db",
|
||||||
|
"drop": "yes"
|
||||||
|
|
||||||
},
|
},
|
||||||
"super_tables": [{
|
"super_tables": [{
|
||||||
|
"child_table_exists":"no",
|
||||||
"name": "stb",
|
"name": "stb",
|
||||||
"childtable_prefix": "stb_",
|
"childtable_prefix": "stb_",
|
||||||
"childtable_count": 10,
|
"childtable_count": 10,
|
||||||
"insert_rows": 10,
|
"insert_rows": 10,
|
||||||
|
"childtable_from": 1,
|
||||||
|
"childtable_to": 9,
|
||||||
"columns": [{"type": "INT"}],
|
"columns": [{"type": "INT"}],
|
||||||
"tags": [{"type": "INT"}]
|
"tags": [{"type": "INT"}]
|
||||||
}]
|
}]
|
||||||
|
|
|
@ -444,7 +444,7 @@ class TDTestCase:
|
||||||
self.__grant_user_privileges(privilege="", dbname="db", user_name=self.__user_list[0]) ,
|
self.__grant_user_privileges(privilege="", dbname="db", user_name=self.__user_list[0]) ,
|
||||||
self.__grant_user_privileges(privilege=" ".join(self.__privilege), user_name=self.__user_list[0]) ,
|
self.__grant_user_privileges(privilege=" ".join(self.__privilege), user_name=self.__user_list[0]) ,
|
||||||
f"GRANT {self.__privilege[0]} ON * TO {self.__user_list[0]}" ,
|
f"GRANT {self.__privilege[0]} ON * TO {self.__user_list[0]}" ,
|
||||||
f"GRANT {self.__privilege[0]} ON {DBNAME}.{NTBNAME} TO {self.__user_list[0]}" ,
|
# f"GRANT {self.__privilege[0]} ON {DBNAME}.{NTBNAME} TO {self.__user_list[0]}" ,
|
||||||
]
|
]
|
||||||
|
|
||||||
def __revoke_err(self):
|
def __revoke_err(self):
|
||||||
|
@ -456,7 +456,7 @@ class TDTestCase:
|
||||||
self.__revoke_user_privileges(privilege="", dbname="db", user_name=self.__user_list[0]) ,
|
self.__revoke_user_privileges(privilege="", dbname="db", user_name=self.__user_list[0]) ,
|
||||||
self.__revoke_user_privileges(privilege=" ".join(self.__privilege), user_name=self.__user_list[0]) ,
|
self.__revoke_user_privileges(privilege=" ".join(self.__privilege), user_name=self.__user_list[0]) ,
|
||||||
f"REVOKE {self.__privilege[0]} ON * FROM {self.__user_list[0]}" ,
|
f"REVOKE {self.__privilege[0]} ON * FROM {self.__user_list[0]}" ,
|
||||||
f"REVOKE {self.__privilege[0]} ON {DBNAME}.{NTBNAME} FROM {self.__user_list[0]}" ,
|
# f"REVOKE {self.__privilege[0]} ON {DBNAME}.{NTBNAME} FROM {self.__user_list[0]}" ,
|
||||||
]
|
]
|
||||||
|
|
||||||
def test_grant_err(self):
|
def test_grant_err(self):
|
||||||
|
|
|
@ -2040,6 +2040,8 @@ class TDTestCase:
|
||||||
#tdSql.query(f"select _irowts,interp(c0) from {dbname}.{stbname} partition by tbname range('2020-02-01 00:00:04', '2020-02-02 00:00:16') every(1h) fill(prev)")
|
#tdSql.query(f"select _irowts,interp(c0) from {dbname}.{stbname} partition by tbname range('2020-02-01 00:00:04', '2020-02-02 00:00:16') every(1h) fill(prev)")
|
||||||
#tdSql.query(f"select tbname,_irowts,interp(c0) from {dbname}.{stbname} partition by tbname range('2020-02-01 00:00:04', '2020-02-02 00:00:16') every(1h) fill(prev)")
|
#tdSql.query(f"select tbname,_irowts,interp(c0) from {dbname}.{stbname} partition by tbname range('2020-02-01 00:00:04', '2020-02-02 00:00:16') every(1h) fill(prev)")
|
||||||
|
|
||||||
|
tdLog.printNoPrefix("======step 14: test interp pseudo columns")
|
||||||
|
tdSql.error(f"select _irowts, c6 from {dbname}.{tbname}")
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
|
|
|
@ -22,7 +22,7 @@ class TDTestCase:
|
||||||
tdSql.execute("insert into db.ctb using db.stb tags(1) (ts, c1) values (now, 1)")
|
tdSql.execute("insert into db.ctb using db.stb tags(1) (ts, c1) values (now, 1)")
|
||||||
|
|
||||||
tdSql.query("select count(*) from information_schema.ins_columns")
|
tdSql.query("select count(*) from information_schema.ins_columns")
|
||||||
tdSql.checkData(0, 0, 272)
|
tdSql.checkData(0, 0, 274)
|
||||||
|
|
||||||
tdSql.query("select * from information_schema.ins_columns where table_name = 'ntb'")
|
tdSql.query("select * from information_schema.ins_columns where table_name = 'ntb'")
|
||||||
tdSql.checkRows(14)
|
tdSql.checkRows(14)
|
||||||
|
|
|
@ -26,10 +26,6 @@ ELSE ()
|
||||||
SET(LINK_WEBSOCKET "")
|
SET(LINK_WEBSOCKET "")
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
IF (CUS_NAME OR CUS_PROMPT OR CUS_EMAIL)
|
|
||||||
ADD_DEFINITIONS(-I${CMAKE_CURRENT_SOURCE_DIR}/../../../enterprise/packaging)
|
|
||||||
ENDIF (CUS_NAME OR CUS_PROMPT OR CUS_EMAIL)
|
|
||||||
|
|
||||||
IF (TD_LINUX AND TD_ALPINE)
|
IF (TD_LINUX AND TD_ALPINE)
|
||||||
SET(LINK_ARGP "/usr/lib/libargp.a")
|
SET(LINK_ARGP "/usr/lib/libargp.a")
|
||||||
ELSE ()
|
ELSE ()
|
||||||
|
|
|
@ -20,18 +20,6 @@
|
||||||
#include "shellInt.h"
|
#include "shellInt.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
#ifndef CUS_NAME
|
|
||||||
char cusName[] = "TDengine";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CUS_PROMPT
|
|
||||||
char cusPrompt[] = "taos";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CUS_EMAIL
|
|
||||||
char cusEmail[] = "<support@taosdata.com>";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CUS_NAME) || defined(CUS_PROMPT) || defined(CUS_EMAIL)
|
#if defined(CUS_NAME) || defined(CUS_PROMPT) || defined(CUS_EMAIL)
|
||||||
#include "cus_name.h"
|
#include "cus_name.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -59,8 +47,8 @@ char cusEmail[] = "<support@taosdata.com>";
|
||||||
#define SHELL_VERSION "Print program version."
|
#define SHELL_VERSION "Print program version."
|
||||||
|
|
||||||
#ifdef WEBSOCKET
|
#ifdef WEBSOCKET
|
||||||
#define SHELL_DSN "The dsn to use when connecting to cloud server."
|
#define SHELL_DSN "Use dsn to connect to the cloud server or to a remote server which provides WebSocket connection."
|
||||||
#define SHELL_REST "Use restful mode when connecting."
|
#define SHELL_REST "Use RESTful mode when connecting."
|
||||||
#define SHELL_TIMEOUT "Set the timeout for websocket query in seconds, default is 30."
|
#define SHELL_TIMEOUT "Set the timeout for websocket query in seconds, default is 30."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -93,7 +81,11 @@ void shellPrintHelp() {
|
||||||
#endif
|
#endif
|
||||||
printf("%s%s%s%s\r\n", indent, "-w,", indent, SHELL_WIDTH);
|
printf("%s%s%s%s\r\n", indent, "-w,", indent, SHELL_WIDTH);
|
||||||
printf("%s%s%s%s\r\n", indent, "-V,", indent, SHELL_VERSION);
|
printf("%s%s%s%s\r\n", indent, "-V,", indent, SHELL_VERSION);
|
||||||
printf("\r\n\r\nReport bugs to %s.\r\n", cusEmail);
|
#ifdef CUS_EMAIL
|
||||||
|
printf("\r\n\r\nReport bugs to %s.\r\n", CUS_EMAIL);
|
||||||
|
#else
|
||||||
|
printf("\r\n\r\nReport bugs to %s.\r\n", "support@taosdata.com");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LINUX
|
#ifdef LINUX
|
||||||
|
@ -105,7 +97,11 @@ void shellPrintHelp() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *argp_program_version = version;
|
const char *argp_program_version = version;
|
||||||
const char *argp_program_bug_address = cusEmail;
|
#ifdef CUS_EMAIL
|
||||||
|
const char *argp_program_bug_address = CUS_EMAIL;
|
||||||
|
#else
|
||||||
|
const char *argp_program_bug_address = "support@taosdata.com";
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct argp_option shellOptions[] = {
|
static struct argp_option shellOptions[] = {
|
||||||
{"host", 'h', "HOST", 0, SHELL_HOST},
|
{"host", 'h', "HOST", 0, SHELL_HOST},
|
||||||
|
@ -411,10 +407,19 @@ int32_t shellParseArgs(int32_t argc, char *argv[]) {
|
||||||
shell.info.clientVersion =
|
shell.info.clientVersion =
|
||||||
"Welcome to the %s Command Line Interface, Client Version:%s\r\n"
|
"Welcome to the %s Command Line Interface, Client Version:%s\r\n"
|
||||||
"Copyright (c) 2022 by %s, all rights reserved.\r\n\r\n";
|
"Copyright (c) 2022 by %s, all rights reserved.\r\n\r\n";
|
||||||
strcpy(shell.info.cusName, cusName);
|
#ifdef CUS_NAME
|
||||||
sprintf(shell.info.promptHeader, "%s> ", cusPrompt);
|
strcpy(shell.info.cusName, CUS_NAME);
|
||||||
|
#else
|
||||||
|
strcpy(shell.info.cusName, "TDengine");
|
||||||
|
#endif
|
||||||
char promptContinueFormat[32] = {0};
|
char promptContinueFormat[32] = {0};
|
||||||
sprintf(promptContinueFormat, "%%%zus> ", strlen(cusPrompt));
|
#ifdef CUS_PROMPT
|
||||||
|
sprintf(shell.info.promptHeader, "%s> ", CUS_PROMPT);
|
||||||
|
sprintf(promptContinueFormat, "%%%zus> ", strlen(CUS_PROMPT));
|
||||||
|
#else
|
||||||
|
sprintf(shell.info.promptHeader, "taos> ");
|
||||||
|
sprintf(promptContinueFormat, "%%%zus> ", strlen("taos"));
|
||||||
|
#endif
|
||||||
sprintf(shell.info.promptContinue, promptContinueFormat, " ");
|
sprintf(shell.info.promptContinue, promptContinueFormat, " ");
|
||||||
shell.info.promptSize = strlen(shell.info.promptHeader);
|
shell.info.promptSize = strlen(shell.info.promptHeader);
|
||||||
#ifdef TD_ENTERPRISE
|
#ifdef TD_ENTERPRISE
|
||||||
|
|
|
@ -6,6 +6,14 @@ add_executable(tmq_taosx_ci tmq_taosx_ci.c)
|
||||||
add_executable(write_raw_block_test write_raw_block_test.c)
|
add_executable(write_raw_block_test write_raw_block_test.c)
|
||||||
add_executable(sml_test sml_test.c)
|
add_executable(sml_test sml_test.c)
|
||||||
add_executable(get_db_name_test get_db_name_test.c)
|
add_executable(get_db_name_test get_db_name_test.c)
|
||||||
|
add_executable(tmq_offset tmqOffset.c)
|
||||||
|
target_link_libraries(
|
||||||
|
tmq_offset
|
||||||
|
PUBLIC taos_static
|
||||||
|
PUBLIC util
|
||||||
|
PUBLIC common
|
||||||
|
PUBLIC os
|
||||||
|
)
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
create_table
|
create_table
|
||||||
PUBLIC taos_static
|
PUBLIC taos_static
|
||||||
|
|
|
@ -942,6 +942,8 @@ int sml_ts2164_Test() {
|
||||||
"ts3038,location=l2a,groupid=ca current=L\"11.8\"",
|
"ts3038,location=l2a,groupid=ca current=L\"11.8\"",
|
||||||
"ts3038,location=l2a,groupid=ca voltage=L\"221\"",
|
"ts3038,location=l2a,groupid=ca voltage=L\"221\"",
|
||||||
"ts3038,location=l2a,groupid=ca phase=L\"221\"",
|
"ts3038,location=l2a,groupid=ca phase=L\"221\"",
|
||||||
|
// "qgyltizmkq,id=sub_table_0123456,t0=f,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=f,c1=127i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"binaryColValue\",c8=L\"ncharColValue\",c9=7u64",
|
||||||
|
// "qgyltizmkq,id=sub_table_0123456,t=3,t0=f,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=f,c1=127i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"binaryColValue\",c8=L\"ncharColValue\",c9=7u64"
|
||||||
// "meters,location=la,groupid=cb current=11.8,voltage=221,phase=0.27",
|
// "meters,location=la,groupid=cb current=11.8,voltage=221,phase=0.27",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
//
|
||||||
|
// Created by mingming wanng on 2023/4/7.
|
||||||
|
//
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "taoserror.h"
|
||||||
|
#include "tlog.h"
|
||||||
|
#include "tmsg.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t size;
|
||||||
|
} STqOffsetHead;
|
||||||
|
|
||||||
|
int32_t tqOffsetRestoreFromFile(const char* fname) {
|
||||||
|
TdFilePtr pFile = taosOpenFile(fname, TD_FILE_READ);
|
||||||
|
if (pFile != NULL) {
|
||||||
|
STqOffsetHead head = {0};
|
||||||
|
int32_t code;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
if ((code = taosReadFile(pFile, &head, sizeof(STqOffsetHead))) != sizeof(STqOffsetHead)) {
|
||||||
|
if (code == 0) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
printf("code:%d != 0\n", code);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int32_t size = htonl(head.size);
|
||||||
|
void* memBuf = taosMemoryCalloc(1, size);
|
||||||
|
if (memBuf == NULL) {
|
||||||
|
printf("memBuf == NULL\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if ((code = taosReadFile(pFile, memBuf, size)) != size) {
|
||||||
|
taosMemoryFree(memBuf);
|
||||||
|
printf("code:%d != size:%d\n", code, size);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
STqOffset offset;
|
||||||
|
SDecoder decoder;
|
||||||
|
tDecoderInit(&decoder, memBuf, size);
|
||||||
|
if (tDecodeSTqOffset(&decoder, &offset) < 0) {
|
||||||
|
taosMemoryFree(memBuf);
|
||||||
|
tDecoderClear(&decoder);
|
||||||
|
printf("tDecodeSTqOffset error\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tDecoderClear(&decoder);
|
||||||
|
printf("subkey:%s, type:%d, uid/version:%"PRId64", ts:%"PRId64"\n",
|
||||||
|
offset.subKey, offset.val.type, offset.val.uid, offset.val.ts);
|
||||||
|
taosMemoryFree(memBuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosCloseFile(&pFile);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
tqOffsetRestoreFromFile("offset-ver0");
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue