other: merge 3.0
This commit is contained in:
commit
d238f387ce
|
@ -2,7 +2,7 @@
|
||||||
# taosadapter
|
# taosadapter
|
||||||
ExternalProject_Add(taosadapter
|
ExternalProject_Add(taosadapter
|
||||||
GIT_REPOSITORY https://github.com/taosdata/taosadapter.git
|
GIT_REPOSITORY https://github.com/taosdata/taosadapter.git
|
||||||
GIT_TAG 8c3d57d
|
GIT_TAG 0d5663d
|
||||||
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter"
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
|
|
@ -255,7 +255,7 @@ Note: If you include an ORDER BY clause, only one partition can be displayed.
|
||||||
|
|
||||||
Some special query functions can be invoked without `FROM` sub-clause.
|
Some special query functions can be invoked without `FROM` sub-clause.
|
||||||
|
|
||||||
## Obtain Current Database
|
### Obtain Current Database
|
||||||
|
|
||||||
The following SQL statement returns the current database. If a database has not been specified on login or with the `USE` command, a null value is returned.
|
The following SQL statement returns the current database. If a database has not been specified on login or with the `USE` command, a null value is returned.
|
||||||
|
|
||||||
|
@ -270,7 +270,7 @@ SELECT CLIENT_VERSION();
|
||||||
SELECT SERVER_VERSION();
|
SELECT SERVER_VERSION();
|
||||||
```
|
```
|
||||||
|
|
||||||
## Obtain Server Status
|
### Obtain Server Status
|
||||||
|
|
||||||
The following SQL statement returns the status of the TDengine server. An integer indicates that the server is running normally. An error code indicates that an error has occurred. This statement can also detect whether a connection pool or third-party tool is connected to TDengine properly. By using this statement, you can ensure that connections in a pool are not lost due to an incorrect heartbeat detection statement.
|
The following SQL statement returns the status of the TDengine server. An integer indicates that the server is running normally. An error code indicates that an error has occurred. This statement can also detect whether a connection pool or third-party tool is connected to TDengine properly. By using this statement, you can ensure that connections in a pool are not lost due to an incorrect heartbeat detection statement.
|
||||||
|
|
||||||
|
@ -314,6 +314,40 @@ Regular expression filtering is supported only on table names (TBNAME), BINARY t
|
||||||
|
|
||||||
A regular expression string cannot exceed 128 bytes. You can configure this value by modifying the maxRegexStringLen parameter on the TDengine Client. The modified value takes effect when the client is restarted.
|
A regular expression string cannot exceed 128 bytes. You can configure this value by modifying the maxRegexStringLen parameter on the TDengine Client. The modified value takes effect when the client is restarted.
|
||||||
|
|
||||||
|
## CASE Expressions
|
||||||
|
|
||||||
|
### Syntax
|
||||||
|
|
||||||
|
```txt
|
||||||
|
CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END
|
||||||
|
CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END
|
||||||
|
```
|
||||||
|
|
||||||
|
### Description
|
||||||
|
CASE expressions let you use IF ... THEN ... ELSE logic in SQL statements without having to invoke procedures.
|
||||||
|
|
||||||
|
The first CASE syntax returns the `result` for the first `value`=`compare_value` comparison that is true.
|
||||||
|
|
||||||
|
The second syntax returns the `result` for the first `condition` that is true.
|
||||||
|
|
||||||
|
If no comparison or condition is true, the result after ELSE is returned, or NULL if there is no ELSE part.
|
||||||
|
|
||||||
|
The return type of the CASE expression is the result type of the first WHEN WHEN part, and the result type of the other WHEN WHEN parts and ELSE parts can be converted to them, otherwise TDengine will report an error.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
A device has three status codes to display its status. The statements are as follows:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT CASE dev_status WHEN 1 THEN 'Running' WHEN 2 THEN 'Warning' WHEN 3 THEN 'Downtime' ELSE 'Unknown' END FROM dev_table;
|
||||||
|
```
|
||||||
|
|
||||||
|
The average voltage value of the smart meter is counted. When the voltage is less than 200 or more than 250, it is considered that the statistics is wrong, and the value is corrected to 220. The statement is as follows:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT AVG(CASE WHEN voltage < 200 or voltage > 250 THEN 220 ELSE voltage END) FROM meters;
|
||||||
|
```
|
||||||
|
|
||||||
## JOIN
|
## JOIN
|
||||||
|
|
||||||
TDengine supports natural joins between supertables, between standard tables, and between subqueries. The difference between natural joins and inner joins is that natural joins require that the fields being joined in the supertables or standard tables must have the same name. Data or tag columns must be joined with the equivalent column in another table.
|
TDengine supports natural joins between supertables, between standard tables, and between subqueries. The difference between natural joins and inner joins is that natural joins require that the fields being joined in the supertables or standard tables must have the same name. Data or tag columns must be joined with the equivalent column in another table.
|
||||||
|
|
|
@ -126,6 +126,12 @@ Only care about the information of the status window when the status is 2. For e
|
||||||
SELECT * FROM (SELECT COUNT(*) AS cnt, FIRST(ts) AS fst, status FROM temp_tb_1 STATE_WINDOW(status)) t WHERE status = 2;
|
SELECT * FROM (SELECT COUNT(*) AS cnt, FIRST(ts) AS fst, status FROM temp_tb_1 STATE_WINDOW(status)) t WHERE status = 2;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
TDengine also supports the use of CASE expressions in state quantities. It can express that the beginning of a state is triggered by meeting a certain condition, and the end of this state is triggered by meeting another condition. For example, if the normal voltage range of the smart meter is 205V to 235V, you can judge whether the circuit is normal by monitoring the voltage.
|
||||||
|
|
||||||
|
```
|
||||||
|
SELECT tbname, _wstart, CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END status FROM meters PARTITION BY tbname STATE_WINDOW(CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END);
|
||||||
|
```
|
||||||
|
|
||||||
### Session Window
|
### Session Window
|
||||||
|
|
||||||
The primary key, i.e. timestamp, is used to determine which session window a row belongs to. As shown in the figure below, if the limit of time interval for the session window is specified as 12 seconds, then the 6 rows in the figure constitutes 2 time windows, [2019-04-28 14:22:10,2019-04-28 14:22:30] and [2019-04-28 14:23:10,2019-04-28 14:23:30] because the time difference between 2019-04-28 14:22:30 and 2019-04-28 14:23:10 is 40 seconds, which exceeds the time interval limit of 12 seconds.
|
The primary key, i.e. timestamp, is used to determine which session window a row belongs to. As shown in the figure below, if the limit of time interval for the session window is specified as 12 seconds, then the 6 rows in the figure constitutes 2 time windows, [2019-04-28 14:22:10,2019-04-28 14:22:30] and [2019-04-28 14:23:10,2019-04-28 14:23:30] because the time difference between 2019-04-28 14:22:30 and 2019-04-28 14:23:10 is 40 seconds, which exceeds the time interval limit of 12 seconds.
|
||||||
|
|
|
@ -106,7 +106,7 @@ The parameters described in this document by the effect that they have on the sy
|
||||||
| Applicable | Server only |
|
| Applicable | Server only |
|
||||||
| Meaning | The switch for monitoring inside server. The main object of monitoring is to collect information about load on physical nodes, including CPU usage, memory usage, disk usage, and network bandwidth. Monitoring information is sent over HTTP to the taosKeeper service specified by `monitorFqdn` and `monitorProt`.
|
| Meaning | The switch for monitoring inside server. The main object of monitoring is to collect information about load on physical nodes, including CPU usage, memory usage, disk usage, and network bandwidth. Monitoring information is sent over HTTP to the taosKeeper service specified by `monitorFqdn` and `monitorProt`.
|
||||||
| Value Range | 0: monitoring disabled, 1: monitoring enabled |
|
| Value Range | 0: monitoring disabled, 1: monitoring enabled |
|
||||||
| Default | 0 |
|
| Default | 1 |
|
||||||
|
|
||||||
### monitorFqdn
|
### monitorFqdn
|
||||||
|
|
||||||
|
|
|
@ -315,6 +315,39 @@ WHERE (column|tbname) **match/MATCH/nmatch/NMATCH** _regex_
|
||||||
|
|
||||||
正则匹配字符串长度不能超过 128 字节。可以通过参数 _maxRegexStringLen_ 设置和调整最大允许的正则匹配字符串,该参数是客户端配置参数,需要重启才能生效。
|
正则匹配字符串长度不能超过 128 字节。可以通过参数 _maxRegexStringLen_ 设置和调整最大允许的正则匹配字符串,该参数是客户端配置参数,需要重启才能生效。
|
||||||
|
|
||||||
|
## CASE 表达式
|
||||||
|
|
||||||
|
### 语法
|
||||||
|
|
||||||
|
```txt
|
||||||
|
CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END
|
||||||
|
CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END
|
||||||
|
```
|
||||||
|
|
||||||
|
### 说明
|
||||||
|
|
||||||
|
TDengine 通过 CASE 表达式让用户可以在 SQL 语句中使用 IF ... THEN ... ELSE 逻辑。
|
||||||
|
|
||||||
|
第一种 CASE 语法返回第一个 value 等于 compare_value 的 result,如果没有 compare_value 符合,则返回 ELSE 之后的 result,如果没有 ELSE 部分,则返回 NULL。
|
||||||
|
|
||||||
|
第二种语法返回第一个 condition 为真的 result。 如果没有 condition 符合,则返回 ELSE 之后的 result,如果没有 ELSE 部分,则返回 NULL。
|
||||||
|
|
||||||
|
CASE 表达式的返回类型为第一个 WHEN THEN 部分的 result 类型,其余 WHEN THEN 部分和 ELSE 部分,result 类型都需要可以向其转换,否则 TDengine 会报错。
|
||||||
|
|
||||||
|
### 示例
|
||||||
|
|
||||||
|
某设备有三个状态码,显示其状态,语句如下:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT CASE dev_status WHEN 1 THEN 'Running' WHEN 2 THEN 'Warning' WHEN 3 THEN 'Downtime' ELSE 'Unknown' END FROM dev_table;
|
||||||
|
```
|
||||||
|
|
||||||
|
统计智能电表的电压平均值,当电压小于 200 或大于 250 时认为是统计有误,修正其值为 220,语句如下:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT AVG(CASE WHEN voltage < 200 or voltage > 250 THEN 220 ELSE voltage END) FROM meters;
|
||||||
|
```
|
||||||
|
|
||||||
## JOIN 子句
|
## JOIN 子句
|
||||||
|
|
||||||
TDengine 支持“普通表与普通表之间”、“超级表与超级表之间”、“子查询与子查询之间” 进行自然连接。自然连接与内连接的主要区别是,自然连接要求参与连接的字段在不同的表/超级表中必须是同名字段。也即,TDengine 在连接关系的表达中,要求必须使用同名数据列/标签列的相等关系。
|
TDengine 支持“普通表与普通表之间”、“超级表与超级表之间”、“子查询与子查询之间” 进行自然连接。自然连接与内连接的主要区别是,自然连接要求参与连接的字段在不同的表/超级表中必须是同名字段。也即,TDengine 在连接关系的表达中,要求必须使用同名数据列/标签列的相等关系。
|
||||||
|
|
|
@ -119,6 +119,12 @@ SELECT COUNT(*), FIRST(ts), status FROM temp_tb_1 STATE_WINDOW(status);
|
||||||
SELECT * FROM (SELECT COUNT(*) AS cnt, FIRST(ts) AS fst, status FROM temp_tb_1 STATE_WINDOW(status)) t WHERE status = 2;
|
SELECT * FROM (SELECT COUNT(*) AS cnt, FIRST(ts) AS fst, status FROM temp_tb_1 STATE_WINDOW(status)) t WHERE status = 2;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
TDengine 还支持将 CASE 表达式用在状态量,可以表达某个状态的开始是由满足某个条件而触发,这个状态的结束是由另外一个条件满足而触发的语义。例如,智能电表的电压正常范围是 205V 到 235V,那么可以通过监控电压来判断电路是否正常。
|
||||||
|
|
||||||
|
```
|
||||||
|
SELECT tbname, _wstart, CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END status FROM meters PARTITION BY tbname STATE_WINDOW(CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END);
|
||||||
|
```
|
||||||
|
|
||||||
### 会话窗口
|
### 会话窗口
|
||||||
|
|
||||||
会话窗口根据记录的时间戳主键的值来确定是否属于同一个会话。如下图所示,如果设置时间戳的连续的间隔小于等于 12 秒,则以下 6 条记录构成 2 个会话窗口,分别是:[2019-04-28 14:22:10,2019-04-28 14:22:30]和[2019-04-28 14:23:10,2019-04-28 14:23:30]。因为 2019-04-28 14:22:30 与 2019-04-28 14:23:10 之间的时间间隔是 40 秒,超过了连续时间间隔(12 秒)。
|
会话窗口根据记录的时间戳主键的值来确定是否属于同一个会话。如下图所示,如果设置时间戳的连续的间隔小于等于 12 秒,则以下 6 条记录构成 2 个会话窗口,分别是:[2019-04-28 14:22:10,2019-04-28 14:22:30]和[2019-04-28 14:23:10,2019-04-28 14:23:30]。因为 2019-04-28 14:22:30 与 2019-04-28 14:23:10 之间的时间间隔是 40 秒,超过了连续时间间隔(12 秒)。
|
||||||
|
|
|
@ -106,7 +106,7 @@ taos --dump-config
|
||||||
| 适用范围 | 仅服务端适用 |
|
| 适用范围 | 仅服务端适用 |
|
||||||
| 含义 | 服务器内部的系统监控开关。监控主要负责收集物理节点的负载状况,包括 CPU、内存、硬盘、网络带宽的监控记录,监控信息将通过 HTTP 协议发送给由 `monitorFqdn` 和 `monitorProt` 指定的 TaosKeeper 监控服务 |
|
| 含义 | 服务器内部的系统监控开关。监控主要负责收集物理节点的负载状况,包括 CPU、内存、硬盘、网络带宽的监控记录,监控信息将通过 HTTP 协议发送给由 `monitorFqdn` 和 `monitorProt` 指定的 TaosKeeper 监控服务 |
|
||||||
| 取值范围 | 0:关闭监控服务, 1:激活监控服务。 |
|
| 取值范围 | 0:关闭监控服务, 1:激活监控服务。 |
|
||||||
| 缺省值 | 0 |
|
| 缺省值 | 1 |
|
||||||
|
|
||||||
### monitorFqdn
|
### monitorFqdn
|
||||||
|
|
||||||
|
|
|
@ -74,9 +74,7 @@ int32_t tTSchemaCreate(int32_t sver, SSchema *pSchema, int32_t nCols, STSchema *
|
||||||
void tTSchemaDestroy(STSchema *pTSchema);
|
void tTSchemaDestroy(STSchema *pTSchema);
|
||||||
|
|
||||||
// SValue ================================
|
// SValue ================================
|
||||||
int32_t tPutValue(uint8_t *p, SValue *pValue, int8_t type);
|
static FORCE_INLINE int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type);
|
||||||
int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type);
|
|
||||||
int tValueCmprFn(const SValue *pValue1, const SValue *pValue2, int8_t type);
|
|
||||||
|
|
||||||
// SColVal ================================
|
// SColVal ================================
|
||||||
#define CV_FLAG_VALUE ((int8_t)0x0)
|
#define CV_FLAG_VALUE ((int8_t)0x0)
|
||||||
|
@ -134,6 +132,7 @@ int32_t tColDataAppendValue(SColData *pColData, SColVal *pColVal);
|
||||||
void tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal);
|
void tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal);
|
||||||
uint8_t tColDataGetBitValue(SColData *pColData, int32_t iVal);
|
uint8_t tColDataGetBitValue(SColData *pColData, int32_t iVal);
|
||||||
int32_t tColDataCopy(SColData *pColDataSrc, SColData *pColDataDest);
|
int32_t tColDataCopy(SColData *pColDataSrc, SColData *pColDataDest);
|
||||||
|
extern void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min, int16_t *numOfNull);
|
||||||
|
|
||||||
// STRUCT ================================
|
// STRUCT ================================
|
||||||
struct STColumn {
|
struct STColumn {
|
||||||
|
@ -282,6 +281,15 @@ void tdResetTSchemaBuilder(STSchemaBuilder *pBuilder, schema_ver_t version)
|
||||||
int32_t tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, int8_t flags, col_id_t colId, col_bytes_t bytes);
|
int32_t tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, int8_t flags, col_id_t colId, col_bytes_t bytes);
|
||||||
STSchema *tdGetSchemaFromBuilder(STSchemaBuilder *pBuilder);
|
STSchema *tdGetSchemaFromBuilder(STSchemaBuilder *pBuilder);
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type) {
|
||||||
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
|
return tGetBinary(p, &pValue->pData, pValue ? &pValue->nData : NULL);
|
||||||
|
} else {
|
||||||
|
memcpy(&pValue->val, p, tDataTypes[type].bytes);
|
||||||
|
return tDataTypes[type].bytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -216,14 +216,9 @@ typedef struct SEp {
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
} SEp;
|
} SEp;
|
||||||
|
|
||||||
#define SHOW_REWRITE_MASK() (1 << 0)
|
|
||||||
|
|
||||||
#define TEST_SHOW_REWRITE_MASK(m) (((m) & SHOW_REWRITE_MASK()) != 0)
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t contLen;
|
int32_t contLen;
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
int32_t msgMask;
|
|
||||||
} SMsgHead;
|
} SMsgHead;
|
||||||
|
|
||||||
// Submit message for one table
|
// Submit message for one table
|
||||||
|
@ -843,6 +838,7 @@ typedef struct {
|
||||||
int64_t dbId;
|
int64_t dbId;
|
||||||
int32_t vgVersion;
|
int32_t vgVersion;
|
||||||
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
|
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
|
||||||
|
int64_t stateTs; // ms
|
||||||
} SUseDbReq;
|
} SUseDbReq;
|
||||||
|
|
||||||
int32_t tSerializeSUseDbReq(void* buf, int32_t bufLen, SUseDbReq* pReq);
|
int32_t tSerializeSUseDbReq(void* buf, int32_t bufLen, SUseDbReq* pReq);
|
||||||
|
@ -857,6 +853,8 @@ typedef struct {
|
||||||
int16_t hashSuffix;
|
int16_t hashSuffix;
|
||||||
int8_t hashMethod;
|
int8_t hashMethod;
|
||||||
SArray* pVgroupInfos; // Array of SVgroupInfo
|
SArray* pVgroupInfos; // Array of SVgroupInfo
|
||||||
|
int32_t errCode;
|
||||||
|
int64_t stateTs; // ms
|
||||||
} SUseDbRsp;
|
} SUseDbRsp;
|
||||||
|
|
||||||
int32_t tSerializeSUseDbRsp(void* buf, int32_t bufLen, const SUseDbRsp* pRsp);
|
int32_t tSerializeSUseDbRsp(void* buf, int32_t bufLen, const SUseDbRsp* pRsp);
|
||||||
|
@ -1616,6 +1614,7 @@ typedef struct SSubQueryMsg {
|
||||||
int8_t needFetch;
|
int8_t needFetch;
|
||||||
uint32_t sqlLen; // the query sql,
|
uint32_t sqlLen; // the query sql,
|
||||||
uint32_t phyLen;
|
uint32_t phyLen;
|
||||||
|
int32_t msgMask;
|
||||||
char msg[];
|
char msg[];
|
||||||
} SSubQueryMsg;
|
} SSubQueryMsg;
|
||||||
|
|
||||||
|
@ -3137,7 +3136,8 @@ int32_t tEncodeDeleteRes(SEncoder* pCoder, const SDeleteRes* pRes);
|
||||||
int32_t tDecodeDeleteRes(SDecoder* pCoder, SDeleteRes* pRes);
|
int32_t tDecodeDeleteRes(SDecoder* pCoder, SDeleteRes* pRes);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t uid;
|
// int64_t uid;
|
||||||
|
char tbname[TSDB_TABLE_NAME_LEN];
|
||||||
int64_t ts;
|
int64_t ts;
|
||||||
} SSingleDeleteReq;
|
} SSingleDeleteReq;
|
||||||
|
|
||||||
|
|
|
@ -263,8 +263,8 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_SYNC_UNKNOWN, "sync-unknown", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_SYNC_UNKNOWN, "sync-unknown", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_SYNC_COMMON_RESPONSE, "sync-common-response", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_SYNC_COMMON_RESPONSE, "sync-common-response", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_SYNC_APPLY_MSG, "sync-apply-msg", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_SYNC_APPLY_MSG, "sync-apply-msg", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_SYNC_CONFIG_CHANGE, "sync-config-change", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_SYNC_CONFIG_CHANGE, "sync-config-change", NULL, NULL) // no longer used
|
||||||
TD_DEF_MSG_TYPE(TDMT_SYNC_CONFIG_CHANGE_FINISH, "sync-config-change-finish", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_SYNC_CONFIG_CHANGE_FINISH, "sync-config-change-finish", NULL, NULL) // no longer used
|
||||||
TD_DEF_MSG_TYPE(TDMT_SYNC_SNAPSHOT_SEND, "sync-snapshot-send", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_SYNC_SNAPSHOT_SEND, "sync-snapshot-send", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_SYNC_SNAPSHOT_RSP, "sync-snapshot-rsp", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_SYNC_SNAPSHOT_RSP, "sync-snapshot-rsp", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_SYNC_LEADER_TRANSFER, "sync-leader-transfer", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_SYNC_LEADER_TRANSFER, "sync-leader-transfer", NULL, NULL)
|
||||||
|
|
|
@ -124,6 +124,7 @@ typedef struct SDbVgVersion {
|
||||||
int64_t dbId;
|
int64_t dbId;
|
||||||
int32_t vgVersion;
|
int32_t vgVersion;
|
||||||
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
|
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
|
||||||
|
int64_t stateTs;
|
||||||
} SDbVgVersion;
|
} SDbVgVersion;
|
||||||
|
|
||||||
typedef struct STbSVersion {
|
typedef struct STbSVersion {
|
||||||
|
@ -307,8 +308,8 @@ int32_t catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* f
|
||||||
int32_t catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, const char* dbFName, AUTH_TYPE type,
|
int32_t catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, const char* dbFName, AUTH_TYPE type,
|
||||||
bool* pass);
|
bool* pass);
|
||||||
|
|
||||||
int32_t catalogChkAuthFromCache(SCatalog* pCtg, const char* user, const char* dbFName, AUTH_TYPE type,
|
int32_t catalogChkAuthFromCache(SCatalog* pCtg, const char* user, const char* dbFName, AUTH_TYPE type, bool* pass,
|
||||||
bool* pass, bool* exists);
|
bool* exists);
|
||||||
|
|
||||||
int32_t catalogUpdateUserAuthInfo(SCatalog* pCtg, SGetUserAuthRsp* pAuth);
|
int32_t catalogUpdateUserAuthInfo(SCatalog* pCtg, SGetUserAuthRsp* pAuth);
|
||||||
|
|
||||||
|
|
|
@ -354,12 +354,33 @@ typedef struct SVgDataBlocks {
|
||||||
void* pData; // SMsgDesc + SSubmitReq + SSubmitBlk + ...
|
void* pData; // SMsgDesc + SSubmitReq + SSubmitBlk + ...
|
||||||
} SVgDataBlocks;
|
} SVgDataBlocks;
|
||||||
|
|
||||||
|
typedef void (*FFreeDataBlockHash)(SHashObj*);
|
||||||
|
typedef void (*FFreeDataBlockArray)(SArray*);
|
||||||
|
|
||||||
typedef struct SVnodeModifOpStmt {
|
typedef struct SVnodeModifOpStmt {
|
||||||
ENodeType nodeType;
|
ENodeType nodeType;
|
||||||
ENodeType sqlNodeType;
|
ENodeType sqlNodeType;
|
||||||
SArray* pDataBlocks; // data block for each vgroup, SArray<SVgDataBlocks*>.
|
SArray* pDataBlocks; // data block for each vgroup, SArray<SVgDataBlocks*>.
|
||||||
uint32_t insertType; // insert data from [file|sql statement| bound statement]
|
uint32_t insertType; // insert data from [file|sql statement| bound statement]
|
||||||
const char* sql; // current sql statement position
|
const char* pSql; // current sql statement position
|
||||||
|
int32_t totalRowsNum;
|
||||||
|
int32_t totalTbNum;
|
||||||
|
SName targetTableName;
|
||||||
|
SName usingTableName;
|
||||||
|
const char* pBoundCols;
|
||||||
|
struct STableMeta* pTableMeta;
|
||||||
|
SHashObj* pVgroupsHashObj;
|
||||||
|
SHashObj* pTableBlockHashObj;
|
||||||
|
SHashObj* pSubTableHashObj;
|
||||||
|
SHashObj* pTableNameHashObj;
|
||||||
|
SHashObj* pDbFNameHashObj;
|
||||||
|
SArray* pVgDataBlocks;
|
||||||
|
SVCreateTbReq createTblReq;
|
||||||
|
TdFilePtr fp;
|
||||||
|
FFreeDataBlockHash freeHashFunc;
|
||||||
|
FFreeDataBlockArray freeArrayFunc;
|
||||||
|
bool usingTableProcessing;
|
||||||
|
bool fileProcessing;
|
||||||
} SVnodeModifOpStmt;
|
} SVnodeModifOpStmt;
|
||||||
|
|
||||||
typedef struct SExplainOptions {
|
typedef struct SExplainOptions {
|
||||||
|
@ -389,8 +410,16 @@ typedef enum EQueryExecMode {
|
||||||
QUERY_EXEC_MODE_EMPTY_RESULT
|
QUERY_EXEC_MODE_EMPTY_RESULT
|
||||||
} EQueryExecMode;
|
} EQueryExecMode;
|
||||||
|
|
||||||
|
typedef enum EQueryExecStage {
|
||||||
|
QUERY_EXEC_STAGE_PARSE = 1,
|
||||||
|
QUERY_EXEC_STAGE_ANALYSE,
|
||||||
|
QUERY_EXEC_STAGE_SCHEDULE,
|
||||||
|
QUERY_EXEC_STAGE_END
|
||||||
|
} EQueryExecStage;
|
||||||
|
|
||||||
typedef struct SQuery {
|
typedef struct SQuery {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
|
EQueryExecStage execStage;
|
||||||
EQueryExecMode execMode;
|
EQueryExecMode execMode;
|
||||||
bool haveResultSet;
|
bool haveResultSet;
|
||||||
SNode* pRoot;
|
SNode* pRoot;
|
||||||
|
|
|
@ -64,8 +64,6 @@ typedef struct SParseContext {
|
||||||
SArray* pTableMetaPos; // sql table pos => catalog data pos
|
SArray* pTableMetaPos; // sql table pos => catalog data pos
|
||||||
SArray* pTableVgroupPos; // sql table pos => catalog data pos
|
SArray* pTableVgroupPos; // sql table pos => catalog data pos
|
||||||
int64_t allocatorId;
|
int64_t allocatorId;
|
||||||
bool needMultiParse;
|
|
||||||
SParseCsvCxt csvCxt;
|
|
||||||
} SParseContext;
|
} SParseContext;
|
||||||
|
|
||||||
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery);
|
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery);
|
||||||
|
@ -75,6 +73,8 @@ bool qIsInsertValuesSql(const char* pStr, size_t length);
|
||||||
int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq);
|
int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq);
|
||||||
int32_t qAnalyseSqlSemantic(SParseContext* pCxt, const struct SCatalogReq* pCatalogReq,
|
int32_t qAnalyseSqlSemantic(SParseContext* pCxt, const struct SCatalogReq* pCatalogReq,
|
||||||
const struct SMetaData* pMetaData, SQuery* pQuery);
|
const struct SMetaData* pMetaData, SQuery* pQuery);
|
||||||
|
int32_t qContinueParseSql(SParseContext* pCxt, struct SCatalogReq* pCatalogReq, const struct SMetaData* pMetaData,
|
||||||
|
SQuery* pQuery);
|
||||||
|
|
||||||
void qDestroyParseContext(SParseContext* pCxt);
|
void qDestroyParseContext(SParseContext* pCxt);
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,10 @@ typedef enum {
|
||||||
#define QUERY_RSP_POLICY_DELAY 0
|
#define QUERY_RSP_POLICY_DELAY 0
|
||||||
#define QUERY_RSP_POLICY_QUICK 1
|
#define QUERY_RSP_POLICY_QUICK 1
|
||||||
|
|
||||||
|
#define QUERY_MSG_MASK_SHOW_REWRITE() (1 << 0)
|
||||||
|
#define TEST_SHOW_REWRITE_MASK(m) (((m) & QUERY_MSG_MASK_SHOW_REWRITE()) != 0)
|
||||||
|
|
||||||
|
|
||||||
typedef struct STableComInfo {
|
typedef struct STableComInfo {
|
||||||
uint8_t numOfTags; // the number of tags in schema
|
uint8_t numOfTags; // the number of tags in schema
|
||||||
uint8_t precision; // the number of precision
|
uint8_t precision; // the number of precision
|
||||||
|
|
|
@ -76,7 +76,7 @@ int32_t qWorkerInit(int8_t nodeType, int32_t nodeId, void **qWorkerMgmt, const S
|
||||||
|
|
||||||
int32_t qWorkerAbortPreprocessQueryMsg(void *qWorkerMgmt, SRpcMsg *pMsg);
|
int32_t qWorkerAbortPreprocessQueryMsg(void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
int32_t qWorkerPreprocessQueryMsg(void *qWorkerMgmt, SRpcMsg *pMsg);
|
int32_t qWorkerPreprocessQueryMsg(void *qWorkerMgmt, SRpcMsg *pMsg, bool chkGrant);
|
||||||
|
|
||||||
int32_t qWorkerProcessQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int64_t ts);
|
int32_t qWorkerProcessQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int64_t ts);
|
||||||
|
|
||||||
|
|
|
@ -317,6 +317,8 @@ typedef struct SStreamTask {
|
||||||
int8_t inputStatus;
|
int8_t inputStatus;
|
||||||
int8_t outputStatus;
|
int8_t outputStatus;
|
||||||
|
|
||||||
|
// STaosQueue* inputQueue1;
|
||||||
|
// STaosQall* inputQall;
|
||||||
SStreamQueue* inputQueue;
|
SStreamQueue* inputQueue;
|
||||||
SStreamQueue* outputQueue;
|
SStreamQueue* outputQueue;
|
||||||
|
|
||||||
|
|
|
@ -138,6 +138,7 @@ typedef struct SSyncFSM {
|
||||||
void (*FpRestoreFinishCb)(const struct SSyncFSM* pFsm);
|
void (*FpRestoreFinishCb)(const struct SSyncFSM* pFsm);
|
||||||
void (*FpReConfigCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SReConfigCbMeta* pMeta);
|
void (*FpReConfigCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SReConfigCbMeta* pMeta);
|
||||||
void (*FpLeaderTransferCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SFsmCbMeta* pMeta);
|
void (*FpLeaderTransferCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SFsmCbMeta* pMeta);
|
||||||
|
bool (*FpApplyQueueEmptyCb)(const struct SSyncFSM* pFsm);
|
||||||
|
|
||||||
void (*FpBecomeLeaderCb)(const struct SSyncFSM* pFsm);
|
void (*FpBecomeLeaderCb)(const struct SSyncFSM* pFsm);
|
||||||
void (*FpBecomeFollowerCb)(const struct SSyncFSM* pFsm);
|
void (*FpBecomeFollowerCb)(const struct SSyncFSM* pFsm);
|
||||||
|
|
|
@ -154,7 +154,7 @@ int32_t* taosGetErrno();
|
||||||
|
|
||||||
// mnode-sdb
|
// mnode-sdb
|
||||||
#define TSDB_CODE_SDB_OBJ_ALREADY_THERE TAOS_DEF_ERROR_CODE(0, 0x0320)
|
#define TSDB_CODE_SDB_OBJ_ALREADY_THERE TAOS_DEF_ERROR_CODE(0, 0x0320)
|
||||||
#define TSDB_CODE_SDB_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0321)
|
#define TSDB_CODE_SDB_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0321) // internal
|
||||||
#define TSDB_CODE_SDB_INVALID_TABLE_TYPE TAOS_DEF_ERROR_CODE(0, 0x0322)
|
#define TSDB_CODE_SDB_INVALID_TABLE_TYPE TAOS_DEF_ERROR_CODE(0, 0x0322)
|
||||||
#define TSDB_CODE_SDB_OBJ_NOT_THERE TAOS_DEF_ERROR_CODE(0, 0x0323)
|
#define TSDB_CODE_SDB_OBJ_NOT_THERE TAOS_DEF_ERROR_CODE(0, 0x0323)
|
||||||
#define TSDB_CODE_SDB_INVALID_KEY_TYPE TAOS_DEF_ERROR_CODE(0, 0x0325)
|
#define TSDB_CODE_SDB_INVALID_KEY_TYPE TAOS_DEF_ERROR_CODE(0, 0x0325)
|
||||||
|
@ -218,14 +218,24 @@ int32_t* taosGetErrno();
|
||||||
|
|
||||||
// mnode-db
|
// mnode-db
|
||||||
#define TSDB_CODE_MND_DB_NOT_SELECTED TAOS_DEF_ERROR_CODE(0, 0x0380)
|
#define TSDB_CODE_MND_DB_NOT_SELECTED TAOS_DEF_ERROR_CODE(0, 0x0380)
|
||||||
#define TSDB_CODE_MND_DB_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0381)
|
#define TSDB_CODE_MND_DB_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0381) //
|
||||||
#define TSDB_CODE_MND_INVALID_DB_OPTION TAOS_DEF_ERROR_CODE(0, 0x0382)
|
#define TSDB_CODE_MND_INVALID_DB_OPTION TAOS_DEF_ERROR_CODE(0, 0x0382) //
|
||||||
#define TSDB_CODE_MND_INVALID_DB TAOS_DEF_ERROR_CODE(0, 0x0383)
|
#define TSDB_CODE_MND_INVALID_DB TAOS_DEF_ERROR_CODE(0, 0x0383)
|
||||||
|
// #define TSDB_CODE_MND_MONITOR_DB_FORBIDDEN TAOS_DEF_ERROR_CODE(0, 0x0384) // 2.x
|
||||||
#define TSDB_CODE_MND_TOO_MANY_DATABASES TAOS_DEF_ERROR_CODE(0, 0x0385)
|
#define TSDB_CODE_MND_TOO_MANY_DATABASES TAOS_DEF_ERROR_CODE(0, 0x0385)
|
||||||
#define TSDB_CODE_MND_DB_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0388)
|
#define TSDB_CODE_MND_DB_IN_DROPPING TAOS_DEF_ERROR_CODE(0, 0x0386) //
|
||||||
#define TSDB_CODE_MND_INVALID_DB_ACCT TAOS_DEF_ERROR_CODE(0, 0x0389)
|
// #define TSDB_CODE_MND_VGROUP_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0387) // 2.x
|
||||||
#define TSDB_CODE_MND_DB_OPTION_UNCHANGED TAOS_DEF_ERROR_CODE(0, 0x038A)
|
#define TSDB_CODE_MND_DB_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0388) //
|
||||||
|
#define TSDB_CODE_MND_INVALID_DB_ACCT TAOS_DEF_ERROR_CODE(0, 0x0389) // internal
|
||||||
|
#define TSDB_CODE_MND_DB_OPTION_UNCHANGED TAOS_DEF_ERROR_CODE(0, 0x038A) //
|
||||||
#define TSDB_CODE_MND_DB_INDEX_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x038B)
|
#define TSDB_CODE_MND_DB_INDEX_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x038B)
|
||||||
|
// #define TSDB_CODE_MND_INVALID_DB_OPTION_DAYS TAOS_DEF_ERROR_CODE(0, 0x0390) // 2.x
|
||||||
|
// #define TSDB_CODE_MND_INVALID_DB_OPTION_KEEP TAOS_DEF_ERROR_CODE(0, 0x0391) // 2.x
|
||||||
|
// #define TSDB_CODE_MND_INVALID_TOPIC TAOS_DEF_ERROR_CODE(0, 0x0392) // 2.x
|
||||||
|
// #define TSDB_CODE_MND_INVALID_TOPIC_OPTION TAOS_DEF_ERROR_CODE(0, 0x0393) // 2.x
|
||||||
|
// #define TSDB_CODE_MND_INVALID_TOPIC_PARTITONSTAOS_DEF_ERROR_CODE(0, 0x0394) // 2.x
|
||||||
|
// #define TSDB_CODE_MND_TOPIC_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0395) // 2.x
|
||||||
|
#define TSDB_CODE_MND_DB_IN_CREATING TAOS_DEF_ERROR_CODE(0, 0x0396) //
|
||||||
#define TSDB_CODE_MND_INVALID_SYS_TABLENAME TAOS_DEF_ERROR_CODE(0, 0x039A)
|
#define TSDB_CODE_MND_INVALID_SYS_TABLENAME TAOS_DEF_ERROR_CODE(0, 0x039A)
|
||||||
|
|
||||||
// mnode-node
|
// mnode-node
|
||||||
|
@ -398,7 +408,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_SYN_NOT_LEADER TAOS_DEF_ERROR_CODE(0, 0x090C)
|
#define TSDB_CODE_SYN_NOT_LEADER TAOS_DEF_ERROR_CODE(0, 0x090C)
|
||||||
#define TSDB_CODE_SYN_ONE_REPLICA TAOS_DEF_ERROR_CODE(0, 0x090D)
|
#define TSDB_CODE_SYN_ONE_REPLICA TAOS_DEF_ERROR_CODE(0, 0x090D)
|
||||||
#define TSDB_CODE_SYN_NOT_IN_NEW_CONFIG TAOS_DEF_ERROR_CODE(0, 0x090E)
|
#define TSDB_CODE_SYN_NOT_IN_NEW_CONFIG TAOS_DEF_ERROR_CODE(0, 0x090E)
|
||||||
#define TSDB_CODE_SYN_NEW_CONFIG_ERROR TAOS_DEF_ERROR_CODE(0, 0x090F)
|
#define TSDB_CODE_SYN_NEW_CONFIG_ERROR TAOS_DEF_ERROR_CODE(0, 0x090F) // internal
|
||||||
#define TSDB_CODE_SYN_RECONFIG_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0910)
|
#define TSDB_CODE_SYN_RECONFIG_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0910)
|
||||||
#define TSDB_CODE_SYN_PROPOSE_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0911)
|
#define TSDB_CODE_SYN_PROPOSE_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0911)
|
||||||
#define TSDB_CODE_SYN_STANDBY_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0912)
|
#define TSDB_CODE_SYN_STANDBY_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0912)
|
||||||
|
|
|
@ -13,7 +13,7 @@ def sync_source(branch_name) {
|
||||||
git branch
|
git branch
|
||||||
git pull || git pull
|
git pull || git pull
|
||||||
git log | head -n 20
|
git log | head -n 20
|
||||||
git submodule update --init --recursive
|
git clean -fxd
|
||||||
'''
|
'''
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
@ -37,19 +37,24 @@ def build_run() {
|
||||||
pipeline {
|
pipeline {
|
||||||
agent none
|
agent none
|
||||||
parameters {
|
parameters {
|
||||||
|
choice(
|
||||||
|
name: 'sourcePath',
|
||||||
|
choices: ['nas','web'],
|
||||||
|
description: 'choice which way to download the installation pacakge;web is Office Web and nas means taos nas server '
|
||||||
|
)
|
||||||
string (
|
string (
|
||||||
name:'version',
|
name:'version',
|
||||||
defaultValue:'3.0.0.1',
|
defaultValue:'3.0.1.6',
|
||||||
description: 'release version number,eg: 3.0.0.1 or 3.0.0.'
|
description: 'release version number,eg: 3.0.0.1 or 3.0.0.'
|
||||||
)
|
)
|
||||||
string (
|
string (
|
||||||
name:'baseVersion',
|
name:'baseVersion',
|
||||||
defaultValue:'3.0.0.1',
|
defaultValue:'3.0.1.6',
|
||||||
description: 'This number of baseVerison is generally not modified.Now it is 3.0.0.1'
|
description: 'This number of baseVerison is generally not modified.Now it is 3.0.0.1'
|
||||||
)
|
)
|
||||||
string (
|
string (
|
||||||
name:'toolsVersion',
|
name:'toolsVersion',
|
||||||
defaultValue:'2.1.2',
|
defaultValue:'2.2.7',
|
||||||
description: 'This number of baseVerison is generally not modified.Now it is 3.0.0.1'
|
description: 'This number of baseVerison is generally not modified.Now it is 3.0.0.1'
|
||||||
)
|
)
|
||||||
string (
|
string (
|
||||||
|
@ -62,7 +67,7 @@ pipeline {
|
||||||
WORK_DIR = '/var/lib/jenkins/workspace'
|
WORK_DIR = '/var/lib/jenkins/workspace'
|
||||||
TDINTERNAL_ROOT_DIR = '/var/lib/jenkins/workspace/TDinternal'
|
TDINTERNAL_ROOT_DIR = '/var/lib/jenkins/workspace/TDinternal'
|
||||||
TDENGINE_ROOT_DIR = '/var/lib/jenkins/workspace/TDinternal/community'
|
TDENGINE_ROOT_DIR = '/var/lib/jenkins/workspace/TDinternal/community'
|
||||||
BRANCH_NAME = 'test/chr/TD-14699'
|
BRANCH_NAME = '3.0'
|
||||||
|
|
||||||
TD_SERVER_TAR = "TDengine-server-${version}-Linux-x64.tar.gz"
|
TD_SERVER_TAR = "TDengine-server-${version}-Linux-x64.tar.gz"
|
||||||
BASE_TD_SERVER_TAR = "TDengine-server-${baseVersion}-Linux-x64.tar.gz"
|
BASE_TD_SERVER_TAR = "TDengine-server-${baseVersion}-Linux-x64.tar.gz"
|
||||||
|
@ -104,17 +109,17 @@ pipeline {
|
||||||
sync_source("${BRANCH_NAME}")
|
sync_source("${BRANCH_NAME}")
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_SERVER_TAR} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
|
bash testpackage.sh ${TD_SERVER_TAR} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server ${sourcePath}
|
||||||
python3 checkPackageRuning.py
|
python3 checkPackageRuning.py
|
||||||
'''
|
'''
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_SERVER_LITE_TAR} ${version} ${BASE_TD_SERVER_LITE_TAR} ${baseVersion} server
|
bash testpackage.sh ${TD_SERVER_LITE_TAR} ${version} ${BASE_TD_SERVER_LITE_TAR} ${baseVersion} server ${sourcePath}
|
||||||
python3 checkPackageRuning.py
|
python3 checkPackageRuning.py
|
||||||
'''
|
'''
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_SERVER_DEB} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
|
bash testpackage.sh ${TD_SERVER_DEB} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server ${sourcePath}
|
||||||
python3 checkPackageRuning.py
|
python3 checkPackageRuning.py
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
|
@ -127,17 +132,17 @@ pipeline {
|
||||||
sync_source("${BRANCH_NAME}")
|
sync_source("${BRANCH_NAME}")
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_SERVER_TAR} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
|
bash testpackage.sh ${TD_SERVER_TAR} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server ${sourcePath}
|
||||||
python3 checkPackageRuning.py
|
python3 checkPackageRuning.py
|
||||||
'''
|
'''
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_SERVER_LITE_TAR} ${version} ${BASE_TD_SERVER_LITE_TAR} ${baseVersion} server
|
bash testpackage.sh ${TD_SERVER_LITE_TAR} ${version} ${BASE_TD_SERVER_LITE_TAR} ${baseVersion} server ${sourcePath}
|
||||||
python3 checkPackageRuning.py
|
python3 checkPackageRuning.py
|
||||||
'''
|
'''
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_SERVER_DEB} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
|
bash testpackage.sh ${TD_SERVER_DEB} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server ${sourcePath}
|
||||||
python3 checkPackageRuning.py
|
python3 checkPackageRuning.py
|
||||||
dpkg -r tdengine
|
dpkg -r tdengine
|
||||||
'''
|
'''
|
||||||
|
@ -152,17 +157,17 @@ pipeline {
|
||||||
sync_source("${BRANCH_NAME}")
|
sync_source("${BRANCH_NAME}")
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_SERVER_TAR} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
|
bash testpackage.sh ${TD_SERVER_TAR} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server ${sourcePath}
|
||||||
python3 checkPackageRuning.py
|
python3 checkPackageRuning.py
|
||||||
'''
|
'''
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_SERVER_LITE_TAR} ${version} ${BASE_TD_SERVER_LITE_TAR} ${baseVersion} server
|
bash testpackage.sh ${TD_SERVER_LITE_TAR} ${version} ${BASE_TD_SERVER_LITE_TAR} ${baseVersion} server ${sourcePath}
|
||||||
python3 checkPackageRuning.py
|
python3 checkPackageRuning.py
|
||||||
'''
|
'''
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_SERVER_RPM} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
|
bash testpackage.sh ${TD_SERVER_RPM} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server ${sourcePath}
|
||||||
python3 checkPackageRuning.py
|
python3 checkPackageRuning.py
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
|
@ -175,17 +180,17 @@ pipeline {
|
||||||
sync_source("${BRANCH_NAME}")
|
sync_source("${BRANCH_NAME}")
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_SERVER_TAR} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
|
bash testpackage.sh ${TD_SERVER_TAR} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server ${sourcePath}
|
||||||
python3 checkPackageRuning.py
|
python3 checkPackageRuning.py
|
||||||
'''
|
'''
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_SERVER_LITE_TAR} ${version} ${BASE_TD_SERVER_LITE_TAR} ${baseVersion} server
|
bash testpackage.sh ${TD_SERVER_LITE_TAR} ${version} ${BASE_TD_SERVER_LITE_TAR} ${baseVersion} server ${sourcePath}
|
||||||
python3 checkPackageRuning.py
|
python3 checkPackageRuning.py
|
||||||
'''
|
'''
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_SERVER_RPM} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
|
bash testpackage.sh ${TD_SERVER_RPM} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server ${sourcePath}
|
||||||
python3 checkPackageRuning.py
|
python3 checkPackageRuning.py
|
||||||
sudo rpm -e tdengine
|
sudo rpm -e tdengine
|
||||||
'''
|
'''
|
||||||
|
@ -199,7 +204,7 @@ pipeline {
|
||||||
sync_source("${BRANCH_NAME}")
|
sync_source("${BRANCH_NAME}")
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_SERVER_ARM_TAR} ${version} ${BASE_TD_SERVER_ARM_TAR} ${baseVersion} server
|
bash testpackage.sh ${TD_SERVER_ARM_TAR} ${version} ${BASE_TD_SERVER_ARM_TAR} ${baseVersion} server ${sourcePath}
|
||||||
python3 checkPackageRuning.py
|
python3 checkPackageRuning.py
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
|
@ -215,7 +220,7 @@ pipeline {
|
||||||
timeout(time: 30, unit: 'MINUTES'){
|
timeout(time: 30, unit: 'MINUTES'){
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_CLIENT_TAR} ${version} ${BASE_TD_CLIENT_TAR} ${baseVersion} client
|
bash testpackage.sh ${TD_CLIENT_TAR} ${version} ${BASE_TD_CLIENT_TAR} ${baseVersion} client ${sourcePath}
|
||||||
python3 checkPackageRuning.py 192.168.0.21
|
python3 checkPackageRuning.py 192.168.0.21
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
|
@ -227,7 +232,7 @@ pipeline {
|
||||||
timeout(time: 30, unit: 'MINUTES'){
|
timeout(time: 30, unit: 'MINUTES'){
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_CLIENT_LITE_TAR} ${version} ${BASE_TD_CLIENT_LITE_TAR} ${baseVersion} client
|
bash testpackage.sh ${TD_CLIENT_LITE_TAR} ${version} ${BASE_TD_CLIENT_LITE_TAR} ${baseVersion} client ${sourcePath}
|
||||||
python3 checkPackageRuning.py 192.168.0.24
|
python3 checkPackageRuning.py 192.168.0.24
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
|
@ -241,7 +246,7 @@ pipeline {
|
||||||
timeout(time: 30, unit: 'MINUTES'){
|
timeout(time: 30, unit: 'MINUTES'){
|
||||||
sh '''
|
sh '''
|
||||||
cd ${TDENGINE_ROOT_DIR}/packaging
|
cd ${TDENGINE_ROOT_DIR}/packaging
|
||||||
bash testpackage.sh ${TD_CLIENT_ARM_TAR} ${version} ${BASE_TD_CLIENT_ARM_TAR} ${baseVersion} client
|
bash testpackage.sh ${TD_CLIENT_ARM_TAR} ${version} ${BASE_TD_CLIENT_ARM_TAR} ${baseVersion} client ${sourcePath}
|
||||||
python3 checkPackageRuning.py 192.168.0.21
|
python3 checkPackageRuning.py 192.168.0.21
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@ if not exist %work_dir%\debug\ver-%2-x86 (
|
||||||
md %work_dir%\debug\ver-%2-x86
|
md %work_dir%\debug\ver-%2-x86
|
||||||
)
|
)
|
||||||
cd %work_dir%\debug\ver-%2-x64
|
cd %work_dir%\debug\ver-%2-x64
|
||||||
call vcvarsall.bat x64
|
rem #call vcvarsall.bat x64
|
||||||
cmake ../../ -G "NMake Makefiles JOM" -DCMAKE_MAKE_PROGRAM=jom -DBUILD_TOOLS=true -DWEBSOCKET=true -DBUILD_HTTP=false -DBUILD_TEST=false -DVERNUMBER=%2 -DCPUTYPE=x64
|
cmake ../../ -G "NMake Makefiles JOM" -DCMAKE_MAKE_PROGRAM=jom -DBUILD_TOOLS=true -DWEBSOCKET=true -DBUILD_HTTP=false -DBUILD_TEST=false -DVERNUMBER=%2 -DCPUTYPE=x64
|
||||||
cmake --build .
|
cmake --build .
|
||||||
rd /s /Q C:\TDengine
|
rd /s /Q C:\TDengine
|
||||||
|
|
|
@ -6,6 +6,8 @@ version=$2
|
||||||
originPackageName=$3
|
originPackageName=$3
|
||||||
originversion=$4
|
originversion=$4
|
||||||
testFile=$5
|
testFile=$5
|
||||||
|
# sourcePath:web/nas
|
||||||
|
sourcePath=$6
|
||||||
subFile="taos.tar.gz"
|
subFile="taos.tar.gz"
|
||||||
|
|
||||||
# Color setting
|
# Color setting
|
||||||
|
@ -71,16 +73,23 @@ fi
|
||||||
function wgetFile {
|
function wgetFile {
|
||||||
|
|
||||||
file=$1
|
file=$1
|
||||||
|
versionPath=$2
|
||||||
if [ ! -f ${file} ];then
|
sourceP=$3
|
||||||
echoColor BD "wget https://www.taosdata.com/assets-download/3.0/${file}"
|
nasServerIP="192.168.1.131"
|
||||||
wget https://www.taosdata.com/assets-download/3.0/${file}
|
packagePath="/nas/TDengine/v${versionPath}/community"
|
||||||
else
|
if [ -f ${file} ];then
|
||||||
echoColor YD "${file} already exists and use new file "
|
echoColor YD "${file} already exists ,it will delete it and download it again "
|
||||||
rm -rf ${file}
|
rm -rf ${file}
|
||||||
echoColor BD "wget https://www.taosdata.com/assets-download/3.0/${file}"
|
|
||||||
wget https://www.taosdata.com/assets-download/3.0/${file}
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ ${sourceP} = 'web' ];then
|
||||||
|
echoColor BD "====download====:wget https://www.taosdata.com/assets-download/3.0/${file}"
|
||||||
|
wget https://www.taosdata.com/assets-download/3.0/${file}
|
||||||
|
elif [ ${sourceP} = 'nas' ];then
|
||||||
|
echoColor BD "====download====:scp root@${nasServerIP}:${packagePath}/${file} ."
|
||||||
|
scp root@${nasServerIP}:${packagePath}/${file} .
|
||||||
|
fi
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function newPath {
|
function newPath {
|
||||||
|
@ -142,8 +151,9 @@ if [ -d ${installPath}/${tdPath} ] ;then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echoColor G "===== download installPackage ====="
|
echoColor G "===== download installPackage ====="
|
||||||
cd ${installPath} && wgetFile ${packgeName}
|
cd ${installPath} && wgetFile ${packgeName} ${version} ${sourcePath}
|
||||||
cd ${oriInstallPath} && wgetFile ${originPackageName}
|
cd ${oriInstallPath} && wgetFile ${originPackageName} ${originversion} ${sourcePath}
|
||||||
|
|
||||||
|
|
||||||
cd ${installPath}
|
cd ${installPath}
|
||||||
cp -r ${scriptDir}/debRpmAutoInstall.sh .
|
cp -r ${scriptDir}/debRpmAutoInstall.sh .
|
||||||
|
@ -193,7 +203,7 @@ elif [[ ${packgeName} =~ "tar" ]];then
|
||||||
cd ${oriInstallPath}
|
cd ${oriInstallPath}
|
||||||
if [ ! -f {originPackageName} ];then
|
if [ ! -f {originPackageName} ];then
|
||||||
echoColor YD "download base installPackage"
|
echoColor YD "download base installPackage"
|
||||||
wgetFile ${originPackageName}
|
wgetFile ${originPackageName} ${originversion} ${sourcePath}
|
||||||
fi
|
fi
|
||||||
echoColor YD "unzip the base installation package"
|
echoColor YD "unzip the base installation package"
|
||||||
echoColor BD "tar -xf ${originPackageName}" && tar -xf ${originPackageName}
|
echoColor BD "tar -xf ${originPackageName}" && tar -xf ${originPackageName}
|
||||||
|
@ -238,14 +248,19 @@ cd ${installPath}
|
||||||
if [[ ${packgeName} =~ "Lite" ]] || ([[ ${packgeName} =~ "x64" ]] && [[ ${packgeName} =~ "client" ]]) || ([[ ${packgeName} =~ "deb" ]] && [[ ${packgeName} =~ "server" ]]) || ([[ ${packgeName} =~ "rpm" ]] && [[ ${packgeName} =~ "server" ]]) ;then
|
if [[ ${packgeName} =~ "Lite" ]] || ([[ ${packgeName} =~ "x64" ]] && [[ ${packgeName} =~ "client" ]]) || ([[ ${packgeName} =~ "deb" ]] && [[ ${packgeName} =~ "server" ]]) || ([[ ${packgeName} =~ "rpm" ]] && [[ ${packgeName} =~ "server" ]]) ;then
|
||||||
echoColor G "===== install taos-tools when package is lite or client ====="
|
echoColor G "===== install taos-tools when package is lite or client ====="
|
||||||
cd ${installPath}
|
cd ${installPath}
|
||||||
wgetFile taosTools-2.1.3-Linux-x64.tar.gz .
|
if [ ! -f "taosTools-2.1.3-Linux-x64.tar.gz " ];then
|
||||||
|
wgetFile taosTools-2.1.3-Linux-x64.tar.gz v2.1.3 web
|
||||||
tar xf taosTools-2.1.3-Linux-x64.tar.gz
|
tar xf taosTools-2.1.3-Linux-x64.tar.gz
|
||||||
|
fi
|
||||||
cd taosTools-2.1.3 && bash install-taostools.sh
|
cd taosTools-2.1.3 && bash install-taostools.sh
|
||||||
elif ([[ ${packgeName} =~ "arm64" ]] && [[ ${packgeName} =~ "client" ]]);then
|
elif ([[ ${packgeName} =~ "arm64" ]] && [[ ${packgeName} =~ "client" ]]);then
|
||||||
echoColor G "===== install taos-tools arm when package is arm64-client ====="
|
echoColor G "===== install taos-tools arm when package is arm64-client ====="
|
||||||
cd ${installPath}
|
cd ${installPath}
|
||||||
wgetFile taosTools-2.1.3-Linux-arm64.tar.gz .
|
if [ ! -f "taosTools-2.1.3-Linux-x64.tar.gz " ];then
|
||||||
|
wgetFile taosTools-2.1.3-Linux-x64.tar.gz v2.1.3 web
|
||||||
tar xf taosTools-2.1.3-Linux-arm64.tar.gz
|
tar xf taosTools-2.1.3-Linux-arm64.tar.gz
|
||||||
|
fi
|
||||||
|
|
||||||
cd taosTools-2.1.3 && bash install-taostools.sh
|
cd taosTools-2.1.3 && bash install-taostools.sh
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
|
for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
|
||||||
|
|
||||||
goto %1
|
goto %1
|
||||||
:needAdmin
|
:needAdmin
|
||||||
|
|
||||||
|
@ -11,60 +14,94 @@ set binary_dir=%3
|
||||||
set binary_dir=%binary_dir:/=\\%
|
set binary_dir=%binary_dir:/=\\%
|
||||||
set osType=%4
|
set osType=%4
|
||||||
set verNumber=%5
|
set verNumber=%5
|
||||||
set tagert_dir=C:\\TDengine
|
set target_dir=C:\\TDengine
|
||||||
|
|
||||||
if not exist %tagert_dir% (
|
if not exist %target_dir% (
|
||||||
mkdir %tagert_dir%
|
mkdir %target_dir%
|
||||||
)
|
)
|
||||||
if not exist %tagert_dir%\\cfg (
|
if not exist %target_dir%\\cfg (
|
||||||
mkdir %tagert_dir%\\cfg
|
mkdir %target_dir%\\cfg
|
||||||
)
|
)
|
||||||
if not exist %tagert_dir%\\include (
|
if not exist %target_dir%\\include (
|
||||||
mkdir %tagert_dir%\\include
|
mkdir %target_dir%\\include
|
||||||
)
|
)
|
||||||
if not exist %tagert_dir%\\driver (
|
if not exist %target_dir%\\driver (
|
||||||
mkdir %tagert_dir%\\driver
|
mkdir %target_dir%\\driver
|
||||||
)
|
)
|
||||||
if not exist C:\\TDengine\\cfg\\taos.cfg (
|
if not exist C:\\TDengine\\cfg\\taos.cfg (
|
||||||
copy %source_dir%\\packaging\\cfg\\taos.cfg %tagert_dir%\\cfg\\taos.cfg > nul
|
copy %source_dir%\\packaging\\cfg\\taos.cfg %target_dir%\\cfg\\taos.cfg > nul
|
||||||
)
|
)
|
||||||
|
|
||||||
if exist %binary_dir%\\test\\cfg\\taosadapter.toml (
|
if exist %binary_dir%\\test\\cfg\\taosadapter.toml (
|
||||||
if not exist %tagert_dir%\\cfg\\taosadapter.toml (
|
if not exist %target_dir%\\cfg\\taosadapter.toml (
|
||||||
copy %binary_dir%\\test\\cfg\\taosadapter.toml %tagert_dir%\\cfg\\taosadapter.toml > nul
|
copy %binary_dir%\\test\\cfg\\taosadapter.toml %target_dir%\\cfg\\taosadapter.toml > nul
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
copy %source_dir%\\include\\client\\taos.h %tagert_dir%\\include > nul
|
copy %source_dir%\\include\\client\\taos.h %target_dir%\\include > nul
|
||||||
copy %source_dir%\\include\\util\\taoserror.h %tagert_dir%\\include > nul
|
copy %source_dir%\\include\\util\\taoserror.h %target_dir%\\include > nul
|
||||||
copy %source_dir%\\include\\libs\\function\\taosudf.h %tagert_dir%\\include > nul
|
copy %source_dir%\\include\\libs\\function\\taosudf.h %target_dir%\\include > nul
|
||||||
copy %binary_dir%\\build\\lib\\taos.lib %tagert_dir%\\driver > nul
|
copy %binary_dir%\\build\\lib\\taos.lib %target_dir%\\driver > nul
|
||||||
copy %binary_dir%\\build\\lib\\taos_static.lib %tagert_dir%\\driver > nul
|
copy %binary_dir%\\build\\lib\\taos_static.lib %target_dir%\\driver > nul
|
||||||
copy %binary_dir%\\build\\lib\\taos.dll %tagert_dir%\\driver > nul
|
copy %binary_dir%\\build\\lib\\taos.dll %target_dir%\\driver > nul
|
||||||
copy %binary_dir%\\build\\bin\\taos.exe %tagert_dir% > nul
|
copy %binary_dir%\\build\\bin\\taos.exe %target_dir% > nul
|
||||||
copy %binary_dir%\\build\\bin\\taosd.exe %tagert_dir% > nul
|
|
||||||
copy %binary_dir%\\build\\bin\\udfd.exe %tagert_dir% > nul
|
|
||||||
if exist %binary_dir%\\build\\bin\\taosBenchmark.exe (
|
if exist %binary_dir%\\build\\bin\\taosBenchmark.exe (
|
||||||
copy %binary_dir%\\build\\bin\\taosBenchmark.exe %tagert_dir% > nul
|
copy %binary_dir%\\build\\bin\\taosBenchmark.exe %target_dir% > nul
|
||||||
)
|
)
|
||||||
if exist %binary_dir%\\build\\lib\\taosws.dll.lib (
|
if exist %binary_dir%\\build\\lib\\taosws.dll.lib (
|
||||||
copy %binary_dir%\\build\\lib\\taosws.dll.lib %tagert_dir%\\driver > nul
|
copy %binary_dir%\\build\\lib\\taosws.dll.lib %target_dir%\\driver > nul
|
||||||
)
|
)
|
||||||
if exist %binary_dir%\\build\\lib\\taosws.dll (
|
if exist %binary_dir%\\build\\lib\\taosws.dll (
|
||||||
copy %binary_dir%\\build\\lib\\taosws.dll %tagert_dir%\\driver > nul
|
copy %binary_dir%\\build\\lib\\taosws.dll %target_dir%\\driver > nul
|
||||||
copy %source_dir%\\tools\\taosws-rs\\target\\release\\taosws.h %tagert_dir%\\include > nul
|
copy %source_dir%\\tools\\taosws-rs\\target\\release\\taosws.h %target_dir%\\include > nul
|
||||||
)
|
)
|
||||||
if exist %binary_dir%\\build\\bin\\taosdump.exe (
|
if exist %binary_dir%\\build\\bin\\taosdump.exe (
|
||||||
copy %binary_dir%\\build\\bin\\taosdump.exe %tagert_dir% > nul
|
copy %binary_dir%\\build\\bin\\taosdump.exe %target_dir% > nul
|
||||||
)
|
|
||||||
if exist %binary_dir%\\build\\bin\\taosadapter.exe (
|
|
||||||
copy %binary_dir%\\build\\bin\\taosadapter.exe %tagert_dir% > nul
|
|
||||||
)
|
)
|
||||||
|
|
||||||
mshta vbscript:createobject("shell.application").shellexecute("%~s0",":hasAdmin","","runas",1)(window.close)&& echo To start/stop TDengine with administrator privileges: sc start/stop taosd &goto :eof
|
copy %binary_dir%\\build\\bin\\taosd.exe %target_dir% > nul
|
||||||
|
copy %binary_dir%\\build\\bin\\udfd.exe %target_dir% > nul
|
||||||
|
|
||||||
|
if exist %binary_dir%\\build\\bin\\taosadapter.exe (
|
||||||
|
copy %binary_dir%\\build\\bin\\taosadapter.exe %target_dir% > nul
|
||||||
|
)
|
||||||
|
|
||||||
|
mshta vbscript:createobject("shell.application").shellexecute("%~s0",":hasAdmin","","runas",1)(window.close)
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Please manually remove C:\TDengine from your system PATH environment after you remove TDengine software
|
||||||
|
echo.
|
||||||
|
echo To start/stop TDengine with administrator privileges: %ESC%[92msc start/stop taosd %ESC%[0m
|
||||||
|
|
||||||
|
if exist %binary_dir%\\build\\bin\\taosadapter.exe (
|
||||||
|
echo To start/stop taosAdapter with administrator privileges: %ESC%[92msc start/stop taosadapter %ESC%[0m
|
||||||
|
)
|
||||||
|
|
||||||
|
goto :eof
|
||||||
|
|
||||||
:hasAdmin
|
:hasAdmin
|
||||||
|
|
||||||
|
sc query "taosd" && sc stop taosd && sc delete taosd
|
||||||
|
sc query "taosadapter" && sc stop taosadapter && sc delete taosd
|
||||||
|
|
||||||
copy /y C:\\TDengine\\driver\\taos.dll C:\\Windows\\System32 > nul
|
copy /y C:\\TDengine\\driver\\taos.dll C:\\Windows\\System32 > nul
|
||||||
if exist C:\\TDengine\\driver\\taosws.dll (
|
if exist C:\\TDengine\\driver\\taosws.dll (
|
||||||
copy /y C:\\TDengine\\driver\\taosws.dll C:\\Windows\\System32 > nul
|
copy /y C:\\TDengine\\driver\\taosws.dll C:\\Windows\\System32 > nul
|
||||||
)
|
)
|
||||||
|
|
||||||
sc query "taosd" >nul || sc create "taosd" binPath= "C:\\TDengine\\taosd.exe --win_service" start= DEMAND
|
sc query "taosd" >nul || sc create "taosd" binPath= "C:\\TDengine\\taosd.exe --win_service" start= DEMAND
|
||||||
sc query "taosadapter" >nul || sc create "taosadapter" binPath= "C:\\TDengine\\taosadapter.exe" start= DEMAND
|
sc query "taosadapter" >nul || sc create "taosadapter" binPath= "C:\\TDengine\\taosadapter.exe" start= DEMAND
|
||||||
|
|
||||||
|
set "env=HKLM\System\CurrentControlSet\Control\Session Manager\Environment"
|
||||||
|
for /f "tokens=2*" %%I in ('reg query "%env%" /v Path ^| findstr /i "\<Path\>"') do (
|
||||||
|
|
||||||
|
rem // make addition persistent through reboots
|
||||||
|
reg add "%env%" /f /v Path /t REG_EXPAND_SZ /d "%%J;C:\TDengine"
|
||||||
|
|
||||||
|
rem // apply change to the current process
|
||||||
|
for %%a in ("%%J;C:\TDengine") do path %%~a
|
||||||
|
)
|
||||||
|
|
||||||
|
rem // use setx to set a temporary throwaway value to trigger a WM_SETTINGCHANGE
|
||||||
|
rem // applies change to new console windows without requiring a reboot
|
||||||
|
(setx /m foo bar & reg delete "%env%" /f /v foo) >NUL 2>NUL
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,29 @@ Source: {#MyAppSourceDir}{#MyAppIncludeName}; DestDir: "{app}\include"; Flags: i
|
||||||
Source: {#MyAppSourceDir}{#MyAppExeName}; DestDir: "{app}"; Excludes: {#MyAppExcludeSource} ; Flags: igNoreversion recursesubdirs createallsubdirs
|
Source: {#MyAppSourceDir}{#MyAppExeName}; DestDir: "{app}"; Excludes: {#MyAppExcludeSource} ; Flags: igNoreversion recursesubdirs createallsubdirs
|
||||||
Source: {#MyAppSourceDir}{#MyAppTaosdemoExeName}; DestDir: "{app}"; Flags: igNoreversion recursesubdirs createallsubdirs
|
Source: {#MyAppSourceDir}{#MyAppTaosdemoExeName}; DestDir: "{app}"; Flags: igNoreversion recursesubdirs createallsubdirs
|
||||||
|
|
||||||
|
|
||||||
|
[Registry]
|
||||||
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; \
|
||||||
|
ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};C:\TDengine"; \
|
||||||
|
Check: NeedsAddPath('C:\TDengine')
|
||||||
|
|
||||||
|
[Code]
|
||||||
|
function NeedsAddPath(Param: string): boolean;
|
||||||
|
var
|
||||||
|
OrigPath: string;
|
||||||
|
begin
|
||||||
|
if not RegQueryStringValue(HKEY_LOCAL_MACHINE,
|
||||||
|
'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
|
||||||
|
'Path', OrigPath)
|
||||||
|
then begin
|
||||||
|
Result := True;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
{ look for the path with leading and trailing semicolon }
|
||||||
|
{ Pos() returns 0 if not found }
|
||||||
|
Result := Pos(';' + Param + ';', ';' + OrigPath + ';') = 0;
|
||||||
|
end;
|
||||||
|
|
||||||
[UninstallDelete]
|
[UninstallDelete]
|
||||||
Name: {app}\driver; Type: filesandordirs
|
Name: {app}\driver; Type: filesandordirs
|
||||||
Name: {app}\connector; Type: filesandordirs
|
Name: {app}\connector; Type: filesandordirs
|
||||||
|
|
|
@ -384,7 +384,6 @@ void hbMgrInitMqHbRspHandle();
|
||||||
typedef struct SSqlCallbackWrapper {
|
typedef struct SSqlCallbackWrapper {
|
||||||
SParseContext* pParseCtx;
|
SParseContext* pParseCtx;
|
||||||
SCatalogReq* pCatalogReq;
|
SCatalogReq* pCatalogReq;
|
||||||
SMetaData* pResultMeta;
|
|
||||||
SRequestObj* pRequest;
|
SRequestObj* pRequest;
|
||||||
} SSqlCallbackWrapper;
|
} SSqlCallbackWrapper;
|
||||||
|
|
||||||
|
@ -398,7 +397,7 @@ int32_t removeMeta(STscObj* pTscObj, SArray* tbList);
|
||||||
int32_t handleAlterTbExecRes(void* res, struct SCatalog* pCatalog);
|
int32_t handleAlterTbExecRes(void* res, struct SCatalog* pCatalog);
|
||||||
int32_t handleCreateTbExecRes(void* res, SCatalog* pCatalog);
|
int32_t handleCreateTbExecRes(void* res, SCatalog* pCatalog);
|
||||||
bool qnodeRequired(SRequestObj* pRequest);
|
bool qnodeRequired(SRequestObj* pRequest);
|
||||||
int32_t continueInsertFromCsv(SSqlCallbackWrapper* pWrapper, SRequestObj* pRequest);
|
void continueInsertFromCsv(SSqlCallbackWrapper* pWrapper, SRequestObj* pRequest);
|
||||||
void destorySqlCallbackWrapper(SSqlCallbackWrapper* pWrapper);
|
void destorySqlCallbackWrapper(SSqlCallbackWrapper* pWrapper);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -873,6 +873,10 @@ int32_t handleQueryExecRsp(SRequestObj* pRequest) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool incompletaFileParsing(SNode* pStmt) {
|
||||||
|
return QUERY_NODE_VNODE_MODIF_STMT != nodeType(pStmt) ? false : ((SVnodeModifOpStmt*)pStmt)->fileProcessing;
|
||||||
|
}
|
||||||
|
|
||||||
// todo refacto the error code mgmt
|
// todo refacto the error code mgmt
|
||||||
void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) {
|
void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) {
|
||||||
SSqlCallbackWrapper* pWrapper = param;
|
SSqlCallbackWrapper* pWrapper = param;
|
||||||
|
@ -927,12 +931,11 @@ void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) {
|
||||||
pRequest->code = code1;
|
pRequest->code = code1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pRequest->code == TSDB_CODE_SUCCESS && NULL != pWrapper->pParseCtx && pWrapper->pParseCtx->needMultiParse) {
|
if (pRequest->code == TSDB_CODE_SUCCESS && NULL != pRequest->pQuery &&
|
||||||
code = continueInsertFromCsv(pWrapper, pRequest);
|
incompletaFileParsing(pRequest->pQuery->pRoot)) {
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
continueInsertFromCsv(pWrapper, pRequest);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
destorySqlCallbackWrapper(pWrapper);
|
destorySqlCallbackWrapper(pWrapper);
|
||||||
|
|
||||||
|
@ -1055,7 +1058,9 @@ static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaDat
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code && !pRequest->validateOnly) {
|
if (TSDB_CODE_SUCCESS == code && !pRequest->validateOnly) {
|
||||||
SArray* pNodeList = NULL;
|
SArray* pNodeList = NULL;
|
||||||
|
if (QUERY_NODE_VNODE_MODIF_STMT != nodeType(pQuery->pRoot)) {
|
||||||
buildAsyncExecNodeList(pRequest, &pNodeList, pMnodeList, pResultMeta);
|
buildAsyncExecNodeList(pRequest, &pNodeList, pMnodeList, pResultMeta);
|
||||||
|
}
|
||||||
|
|
||||||
SRequestConnInfo conn = {.pTrans = getAppInfo(pRequest)->pTransporter,
|
SRequestConnInfo conn = {.pTrans = getAppInfo(pRequest)->pTransporter,
|
||||||
.requestId = pRequest->requestId,
|
.requestId = pRequest->requestId,
|
||||||
|
|
|
@ -686,11 +686,10 @@ void destorySqlCallbackWrapper(SSqlCallbackWrapper *pWrapper) {
|
||||||
}
|
}
|
||||||
destoryCatalogReq(pWrapper->pCatalogReq);
|
destoryCatalogReq(pWrapper->pCatalogReq);
|
||||||
qDestroyParseContext(pWrapper->pParseCtx);
|
qDestroyParseContext(pWrapper->pParseCtx);
|
||||||
catalogFreeMetaData(pWrapper->pResultMeta);
|
|
||||||
taosMemoryFree(pWrapper);
|
taosMemoryFree(pWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) {
|
static void doAsyncQueryFromAnalyse(SMetaData *pResultMeta, void *param, int32_t code) {
|
||||||
SSqlCallbackWrapper *pWrapper = (SSqlCallbackWrapper *)param;
|
SSqlCallbackWrapper *pWrapper = (SSqlCallbackWrapper *)param;
|
||||||
SRequestObj *pRequest = pWrapper->pRequest;
|
SRequestObj *pRequest = pWrapper->pRequest;
|
||||||
SQuery *pQuery = pRequest->pQuery;
|
SQuery *pQuery = pRequest->pQuery;
|
||||||
|
@ -708,13 +707,6 @@ void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) {
|
||||||
|
|
||||||
pRequest->metric.semanticEnd = taosGetTimestampUs();
|
pRequest->metric.semanticEnd = taosGetTimestampUs();
|
||||||
|
|
||||||
if (code == TSDB_CODE_SUCCESS && pWrapper->pParseCtx->needMultiParse) {
|
|
||||||
pWrapper->pResultMeta = catalogCloneMetaData(pResultMeta);
|
|
||||||
if (NULL == pWrapper->pResultMeta) {
|
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (code == TSDB_CODE_SUCCESS) {
|
if (code == TSDB_CODE_SUCCESS) {
|
||||||
if (pQuery->haveResultSet) {
|
if (pQuery->haveResultSet) {
|
||||||
setResSchemaInfo(&pRequest->body.resInfo, pQuery->pResSchema, pQuery->numOfResCols);
|
setResSchemaInfo(&pRequest->body.resInfo, pQuery->pResSchema, pQuery->numOfResCols);
|
||||||
|
@ -751,14 +743,83 @@ void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t continueInsertFromCsv(SSqlCallbackWrapper *pWrapper, SRequestObj *pRequest) {
|
static int32_t getAllMetaAsync(SSqlCallbackWrapper *pWrapper, catalogCallback fp) {
|
||||||
qDestroyQuery(pRequest->pQuery);
|
SRequestConnInfo conn = {.pTrans = pWrapper->pParseCtx->pTransporter,
|
||||||
pRequest->pQuery = (SQuery *)nodesMakeNode(QUERY_NODE_QUERY);
|
.requestId = pWrapper->pParseCtx->requestId,
|
||||||
if (NULL == pRequest->pQuery) {
|
.requestObjRefId = pWrapper->pParseCtx->requestRid,
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
.mgmtEps = pWrapper->pParseCtx->mgmtEpSet};
|
||||||
|
|
||||||
|
pWrapper->pRequest->metric.ctgStart = taosGetTimestampUs();
|
||||||
|
|
||||||
|
return catalogAsyncGetAllMeta(pWrapper->pParseCtx->pCatalog, &conn, pWrapper->pCatalogReq, fp, pWrapper,
|
||||||
|
&pWrapper->pRequest->body.queryJob);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doAsyncQueryFromParse(SMetaData *pResultMeta, void *param, int32_t code);
|
||||||
|
|
||||||
|
static int32_t phaseAsyncQuery(SSqlCallbackWrapper *pWrapper) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
switch (pWrapper->pRequest->pQuery->execStage) {
|
||||||
|
case QUERY_EXEC_STAGE_PARSE: {
|
||||||
|
// continue parse after get metadata
|
||||||
|
code = getAllMetaAsync(pWrapper, doAsyncQueryFromParse);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case QUERY_EXEC_STAGE_ANALYSE: {
|
||||||
|
// analysis after get metadata
|
||||||
|
code = getAllMetaAsync(pWrapper, doAsyncQueryFromAnalyse);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case QUERY_EXEC_STAGE_SCHEDULE: {
|
||||||
|
launchAsyncQuery(pWrapper->pRequest, pWrapper->pRequest->pQuery, NULL, pWrapper);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doAsyncQueryFromParse(SMetaData *pResultMeta, void *param, int32_t code) {
|
||||||
|
SSqlCallbackWrapper *pWrapper = (SSqlCallbackWrapper *)param;
|
||||||
|
SRequestObj *pRequest = pWrapper->pRequest;
|
||||||
|
SQuery *pQuery = pRequest->pQuery;
|
||||||
|
|
||||||
|
pRequest->metric.ctgEnd = taosGetTimestampUs();
|
||||||
|
qDebug("0x%" PRIx64 " start to continue parse, reqId:0x%" PRIx64, pRequest->self, pRequest->requestId);
|
||||||
|
|
||||||
|
if (code == TSDB_CODE_SUCCESS) {
|
||||||
|
code = qContinueParseSql(pWrapper->pParseCtx, pWrapper->pCatalogReq, pResultMeta, pQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = phaseAsyncQuery(pWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pWrapper->pRequest->self, code,
|
||||||
|
tstrerror(code), pWrapper->pRequest->requestId);
|
||||||
|
destorySqlCallbackWrapper(pWrapper);
|
||||||
|
terrno = code;
|
||||||
|
pRequest->code = code;
|
||||||
|
pRequest->body.queryFp(pRequest->body.param, pRequest, code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void continueInsertFromCsv(SSqlCallbackWrapper *pWrapper, SRequestObj *pRequest) {
|
||||||
|
int32_t code = qParseSqlSyntax(pWrapper->pParseCtx, &pRequest->pQuery, pWrapper->pCatalogReq);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = phaseAsyncQuery(pWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pWrapper->pRequest->self, code,
|
||||||
|
tstrerror(code), pWrapper->pRequest->requestId);
|
||||||
|
destorySqlCallbackWrapper(pWrapper);
|
||||||
|
terrno = code;
|
||||||
|
pWrapper->pRequest->code = code;
|
||||||
|
pWrapper->pRequest->body.queryFp(pWrapper->pRequest->body.param, pWrapper->pRequest, code);
|
||||||
}
|
}
|
||||||
retrieveMetaCallback(pWrapper->pResultMeta, pWrapper, TSDB_CODE_SUCCESS);
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void taos_query_a(TAOS *taos, const char *sql, __taos_async_fn_t fp, void *param) {
|
void taos_query_a(TAOS *taos, const char *sql, __taos_async_fn_t fp, void *param) {
|
||||||
|
@ -845,26 +906,16 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) {
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code && !updateMetaForce) {
|
if (TSDB_CODE_SUCCESS == code && !updateMetaForce) {
|
||||||
SAppClusterSummary *pActivity = &pTscObj->pAppInfo->summary;
|
SAppClusterSummary *pActivity = &pTscObj->pAppInfo->summary;
|
||||||
if (NULL == pRequest->pQuery->pRoot) {
|
if (QUERY_NODE_INSERT_STMT == nodeType(pRequest->pQuery->pRoot)) {
|
||||||
atomic_add_fetch_64((int64_t *)&pActivity->numOfInsertsReq, 1);
|
atomic_add_fetch_64((int64_t *)&pActivity->numOfInsertsReq, 1);
|
||||||
} else if (QUERY_NODE_SELECT_STMT == pRequest->pQuery->pRoot->type) {
|
} else if (QUERY_NODE_SELECT_STMT == nodeType(pRequest->pQuery->pRoot)) {
|
||||||
atomic_add_fetch_64((int64_t *)&pActivity->numOfQueryReq, 1);
|
atomic_add_fetch_64((int64_t *)&pActivity->numOfQueryReq, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
SRequestConnInfo conn = {.pTrans = pWrapper->pParseCtx->pTransporter,
|
phaseAsyncQuery(pWrapper);
|
||||||
.requestId = pWrapper->pParseCtx->requestId,
|
} else {
|
||||||
.requestObjRefId = pWrapper->pParseCtx->requestRid,
|
|
||||||
.mgmtEps = pWrapper->pParseCtx->mgmtEpSet};
|
|
||||||
|
|
||||||
pRequest->metric.ctgStart = taosGetTimestampUs();
|
|
||||||
|
|
||||||
code = catalogAsyncGetAllMeta(pWrapper->pParseCtx->pCatalog, &conn, pWrapper->pCatalogReq, retrieveMetaCallback,
|
|
||||||
pWrapper, &pRequest->body.queryJob);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
|
||||||
tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pRequest->self, code, tstrerror(code),
|
tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pRequest->self, code, tstrerror(code),
|
||||||
pRequest->requestId);
|
pRequest->requestId);
|
||||||
destorySqlCallbackWrapper(pWrapper);
|
destorySqlCallbackWrapper(pWrapper);
|
||||||
|
|
|
@ -175,7 +175,8 @@ int32_t processCreateDbRsp(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
int32_t processUseDbRsp(void* param, SDataBuf* pMsg, int32_t code) {
|
int32_t processUseDbRsp(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
SRequestObj* pRequest = param;
|
SRequestObj* pRequest = param;
|
||||||
|
|
||||||
if (TSDB_CODE_MND_DB_NOT_EXIST == code) {
|
if (TSDB_CODE_MND_DB_NOT_EXIST == code || TSDB_CODE_MND_DB_IN_CREATING == code ||
|
||||||
|
TSDB_CODE_MND_DB_IN_DROPPING == code) {
|
||||||
SUseDbRsp usedbRsp = {0};
|
SUseDbRsp usedbRsp = {0};
|
||||||
tDeserializeSUseDbRsp(pMsg->pData, pMsg->len, &usedbRsp);
|
tDeserializeSUseDbRsp(pMsg->pData, pMsg->len, &usedbRsp);
|
||||||
struct SCatalog* pCatalog = NULL;
|
struct SCatalog* pCatalog = NULL;
|
||||||
|
@ -212,7 +213,20 @@ int32_t processUseDbRsp(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
tDeserializeSUseDbRsp(pMsg->pData, pMsg->len, &usedbRsp);
|
tDeserializeSUseDbRsp(pMsg->pData, pMsg->len, &usedbRsp);
|
||||||
|
|
||||||
if (strlen(usedbRsp.db) == 0) {
|
if (strlen(usedbRsp.db) == 0) {
|
||||||
return TSDB_CODE_MND_DB_NOT_EXIST;
|
if (usedbRsp.errCode != 0) {
|
||||||
|
return usedbRsp.errCode;
|
||||||
|
} else {
|
||||||
|
return TSDB_CODE_APP_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tscTrace("db:%s, usedbRsp received, numOfVgroups:%d", usedbRsp.db, usedbRsp.vgNum);
|
||||||
|
for (int32_t i = 0; i < usedbRsp.vgNum; ++i) {
|
||||||
|
SVgroupInfo* pInfo = taosArrayGet(usedbRsp.pVgroupInfos, i);
|
||||||
|
tscTrace("vgId:%d, numOfEps:%d inUse:%d ", pInfo->vgId, pInfo->epSet.numOfEps, pInfo->epSet.inUse);
|
||||||
|
for (int32_t j = 0; j < pInfo->epSet.numOfEps; ++j) {
|
||||||
|
tscTrace("vgId:%d, index:%d epset:%s:%u", pInfo->vgId, j, pInfo->epSet.eps[j].fqdn, pInfo->epSet.eps[j].port);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SName name = {0};
|
SName name = {0};
|
||||||
|
|
|
@ -1649,7 +1649,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
taosFreeQitem(pollRspWrapper);
|
taosFreeQitem(pollRspWrapper);
|
||||||
return pRsp;
|
return pRsp;
|
||||||
} else {
|
} else {
|
||||||
tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d\n",
|
tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d",
|
||||||
pollRspWrapper->dataRsp.head.epoch, consumerEpoch);
|
pollRspWrapper->dataRsp.head.epoch, consumerEpoch);
|
||||||
taosFreeQitem(pollRspWrapper);
|
taosFreeQitem(pollRspWrapper);
|
||||||
}
|
}
|
||||||
|
@ -1667,7 +1667,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
taosFreeQitem(pollRspWrapper);
|
taosFreeQitem(pollRspWrapper);
|
||||||
return pRsp;
|
return pRsp;
|
||||||
} else {
|
} else {
|
||||||
tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d\n",
|
tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d",
|
||||||
pollRspWrapper->metaRsp.head.epoch, consumerEpoch);
|
pollRspWrapper->metaRsp.head.epoch, consumerEpoch);
|
||||||
taosFreeQitem(pollRspWrapper);
|
taosFreeQitem(pollRspWrapper);
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ typedef struct {
|
||||||
#define TSROW_IS_KV_ROW(r) ((r)->flags & TSROW_KV_ROW)
|
#define TSROW_IS_KV_ROW(r) ((r)->flags & TSROW_KV_ROW)
|
||||||
|
|
||||||
// SValue
|
// SValue
|
||||||
int32_t tPutValue(uint8_t *p, SValue *pValue, int8_t type) {
|
static FORCE_INLINE int32_t tPutValue(uint8_t *p, SValue *pValue, int8_t type) {
|
||||||
if (IS_VAR_DATA_TYPE(type)) {
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
return tPutBinary(p, pValue->pData, pValue->nData);
|
return tPutBinary(p, pValue->pData, pValue->nData);
|
||||||
} else {
|
} else {
|
||||||
|
@ -65,20 +65,6 @@ int32_t tPutValue(uint8_t *p, SValue *pValue, int8_t type) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type) {
|
|
||||||
if (IS_VAR_DATA_TYPE(type)) {
|
|
||||||
return tGetBinary(p, &pValue->pData, pValue ? &pValue->nData : NULL);
|
|
||||||
} else {
|
|
||||||
memcpy(&pValue->val, p, tDataTypes[type].bytes);
|
|
||||||
return tDataTypes[type].bytes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int tValueCmprFn(const SValue *pValue1, const SValue *pValue2, int8_t type) {
|
|
||||||
// TODO
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// STSRow2 ========================================================================
|
// STSRow2 ========================================================================
|
||||||
static void setBitMap(uint8_t *pb, uint8_t v, int32_t idx, uint8_t flags) {
|
static void setBitMap(uint8_t *pb, uint8_t v, int32_t idx, uint8_t flags) {
|
||||||
if (pb) {
|
if (pb) {
|
||||||
|
@ -1164,31 +1150,27 @@ static FORCE_INLINE int32_t tColDataPutValue(SColData *pColData, SColVal *pColVa
|
||||||
ASSERT(pColData->nData == tDataTypes[pColData->type].bytes * pColData->nVal);
|
ASSERT(pColData->nData == tDataTypes[pColData->type].bytes * pColData->nVal);
|
||||||
code = tRealloc(&pColData->pData, pColData->nData + tDataTypes[pColData->type].bytes);
|
code = tRealloc(&pColData->pData, pColData->nData + tDataTypes[pColData->type].bytes);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
pColData->nData += tPutValue(pColData->pData + pColData->nData, &pColVal->value, pColVal->type);
|
memcpy(pColData->pData + pColData->nData, &pColVal->value.val, tDataTypes[pColData->type].bytes);
|
||||||
|
pColData->nData += tDataTypes[pColData->type].bytes;
|
||||||
}
|
}
|
||||||
|
pColData->nVal++;
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue00(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue00(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
|
||||||
pColData->flag = HAS_VALUE;
|
pColData->flag = HAS_VALUE;
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
pColData->nVal++;
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue01(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue01(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
|
||||||
pColData->flag = HAS_NONE;
|
pColData->flag = HAS_NONE;
|
||||||
pColData->nVal++;
|
pColData->nVal++;
|
||||||
return code;
|
return 0;
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue02(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue02(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
|
||||||
pColData->flag = HAS_NULL;
|
pColData->flag = HAS_NULL;
|
||||||
pColData->nVal++;
|
pColData->nVal++;
|
||||||
return code;
|
return 0;
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue10(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue10(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1216,16 +1198,11 @@ static FORCE_INLINE int32_t tColDataAppendValue10(SColData *pColData, SColVal *p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue11(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue11(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
|
||||||
pColData->nVal++;
|
pColData->nVal++;
|
||||||
return code;
|
return 0;
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue12(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue12(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1268,11 +1245,7 @@ static FORCE_INLINE int32_t tColDataAppendValue20(SColData *pColData, SColVal *p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue21(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue21(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1290,9 +1263,8 @@ static FORCE_INLINE int32_t tColDataAppendValue21(SColData *pColData, SColVal *p
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue22(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue22(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
|
||||||
pColData->nVal++;
|
pColData->nVal++;
|
||||||
return code;
|
return 0;
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue30(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue30(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1325,11 +1297,7 @@ static FORCE_INLINE int32_t tColDataAppendValue30(SColData *pColData, SColVal *p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue31(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue31(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1353,15 +1321,7 @@ static FORCE_INLINE int32_t tColDataAppendValue32(SColData *pColData, SColVal *p
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue40(SColData *pColData, SColVal *pColVal) {
|
#define tColDataAppendValue40 tColDataPutValue
|
||||||
int32_t code = 0;
|
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
|
||||||
if (code) return code;
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue41(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue41(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
@ -1374,12 +1334,7 @@ static FORCE_INLINE int32_t tColDataAppendValue41(SColData *pColData, SColVal *p
|
||||||
memset(pColData->pBitMap, 255, nBit);
|
memset(pColData->pBitMap, 255, nBit);
|
||||||
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue42(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue42(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1393,12 +1348,7 @@ static FORCE_INLINE int32_t tColDataAppendValue42(SColData *pColData, SColVal *p
|
||||||
memset(pColData->pBitMap, 255, nBit);
|
memset(pColData->pBitMap, 255, nBit);
|
||||||
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue50(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue50(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1408,12 +1358,7 @@ static FORCE_INLINE int32_t tColDataAppendValue50(SColData *pColData, SColVal *p
|
||||||
|
|
||||||
SET_BIT1(pColData->pBitMap, pColData->nVal, 1);
|
SET_BIT1(pColData->pBitMap, pColData->nVal, 1);
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue51(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue51(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1423,12 +1368,7 @@ static FORCE_INLINE int32_t tColDataAppendValue51(SColData *pColData, SColVal *p
|
||||||
|
|
||||||
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue52(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue52(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1447,12 +1387,7 @@ static FORCE_INLINE int32_t tColDataAppendValue52(SColData *pColData, SColVal *p
|
||||||
tFree(pColData->pBitMap);
|
tFree(pColData->pBitMap);
|
||||||
pColData->pBitMap = pBitMap;
|
pColData->pBitMap = pBitMap;
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue60(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue60(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1461,12 +1396,7 @@ static FORCE_INLINE int32_t tColDataAppendValue60(SColData *pColData, SColVal *p
|
||||||
if (code) return code;
|
if (code) return code;
|
||||||
SET_BIT1(pColData->pBitMap, pColData->nVal, 1);
|
SET_BIT1(pColData->pBitMap, pColData->nVal, 1);
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue61(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue61(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1485,12 +1415,7 @@ static FORCE_INLINE int32_t tColDataAppendValue61(SColData *pColData, SColVal *p
|
||||||
tFree(pColData->pBitMap);
|
tFree(pColData->pBitMap);
|
||||||
pColData->pBitMap = pBitMap;
|
pColData->pBitMap = pBitMap;
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue62(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue62(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1499,12 +1424,7 @@ static FORCE_INLINE int32_t tColDataAppendValue62(SColData *pColData, SColVal *p
|
||||||
if (code) return code;
|
if (code) return code;
|
||||||
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue70(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue70(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1513,12 +1433,7 @@ static FORCE_INLINE int32_t tColDataAppendValue70(SColData *pColData, SColVal *p
|
||||||
if (code) return code;
|
if (code) return code;
|
||||||
SET_BIT2(pColData->pBitMap, pColData->nVal, 2);
|
SET_BIT2(pColData->pBitMap, pColData->nVal, 2);
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue71(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue71(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1527,12 +1442,7 @@ static FORCE_INLINE int32_t tColDataAppendValue71(SColData *pColData, SColVal *p
|
||||||
if (code) return code;
|
if (code) return code;
|
||||||
SET_BIT2(pColData->pBitMap, pColData->nVal, 0);
|
SET_BIT2(pColData->pBitMap, pColData->nVal, 0);
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static FORCE_INLINE int32_t tColDataAppendValue72(SColData *pColData, SColVal *pColVal) {
|
static FORCE_INLINE int32_t tColDataAppendValue72(SColData *pColData, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1541,12 +1451,7 @@ static FORCE_INLINE int32_t tColDataAppendValue72(SColData *pColData, SColVal *p
|
||||||
if (code) return code;
|
if (code) return code;
|
||||||
SET_BIT2(pColData->pBitMap, pColData->nVal, 1);
|
SET_BIT2(pColData->pBitMap, pColData->nVal, 1);
|
||||||
|
|
||||||
code = tColDataPutValue(pColData, pColVal);
|
return tColDataPutValue(pColData, pColVal);
|
||||||
if (code) return code;
|
|
||||||
|
|
||||||
pColData->nVal++;
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
static int32_t (*tColDataAppendValueImpl[8][3])(SColData *pColData, SColVal *pColVal) = {
|
static int32_t (*tColDataAppendValueImpl[8][3])(SColData *pColData, SColVal *pColVal) = {
|
||||||
{tColDataAppendValue00, tColDataAppendValue01, tColDataAppendValue02}, // 0
|
{tColDataAppendValue00, tColDataAppendValue01, tColDataAppendValue02}, // 0
|
||||||
|
@ -1723,3 +1628,385 @@ int32_t tColDataCopy(SColData *pColDataSrc, SColData *pColDataDest) {
|
||||||
_exit:
|
_exit:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CALC_SUM_MAX_MIN(SUM, MAX, MIN, VAL) \
|
||||||
|
do { \
|
||||||
|
(SUM) += (VAL); \
|
||||||
|
if ((MAX) < (VAL)) (MAX) = (VAL); \
|
||||||
|
if ((MIN) > (VAL)) (MIN) = (VAL); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
static FORCE_INLINE void tColDataCalcSMABool(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
|
||||||
|
int16_t *numOfNull) {
|
||||||
|
*sum = 0;
|
||||||
|
*max = 0;
|
||||||
|
*min = 1;
|
||||||
|
*numOfNull = 0;
|
||||||
|
|
||||||
|
int8_t val;
|
||||||
|
if (HAS_VALUE == pColData->flag) {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
|
||||||
|
CALC_SUM_MAX_MIN(*sum, *max, *min, val);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
switch (tColDataGetBitValue(pColData, iVal)) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
(*numOfNull)++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
|
||||||
|
CALC_SUM_MAX_MIN(*sum, *max, *min, val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void tColDataCalcSMATinyInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
|
||||||
|
int16_t *numOfNull) {
|
||||||
|
*sum = 0;
|
||||||
|
*max = INT8_MIN;
|
||||||
|
*min = INT8_MAX;
|
||||||
|
*numOfNull = 0;
|
||||||
|
|
||||||
|
int8_t val;
|
||||||
|
if (HAS_VALUE == pColData->flag) {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
val = ((int8_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*sum, *max, *min, val);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
switch (tColDataGetBitValue(pColData, iVal)) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
(*numOfNull)++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
val = ((int8_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*sum, *max, *min, val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void tColDataCalcSMATinySmallInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
|
||||||
|
int16_t *numOfNull) {
|
||||||
|
*sum = 0;
|
||||||
|
*max = INT16_MIN;
|
||||||
|
*min = INT16_MAX;
|
||||||
|
*numOfNull = 0;
|
||||||
|
|
||||||
|
int16_t val;
|
||||||
|
if (HAS_VALUE == pColData->flag) {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
val = ((int16_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*sum, *max, *min, val);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
switch (tColDataGetBitValue(pColData, iVal)) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
(*numOfNull)++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
val = ((int16_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*sum, *max, *min, val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void tColDataCalcSMAInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
|
||||||
|
int16_t *numOfNull) {
|
||||||
|
*sum = 0;
|
||||||
|
*max = INT32_MIN;
|
||||||
|
*min = INT32_MAX;
|
||||||
|
*numOfNull = 0;
|
||||||
|
|
||||||
|
int32_t val;
|
||||||
|
if (HAS_VALUE == pColData->flag) {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
val = ((int32_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*sum, *max, *min, val);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
switch (tColDataGetBitValue(pColData, iVal)) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
(*numOfNull)++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
val = ((int32_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*sum, *max, *min, val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void tColDataCalcSMABigInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
|
||||||
|
int16_t *numOfNull) {
|
||||||
|
*sum = 0;
|
||||||
|
*max = INT64_MIN;
|
||||||
|
*min = INT64_MAX;
|
||||||
|
*numOfNull = 0;
|
||||||
|
|
||||||
|
int64_t val;
|
||||||
|
if (HAS_VALUE == pColData->flag) {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
val = ((int64_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*sum, *max, *min, val);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
switch (tColDataGetBitValue(pColData, iVal)) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
(*numOfNull)++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
val = ((int64_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*sum, *max, *min, val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void tColDataCalcSMAFloat(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
|
||||||
|
int16_t *numOfNull) {
|
||||||
|
*(double *)sum = 0;
|
||||||
|
*(double *)max = -FLT_MAX;
|
||||||
|
*(double *)min = FLT_MAX;
|
||||||
|
*numOfNull = 0;
|
||||||
|
|
||||||
|
float val;
|
||||||
|
if (HAS_VALUE == pColData->flag) {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
val = ((float *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
switch (tColDataGetBitValue(pColData, iVal)) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
(*numOfNull)++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
val = ((float *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void tColDataCalcSMADouble(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
|
||||||
|
int16_t *numOfNull) {
|
||||||
|
*(double *)sum = 0;
|
||||||
|
*(double *)max = -DBL_MAX;
|
||||||
|
*(double *)min = DBL_MAX;
|
||||||
|
*numOfNull = 0;
|
||||||
|
|
||||||
|
double val;
|
||||||
|
if (HAS_VALUE == pColData->flag) {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
val = ((double *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
switch (tColDataGetBitValue(pColData, iVal)) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
(*numOfNull)++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
val = ((double *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void tColDataCalcSMAUTinyInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
|
||||||
|
int16_t *numOfNull) {
|
||||||
|
*(uint64_t *)sum = 0;
|
||||||
|
*(uint64_t *)max = 0;
|
||||||
|
*(uint64_t *)min = UINT8_MAX;
|
||||||
|
*numOfNull = 0;
|
||||||
|
|
||||||
|
uint8_t val;
|
||||||
|
if (HAS_VALUE == pColData->flag) {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
val = ((uint8_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
switch (tColDataGetBitValue(pColData, iVal)) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
(*numOfNull)++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
val = ((uint8_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void tColDataCalcSMATinyUSmallInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
|
||||||
|
int16_t *numOfNull) {
|
||||||
|
*(uint64_t *)sum = 0;
|
||||||
|
*(uint64_t *)max = 0;
|
||||||
|
*(uint64_t *)min = UINT16_MAX;
|
||||||
|
*numOfNull = 0;
|
||||||
|
|
||||||
|
uint16_t val;
|
||||||
|
if (HAS_VALUE == pColData->flag) {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
val = ((uint16_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
switch (tColDataGetBitValue(pColData, iVal)) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
(*numOfNull)++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
val = ((uint16_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void tColDataCalcSMAUInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
|
||||||
|
int16_t *numOfNull) {
|
||||||
|
*(uint64_t *)sum = 0;
|
||||||
|
*(uint64_t *)max = 0;
|
||||||
|
*(uint64_t *)min = UINT32_MAX;
|
||||||
|
*numOfNull = 0;
|
||||||
|
|
||||||
|
uint32_t val;
|
||||||
|
if (HAS_VALUE == pColData->flag) {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
val = ((uint32_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
switch (tColDataGetBitValue(pColData, iVal)) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
(*numOfNull)++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
val = ((uint32_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void tColDataCalcSMAUBigInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
|
||||||
|
int16_t *numOfNull) {
|
||||||
|
*(uint64_t *)sum = 0;
|
||||||
|
*(uint64_t *)max = 0;
|
||||||
|
*(uint64_t *)min = UINT64_MAX;
|
||||||
|
*numOfNull = 0;
|
||||||
|
|
||||||
|
uint64_t val;
|
||||||
|
if (HAS_VALUE == pColData->flag) {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
val = ((uint64_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
switch (tColDataGetBitValue(pColData, iVal)) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
(*numOfNull)++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
val = ((uint64_t *)pColData->pData)[iVal];
|
||||||
|
CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min, int16_t *numOfNull) = {
|
||||||
|
NULL,
|
||||||
|
tColDataCalcSMABool, // TSDB_DATA_TYPE_BOOL
|
||||||
|
tColDataCalcSMATinyInt, // TSDB_DATA_TYPE_TINYINT
|
||||||
|
tColDataCalcSMATinySmallInt, // TSDB_DATA_TYPE_SMALLINT
|
||||||
|
tColDataCalcSMAInt, // TSDB_DATA_TYPE_INT
|
||||||
|
tColDataCalcSMABigInt, // TSDB_DATA_TYPE_BIGINT
|
||||||
|
tColDataCalcSMAFloat, // TSDB_DATA_TYPE_FLOAT
|
||||||
|
tColDataCalcSMADouble, // TSDB_DATA_TYPE_DOUBLE
|
||||||
|
NULL, // TSDB_DATA_TYPE_VARCHAR
|
||||||
|
tColDataCalcSMABigInt, // TSDB_DATA_TYPE_TIMESTAMP
|
||||||
|
NULL, // TSDB_DATA_TYPE_NCHAR
|
||||||
|
tColDataCalcSMAUTinyInt, // TSDB_DATA_TYPE_UTINYINT
|
||||||
|
tColDataCalcSMATinyUSmallInt, // TSDB_DATA_TYPE_USMALLINT
|
||||||
|
tColDataCalcSMAUInt, // TSDB_DATA_TYPE_UINT
|
||||||
|
tColDataCalcSMAUBigInt, // TSDB_DATA_TYPE_UBIGINT
|
||||||
|
NULL, // TSDB_DATA_TYPE_JSON
|
||||||
|
NULL, // TSDB_DATA_TYPE_VARBINARY
|
||||||
|
NULL, // TSDB_DATA_TYPE_DECIMAL
|
||||||
|
NULL, // TSDB_DATA_TYPE_BLOB
|
||||||
|
NULL // TSDB_DATA_TYPE_MEDIUMBLOB
|
||||||
|
};
|
||||||
|
|
|
@ -2238,6 +2238,7 @@ int32_t tSerializeSUseDbReq(void *buf, int32_t bufLen, SUseDbReq *pReq) {
|
||||||
if (tEncodeI64(&encoder, pReq->dbId) < 0) return -1;
|
if (tEncodeI64(&encoder, pReq->dbId) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->vgVersion) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->vgVersion) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->numOfTable) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->numOfTable) < 0) return -1;
|
||||||
|
if (tEncodeI64(&encoder, pReq->stateTs) < 0) return -1;
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
int32_t tlen = encoder.pos;
|
int32_t tlen = encoder.pos;
|
||||||
|
@ -2254,6 +2255,7 @@ int32_t tDeserializeSUseDbReq(void *buf, int32_t bufLen, SUseDbReq *pReq) {
|
||||||
if (tDecodeI64(&decoder, &pReq->dbId) < 0) return -1;
|
if (tDecodeI64(&decoder, &pReq->dbId) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->vgVersion) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->vgVersion) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->numOfTable) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->numOfTable) < 0) return -1;
|
||||||
|
if (tDecodeI64(&decoder, &pReq->stateTs) < 0) return -1;
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
|
@ -2489,6 +2491,8 @@ int32_t tSerializeSUseDbRspImp(SEncoder *pEncoder, const SUseDbRsp *pRsp) {
|
||||||
if (tEncodeI32(pEncoder, pVgInfo->numOfTable) < 0) return -1;
|
if (tEncodeI32(pEncoder, pVgInfo->numOfTable) < 0) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tEncodeI32(pEncoder, pRsp->errCode) < 0) return -1;
|
||||||
|
if (tEncodeI64(pEncoder, pRsp->stateTs) < 0) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2553,6 +2557,8 @@ int32_t tDeserializeSUseDbRspImp(SDecoder *pDecoder, SUseDbRsp *pRsp) {
|
||||||
taosArrayPush(pRsp->pVgroupInfos, &vgInfo);
|
taosArrayPush(pRsp->pVgroupInfos, &vgInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tDecodeI32(pDecoder, &pRsp->errCode) < 0) return -1;
|
||||||
|
if (tDecodeI64(pDecoder, &pRsp->stateTs) < 0) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6129,13 +6135,13 @@ void tDeleteSTaosxRsp(STaosxRsp *pRsp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tEncodeSSingleDeleteReq(SEncoder *pEncoder, const SSingleDeleteReq *pReq) {
|
int32_t tEncodeSSingleDeleteReq(SEncoder *pEncoder, const SSingleDeleteReq *pReq) {
|
||||||
if (tEncodeI64(pEncoder, pReq->uid) < 0) return -1;
|
if (tEncodeCStr(pEncoder, pReq->tbname) < 0) return -1;
|
||||||
if (tEncodeI64(pEncoder, pReq->ts) < 0) return -1;
|
if (tEncodeI64(pEncoder, pReq->ts) < 0) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tDecodeSSingleDeleteReq(SDecoder *pDecoder, SSingleDeleteReq *pReq) {
|
int32_t tDecodeSSingleDeleteReq(SDecoder *pDecoder, SSingleDeleteReq *pReq) {
|
||||||
if (tDecodeI64(pDecoder, &pReq->uid) < 0) return -1;
|
if (tDecodeCStrTo(pDecoder, pReq->tbname) < 0) return -1;
|
||||||
if (tDecodeI64(pDecoder, &pReq->ts) < 0) return -1;
|
if (tDecodeI64(pDecoder, &pReq->ts) < 0) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1083,13 +1083,15 @@ void tTSRowGetVal(STSRow *pRow, STSchema *pTSchema, int16_t iCol, SColVal *pColV
|
||||||
} else if (tdValTypeIsNull(cv.valType)) {
|
} else if (tdValTypeIsNull(cv.valType)) {
|
||||||
*pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
|
*pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
|
||||||
} else {
|
} else {
|
||||||
if (IS_VAR_DATA_TYPE(pTColumn->type)) {
|
pColVal->cid = pTColumn->colId;
|
||||||
value.nData = varDataLen(cv.val);
|
pColVal->type = pTColumn->type;
|
||||||
value.pData = varDataVal(cv.val);
|
pColVal->flag = CV_FLAG_VALUE;
|
||||||
} else {
|
|
||||||
tGetValue(cv.val, &value, pTColumn->type);
|
|
||||||
}
|
|
||||||
|
|
||||||
*pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, value);
|
if (IS_VAR_DATA_TYPE(pTColumn->type)) {
|
||||||
|
pColVal->value.nData = varDataLen(cv.val);
|
||||||
|
pColVal->value.pData = varDataVal(cv.val);
|
||||||
|
} else {
|
||||||
|
memcpy(&pColVal->value.val, cv.val, tDataTypes[pTColumn->type].bytes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -91,7 +91,7 @@ SArray *mmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_SNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_SNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_DND_CREATE_VNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_DND_CREATE_VNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_VNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_VNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_DND_CONFIG_DNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_DND_CONFIG_DNODE_RSP, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
|
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_CONNECT, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_CONNECT, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_ACCT, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_ACCT, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
|
@ -102,7 +102,7 @@ SArray *mmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_USER, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_USER, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_GET_USER_AUTH, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_GET_USER_AUTH, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_DNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_DNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_CONFIG_DNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_CONFIG_DNODE, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_DNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_DNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_MNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_MNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_ALTER_MNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_ALTER_MNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
|
@ -116,7 +116,7 @@ SArray *mmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_SNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_SNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_USE_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_USE_DB, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_ALTER_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_ALTER_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_COMPACT_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_COMPACT_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_TRIM_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_TRIM_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
|
@ -127,7 +127,7 @@ SArray *mmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_SPLIT_VGROUP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_SPLIT_VGROUP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_BALANCE_VGROUP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_BALANCE_VGROUP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_FUNC, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_FUNC, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_RETRIEVE_FUNC, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_RETRIEVE_FUNC, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_FUNC, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_FUNC, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_STB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_STB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_ALTER_STB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_ALTER_STB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
|
@ -151,7 +151,7 @@ SArray *mmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_KILL_TRANS, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_KILL_TRANS, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_KILL_QUERY, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_KILL_QUERY, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_KILL_CONN, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_KILL_CONN, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_HEARTBEAT, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_HEARTBEAT, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_STATUS, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_STATUS, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_SYSTABLE_RETRIEVE, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_SYSTABLE_RETRIEVE, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_AUTH, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_AUTH, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
|
|
|
@ -191,6 +191,16 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
dInfo("vgId:%d, replica:%d id:%d fqdn:%s port:%u", req.vgId, i, req.replicas[i].id, req.replicas[i].fqdn,
|
dInfo("vgId:%d, replica:%d id:%d fqdn:%s port:%u", req.vgId, i, req.replicas[i].id, req.replicas[i].fqdn,
|
||||||
req.replicas[i].port);
|
req.replicas[i].port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SReplica *pReplica = &req.replicas[req.selfIndex];
|
||||||
|
if (pReplica->id != pMgmt->pData->dnodeId || pReplica->port != tsServerPort ||
|
||||||
|
strcmp(pReplica->fqdn, tsLocalFqdn) != 0) {
|
||||||
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
dError("vgId:%d, dnodeId:%d ep:%s:%u not matched with local dnode", req.vgId, pReplica->id, pReplica->fqdn,
|
||||||
|
pReplica->port);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
vmGenerateVnodeCfg(&req, &vnodeCfg);
|
vmGenerateVnodeCfg(&req, &vnodeCfg);
|
||||||
|
|
||||||
if (vmTsmaAdjustDays(&vnodeCfg, &req) < 0) {
|
if (vmTsmaAdjustDays(&vnodeCfg, &req) < 0) {
|
||||||
|
@ -285,6 +295,15 @@ int32_t vmProcessAlterVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SReplica *pReplica = &alterReq.replicas[alterReq.selfIndex];
|
||||||
|
if (pReplica->id != pMgmt->pData->dnodeId || pReplica->port != tsServerPort ||
|
||||||
|
strcmp(pReplica->fqdn, tsLocalFqdn) != 0) {
|
||||||
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
dError("vgId:%d, dnodeId:%d ep:%s:%u not matched with local dnode", alterReq.vgId, pReplica->id, pReplica->fqdn,
|
||||||
|
pReplica->port);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, vgId);
|
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, vgId);
|
||||||
if (pVnode == NULL) {
|
if (pVnode == NULL) {
|
||||||
dError("vgId:%d, failed to alter replica since %s", vgId, terrstr());
|
dError("vgId:%d, failed to alter replica since %s", vgId, terrstr());
|
||||||
|
@ -341,6 +360,12 @@ int32_t vmProcessDropVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
int32_t vgId = dropReq.vgId;
|
int32_t vgId = dropReq.vgId;
|
||||||
dDebug("vgId:%d, start to drop vnode", vgId);
|
dDebug("vgId:%d, start to drop vnode", vgId);
|
||||||
|
|
||||||
|
if (dropReq.dnodeId != pMgmt->pData->dnodeId) {
|
||||||
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
dError("vgId:%d, dnodeId:%d not matched with local dnode", dropReq.vgId, dropReq.dnodeId);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, vgId);
|
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, vgId);
|
||||||
if (pVnode == NULL) {
|
if (pVnode == NULL) {
|
||||||
dDebug("vgId:%d, failed to drop since %s", vgId, terrstr());
|
dDebug("vgId:%d, failed to drop since %s", vgId, terrstr());
|
||||||
|
|
|
@ -145,7 +145,6 @@ static int32_t vmPutMsgToQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg, EQueueType qtyp
|
||||||
|
|
||||||
pHead->contLen = ntohl(pHead->contLen);
|
pHead->contLen = ntohl(pHead->contLen);
|
||||||
pHead->vgId = ntohl(pHead->vgId);
|
pHead->vgId = ntohl(pHead->vgId);
|
||||||
pHead->msgMask = ntohl(pHead->msgMask);
|
|
||||||
|
|
||||||
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, pHead->vgId);
|
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, pHead->vgId);
|
||||||
if (pVnode == NULL) {
|
if (pVnode == NULL) {
|
||||||
|
@ -156,12 +155,10 @@ static int32_t vmPutMsgToQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg, EQueueType qtyp
|
||||||
|
|
||||||
switch (qtype) {
|
switch (qtype) {
|
||||||
case QUERY_QUEUE:
|
case QUERY_QUEUE:
|
||||||
if ((pMsg->msgType == TDMT_SCH_QUERY) && (grantCheck(TSDB_GRANT_TIME) != TSDB_CODE_SUCCESS) && !TEST_SHOW_REWRITE_MASK(pHead->msgMask)) {
|
code = vnodePreprocessQueryMsg(pVnode->pImpl, pMsg);
|
||||||
terrno = TSDB_CODE_GRANT_EXPIRED;
|
if (code) {
|
||||||
code = terrno;
|
dError("vgId:%d, msg:%p preprocess query msg failed since %s", pVnode->vgId, pMsg, terrstr(code));
|
||||||
dDebug("vgId:%d, msg:%p put into vnode-query queue failed since %s", pVnode->vgId, pMsg, terrstr(code));
|
|
||||||
} else {
|
} else {
|
||||||
vnodePreprocessQueryMsg(pVnode->pImpl, pMsg);
|
|
||||||
dGTrace("vgId:%d, msg:%p put into vnode-query queue", pVnode->vgId, pMsg);
|
dGTrace("vgId:%d, msg:%p put into vnode-query queue", pVnode->vgId, pMsg);
|
||||||
taosWriteQitem(pVnode->pQueryQ, pMsg);
|
taosWriteQitem(pVnode->pQueryQ, pMsg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -321,6 +321,7 @@ typedef struct {
|
||||||
int32_t vgVersion;
|
int32_t vgVersion;
|
||||||
SDbCfg cfg;
|
SDbCfg cfg;
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
|
int64_t stateTs;
|
||||||
} SDbObj;
|
} SDbObj;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -285,8 +285,17 @@ static inline int32_t mndGetGlobalVgroupVersion(SMnode *pMnode) {
|
||||||
SDbObj *mndAcquireDb(SMnode *pMnode, const char *db) {
|
SDbObj *mndAcquireDb(SMnode *pMnode, const char *db) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
SDbObj *pDb = sdbAcquire(pSdb, SDB_DB, db);
|
SDbObj *pDb = sdbAcquire(pSdb, SDB_DB, db);
|
||||||
if (pDb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
|
if (pDb == NULL) {
|
||||||
|
if (terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
|
||||||
terrno = TSDB_CODE_MND_DB_NOT_EXIST;
|
terrno = TSDB_CODE_MND_DB_NOT_EXIST;
|
||||||
|
} else if (terrno == TSDB_CODE_SDB_OBJ_CREATING) {
|
||||||
|
terrno = TSDB_CODE_MND_DB_IN_CREATING;
|
||||||
|
} else if (terrno == TSDB_CODE_SDB_OBJ_DROPPING) {
|
||||||
|
terrno = TSDB_CODE_MND_DB_IN_DROPPING;
|
||||||
|
} else {
|
||||||
|
terrno = TSDB_CODE_APP_ERROR;
|
||||||
|
mFatal("db:%s, failed to acquire db since %s", db, terrstr());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return pDb;
|
return pDb;
|
||||||
}
|
}
|
||||||
|
@ -594,7 +603,8 @@ static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) {
|
||||||
terrno = TSDB_CODE_MND_DB_ALREADY_EXIST;
|
terrno = TSDB_CODE_MND_DB_ALREADY_EXIST;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
} else if (terrno == TSDB_CODE_SDB_OBJ_CREATING) {
|
} else {
|
||||||
|
if (terrno == TSDB_CODE_MND_DB_IN_CREATING) {
|
||||||
if (mndSetRpcInfoForDbTrans(pMnode, pReq, MND_OPER_CREATE_DB, createReq.db) == 0) {
|
if (mndSetRpcInfoForDbTrans(pMnode, pReq, MND_OPER_CREATE_DB, createReq.db) == 0) {
|
||||||
mInfo("db:%s, is creating and response after trans finished", createReq.db);
|
mInfo("db:%s, is creating and response after trans finished", createReq.db);
|
||||||
code = TSDB_CODE_ACTION_IN_PROGRESS;
|
code = TSDB_CODE_ACTION_IN_PROGRESS;
|
||||||
|
@ -602,8 +612,13 @@ static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) {
|
||||||
} else {
|
} else {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
} else if (terrno != TSDB_CODE_MND_DB_NOT_EXIST) {
|
} else if (terrno == TSDB_CODE_MND_DB_IN_DROPPING) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
|
} else if (terrno == TSDB_CODE_MND_DB_NOT_EXIST) {
|
||||||
|
// continue
|
||||||
|
} else { // TSDB_CODE_APP_ERROR
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pUser = mndAcquireUser(pMnode, pReq->info.conn.user);
|
pUser = mndAcquireUser(pMnode, pReq->info.conn.user);
|
||||||
|
@ -786,7 +801,6 @@ static int32_t mndProcessAlterDbReq(SRpcMsg *pReq) {
|
||||||
|
|
||||||
pDb = mndAcquireDb(pMnode, alterReq.db);
|
pDb = mndAcquireDb(pMnode, alterReq.db);
|
||||||
if (pDb == NULL) {
|
if (pDb == NULL) {
|
||||||
terrno = TSDB_CODE_MND_DB_NOT_EXIST;
|
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -836,7 +850,6 @@ static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq) {
|
||||||
|
|
||||||
pDb = mndAcquireDb(pMnode, cfgReq.db);
|
pDb = mndAcquireDb(pMnode, cfgReq.db);
|
||||||
if (pDb == NULL) {
|
if (pDb == NULL) {
|
||||||
terrno = TSDB_CODE_MND_DB_NOT_EXIST;
|
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1066,11 +1079,8 @@ static int32_t mndProcessDropDbReq(SRpcMsg *pReq) {
|
||||||
if (pDb == NULL) {
|
if (pDb == NULL) {
|
||||||
if (dropReq.ignoreNotExists) {
|
if (dropReq.ignoreNotExists) {
|
||||||
code = mndBuildDropDbRsp(pDb, &pReq->info.rspLen, &pReq->info.rsp, true);
|
code = mndBuildDropDbRsp(pDb, &pReq->info.rspLen, &pReq->info.rsp, true);
|
||||||
goto _OVER;
|
|
||||||
} else {
|
|
||||||
terrno = TSDB_CODE_MND_DB_NOT_EXIST;
|
|
||||||
goto _OVER;
|
|
||||||
}
|
}
|
||||||
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_DB, pDb) != 0) {
|
if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_DB, pDb) != 0) {
|
||||||
|
@ -1172,6 +1182,7 @@ int32_t mndExtractDbInfo(SMnode *pMnode, SDbObj *pDb, SUseDbRsp *pRsp, const SUs
|
||||||
memcpy(pRsp->db, pDb->name, TSDB_DB_FNAME_LEN);
|
memcpy(pRsp->db, pDb->name, TSDB_DB_FNAME_LEN);
|
||||||
pRsp->uid = pDb->uid;
|
pRsp->uid = pDb->uid;
|
||||||
pRsp->vgVersion = pDb->vgVersion;
|
pRsp->vgVersion = pDb->vgVersion;
|
||||||
|
pRsp->stateTs = pDb->stateTs;
|
||||||
pRsp->vgNum = taosArrayGetSize(pRsp->pVgroupInfos);
|
pRsp->vgNum = taosArrayGetSize(pRsp->pVgroupInfos);
|
||||||
pRsp->hashMethod = pDb->cfg.hashMethod;
|
pRsp->hashMethod = pDb->cfg.hashMethod;
|
||||||
pRsp->hashPrefix = pDb->cfg.hashPrefix;
|
pRsp->hashPrefix = pDb->cfg.hashPrefix;
|
||||||
|
@ -1197,10 +1208,7 @@ static int32_t mndProcessUseDbReq(SRpcMsg *pReq) {
|
||||||
int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
|
int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
|
||||||
if (usedbReq.vgVersion < vgVersion) {
|
if (usedbReq.vgVersion < vgVersion) {
|
||||||
usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
|
usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
|
||||||
if (usedbRsp.pVgroupInfos == NULL) {
|
if (usedbRsp.pVgroupInfos == NULL) goto _OVER;
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto _OVER;
|
|
||||||
}
|
|
||||||
|
|
||||||
mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
|
mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
|
||||||
usedbRsp.vgVersion = vgVersion++;
|
usedbRsp.vgVersion = vgVersion++;
|
||||||
|
@ -1209,16 +1217,13 @@ static int32_t mndProcessUseDbReq(SRpcMsg *pReq) {
|
||||||
}
|
}
|
||||||
usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
|
usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
|
||||||
code = 0;
|
code = 0;
|
||||||
|
|
||||||
// no jump, need to construct rsp
|
|
||||||
} else {
|
} else {
|
||||||
pDb = mndAcquireDb(pMnode, usedbReq.db);
|
pDb = mndAcquireDb(pMnode, usedbReq.db);
|
||||||
if (pDb == NULL) {
|
if (pDb == NULL) {
|
||||||
terrno = TSDB_CODE_MND_DB_NOT_EXIST;
|
|
||||||
|
|
||||||
memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
|
memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
|
||||||
usedbRsp.uid = usedbReq.dbId;
|
usedbRsp.uid = usedbReq.dbId;
|
||||||
usedbRsp.vgVersion = usedbReq.vgVersion;
|
usedbRsp.vgVersion = usedbReq.vgVersion;
|
||||||
|
usedbRsp.errCode = terrno;
|
||||||
|
|
||||||
mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
|
mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
|
||||||
} else {
|
} else {
|
||||||
|
@ -1230,6 +1235,8 @@ static int32_t mndProcessUseDbReq(SRpcMsg *pReq) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mDebug("db:%s, process usedb req vgVersion:%d stateTs:%" PRId64 ", rsp vgVersion:%d stateTs:%" PRId64,
|
||||||
|
usedbReq.db, usedbReq.vgVersion, usedbReq.stateTs, usedbRsp.vgVersion, usedbRsp.stateTs);
|
||||||
code = 0;
|
code = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1286,13 +1293,19 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs,
|
||||||
|
|
||||||
int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
|
int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
|
||||||
|
|
||||||
if (pDbVgVersion->vgVersion >= pDb->vgVersion && numOfTable == pDbVgVersion->numOfTable) {
|
if (pDbVgVersion->vgVersion >= pDb->vgVersion && numOfTable == pDbVgVersion->numOfTable /* &&
|
||||||
mInfo("db:%s, version and numOfTable not changed", pDbVgVersion->dbFName);
|
pDbVgVersion->stateTs == pDb->stateTs */) {
|
||||||
|
mTrace("db:%s, valid dbinfo, vgVersion:%d stateTs:%" PRId64
|
||||||
|
" numOfTables:%d, not changed vgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
|
||||||
|
pDbVgVersion->dbFName, pDbVgVersion->vgVersion, pDbVgVersion->stateTs, pDbVgVersion->numOfTable,
|
||||||
|
pDb->vgVersion, pDb->stateTs, numOfTable);
|
||||||
mndReleaseDb(pMnode, pDb);
|
mndReleaseDb(pMnode, pDb);
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
mInfo("db:%s, vgroup version changed from %d to %d", pDbVgVersion->dbFName, pDbVgVersion->vgVersion,
|
mInfo("db:%s, valid dbinfo, vgVersion:%d stateTs:%" PRId64
|
||||||
pDb->vgVersion);
|
" numOfTables:%d, changed to vgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
|
||||||
|
pDbVgVersion->dbFName, pDbVgVersion->vgVersion, pDbVgVersion->stateTs, pDbVgVersion->numOfTable,
|
||||||
|
pDb->vgVersion, pDb->stateTs, numOfTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
usedbRsp.pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
|
usedbRsp.pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
|
||||||
|
@ -1306,6 +1319,7 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs,
|
||||||
memcpy(usedbRsp.db, pDb->name, TSDB_DB_FNAME_LEN);
|
memcpy(usedbRsp.db, pDb->name, TSDB_DB_FNAME_LEN);
|
||||||
usedbRsp.uid = pDb->uid;
|
usedbRsp.uid = pDb->uid;
|
||||||
usedbRsp.vgVersion = pDb->vgVersion;
|
usedbRsp.vgVersion = pDb->vgVersion;
|
||||||
|
usedbRsp.stateTs = pDb->stateTs;
|
||||||
usedbRsp.vgNum = (int32_t)taosArrayGetSize(usedbRsp.pVgroupInfos);
|
usedbRsp.vgNum = (int32_t)taosArrayGetSize(usedbRsp.pVgroupInfos);
|
||||||
usedbRsp.hashMethod = pDb->cfg.hashMethod;
|
usedbRsp.hashMethod = pDb->cfg.hashMethod;
|
||||||
usedbRsp.hashPrefix = pDb->cfg.hashPrefix;
|
usedbRsp.hashPrefix = pDb->cfg.hashPrefix;
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "mndDnode.h"
|
#include "mndDnode.h"
|
||||||
|
#include "mndDb.h"
|
||||||
#include "mndMnode.h"
|
#include "mndMnode.h"
|
||||||
#include "mndPrivilege.h"
|
#include "mndPrivilege.h"
|
||||||
#include "mndQnode.h"
|
#include "mndQnode.h"
|
||||||
|
@ -376,6 +377,9 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
|
||||||
if (pVgroup->vnodeGid[vg].dnodeId == statusReq.dnodeId) {
|
if (pVgroup->vnodeGid[vg].dnodeId == statusReq.dnodeId) {
|
||||||
if (pVgroup->vnodeGid[vg].syncState != pVload->syncState ||
|
if (pVgroup->vnodeGid[vg].syncState != pVload->syncState ||
|
||||||
pVgroup->vnodeGid[vg].syncRestore != pVload->syncRestore) {
|
pVgroup->vnodeGid[vg].syncRestore != pVload->syncRestore) {
|
||||||
|
mInfo("vgId:%d, state changed by status msg, old state:%s restored:%d new state:%s restored:%d",
|
||||||
|
pVgroup->vgId, syncStr(pVgroup->vnodeGid[vg].syncState), pVgroup->vnodeGid[vg].syncRestore,
|
||||||
|
syncStr(pVload->syncState), pVload->syncRestore);
|
||||||
pVgroup->vnodeGid[vg].syncState = pVload->syncState;
|
pVgroup->vnodeGid[vg].syncState = pVload->syncState;
|
||||||
pVgroup->vnodeGid[vg].syncRestore = pVload->syncRestore;
|
pVgroup->vnodeGid[vg].syncRestore = pVload->syncRestore;
|
||||||
roleChanged = true;
|
roleChanged = true;
|
||||||
|
@ -384,7 +388,12 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (roleChanged) {
|
if (roleChanged) {
|
||||||
// notify scheduler role has changed
|
SDbObj *pDb = mndAcquireDb(pMnode, pVgroup->dbName);
|
||||||
|
if (pDb != NULL && pDb->stateTs != curMs) {
|
||||||
|
mInfo("db:%s, stateTs changed by status msg, old stateTs:%" PRId64 " new stateTs:%" PRId64, pDb->name, pDb->stateTs, curMs);
|
||||||
|
pDb->stateTs = curMs;
|
||||||
|
}
|
||||||
|
mndReleaseDb(pMnode, pDb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,6 +139,63 @@ static void mndIncreaseUpTime(SMnode *pMnode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mndSetVgroupOffline(SMnode *pMnode, int32_t dnodeId, int64_t curMs) {
|
||||||
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
|
|
||||||
|
void *pIter = NULL;
|
||||||
|
while (1) {
|
||||||
|
SVgObj *pVgroup = NULL;
|
||||||
|
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
|
||||||
|
if (pIter == NULL) break;
|
||||||
|
|
||||||
|
bool roleChanged = false;
|
||||||
|
for (int32_t vg = 0; vg < pVgroup->replica; ++vg) {
|
||||||
|
if (pVgroup->vnodeGid[vg].dnodeId == dnodeId) {
|
||||||
|
if (pVgroup->vnodeGid[vg].syncState != TAOS_SYNC_STATE_ERROR) {
|
||||||
|
mInfo("vgId:%d, state changed by offline check, old state:%s restored:%d new state:error restored:0",
|
||||||
|
pVgroup->vgId, syncStr(pVgroup->vnodeGid[vg].syncState), pVgroup->vnodeGid[vg].syncRestore);
|
||||||
|
pVgroup->vnodeGid[vg].syncState = TAOS_SYNC_STATE_ERROR;
|
||||||
|
pVgroup->vnodeGid[vg].syncRestore = 0;
|
||||||
|
roleChanged = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (roleChanged) {
|
||||||
|
SDbObj *pDb = mndAcquireDb(pMnode, pVgroup->dbName);
|
||||||
|
if (pDb != NULL && pDb->stateTs != curMs) {
|
||||||
|
mInfo("db:%s, stateTs changed by offline check, old newTs:%" PRId64 " newTs:%" PRId64, pDb->name, pDb->stateTs,
|
||||||
|
curMs);
|
||||||
|
pDb->stateTs = curMs;
|
||||||
|
}
|
||||||
|
mndReleaseDb(pMnode, pDb);
|
||||||
|
}
|
||||||
|
|
||||||
|
sdbRelease(pSdb, pVgroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mndCheckDnodeOffline(SMnode *pMnode) {
|
||||||
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
|
int64_t curMs = taosGetTimestampMs();
|
||||||
|
|
||||||
|
void *pIter = NULL;
|
||||||
|
while (1) {
|
||||||
|
SDnodeObj *pDnode = NULL;
|
||||||
|
pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode);
|
||||||
|
if (pIter == NULL) break;
|
||||||
|
|
||||||
|
bool online = mndIsDnodeOnline(pDnode, curMs);
|
||||||
|
if (!online) {
|
||||||
|
mInfo("dnode:%d, in offline state", pDnode->id);
|
||||||
|
mndSetVgroupOffline(pMnode, pDnode->id, curMs);
|
||||||
|
}
|
||||||
|
|
||||||
|
sdbRelease(pSdb, pDnode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void *mndThreadFp(void *param) {
|
static void *mndThreadFp(void *param) {
|
||||||
SMnode *pMnode = param;
|
SMnode *pMnode = param;
|
||||||
int64_t lastTime = 0;
|
int64_t lastTime = 0;
|
||||||
|
@ -174,6 +231,10 @@ static void *mndThreadFp(void *param) {
|
||||||
if (sec % tsUptimeInterval == 0) {
|
if (sec % tsUptimeInterval == 0) {
|
||||||
mndIncreaseUpTime(pMnode);
|
mndIncreaseUpTime(pMnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sec % (tsStatusInterval * 5) == 0) {
|
||||||
|
mndCheckDnodeOffline(pMnode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
int32_t mndPreProcessQueryMsg(SRpcMsg *pMsg) {
|
int32_t mndPreProcessQueryMsg(SRpcMsg *pMsg) {
|
||||||
if (TDMT_SCH_QUERY != pMsg->msgType && TDMT_SCH_MERGE_QUERY != pMsg->msgType) return 0;
|
if (TDMT_SCH_QUERY != pMsg->msgType && TDMT_SCH_MERGE_QUERY != pMsg->msgType) return 0;
|
||||||
SMnode *pMnode = pMsg->info.node;
|
SMnode *pMnode = pMsg->info.node;
|
||||||
return qWorkerPreprocessQueryMsg(pMnode->pQuery, pMsg);
|
return qWorkerPreprocessQueryMsg(pMnode->pQuery, pMsg, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mndPostProcessQueryMsg(SRpcMsg *pMsg) {
|
void mndPostProcessQueryMsg(SRpcMsg *pMsg) {
|
||||||
|
|
|
@ -519,7 +519,6 @@ static void *mndBuildVDropStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb,
|
||||||
|
|
||||||
pHead->contLen = htonl(contLen);
|
pHead->contLen = htonl(contLen);
|
||||||
pHead->vgId = htonl(pVgroup->vgId);
|
pHead->vgId = htonl(pVgroup->vgId);
|
||||||
pHead->msgMask = htonl(0);
|
|
||||||
|
|
||||||
void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
|
void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
|
||||||
|
|
||||||
|
|
|
@ -287,9 +287,7 @@ static int32_t mndBuildStreamObjFromCreateReq(SMnode *pMnode, SStreamObj *pObj,
|
||||||
memcpy(pObj->sourceDb, pCreate->sourceDB, TSDB_DB_FNAME_LEN);
|
memcpy(pObj->sourceDb, pCreate->sourceDB, TSDB_DB_FNAME_LEN);
|
||||||
SDbObj *pSourceDb = mndAcquireDb(pMnode, pCreate->sourceDB);
|
SDbObj *pSourceDb = mndAcquireDb(pMnode, pCreate->sourceDB);
|
||||||
if (pSourceDb == NULL) {
|
if (pSourceDb == NULL) {
|
||||||
/*ASSERT(0);*/
|
mInfo("stream:%s failed to create, source db %s not exist since %s", pCreate->name, pObj->sourceDb, terrstr());
|
||||||
mInfo("stream:%s failed to create, source db %s not exist", pCreate->name, pObj->sourceDb);
|
|
||||||
terrno = TSDB_CODE_MND_DB_NOT_EXIST;
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pObj->sourceDbUid = pSourceDb->uid;
|
pObj->sourceDbUid = pSourceDb->uid;
|
||||||
|
@ -298,8 +296,7 @@ static int32_t mndBuildStreamObjFromCreateReq(SMnode *pMnode, SStreamObj *pObj,
|
||||||
|
|
||||||
SDbObj *pTargetDb = mndAcquireDbByStb(pMnode, pObj->targetSTbName);
|
SDbObj *pTargetDb = mndAcquireDbByStb(pMnode, pObj->targetSTbName);
|
||||||
if (pTargetDb == NULL) {
|
if (pTargetDb == NULL) {
|
||||||
mInfo("stream:%s failed to create, target db %s not exist", pCreate->name, pObj->targetDb);
|
mInfo("stream:%s failed to create, target db %s not exist since %s", pCreate->name, pObj->targetDb, terrstr());
|
||||||
terrno = TSDB_CODE_MND_DB_NOT_EXIST;
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
tstrncpy(pObj->targetDb, pTargetDb->name, TSDB_DB_FNAME_LEN);
|
tstrncpy(pObj->targetDb, pTargetDb->name, TSDB_DB_FNAME_LEN);
|
||||||
|
|
|
@ -202,6 +202,13 @@ static void mndBecomeLeader(const SSyncFSM *pFsm) {
|
||||||
SMnode *pMnode = pFsm->data;
|
SMnode *pMnode = pFsm->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool mndApplyQueueEmpty(const SSyncFSM *pFsm) {
|
||||||
|
SMnode *pMnode = pFsm->data;
|
||||||
|
|
||||||
|
int32_t itemSize = tmsgGetQueueSize(&pMnode->msgCb, 1, APPLY_QUEUE);
|
||||||
|
return (itemSize == 0);
|
||||||
|
}
|
||||||
|
|
||||||
SSyncFSM *mndSyncMakeFsm(SMnode *pMnode) {
|
SSyncFSM *mndSyncMakeFsm(SMnode *pMnode) {
|
||||||
SSyncFSM *pFsm = taosMemoryCalloc(1, sizeof(SSyncFSM));
|
SSyncFSM *pFsm = taosMemoryCalloc(1, sizeof(SSyncFSM));
|
||||||
pFsm->data = pMnode;
|
pFsm->data = pMnode;
|
||||||
|
@ -210,6 +217,7 @@ SSyncFSM *mndSyncMakeFsm(SMnode *pMnode) {
|
||||||
pFsm->FpRollBackCb = NULL;
|
pFsm->FpRollBackCb = NULL;
|
||||||
pFsm->FpRestoreFinishCb = mndRestoreFinish;
|
pFsm->FpRestoreFinishCb = mndRestoreFinish;
|
||||||
pFsm->FpLeaderTransferCb = NULL;
|
pFsm->FpLeaderTransferCb = NULL;
|
||||||
|
pFsm->FpApplyQueueEmptyCb = mndApplyQueueEmpty;
|
||||||
pFsm->FpReConfigCb = NULL;
|
pFsm->FpReConfigCb = NULL;
|
||||||
pFsm->FpBecomeLeaderCb = mndBecomeLeader;
|
pFsm->FpBecomeLeaderCb = mndBecomeLeader;
|
||||||
pFsm->FpBecomeFollowerCb = mndBecomeFollower;
|
pFsm->FpBecomeFollowerCb = mndBecomeFollower;
|
||||||
|
|
|
@ -69,7 +69,7 @@ int32_t qndPreprocessQueryMsg(SQnode *pQnode, SRpcMsg *pMsg) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return qWorkerPreprocessQueryMsg(pQnode->pQuery, pMsg);
|
return qWorkerPreprocessQueryMsg(pQnode->pQuery, pMsg, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qndProcessQueryMsg(SQnode *pQnode, int64_t ts, SRpcMsg *pMsg) {
|
int32_t qndProcessQueryMsg(SQnode *pQnode, int64_t ts, SRpcMsg *pMsg) {
|
||||||
|
|
|
@ -155,15 +155,13 @@ int32_t tCmprBlockL(void const *lhs, void const *rhs);
|
||||||
int32_t tBlockDataCreate(SBlockData *pBlockData);
|
int32_t tBlockDataCreate(SBlockData *pBlockData);
|
||||||
void tBlockDataDestroy(SBlockData *pBlockData, int8_t deepClear);
|
void tBlockDataDestroy(SBlockData *pBlockData, int8_t deepClear);
|
||||||
int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema, int16_t *aCid, int32_t nCid);
|
int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema, int16_t *aCid, int32_t nCid);
|
||||||
int32_t tBlockDataInitEx(SBlockData *pBlockData, SBlockData *pBlockDataFrom);
|
|
||||||
void tBlockDataReset(SBlockData *pBlockData);
|
void tBlockDataReset(SBlockData *pBlockData);
|
||||||
int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema, int64_t uid);
|
int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema, int64_t uid);
|
||||||
void tBlockDataClear(SBlockData *pBlockData);
|
void tBlockDataClear(SBlockData *pBlockData);
|
||||||
SColData *tBlockDataGetColDataByIdx(SBlockData *pBlockData, int32_t idx);
|
SColData *tBlockDataGetColDataByIdx(SBlockData *pBlockData, int32_t idx);
|
||||||
void tBlockDataGetColData(SBlockData *pBlockData, int16_t cid, SColData **ppColData);
|
void tBlockDataGetColData(SBlockData *pBlockData, int16_t cid, SColData **ppColData);
|
||||||
int32_t tBlockDataCopy(SBlockData *pBlockDataSrc, SBlockData *pBlockDataDest);
|
|
||||||
int32_t tBlockDataMerge(SBlockData *pBlockData1, SBlockData *pBlockData2, SBlockData *pBlockData);
|
int32_t tBlockDataMerge(SBlockData *pBlockData1, SBlockData *pBlockData2, SBlockData *pBlockData);
|
||||||
int32_t tBlockDataAddColData(SBlockData *pBlockData, int32_t iColData, SColData **ppColData);
|
int32_t tBlockDataAddColData(SBlockData *pBlockData, SColData **ppColData);
|
||||||
int32_t tCmprBlockData(SBlockData *pBlockData, int8_t cmprAlg, uint8_t **ppOut, int32_t *szOut, uint8_t *aBuf[],
|
int32_t tCmprBlockData(SBlockData *pBlockData, int8_t cmprAlg, uint8_t **ppOut, int32_t *szOut, uint8_t *aBuf[],
|
||||||
int32_t aBufN[]);
|
int32_t aBufN[]);
|
||||||
int32_t tDecmprBlockData(uint8_t *pIn, int32_t szIn, SBlockData *pBlockData, uint8_t *aBuf[]);
|
int32_t tDecmprBlockData(uint8_t *pIn, int32_t szIn, SBlockData *pBlockData, uint8_t *aBuf[]);
|
||||||
|
@ -193,7 +191,6 @@ int32_t tsdbKeyFid(TSKEY key, int32_t minutes, int8_t precision);
|
||||||
void tsdbFidKeyRange(int32_t fid, int32_t minutes, int8_t precision, TSKEY *minKey, TSKEY *maxKey);
|
void tsdbFidKeyRange(int32_t fid, int32_t minutes, int8_t precision, TSKEY *minKey, TSKEY *maxKey);
|
||||||
int32_t tsdbFidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int64_t now);
|
int32_t tsdbFidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int64_t now);
|
||||||
int32_t tsdbBuildDeleteSkyline(SArray *aDelData, int32_t sidx, int32_t eidx, SArray *aSkyline);
|
int32_t tsdbBuildDeleteSkyline(SArray *aDelData, int32_t sidx, int32_t eidx, SArray *aSkyline);
|
||||||
void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg);
|
|
||||||
int32_t tPutColumnDataAgg(uint8_t *p, SColumnDataAgg *pColAgg);
|
int32_t tPutColumnDataAgg(uint8_t *p, SColumnDataAgg *pColAgg);
|
||||||
int32_t tGetColumnDataAgg(uint8_t *p, SColumnDataAgg *pColAgg);
|
int32_t tGetColumnDataAgg(uint8_t *p, SColumnDataAgg *pColAgg);
|
||||||
int32_t tsdbCmprData(uint8_t *pIn, int32_t szIn, int8_t type, int8_t cmprAlg, uint8_t **ppOut, int32_t nOut,
|
int32_t tsdbCmprData(uint8_t *pIn, int32_t szIn, int8_t type, int8_t cmprAlg, uint8_t **ppOut, int32_t nOut,
|
||||||
|
@ -473,7 +470,7 @@ struct SBlockData {
|
||||||
int64_t *aUid; // uids of each row, only exist in block data in .last file (uid == 0)
|
int64_t *aUid; // uids of each row, only exist in block data in .last file (uid == 0)
|
||||||
int64_t *aVersion; // versions of each row
|
int64_t *aVersion; // versions of each row
|
||||||
TSKEY *aTSKEY; // timestamp of each row
|
TSKEY *aTSKEY; // timestamp of each row
|
||||||
SArray *aIdx; // SArray<int32_t>
|
int32_t nColData;
|
||||||
SArray *aColData; // SArray<SColData>
|
SArray *aColData; // SArray<SColData>
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -102,6 +102,7 @@ int metaClose(SMeta* pMeta);
|
||||||
int metaBegin(SMeta* pMeta, int8_t fromSys);
|
int metaBegin(SMeta* pMeta, int8_t fromSys);
|
||||||
int metaCommit(SMeta* pMeta);
|
int metaCommit(SMeta* pMeta);
|
||||||
int metaFinishCommit(SMeta* pMeta);
|
int metaFinishCommit(SMeta* pMeta);
|
||||||
|
int metaPrepareAsyncCommit(SMeta* pMeta);
|
||||||
int metaCreateSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq);
|
int metaCreateSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq);
|
||||||
int metaAlterSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq);
|
int metaAlterSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq);
|
||||||
int metaDropSTable(SMeta* pMeta, int64_t verison, SVDropStbReq* pReq, SArray* tbUidList);
|
int metaDropSTable(SMeta* pMeta, int64_t verison, SVDropStbReq* pReq, SArray* tbUidList);
|
||||||
|
|
|
@ -35,6 +35,7 @@ int metaBegin(SMeta *pMeta, int8_t fromSys) {
|
||||||
// commit the meta txn
|
// commit the meta txn
|
||||||
int metaCommit(SMeta *pMeta) { return tdbCommit(pMeta->pEnv, &pMeta->txn); }
|
int metaCommit(SMeta *pMeta) { return tdbCommit(pMeta->pEnv, &pMeta->txn); }
|
||||||
int metaFinishCommit(SMeta *pMeta) { return tdbPostCommit(pMeta->pEnv, &pMeta->txn); }
|
int metaFinishCommit(SMeta *pMeta) { return tdbPostCommit(pMeta->pEnv, &pMeta->txn); }
|
||||||
|
int metaPrepareAsyncCommit(SMeta *pMeta) { return tdbPrepareAsyncCommit(pMeta->pEnv, &pMeta->txn); }
|
||||||
|
|
||||||
// abort the meta txn
|
// abort the meta txn
|
||||||
int metaAbort(SMeta *pMeta) { return tdbAbort(pMeta->pEnv, &pMeta->txn); }
|
int metaAbort(SMeta *pMeta) { return tdbAbort(pMeta->pEnv, &pMeta->txn); }
|
||||||
|
|
|
@ -125,6 +125,10 @@ int32_t tqMetaSaveCheckInfo(STQ* pTq, const char* key, const void* value, int32_
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tdbPostCommit(pTq->pMetaDB, &txn) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,6 +151,10 @@ int32_t tqMetaDeleteCheckInfo(STQ* pTq, const char* key) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tdbPostCommit(pTq->pMetaDB, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,6 +234,10 @@ int32_t tqMetaSaveHandle(STQ* pTq, const char* key, const STqHandle* pHandle) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tdbPostCommit(pTq->pMetaDB, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
tEncoderClear(&encoder);
|
tEncoderClear(&encoder);
|
||||||
taosMemoryFree(buf);
|
taosMemoryFree(buf);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -250,6 +262,10 @@ int32_t tqMetaDeleteHandle(STQ* pTq, const char* key) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tdbPostCommit(pTq->pMetaDB, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,9 +17,9 @@
|
||||||
#include "tq.h"
|
#include "tq.h"
|
||||||
|
|
||||||
struct STqOffsetStore {
|
struct STqOffsetStore {
|
||||||
char* fname;
|
|
||||||
STQ* pTq;
|
STQ* pTq;
|
||||||
SHashObj* pHash; // SHashObj<subscribeKey, offset>
|
SHashObj* pHash; // SHashObj<subscribeKey, offset>
|
||||||
|
int8_t needCommit;
|
||||||
};
|
};
|
||||||
|
|
||||||
char* tqOffsetBuildFName(const char* path, int32_t fVer) {
|
char* tqOffsetBuildFName(const char* path, int32_t fVer) {
|
||||||
|
@ -74,6 +74,7 @@ STqOffsetStore* tqOffsetOpen(STQ* pTq) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
pStore->pTq = pTq;
|
pStore->pTq = pTq;
|
||||||
|
pStore->needCommit = 0;
|
||||||
pTq->pOffsetStore = pStore;
|
pTq->pOffsetStore = pStore;
|
||||||
|
|
||||||
pStore->pHash = taosHashInit(64, MurmurHash3_32, true, HASH_NO_LOCK);
|
pStore->pHash = taosHashInit(64, MurmurHash3_32, true, HASH_NO_LOCK);
|
||||||
|
@ -100,6 +101,7 @@ STqOffset* tqOffsetRead(STqOffsetStore* pStore, const char* subscribeKey) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqOffsetWrite(STqOffsetStore* pStore, const STqOffset* pOffset) {
|
int32_t tqOffsetWrite(STqOffsetStore* pStore, const STqOffset* pOffset) {
|
||||||
|
pStore->needCommit = 1;
|
||||||
return taosHashPut(pStore->pHash, pOffset->subKey, strlen(pOffset->subKey), pOffset, sizeof(STqOffset));
|
return taosHashPut(pStore->pHash, pOffset->subKey, strlen(pOffset->subKey), pOffset, sizeof(STqOffset));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,14 +110,23 @@ int32_t tqOffsetDelete(STqOffsetStore* pStore, const char* subscribeKey) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqOffsetCommitFile(STqOffsetStore* pStore) {
|
int32_t tqOffsetCommitFile(STqOffsetStore* pStore) {
|
||||||
|
if (!pStore->needCommit) return 0;
|
||||||
// TODO file name should be with a newer version
|
// TODO file name should be with a newer version
|
||||||
char* fname = tqOffsetBuildFName(pStore->pTq->path, 0);
|
char* fname = tqOffsetBuildFName(pStore->pTq->path, 0);
|
||||||
TdFilePtr pFile = taosOpenFile(fname, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND);
|
TdFilePtr pFile = taosOpenFile(fname, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND);
|
||||||
taosMemoryFree(fname);
|
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
|
||||||
|
int32_t err = terrno;
|
||||||
|
const char* errStr = tstrerror(err);
|
||||||
|
int32_t sysErr = errno;
|
||||||
|
const char* sysErrStr = strerror(errno);
|
||||||
|
tqError("vgId:%d, cannot open file %s when commit offset since %s", pStore->pTq->pVnode->config.vgId, fname,
|
||||||
|
sysErrStr);
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
taosMemoryFree(fname);
|
||||||
void* pIter = NULL;
|
void* pIter = NULL;
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = taosHashIterate(pStore->pHash, pIter);
|
pIter = taosHashIterate(pStore->pHash, pIter);
|
||||||
|
@ -152,5 +163,6 @@ int32_t tqOffsetCommitFile(STqOffsetStore* pStore) {
|
||||||
}
|
}
|
||||||
// close and rename file
|
// close and rename file
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
|
pStore->needCommit = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,8 @@ int32_t tqBuildDeleteReq(SVnode* pVnode, const char* stbFullName, const SSDataBl
|
||||||
SColumnInfoData* pGidCol = taosArrayGet(pDataBlock->pDataBlock, GROUPID_COLUMN_INDEX);
|
SColumnInfoData* pGidCol = taosArrayGet(pDataBlock->pDataBlock, GROUPID_COLUMN_INDEX);
|
||||||
SColumnInfoData* pTbNameCol = taosArrayGet(pDataBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX);
|
SColumnInfoData* pTbNameCol = taosArrayGet(pDataBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX);
|
||||||
|
|
||||||
|
tqDebug("stream delete msg: row %d", totRow);
|
||||||
|
|
||||||
for (int32_t row = 0; row < totRow; row++) {
|
for (int32_t row = 0; row < totRow; row++) {
|
||||||
int64_t ts = *(int64_t*)colDataGetData(pTsCol, row);
|
int64_t ts = *(int64_t*)colDataGetData(pTsCol, row);
|
||||||
int64_t groupId = *(int64_t*)colDataGetData(pGidCol, row);
|
int64_t groupId = *(int64_t*)colDataGetData(pGidCol, row);
|
||||||
|
@ -36,11 +38,14 @@ int32_t tqBuildDeleteReq(SVnode* pVnode, const char* stbFullName, const SSDataBl
|
||||||
} else {
|
} else {
|
||||||
name = buildCtbNameByGroupId(stbFullName, groupId);
|
name = buildCtbNameByGroupId(stbFullName, groupId);
|
||||||
}
|
}
|
||||||
tqDebug("stream delete msg: groupId :%" PRId64 ", name: %s", groupId, name);
|
tqDebug("stream delete msg: vgId:%d, groupId :%" PRId64 ", name: %s, ts:%" PRId64, pVnode->config.vgId, groupId,
|
||||||
|
name, ts);
|
||||||
|
#if 0
|
||||||
SMetaReader mr = {0};
|
SMetaReader mr = {0};
|
||||||
metaReaderInit(&mr, pVnode->pMeta, 0);
|
metaReaderInit(&mr, pVnode->pMeta, 0);
|
||||||
if (metaGetTableEntryByName(&mr, name) < 0) {
|
if (metaGetTableEntryByName(&mr, name) < 0) {
|
||||||
metaReaderClear(&mr);
|
metaReaderClear(&mr);
|
||||||
|
tqDebug("stream delete msg, skip vgId:%d since no table: %s", pVnode->config.vgId, name);
|
||||||
taosMemoryFree(name);
|
taosMemoryFree(name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -48,10 +53,13 @@ int32_t tqBuildDeleteReq(SVnode* pVnode, const char* stbFullName, const SSDataBl
|
||||||
int64_t uid = mr.me.uid;
|
int64_t uid = mr.me.uid;
|
||||||
metaReaderClear(&mr);
|
metaReaderClear(&mr);
|
||||||
taosMemoryFree(name);
|
taosMemoryFree(name);
|
||||||
|
#endif
|
||||||
SSingleDeleteReq req = {
|
SSingleDeleteReq req = {
|
||||||
.ts = ts,
|
.ts = ts,
|
||||||
.uid = uid,
|
|
||||||
};
|
};
|
||||||
|
strncpy(req.tbname, name, TSDB_TABLE_NAME_LEN);
|
||||||
|
taosMemoryFree(name);
|
||||||
|
/*tqDebug("stream delete msg, active: vgId:%d, ts:%" PRId64 " name:%s", pVnode->config.vgId, ts, name);*/
|
||||||
taosArrayPush(deleteReq->deleteReqs, &req);
|
taosArrayPush(deleteReq->deleteReqs, &req);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -309,6 +317,10 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
|
||||||
deleteReq.deleteReqs = taosArrayInit(0, sizeof(SSingleDeleteReq));
|
deleteReq.deleteReqs = taosArrayInit(0, sizeof(SSingleDeleteReq));
|
||||||
deleteReq.suid = suid;
|
deleteReq.suid = suid;
|
||||||
tqBuildDeleteReq(pVnode, stbFullName, pDataBlock, &deleteReq);
|
tqBuildDeleteReq(pVnode, stbFullName, pDataBlock, &deleteReq);
|
||||||
|
if (taosArrayGetSize(deleteReq.deleteReqs) == 0) {
|
||||||
|
taosArrayDestroy(deleteReq.deleteReqs);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t len;
|
int32_t len;
|
||||||
int32_t code;
|
int32_t code;
|
||||||
|
|
|
@ -169,6 +169,8 @@ int32_t tqSnapWriterClose(STqSnapWriter** ppWriter, int8_t rollback) {
|
||||||
} else {
|
} else {
|
||||||
code = tdbCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
|
code = tdbCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
code = tdbPostCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
|
||||||
|
if (code) goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFree(pWriter);
|
taosMemoryFree(pWriter);
|
||||||
|
|
|
@ -169,6 +169,8 @@ int32_t tqSnapWriterClose(STqSnapWriter** ppWriter, int8_t rollback) {
|
||||||
} else {
|
} else {
|
||||||
code = tdbCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
|
code = tdbCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
code = tdbPostCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
|
||||||
|
if (code) goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFree(pWriter);
|
taosMemoryFree(pWriter);
|
||||||
|
|
|
@ -169,6 +169,8 @@ int32_t tqSnapWriterClose(STqSnapWriter** ppWriter, int8_t rollback) {
|
||||||
} else {
|
} else {
|
||||||
code = tdbCommit(pWriter->pTq->pMetaStore, &pWriter->txn);
|
code = tdbCommit(pWriter->pTq->pMetaStore, &pWriter->txn);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
code = tdbPostCommit(pWriter->pTq->pMetaStore, &pWriter->txn);
|
||||||
|
if (code) goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFree(pWriter);
|
taosMemoryFree(pWriter);
|
||||||
|
|
|
@ -427,13 +427,13 @@ static int32_t (*tDiskColAddValImpl[8][3])(SDiskColBuilder *pBuilder, SColVal *p
|
||||||
{tDiskColAddVal60, tDiskColAddVal61, tDiskColAddVal62}, // HAS_VALUE|HAS_NULL
|
{tDiskColAddVal60, tDiskColAddVal61, tDiskColAddVal62}, // HAS_VALUE|HAS_NULL
|
||||||
{tDiskColAddVal70, tDiskColAddVal71, tDiskColAddVal72} // HAS_VALUE|HAS_NULL|HAS_NONE
|
{tDiskColAddVal70, tDiskColAddVal71, tDiskColAddVal72} // HAS_VALUE|HAS_NULL|HAS_NONE
|
||||||
};
|
};
|
||||||
extern void (*tSmaUpdateImpl[])(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet);
|
// extern void (*tSmaUpdateImpl[])(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet);
|
||||||
static int32_t tDiskColAddVal(SDiskColBuilder *pBuilder, SColVal *pColVal) {
|
static int32_t tDiskColAddVal(SDiskColBuilder *pBuilder, SColVal *pColVal) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (pBuilder->calcSma) {
|
if (pBuilder->calcSma) {
|
||||||
if (COL_VAL_IS_VALUE(pColVal)) {
|
if (COL_VAL_IS_VALUE(pColVal)) {
|
||||||
tSmaUpdateImpl[pBuilder->type](&pBuilder->sma, pColVal, &pBuilder->minSet, &pBuilder->maxSet);
|
// tSmaUpdateImpl[pBuilder->type](&pBuilder->sma, pColVal, &pBuilder->minSet, &pBuilder->maxSet);
|
||||||
} else {
|
} else {
|
||||||
pBuilder->sma.numOfNull++;
|
pBuilder->sma.numOfNull++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,8 +117,8 @@ int32_t tsdbInsertTableData(STsdb *pTsdb, int64_t version, SSubmitMsgIter *pMsgI
|
||||||
metaGetInfo(pTsdb->pVnode->pMeta, info.suid, &info);
|
metaGetInfo(pTsdb->pVnode->pMeta, info.suid, &info);
|
||||||
}
|
}
|
||||||
if (pMsgIter->sversion != info.skmVer) {
|
if (pMsgIter->sversion != info.skmVer) {
|
||||||
tsdbError("vgId:%d, req sver:%d, skmVer:%d suid:%" PRId64 " uid:%" PRId64,
|
tsdbError("vgId:%d, req sver:%d, skmVer:%d suid:%" PRId64 " uid:%" PRId64, TD_VID(pTsdb->pVnode),
|
||||||
TD_VID(pTsdb->pVnode), pMsgIter->sversion, info.skmVer, suid, uid);
|
pMsgIter->sversion, info.skmVer, suid, uid);
|
||||||
code = TSDB_CODE_TDB_INVALID_TABLE_SCHEMA_VER;
|
code = TSDB_CODE_TDB_INVALID_TABLE_SCHEMA_VER;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
@ -198,14 +198,14 @@ int32_t tsdbDeleteTableData(STsdb *pTsdb, int64_t version, tb_uid_t suid, tb_uid
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbInfo("vgId:%d, delete data from table suid:%" PRId64 " uid:%" PRId64 " skey:%" PRId64 " eKey:%" PRId64
|
tsdbInfo("vgId:%d, delete data from table suid:%" PRId64 " uid:%" PRId64 " skey:%" PRId64 " eKey:%" PRId64
|
||||||
" since %s",
|
" at version %" PRId64 " since %s",
|
||||||
TD_VID(pTsdb->pVnode), suid, uid, sKey, eKey, tstrerror(code));
|
TD_VID(pTsdb->pVnode), suid, uid, sKey, eKey, version, tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
tsdbError("vgId:%d, failed to delete data from table suid:%" PRId64 " uid:%" PRId64 " skey:%" PRId64 " eKey:%" PRId64
|
tsdbError("vgId:%d, failed to delete data from table suid:%" PRId64 " uid:%" PRId64 " skey:%" PRId64 " eKey:%" PRId64
|
||||||
" since %s",
|
" at version %" PRId64 " since %s",
|
||||||
TD_VID(pTsdb->pVnode), suid, uid, sKey, eKey, tstrerror(code));
|
TD_VID(pTsdb->pVnode), suid, uid, sKey, eKey, version, tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -185,11 +185,13 @@ static int32_t doMergeRowsInLastBlock(SLastBlockReader* pLastBlockReader, STabl
|
||||||
SRowMerger* pMerger, SVersionRange* pVerRange);
|
SRowMerger* pMerger, SVersionRange* pVerRange);
|
||||||
static int32_t doMergeRowsInBuf(SIterInfo* pIter, uint64_t uid, int64_t ts, SArray* pDelList, SRowMerger* pMerger,
|
static int32_t doMergeRowsInBuf(SIterInfo* pIter, uint64_t uid, int64_t ts, SArray* pDelList, SRowMerger* pMerger,
|
||||||
STsdbReader* pReader);
|
STsdbReader* pReader);
|
||||||
static int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow* pTSRow, STableBlockScanInfo* pInfo);
|
static int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow* pTSRow,
|
||||||
|
STableBlockScanInfo* pInfo);
|
||||||
static int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, SBlockData* pBlockData,
|
static int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, SBlockData* pBlockData,
|
||||||
int32_t rowIndex);
|
int32_t rowIndex);
|
||||||
static void setComposedBlockFlag(STsdbReader* pReader, bool composed);
|
static void setComposedBlockFlag(STsdbReader* pReader, bool composed);
|
||||||
static bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey, int32_t order, SVersionRange* pVerRange);
|
static bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey, int32_t order,
|
||||||
|
SVersionRange* pVerRange);
|
||||||
|
|
||||||
static int32_t doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList,
|
static int32_t doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList,
|
||||||
STSRow** pTSRow, STsdbReader* pReader, bool* freeTSRow);
|
STSRow** pTSRow, STsdbReader* pReader, bool* freeTSRow);
|
||||||
|
@ -319,8 +321,8 @@ static SHashObj* createDataBlockScanInfo(STsdbReader* pTsdbReader, const STableK
|
||||||
taosHashPut(pTableMap, &info.uid, sizeof(uint64_t), &info, sizeof(info));
|
taosHashPut(pTableMap, &info.uid, sizeof(uint64_t), &info, sizeof(info));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
tsdbTrace("%p check table uid:%" PRId64 " from lastKey:%" PRId64 " %s", pTsdbReader, pScanInfo->uid, pScanInfo->lastKey,
|
tsdbTrace("%p check table uid:%" PRId64 " from lastKey:%" PRId64 " %s", pTsdbReader, pScanInfo->uid,
|
||||||
pTsdbReader->idStr);
|
pScanInfo->lastKey, pTsdbReader->idStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
pTsdbReader->cost.createScanInfoList = (taosGetTimestampUs() - st) / 1000.0;
|
pTsdbReader->cost.createScanInfoList = (taosGetTimestampUs() - st) / 1000.0;
|
||||||
|
@ -364,9 +366,9 @@ static void clearBlockScanInfo(STableBlockScanInfo* p) {
|
||||||
tMapDataClear(&p->mapData);
|
tMapDataClear(&p->mapData);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void destroyAllBlockScanInfo(SHashObj* pTableMap) {
|
static void destroyAllBlockScanInfo(SHashObj* pTableMap, bool clearEntry) {
|
||||||
void* p = NULL;
|
void* p = NULL;
|
||||||
while ((p = taosHashIterate(pTableMap, p)) != NULL) {
|
while (clearEntry && ((p = taosHashIterate(pTableMap, p)) != NULL)) {
|
||||||
clearBlockScanInfo(*(STableBlockScanInfo**)p);
|
clearBlockScanInfo(*(STableBlockScanInfo**)p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -982,7 +984,7 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t colIndex = 0;
|
int32_t colIndex = 0;
|
||||||
int32_t num = taosArrayGetSize(pBlockData->aIdx);
|
int32_t num = pBlockData->nColData;
|
||||||
while (i < numOfOutputCols && colIndex < num) {
|
while (i < numOfOutputCols && colIndex < num) {
|
||||||
rowIndex = 0;
|
rowIndex = 0;
|
||||||
pColData = taosArrayGet(pResBlock->pDataBlock, i);
|
pColData = taosArrayGet(pResBlock->pDataBlock, i);
|
||||||
|
@ -1115,7 +1117,7 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
|
||||||
int32_t unDumpedRows = asc ? pBlock->nRow - pDumpInfo->rowIndex : pDumpInfo->rowIndex + 1;
|
int32_t unDumpedRows = asc ? pBlock->nRow - pDumpInfo->rowIndex : pDumpInfo->rowIndex + 1;
|
||||||
tsdbDebug("%p copy file block to sdatablock, global index:%d, table index:%d, brange:%" PRId64 "-%" PRId64
|
tsdbDebug("%p copy file block to sdatablock, global index:%d, table index:%d, brange:%" PRId64 "-%" PRId64
|
||||||
", rows:%d, remain:%d, minVer:%" PRId64 ", maxVer:%" PRId64 ", elapsed time:%.2f ms, %s",
|
", rows:%d, remain:%d, minVer:%" PRId64 ", maxVer:%" PRId64 ", elapsed time:%.2f ms, %s",
|
||||||
pReader, pBlockIter->index, pBlockInfo->tbBlockIdx, pBlock->minKey.ts, pBlock->maxKey.ts, dumpedRows,
|
pReader, pBlockIter->index, pBlockInfo->tbBlockIdx, pBlock->minKey.ts, pBlock->maxKey.ts, remain,
|
||||||
unDumpedRows, pBlock->minVer, pBlock->maxVer, elapsedTime, pReader->idStr);
|
unDumpedRows, pBlock->minVer, pBlock->maxVer, elapsedTime, pReader->idStr);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -1443,7 +1445,8 @@ static bool keyOverlapFileBlock(TSDBKEY key, SDataBlk* pBlock, SVersionRange* pV
|
||||||
(pBlock->minVer <= pVerRange->maxVer);
|
(pBlock->minVer <= pVerRange->maxVer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool doCheckforDatablockOverlap(STableBlockScanInfo* pBlockScanInfo, const SDataBlk* pBlock, int32_t startIndex) {
|
static bool doCheckforDatablockOverlap(STableBlockScanInfo* pBlockScanInfo, const SDataBlk* pBlock,
|
||||||
|
int32_t startIndex) {
|
||||||
size_t num = taosArrayGetSize(pBlockScanInfo->delSkyline);
|
size_t num = taosArrayGetSize(pBlockScanInfo->delSkyline);
|
||||||
|
|
||||||
for (int32_t i = startIndex; i < num; i += 1) {
|
for (int32_t i = startIndex; i < num; i += 1) {
|
||||||
|
@ -2743,7 +2746,8 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) {
|
||||||
SLastBlockReader* pLastBlockReader = pReader->status.fileIter.pLastBlockReader;
|
SLastBlockReader* pLastBlockReader = pReader->status.fileIter.pLastBlockReader;
|
||||||
|
|
||||||
if (pBlockInfo != NULL) {
|
if (pBlockInfo != NULL) {
|
||||||
pScanInfo = *(STableBlockScanInfo**)taosHashGet(pReader->status.pTableMap, &pBlockInfo->uid, sizeof(pBlockInfo->uid));
|
pScanInfo =
|
||||||
|
*(STableBlockScanInfo**)taosHashGet(pReader->status.pTableMap, &pBlockInfo->uid, sizeof(pBlockInfo->uid));
|
||||||
} else {
|
} else {
|
||||||
pScanInfo = *pReader->status.pTableIter;
|
pScanInfo = *pReader->status.pTableIter;
|
||||||
}
|
}
|
||||||
|
@ -3492,7 +3496,8 @@ int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pR
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow* pTSRow, STableBlockScanInfo* pScanInfo) {
|
int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow* pTSRow,
|
||||||
|
STableBlockScanInfo* pScanInfo) {
|
||||||
int32_t numOfRows = pBlock->info.rows;
|
int32_t numOfRows = pBlock->info.rows;
|
||||||
int32_t numOfCols = (int32_t)taosArrayGetSize(pBlock->pDataBlock);
|
int32_t numOfCols = (int32_t)taosArrayGetSize(pBlock->pDataBlock);
|
||||||
int64_t uid = pScanInfo->uid;
|
int64_t uid = pScanInfo->uid;
|
||||||
|
@ -3552,7 +3557,7 @@ int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, S
|
||||||
}
|
}
|
||||||
|
|
||||||
SColVal cv = {0};
|
SColVal cv = {0};
|
||||||
int32_t numOfInputCols = pBlockData->aIdx->size;
|
int32_t numOfInputCols = pBlockData->nColData;
|
||||||
int32_t numOfOutputCols = pResBlock->pDataBlock->size;
|
int32_t numOfOutputCols = pResBlock->pDataBlock->size;
|
||||||
|
|
||||||
while (i < numOfOutputCols && j < numOfInputCols) {
|
while (i < numOfOutputCols && j < numOfInputCols) {
|
||||||
|
@ -3841,7 +3846,7 @@ void tsdbReaderClose(STsdbReader* pReader) {
|
||||||
cleanupDataBlockIterator(&pReader->status.blockIter);
|
cleanupDataBlockIterator(&pReader->status.blockIter);
|
||||||
|
|
||||||
size_t numOfTables = taosHashGetSize(pReader->status.pTableMap);
|
size_t numOfTables = taosHashGetSize(pReader->status.pTableMap);
|
||||||
destroyAllBlockScanInfo(pReader->status.pTableMap);
|
destroyAllBlockScanInfo(pReader->status.pTableMap, (pReader->innerReader[0] == NULL) ? true : false);
|
||||||
blockDataDestroy(pReader->pResBlock);
|
blockDataDestroy(pReader->pResBlock);
|
||||||
clearBlockScanInfoBuf(&pReader->blockInfoBuf);
|
clearBlockScanInfoBuf(&pReader->blockInfoBuf);
|
||||||
|
|
||||||
|
@ -3960,7 +3965,8 @@ bool tsdbNextDataBlock(STsdbReader* pReader) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tsdbTableNextDataBlock(STsdbReader* pReader, uint64_t uid) {
|
bool tsdbTableNextDataBlock(STsdbReader* pReader, uint64_t uid) {
|
||||||
STableBlockScanInfo* pBlockScanInfo = *(STableBlockScanInfo**)taosHashGet(pReader->status.pTableMap, &uid, sizeof(uid));
|
STableBlockScanInfo* pBlockScanInfo =
|
||||||
|
*(STableBlockScanInfo**)taosHashGet(pReader->status.pTableMap, &uid, sizeof(uid));
|
||||||
if (pBlockScanInfo == NULL) { // no data block for the table of given uid
|
if (pBlockScanInfo == NULL) { // no data block for the table of given uid
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -4073,7 +4079,8 @@ static SArray* doRetrieveDataBlock(STsdbReader* pReader) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SFileDataBlockInfo* pBlockInfo = getCurrentBlockInfo(&pStatus->blockIter);
|
SFileDataBlockInfo* pBlockInfo = getCurrentBlockInfo(&pStatus->blockIter);
|
||||||
STableBlockScanInfo* pBlockScanInfo = *(STableBlockScanInfo**)taosHashGet(pStatus->pTableMap, &pBlockInfo->uid, sizeof(pBlockInfo->uid));
|
STableBlockScanInfo* pBlockScanInfo =
|
||||||
|
*(STableBlockScanInfo**)taosHashGet(pStatus->pTableMap, &pBlockInfo->uid, sizeof(pBlockInfo->uid));
|
||||||
if (pBlockScanInfo == NULL) {
|
if (pBlockScanInfo == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
tsdbError("failed to locate the uid:%" PRIu64 " in query table uid list, total tables:%d, %s", pBlockInfo->uid,
|
tsdbError("failed to locate the uid:%" PRIu64 " in query table uid list, total tables:%d, %s", pBlockInfo->uid,
|
||||||
|
|
|
@ -514,13 +514,13 @@ static int32_t tsdbWriteBlockSma(SDataFWriter *pWriter, SBlockData *pBlockData,
|
||||||
pSmaInfo->size = 0;
|
pSmaInfo->size = 0;
|
||||||
|
|
||||||
// encode
|
// encode
|
||||||
for (int32_t iColData = 0; iColData < taosArrayGetSize(pBlockData->aIdx); iColData++) {
|
for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
|
||||||
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
||||||
|
|
||||||
if ((!pColData->smaOn) || IS_VAR_DATA_TYPE(pColData->type)) continue;
|
if ((!pColData->smaOn) || IS_VAR_DATA_TYPE(pColData->type)) continue;
|
||||||
|
|
||||||
SColumnDataAgg sma;
|
SColumnDataAgg sma = {.colId = pColData->cid};
|
||||||
tsdbCalcColDataSMA(pColData, &sma);
|
tColDataCalcSMA[pColData->type](pColData, &sma.sum, &sma.max, &sma.min, &sma.numOfNull);
|
||||||
|
|
||||||
code = tRealloc(&pWriter->aBuf[0], pSmaInfo->size + tPutColumnDataAgg(NULL, &sma));
|
code = tRealloc(&pWriter->aBuf[0], pSmaInfo->size + tPutColumnDataAgg(NULL, &sma));
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
@ -1112,7 +1112,7 @@ static int32_t tsdbReadBlockDataImpl(SDataFReader *pReader, SBlockInfo *pBlkInfo
|
||||||
ASSERT(p - pReader->aBuf[0] == pBlkInfo->szKey);
|
ASSERT(p - pReader->aBuf[0] == pBlkInfo->szKey);
|
||||||
|
|
||||||
// read and decode columns
|
// read and decode columns
|
||||||
if (taosArrayGetSize(pBlockData->aIdx) == 0) goto _exit;
|
if (pBlockData->nColData == 0) goto _exit;
|
||||||
|
|
||||||
if (hdr.szBlkCol > 0) {
|
if (hdr.szBlkCol > 0) {
|
||||||
int64_t offset = pBlkInfo->offset + pBlkInfo->szKey;
|
int64_t offset = pBlkInfo->offset + pBlkInfo->szKey;
|
||||||
|
@ -1128,7 +1128,7 @@ static int32_t tsdbReadBlockDataImpl(SDataFReader *pReader, SBlockInfo *pBlkInfo
|
||||||
SBlockCol *pBlockCol = &blockCol;
|
SBlockCol *pBlockCol = &blockCol;
|
||||||
int32_t n = 0;
|
int32_t n = 0;
|
||||||
|
|
||||||
for (int32_t iColData = 0; iColData < taosArrayGetSize(pBlockData->aIdx); iColData++) {
|
for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
|
||||||
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
||||||
|
|
||||||
while (pBlockCol && pBlockCol->cid < pColData->cid) {
|
while (pBlockCol && pBlockCol->cid < pColData->cid) {
|
||||||
|
@ -1212,49 +1212,6 @@ int32_t tsdbReadDataBlock(SDataFReader *pReader, SDataBlk *pDataBlk, SBlockData
|
||||||
|
|
||||||
ASSERT(pDataBlk->nSubBlock == 1);
|
ASSERT(pDataBlk->nSubBlock == 1);
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (pDataBlk->nSubBlock > 1) {
|
|
||||||
SBlockData bData1;
|
|
||||||
SBlockData bData2;
|
|
||||||
|
|
||||||
// create
|
|
||||||
code = tBlockDataCreate(&bData1);
|
|
||||||
if (code) goto _err;
|
|
||||||
code = tBlockDataCreate(&bData2);
|
|
||||||
if (code) goto _err;
|
|
||||||
|
|
||||||
// init
|
|
||||||
tBlockDataInitEx(&bData1, pBlockData);
|
|
||||||
tBlockDataInitEx(&bData2, pBlockData);
|
|
||||||
|
|
||||||
for (int32_t iSubBlock = 1; iSubBlock < pDataBlk->nSubBlock; iSubBlock++) {
|
|
||||||
code = tsdbReadBlockDataImpl(pReader, &pDataBlk->aSubBlock[iSubBlock], &bData1);
|
|
||||||
if (code) {
|
|
||||||
tBlockDataDestroy(&bData1, 1);
|
|
||||||
tBlockDataDestroy(&bData2, 1);
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
code = tBlockDataCopy(pBlockData, &bData2);
|
|
||||||
if (code) {
|
|
||||||
tBlockDataDestroy(&bData1, 1);
|
|
||||||
tBlockDataDestroy(&bData2, 1);
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
code = tBlockDataMerge(&bData1, &bData2, pBlockData);
|
|
||||||
if (code) {
|
|
||||||
tBlockDataDestroy(&bData1, 1);
|
|
||||||
tBlockDataDestroy(&bData2, 1);
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tBlockDataDestroy(&bData1, 1);
|
|
||||||
tBlockDataDestroy(&bData2, 1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
|
|
|
@ -607,13 +607,13 @@ void tRowIterInit(SRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema) {
|
||||||
SColVal *tRowIterNext(SRowIter *pIter) {
|
SColVal *tRowIterNext(SRowIter *pIter) {
|
||||||
if (pIter->pRow->type == 0) {
|
if (pIter->pRow->type == 0) {
|
||||||
if (pIter->i < pIter->pTSchema->numOfCols) {
|
if (pIter->i < pIter->pTSchema->numOfCols) {
|
||||||
tsdbRowGetColVal(pIter->pRow, pIter->pTSchema, pIter->i, &pIter->colVal);
|
tTSRowGetVal(pIter->pRow->pTSRow, pIter->pTSchema, pIter->i, &pIter->colVal);
|
||||||
pIter->i++;
|
pIter->i++;
|
||||||
|
|
||||||
return &pIter->colVal;
|
return &pIter->colVal;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (pIter->i < taosArrayGetSize(pIter->pRow->pBlockData->aIdx)) {
|
if (pIter->i < pIter->pRow->pBlockData->nColData) {
|
||||||
SColData *pColData = tBlockDataGetColDataByIdx(pIter->pRow->pBlockData, pIter->i);
|
SColData *pColData = tBlockDataGetColDataByIdx(pIter->pRow->pBlockData, pIter->i);
|
||||||
|
|
||||||
tColDataGetValue(pColData, pIter->pRow->iRow, &pIter->colVal);
|
tColDataGetValue(pColData, pIter->pRow->iRow, &pIter->colVal);
|
||||||
|
@ -917,14 +917,9 @@ int32_t tBlockDataCreate(SBlockData *pBlockData) {
|
||||||
pBlockData->aUid = NULL;
|
pBlockData->aUid = NULL;
|
||||||
pBlockData->aVersion = NULL;
|
pBlockData->aVersion = NULL;
|
||||||
pBlockData->aTSKEY = NULL;
|
pBlockData->aTSKEY = NULL;
|
||||||
pBlockData->aIdx = taosArrayInit(0, sizeof(int32_t));
|
pBlockData->nColData = 0;
|
||||||
if (pBlockData->aIdx == NULL) {
|
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto _exit;
|
|
||||||
}
|
|
||||||
pBlockData->aColData = taosArrayInit(0, sizeof(SColData));
|
pBlockData->aColData = taosArrayInit(0, sizeof(SColData));
|
||||||
if (pBlockData->aColData == NULL) {
|
if (pBlockData->aColData == NULL) {
|
||||||
taosArrayDestroy(pBlockData->aIdx);
|
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
@ -937,12 +932,10 @@ void tBlockDataDestroy(SBlockData *pBlockData, int8_t deepClear) {
|
||||||
tFree((uint8_t *)pBlockData->aUid);
|
tFree((uint8_t *)pBlockData->aUid);
|
||||||
tFree((uint8_t *)pBlockData->aVersion);
|
tFree((uint8_t *)pBlockData->aVersion);
|
||||||
tFree((uint8_t *)pBlockData->aTSKEY);
|
tFree((uint8_t *)pBlockData->aTSKEY);
|
||||||
taosArrayDestroy(pBlockData->aIdx);
|
|
||||||
taosArrayDestroyEx(pBlockData->aColData, deepClear ? tColDataDestroy : NULL);
|
taosArrayDestroyEx(pBlockData->aColData, deepClear ? tColDataDestroy : NULL);
|
||||||
pBlockData->aUid = NULL;
|
pBlockData->aUid = NULL;
|
||||||
pBlockData->aVersion = NULL;
|
pBlockData->aVersion = NULL;
|
||||||
pBlockData->aTSKEY = NULL;
|
pBlockData->aTSKEY = NULL;
|
||||||
pBlockData->aIdx = NULL;
|
|
||||||
pBlockData->aColData = NULL;
|
pBlockData->aColData = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -955,7 +948,7 @@ int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema,
|
||||||
pBlockData->uid = pId->uid;
|
pBlockData->uid = pId->uid;
|
||||||
pBlockData->nRow = 0;
|
pBlockData->nRow = 0;
|
||||||
|
|
||||||
taosArrayClear(pBlockData->aIdx);
|
pBlockData->nColData = 0;
|
||||||
if (aCid) {
|
if (aCid) {
|
||||||
int32_t iColumn = 1;
|
int32_t iColumn = 1;
|
||||||
STColumn *pTColumn = &pTSchema->columns[iColumn];
|
STColumn *pTColumn = &pTSchema->columns[iColumn];
|
||||||
|
@ -969,7 +962,7 @@ int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema,
|
||||||
break;
|
break;
|
||||||
} else if (pTColumn->colId == aCid[iCid]) {
|
} else if (pTColumn->colId == aCid[iCid]) {
|
||||||
SColData *pColData;
|
SColData *pColData;
|
||||||
code = tBlockDataAddColData(pBlockData, taosArrayGetSize(pBlockData->aIdx), &pColData);
|
code = tBlockDataAddColData(pBlockData, &pColData);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
tColDataInit(pColData, pTColumn->colId, pTColumn->type, (pTColumn->flags & COL_SMA_ON) ? 1 : 0);
|
tColDataInit(pColData, pTColumn->colId, pTColumn->type, (pTColumn->flags & COL_SMA_ON) ? 1 : 0);
|
||||||
|
|
||||||
|
@ -982,7 +975,7 @@ int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema,
|
||||||
STColumn *pTColumn = &pTSchema->columns[iColumn];
|
STColumn *pTColumn = &pTSchema->columns[iColumn];
|
||||||
|
|
||||||
SColData *pColData;
|
SColData *pColData;
|
||||||
code = tBlockDataAddColData(pBlockData, iColumn - 1, &pColData);
|
code = tBlockDataAddColData(pBlockData, &pColData);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
|
||||||
tColDataInit(pColData, pTColumn->colId, pTColumn->type, (pTColumn->flags & COL_SMA_ON) ? 1 : 0);
|
tColDataInit(pColData, pTColumn->colId, pTColumn->type, (pTColumn->flags & COL_SMA_ON) ? 1 : 0);
|
||||||
|
@ -993,64 +986,36 @@ _exit:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tBlockDataInitEx(SBlockData *pBlockData, SBlockData *pBlockDataFrom) {
|
|
||||||
int32_t code = 0;
|
|
||||||
|
|
||||||
ASSERT(pBlockDataFrom->suid || pBlockDataFrom->uid);
|
|
||||||
|
|
||||||
pBlockData->suid = pBlockDataFrom->suid;
|
|
||||||
pBlockData->uid = pBlockDataFrom->uid;
|
|
||||||
pBlockData->nRow = 0;
|
|
||||||
|
|
||||||
taosArrayClear(pBlockData->aIdx);
|
|
||||||
for (int32_t iColData = 0; iColData < taosArrayGetSize(pBlockDataFrom->aIdx); iColData++) {
|
|
||||||
SColData *pColDataFrom = tBlockDataGetColDataByIdx(pBlockDataFrom, iColData);
|
|
||||||
|
|
||||||
SColData *pColData;
|
|
||||||
code = tBlockDataAddColData(pBlockData, iColData, &pColData);
|
|
||||||
if (code) goto _exit;
|
|
||||||
|
|
||||||
tColDataInit(pColData, pColDataFrom->cid, pColDataFrom->type, pColDataFrom->smaOn);
|
|
||||||
}
|
|
||||||
|
|
||||||
_exit:
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
void tBlockDataReset(SBlockData *pBlockData) {
|
void tBlockDataReset(SBlockData *pBlockData) {
|
||||||
pBlockData->suid = 0;
|
pBlockData->suid = 0;
|
||||||
pBlockData->uid = 0;
|
pBlockData->uid = 0;
|
||||||
pBlockData->nRow = 0;
|
pBlockData->nRow = 0;
|
||||||
taosArrayClear(pBlockData->aIdx);
|
pBlockData->nColData = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tBlockDataClear(SBlockData *pBlockData) {
|
void tBlockDataClear(SBlockData *pBlockData) {
|
||||||
ASSERT(pBlockData->suid || pBlockData->uid);
|
ASSERT(pBlockData->suid || pBlockData->uid);
|
||||||
|
|
||||||
pBlockData->nRow = 0;
|
pBlockData->nRow = 0;
|
||||||
for (int32_t iColData = 0; iColData < taosArrayGetSize(pBlockData->aIdx); iColData++) {
|
for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
|
||||||
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
||||||
tColDataClear(pColData);
|
tColDataClear(pColData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tBlockDataAddColData(SBlockData *pBlockData, int32_t iColData, SColData **ppColData) {
|
int32_t tBlockDataAddColData(SBlockData *pBlockData, SColData **ppColData) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SColData *pColData = NULL;
|
SColData *pColData = NULL;
|
||||||
int32_t idx = taosArrayGetSize(pBlockData->aIdx);
|
|
||||||
|
|
||||||
if (idx >= taosArrayGetSize(pBlockData->aColData)) {
|
if (pBlockData->nColData >= taosArrayGetSize(pBlockData->aColData)) {
|
||||||
if (taosArrayPush(pBlockData->aColData, &((SColData){0})) == NULL) {
|
if (taosArrayPush(pBlockData->aColData, &((SColData){0})) == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pColData = (SColData *)taosArrayGet(pBlockData->aColData, idx);
|
pColData = (SColData *)taosArrayGet(pBlockData->aColData, pBlockData->nColData);
|
||||||
|
|
||||||
if (taosArrayInsert(pBlockData->aIdx, iColData, &idx) == NULL) {
|
pBlockData->nColData++;
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
*ppColData = pColData;
|
*ppColData = pColData;
|
||||||
return code;
|
return code;
|
||||||
|
@ -1087,7 +1052,7 @@ int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTS
|
||||||
|
|
||||||
tRowIterInit(&rIter, pRow, pTSchema);
|
tRowIterInit(&rIter, pRow, pTSchema);
|
||||||
pColVal = tRowIterNext(&rIter);
|
pColVal = tRowIterNext(&rIter);
|
||||||
for (int32_t iColData = 0; iColData < taosArrayGetSize(pBlockData->aIdx); iColData++) {
|
for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
|
||||||
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
||||||
|
|
||||||
while (pColVal && pColVal->cid < pColData->cid) {
|
while (pColVal && pColVal->cid < pColData->cid) {
|
||||||
|
@ -1115,19 +1080,19 @@ int32_t tBlockDataCorrectSchema(SBlockData *pBlockData, SBlockData *pBlockDataFr
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
int32_t iColData = 0;
|
int32_t iColData = 0;
|
||||||
for (int32_t iColDataFrom = 0; iColDataFrom < taosArrayGetSize(pBlockDataFrom->aIdx); iColDataFrom++) {
|
for (int32_t iColDataFrom = 0; iColDataFrom < pBlockDataFrom->nColData; iColDataFrom++) {
|
||||||
SColData *pColDataFrom = tBlockDataGetColDataByIdx(pBlockDataFrom, iColDataFrom);
|
SColData *pColDataFrom = tBlockDataGetColDataByIdx(pBlockDataFrom, iColDataFrom);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
SColData *pColData;
|
SColData *pColData;
|
||||||
if (iColData < taosArrayGetSize(pBlockData->aIdx)) {
|
if (iColData < pBlockData->nColData) {
|
||||||
pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
||||||
} else {
|
} else {
|
||||||
pColData = NULL;
|
pColData = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pColData == NULL || pColData->cid > pColDataFrom->cid) {
|
if (pColData == NULL || pColData->cid > pColDataFrom->cid) {
|
||||||
code = tBlockDataAddColData(pBlockData, iColData, &pColData);
|
code = tBlockDataAddColData(pBlockData, &pColData);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
|
||||||
tColDataInit(pColData, pColDataFrom->cid, pColDataFrom->type, pColDataFrom->smaOn);
|
tColDataInit(pColData, pColDataFrom->cid, pColDataFrom->type, pColDataFrom->smaOn);
|
||||||
|
@ -1226,55 +1191,15 @@ _exit:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tBlockDataCopy(SBlockData *pSrc, SBlockData *pDest) {
|
|
||||||
int32_t code = 0;
|
|
||||||
|
|
||||||
tBlockDataClear(pDest);
|
|
||||||
|
|
||||||
ASSERT(pDest->suid == pSrc->suid);
|
|
||||||
ASSERT(pDest->uid == pSrc->uid);
|
|
||||||
ASSERT(taosArrayGetSize(pSrc->aIdx) == taosArrayGetSize(pDest->aIdx));
|
|
||||||
|
|
||||||
pDest->nRow = pSrc->nRow;
|
|
||||||
|
|
||||||
if (pSrc->uid == 0) {
|
|
||||||
code = tRealloc((uint8_t **)&pDest->aUid, sizeof(int64_t) * pDest->nRow);
|
|
||||||
if (code) goto _exit;
|
|
||||||
memcpy(pDest->aUid, pSrc->aUid, sizeof(int64_t) * pDest->nRow);
|
|
||||||
}
|
|
||||||
|
|
||||||
code = tRealloc((uint8_t **)&pDest->aVersion, sizeof(int64_t) * pDest->nRow);
|
|
||||||
if (code) goto _exit;
|
|
||||||
memcpy(pDest->aVersion, pSrc->aVersion, sizeof(int64_t) * pDest->nRow);
|
|
||||||
|
|
||||||
code = tRealloc((uint8_t **)&pDest->aTSKEY, sizeof(TSKEY) * pDest->nRow);
|
|
||||||
if (code) goto _exit;
|
|
||||||
memcpy(pDest->aTSKEY, pSrc->aTSKEY, sizeof(TSKEY) * pDest->nRow);
|
|
||||||
|
|
||||||
for (int32_t iColData = 0; iColData < taosArrayGetSize(pSrc->aIdx); iColData++) {
|
|
||||||
SColData *pColSrc = tBlockDataGetColDataByIdx(pSrc, iColData);
|
|
||||||
SColData *pColDest = tBlockDataGetColDataByIdx(pDest, iColData);
|
|
||||||
|
|
||||||
ASSERT(pColSrc->cid == pColDest->cid);
|
|
||||||
ASSERT(pColSrc->type == pColDest->type);
|
|
||||||
|
|
||||||
code = tColDataCopy(pColSrc, pColDest);
|
|
||||||
if (code) goto _exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
_exit:
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
SColData *tBlockDataGetColDataByIdx(SBlockData *pBlockData, int32_t idx) {
|
SColData *tBlockDataGetColDataByIdx(SBlockData *pBlockData, int32_t idx) {
|
||||||
ASSERT(idx >= 0 && idx < taosArrayGetSize(pBlockData->aIdx));
|
ASSERT(idx >= 0 && idx < pBlockData->nColData);
|
||||||
return (SColData *)taosArrayGet(pBlockData->aColData, *(int32_t *)taosArrayGet(pBlockData->aIdx, idx));
|
return (SColData *)taosArrayGet(pBlockData->aColData, idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tBlockDataGetColData(SBlockData *pBlockData, int16_t cid, SColData **ppColData) {
|
void tBlockDataGetColData(SBlockData *pBlockData, int16_t cid, SColData **ppColData) {
|
||||||
ASSERT(cid != PRIMARYKEY_TIMESTAMP_COL_ID);
|
ASSERT(cid != PRIMARYKEY_TIMESTAMP_COL_ID);
|
||||||
int32_t lidx = 0;
|
int32_t lidx = 0;
|
||||||
int32_t ridx = taosArrayGetSize(pBlockData->aIdx) - 1;
|
int32_t ridx = pBlockData->nColData - 1;
|
||||||
|
|
||||||
while (lidx <= ridx) {
|
while (lidx <= ridx) {
|
||||||
int32_t midx = (lidx + ridx) / 2;
|
int32_t midx = (lidx + ridx) / 2;
|
||||||
|
@ -1308,7 +1233,7 @@ int32_t tCmprBlockData(SBlockData *pBlockData, int8_t cmprAlg, uint8_t **ppOut,
|
||||||
// encode =================
|
// encode =================
|
||||||
// columns AND SBlockCol
|
// columns AND SBlockCol
|
||||||
aBufN[0] = 0;
|
aBufN[0] = 0;
|
||||||
for (int32_t iColData = 0; iColData < taosArrayGetSize(pBlockData->aIdx); iColData++) {
|
for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
|
||||||
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
||||||
|
|
||||||
ASSERT(pColData->flag);
|
ASSERT(pColData->flag);
|
||||||
|
@ -1431,7 +1356,7 @@ int32_t tDecmprBlockData(uint8_t *pIn, int32_t szIn, SBlockData *pBlockData, uin
|
||||||
ASSERT(nt <= hdr.szBlkCol);
|
ASSERT(nt <= hdr.szBlkCol);
|
||||||
|
|
||||||
SColData *pColData;
|
SColData *pColData;
|
||||||
code = tBlockDataAddColData(pBlockData, taosArrayGetSize(pBlockData->aIdx), &pColData);
|
code = tBlockDataAddColData(pBlockData, &pColData);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
|
||||||
tColDataInit(pColData, blockCol.cid, blockCol.type, blockCol.smaOn);
|
tColDataInit(pColData, blockCol.cid, blockCol.type, blockCol.smaOn);
|
||||||
|
@ -1512,111 +1437,6 @@ int32_t tGetColumnDataAgg(uint8_t *p, SColumnDataAgg *pColAgg) {
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SMA_UPDATE(SUM_V, MIN_V, MAX_V, VAL, MINSET, MAXSET) \
|
|
||||||
do { \
|
|
||||||
(SUM_V) += (VAL); \
|
|
||||||
if (!(MINSET)) { \
|
|
||||||
(MIN_V) = (VAL); \
|
|
||||||
(MINSET) = 1; \
|
|
||||||
} else if ((MIN_V) > (VAL)) { \
|
|
||||||
(MIN_V) = (VAL); \
|
|
||||||
} \
|
|
||||||
if (!(MAXSET)) { \
|
|
||||||
(MAX_V) = (VAL); \
|
|
||||||
(MAXSET) = 1; \
|
|
||||||
} else if ((MAX_V) < (VAL)) { \
|
|
||||||
(MAX_V) = (VAL); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
static FORCE_INLINE void tSmaUpdateBool(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) {
|
|
||||||
int8_t val = *(int8_t *)&pColVal->value.val ? 1 : 0;
|
|
||||||
SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
|
|
||||||
}
|
|
||||||
static FORCE_INLINE void tSmaUpdateTinyint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet,
|
|
||||||
uint8_t *maxSet) {
|
|
||||||
int8_t val = *(int8_t *)&pColVal->value.val;
|
|
||||||
SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
|
|
||||||
}
|
|
||||||
static FORCE_INLINE void tSmaUpdateSmallint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet,
|
|
||||||
uint8_t *maxSet) {
|
|
||||||
int16_t val = *(int16_t *)&pColVal->value.val;
|
|
||||||
SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
|
|
||||||
}
|
|
||||||
static FORCE_INLINE void tSmaUpdateInt(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) {
|
|
||||||
int32_t val = *(int32_t *)&pColVal->value.val;
|
|
||||||
SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
|
|
||||||
}
|
|
||||||
static FORCE_INLINE void tSmaUpdateBigint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) {
|
|
||||||
int64_t val = *(int64_t *)&pColVal->value.val;
|
|
||||||
SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
|
|
||||||
}
|
|
||||||
static FORCE_INLINE void tSmaUpdateFloat(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) {
|
|
||||||
float val = *(float *)&pColVal->value.val;
|
|
||||||
SMA_UPDATE(*(double *)&pColAgg->sum, *(double *)&pColAgg->min, *(double *)&pColAgg->max, val, *minSet, *maxSet);
|
|
||||||
}
|
|
||||||
static FORCE_INLINE void tSmaUpdateDouble(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) {
|
|
||||||
double val = *(double *)&pColVal->value.val;
|
|
||||||
SMA_UPDATE(*(double *)&pColAgg->sum, *(double *)&pColAgg->min, *(double *)&pColAgg->max, val, *minSet, *maxSet);
|
|
||||||
}
|
|
||||||
static FORCE_INLINE void tSmaUpdateUTinyint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet,
|
|
||||||
uint8_t *maxSet) {
|
|
||||||
uint8_t val = *(uint8_t *)&pColVal->value.val;
|
|
||||||
SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
|
|
||||||
}
|
|
||||||
static FORCE_INLINE void tSmaUpdateUSmallint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet,
|
|
||||||
uint8_t *maxSet) {
|
|
||||||
uint16_t val = *(uint16_t *)&pColVal->value.val;
|
|
||||||
SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
|
|
||||||
}
|
|
||||||
static FORCE_INLINE void tSmaUpdateUInt(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) {
|
|
||||||
uint32_t val = *(uint32_t *)&pColVal->value.val;
|
|
||||||
SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
|
|
||||||
}
|
|
||||||
static FORCE_INLINE void tSmaUpdateUBigint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet,
|
|
||||||
uint8_t *maxSet) {
|
|
||||||
uint64_t val = *(uint64_t *)&pColVal->value.val;
|
|
||||||
SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
|
|
||||||
}
|
|
||||||
void (*tSmaUpdateImpl[])(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) = {
|
|
||||||
NULL,
|
|
||||||
tSmaUpdateBool, // TSDB_DATA_TYPE_BOOL
|
|
||||||
tSmaUpdateTinyint, // TSDB_DATA_TYPE_TINYINT
|
|
||||||
tSmaUpdateSmallint, // TSDB_DATA_TYPE_SMALLINT
|
|
||||||
tSmaUpdateInt, // TSDB_DATA_TYPE_INT
|
|
||||||
tSmaUpdateBigint, // TSDB_DATA_TYPE_BIGINT
|
|
||||||
tSmaUpdateFloat, // TSDB_DATA_TYPE_FLOAT
|
|
||||||
tSmaUpdateDouble, // TSDB_DATA_TYPE_DOUBLE
|
|
||||||
NULL, // TSDB_DATA_TYPE_VARCHAR
|
|
||||||
tSmaUpdateBigint, // TSDB_DATA_TYPE_TIMESTAMP
|
|
||||||
NULL, // TSDB_DATA_TYPE_NCHAR
|
|
||||||
tSmaUpdateUTinyint, // TSDB_DATA_TYPE_UTINYINT
|
|
||||||
tSmaUpdateUSmallint, // TSDB_DATA_TYPE_USMALLINT
|
|
||||||
tSmaUpdateUInt, // TSDB_DATA_TYPE_UINT
|
|
||||||
tSmaUpdateUBigint, // TSDB_DATA_TYPE_UBIGINT
|
|
||||||
NULL, // TSDB_DATA_TYPE_JSON
|
|
||||||
NULL, // TSDB_DATA_TYPE_VARBINARY
|
|
||||||
NULL, // TSDB_DATA_TYPE_DECIMAL
|
|
||||||
NULL, // TSDB_DATA_TYPE_BLOB
|
|
||||||
NULL, // TSDB_DATA_TYPE_MEDIUMBLOB
|
|
||||||
};
|
|
||||||
void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg) {
|
|
||||||
*pColAgg = (SColumnDataAgg){.colId = pColData->cid};
|
|
||||||
uint8_t minSet = 0;
|
|
||||||
uint8_t maxSet = 0;
|
|
||||||
|
|
||||||
SColVal cv;
|
|
||||||
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
|
||||||
tColDataGetValue(pColData, iVal, &cv);
|
|
||||||
|
|
||||||
if (COL_VAL_IS_VALUE(&cv)) {
|
|
||||||
tSmaUpdateImpl[pColData->type](pColAgg, &cv, &minSet, &maxSet);
|
|
||||||
} else {
|
|
||||||
pColAgg->numOfNull++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tsdbCmprData(uint8_t *pIn, int32_t szIn, int8_t type, int8_t cmprAlg, uint8_t **ppOut, int32_t nOut,
|
int32_t tsdbCmprData(uint8_t *pIn, int32_t szIn, int8_t type, int8_t cmprAlg, uint8_t **ppOut, int32_t nOut,
|
||||||
int32_t *szOut, uint8_t **ppBuf) {
|
int32_t *szOut, uint8_t **ppBuf) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
|
@ -329,7 +329,7 @@ int32_t vnodePreprocessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return qWorkerPreprocessQueryMsg(pVnode->pQuery, pMsg);
|
return qWorkerPreprocessQueryMsg(pVnode->pQuery, pMsg, TDMT_SCH_QUERY == pMsg->msgType);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
int32_t vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
|
@ -1169,16 +1169,28 @@ static int32_t vnodeProcessBatchDeleteReq(SVnode *pVnode, int64_t version, void
|
||||||
tDecoderInit(&decoder, pReq, len);
|
tDecoderInit(&decoder, pReq, len);
|
||||||
tDecodeSBatchDeleteReq(&decoder, &deleteReq);
|
tDecodeSBatchDeleteReq(&decoder, &deleteReq);
|
||||||
|
|
||||||
|
SMetaReader mr = {0};
|
||||||
|
metaReaderInit(&mr, pVnode->pMeta, 0);
|
||||||
|
|
||||||
int32_t sz = taosArrayGetSize(deleteReq.deleteReqs);
|
int32_t sz = taosArrayGetSize(deleteReq.deleteReqs);
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
SSingleDeleteReq *pOneReq = taosArrayGet(deleteReq.deleteReqs, i);
|
SSingleDeleteReq *pOneReq = taosArrayGet(deleteReq.deleteReqs, i);
|
||||||
int32_t code = tsdbDeleteTableData(pVnode->pTsdb, version, deleteReq.suid, pOneReq->uid, pOneReq->ts, pOneReq->ts);
|
char *name = pOneReq->tbname;
|
||||||
|
if (metaGetTableEntryByName(&mr, name) < 0) {
|
||||||
|
vDebug("stream delete msg, skip vgId:%d since no table: %s", pVnode->config.vgId, name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t uid = mr.me.uid;
|
||||||
|
|
||||||
|
int32_t code = tsdbDeleteTableData(pVnode->pTsdb, version, deleteReq.suid, uid, pOneReq->ts, pOneReq->ts);
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
terrno = code;
|
terrno = code;
|
||||||
vError("vgId:%d, delete error since %s, suid:%" PRId64 ", uid:%" PRId64 ", start ts:%" PRId64 ", end ts:%" PRId64,
|
vError("vgId:%d, delete error since %s, suid:%" PRId64 ", uid:%" PRId64 ", start ts:%" PRId64 ", end ts:%" PRId64,
|
||||||
TD_VID(pVnode), terrstr(), deleteReq.suid, pOneReq->uid, pOneReq->ts, pOneReq->ts);
|
TD_VID(pVnode), terrstr(), deleteReq.suid, uid, pOneReq->ts, pOneReq->ts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
metaReaderClear(&mr);
|
||||||
taosArrayDestroy(deleteReq.deleteReqs);
|
taosArrayDestroy(deleteReq.deleteReqs);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -436,6 +436,12 @@ static void vnodeBecomeLeader(const SSyncFSM *pFsm) {
|
||||||
vDebug("vgId:%d, become leader", pVnode->config.vgId);
|
vDebug("vgId:%d, become leader", pVnode->config.vgId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool vnodeApplyQueueEmpty(const SSyncFSM *pFsm) {
|
||||||
|
SVnode *pVnode = pFsm->data;
|
||||||
|
int32_t itemSize = tmsgGetQueueSize(&pVnode->msgCb, pVnode->config.vgId, APPLY_QUEUE);
|
||||||
|
return (itemSize == 0);
|
||||||
|
}
|
||||||
|
|
||||||
static SSyncFSM *vnodeSyncMakeFsm(SVnode *pVnode) {
|
static SSyncFSM *vnodeSyncMakeFsm(SVnode *pVnode) {
|
||||||
SSyncFSM *pFsm = taosMemoryCalloc(1, sizeof(SSyncFSM));
|
SSyncFSM *pFsm = taosMemoryCalloc(1, sizeof(SSyncFSM));
|
||||||
pFsm->data = pVnode;
|
pFsm->data = pVnode;
|
||||||
|
@ -445,6 +451,7 @@ static SSyncFSM *vnodeSyncMakeFsm(SVnode *pVnode) {
|
||||||
pFsm->FpGetSnapshotInfo = vnodeSyncGetSnapshot;
|
pFsm->FpGetSnapshotInfo = vnodeSyncGetSnapshot;
|
||||||
pFsm->FpRestoreFinishCb = vnodeRestoreFinish;
|
pFsm->FpRestoreFinishCb = vnodeRestoreFinish;
|
||||||
pFsm->FpLeaderTransferCb = NULL;
|
pFsm->FpLeaderTransferCb = NULL;
|
||||||
|
pFsm->FpApplyQueueEmptyCb = vnodeApplyQueueEmpty;
|
||||||
pFsm->FpBecomeLeaderCb = vnodeBecomeLeader;
|
pFsm->FpBecomeLeaderCb = vnodeBecomeLeader;
|
||||||
pFsm->FpBecomeFollowerCb = vnodeBecomeFollower;
|
pFsm->FpBecomeFollowerCb = vnodeBecomeFollower;
|
||||||
pFsm->FpReConfigCb = NULL;
|
pFsm->FpReConfigCb = NULL;
|
||||||
|
|
|
@ -538,7 +538,8 @@ typedef struct SCtgOperation {
|
||||||
(sizeof(STableMeta) + ((pMeta)->tableInfo.numOfTags + (pMeta)->tableInfo.numOfColumns) * sizeof(SSchema))
|
(sizeof(STableMeta) + ((pMeta)->tableInfo.numOfTags + (pMeta)->tableInfo.numOfColumns) * sizeof(SSchema))
|
||||||
|
|
||||||
#define CTG_TABLE_NOT_EXIST(code) (code == CTG_ERR_CODE_TABLE_NOT_EXIST)
|
#define CTG_TABLE_NOT_EXIST(code) (code == CTG_ERR_CODE_TABLE_NOT_EXIST)
|
||||||
#define CTG_DB_NOT_EXIST(code) (code == TSDB_CODE_MND_DB_NOT_EXIST)
|
#define CTG_DB_NOT_EXIST(code) \
|
||||||
|
(code == TSDB_CODE_MND_DB_NOT_EXIST || code == TSDB_CODE_MND_DB_IN_CREATING || code == TSDB_CODE_MND_DB_IN_DROPPING)
|
||||||
|
|
||||||
#define ctgFatal(param, ...) qFatal("CTG:%p " param, pCtg, __VA_ARGS__)
|
#define ctgFatal(param, ...) qFatal("CTG:%p " param, pCtg, __VA_ARGS__)
|
||||||
#define ctgError(param, ...) qError("CTG:%p " param, pCtg, __VA_ARGS__)
|
#define ctgError(param, ...) qError("CTG:%p " param, pCtg, __VA_ARGS__)
|
||||||
|
|
|
@ -184,7 +184,6 @@ enum {
|
||||||
typedef struct SOperatorFpSet {
|
typedef struct SOperatorFpSet {
|
||||||
__optr_open_fn_t _openFn; // DO NOT invoke this function directly
|
__optr_open_fn_t _openFn; // DO NOT invoke this function directly
|
||||||
__optr_fn_t getNextFn;
|
__optr_fn_t getNextFn;
|
||||||
__optr_fn_t getStreamResFn; // execute the aggregate in the stream model, todo remove it
|
|
||||||
__optr_fn_t cleanupFn; // call this function to release the allocated resources ASAP
|
__optr_fn_t cleanupFn; // call this function to release the allocated resources ASAP
|
||||||
__optr_close_fn_t closeFn;
|
__optr_close_fn_t closeFn;
|
||||||
__optr_encode_fn_t encodeResultRow;
|
__optr_encode_fn_t encodeResultRow;
|
||||||
|
|
|
@ -114,7 +114,6 @@ SOperatorFpSet createOperatorFpSet(__optr_open_fn_t openFn, __optr_fn_t nextFn,
|
||||||
SOperatorFpSet fpSet = {
|
SOperatorFpSet fpSet = {
|
||||||
._openFn = openFn,
|
._openFn = openFn,
|
||||||
.getNextFn = nextFn,
|
.getNextFn = nextFn,
|
||||||
.getStreamResFn = streamFn,
|
|
||||||
.cleanupFn = cleanup,
|
.cleanupFn = cleanup,
|
||||||
.closeFn = closeFn,
|
.closeFn = closeFn,
|
||||||
.getExplainFn = explain,
|
.getExplainFn = explain,
|
||||||
|
@ -1898,7 +1897,7 @@ static void concurrentlyLoadRemoteDataImpl(SOperatorInfo* pOperator, SExchangeIn
|
||||||
if (pRsp->numOfRows == 0) {
|
if (pRsp->numOfRows == 0) {
|
||||||
pDataInfo->status = EX_SOURCE_DATA_EXHAUSTED;
|
pDataInfo->status = EX_SOURCE_DATA_EXHAUSTED;
|
||||||
qDebug("%s vgId:%d, taskId:0x%" PRIx64 " execId:%d index:%d completed, rowsOfSource:%" PRIu64
|
qDebug("%s vgId:%d, taskId:0x%" PRIx64 " execId:%d index:%d completed, rowsOfSource:%" PRIu64
|
||||||
", totalRows:%" PRIu64 ", try next %d/%" PRIzu,
|
", totalRows:%" PRIu64 ", completed:%d try next %d/%" PRIzu,
|
||||||
GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, i, pDataInfo->totalRows,
|
GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, i, pDataInfo->totalRows,
|
||||||
pExchangeInfo->loadInfo.totalRows, i + 1, totalSources);
|
pExchangeInfo->loadInfo.totalRows, i + 1, totalSources);
|
||||||
taosMemoryFreeClear(pDataInfo->pRsp);
|
taosMemoryFreeClear(pDataInfo->pRsp);
|
||||||
|
@ -3357,6 +3356,11 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
pOperator = createTableScanOperatorInfo(pTableScanNode, pHandle, pTaskInfo);
|
pOperator = createTableScanOperatorInfo(pTableScanNode, pHandle, pTaskInfo);
|
||||||
|
if (NULL == pOperator) {
|
||||||
|
pTaskInfo->code = terrno;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
STableScanInfo* pScanInfo = pOperator->info;
|
STableScanInfo* pScanInfo = pOperator->info;
|
||||||
pTaskInfo->cost.pRecoder = &pScanInfo->readRecorder;
|
pTaskInfo->cost.pRecoder = &pScanInfo->readRecorder;
|
||||||
} else if (QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN == type) {
|
} else if (QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN == type) {
|
||||||
|
@ -3377,6 +3381,10 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
pOperator = createTableMergeScanOperatorInfo(pTableScanNode, pTableListInfo, pHandle, pTaskInfo);
|
pOperator = createTableMergeScanOperatorInfo(pTableScanNode, pTableListInfo, pHandle, pTaskInfo);
|
||||||
|
if (NULL == pOperator) {
|
||||||
|
pTaskInfo->code = terrno;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
STableScanInfo* pScanInfo = pOperator->info;
|
STableScanInfo* pScanInfo = pOperator->info;
|
||||||
pTaskInfo->cost.pRecoder = &pScanInfo->readRecorder;
|
pTaskInfo->cost.pRecoder = &pScanInfo->readRecorder;
|
||||||
|
|
|
@ -1691,14 +1691,14 @@ SOperatorInfo* createStreamFillOperatorInfo(SOperatorInfo* downstream, SStreamFi
|
||||||
|
|
||||||
pInfo->srcRowIndex = 0;
|
pInfo->srcRowIndex = 0;
|
||||||
|
|
||||||
pOperator->name = "FillOperator";
|
pOperator->name = "StreamFillOperator";
|
||||||
pOperator->blocking = false;
|
pOperator->blocking = false;
|
||||||
pOperator->status = OP_NOT_OPENED;
|
pOperator->status = OP_NOT_OPENED;
|
||||||
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL;
|
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL;
|
||||||
pOperator->info = pInfo;
|
pOperator->info = pInfo;
|
||||||
pOperator->pTaskInfo = pTaskInfo;
|
pOperator->pTaskInfo = pTaskInfo;
|
||||||
pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamFill, NULL, NULL, destroyStreamFillOperatorInfo,
|
pOperator->fpSet =
|
||||||
NULL);
|
createOperatorFpSet(operatorDummyOpenFn, doStreamFill, NULL, NULL, destroyStreamFillOperatorInfo, NULL);
|
||||||
|
|
||||||
code = appendDownstream(pOperator, &downstream, 1);
|
code = appendDownstream(pOperator, &downstream, 1);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* 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/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#include "filter.h"
|
|
||||||
#include "executorimpl.h"
|
#include "executorimpl.h"
|
||||||
|
#include "filter.h"
|
||||||
#include "function.h"
|
#include "function.h"
|
||||||
#include "functionMgt.h"
|
#include "functionMgt.h"
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
|
@ -1255,9 +1255,8 @@ static SSDataBlock* doBuildIntervalResult(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
SSDataBlock* pBlock = pInfo->binfo.pRes;
|
SSDataBlock* pBlock = pInfo->binfo.pRes;
|
||||||
|
|
||||||
if (pInfo->execModel == OPTR_EXEC_MODEL_STREAM) {
|
ASSERT(pInfo->execModel == OPTR_EXEC_MODEL_BATCH);
|
||||||
return pOperator->fpSet.getStreamResFn(pOperator);
|
|
||||||
} else {
|
|
||||||
pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
|
pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
|
||||||
if (pTaskInfo->code != TSDB_CODE_SUCCESS) {
|
if (pTaskInfo->code != TSDB_CODE_SUCCESS) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1284,7 +1283,6 @@ static SSDataBlock* doBuildIntervalResult(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
return (rows == 0) ? NULL : pBlock;
|
return (rows == 0) ? NULL : pBlock;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static void setInverFunction(SqlFunctionCtx* pCtx, int32_t num, EStreamType type) {
|
static void setInverFunction(SqlFunctionCtx* pCtx, int32_t num, EStreamType type) {
|
||||||
for (int i = 0; i < num; i++) {
|
for (int i = 0; i < num; i++) {
|
||||||
|
|
|
@ -2734,7 +2734,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "mode",
|
.name = "mode",
|
||||||
.type = FUNCTION_TYPE_MODE,
|
.type = FUNCTION_TYPE_MODE,
|
||||||
.classification = FUNC_MGT_AGG_FUNC,
|
.classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC,
|
||||||
.translateFunc = translateMode,
|
.translateFunc = translateMode,
|
||||||
.getEnvFunc = getModeFuncEnv,
|
.getEnvFunc = getModeFuncEnv,
|
||||||
.initFunc = modeFunctionSetup,
|
.initFunc = modeFunctionSetup,
|
||||||
|
|
|
@ -256,6 +256,7 @@ typedef struct SUniqueInfo {
|
||||||
|
|
||||||
typedef struct SModeItem {
|
typedef struct SModeItem {
|
||||||
int64_t count;
|
int64_t count;
|
||||||
|
STuplePos tuplePos;
|
||||||
char data[];
|
char data[];
|
||||||
} SModeItem;
|
} SModeItem;
|
||||||
|
|
||||||
|
@ -264,6 +265,10 @@ typedef struct SModeInfo {
|
||||||
uint8_t colType;
|
uint8_t colType;
|
||||||
int16_t colBytes;
|
int16_t colBytes;
|
||||||
SHashObj* pHash;
|
SHashObj* pHash;
|
||||||
|
|
||||||
|
STuplePos nullTuplePos;
|
||||||
|
bool nullTupleSaved;
|
||||||
|
|
||||||
char pItems[];
|
char pItems[];
|
||||||
} SModeInfo;
|
} SModeInfo;
|
||||||
|
|
||||||
|
@ -5468,10 +5473,13 @@ bool modeFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
} else {
|
} else {
|
||||||
pInfo->pHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
pInfo->pHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
||||||
}
|
}
|
||||||
|
pInfo->nullTupleSaved = false;
|
||||||
|
pInfo->nullTuplePos.pageId = -1;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doModeAdd(SModeInfo* pInfo, char* data) {
|
static void doModeAdd(SModeInfo* pInfo, int32_t rowIndex, SqlFunctionCtx* pCtx, char* data) {
|
||||||
int32_t hashKeyBytes = IS_STR_DATA_TYPE(pInfo->colType) ? varDataTLen(data) : pInfo->colBytes;
|
int32_t hashKeyBytes = IS_STR_DATA_TYPE(pInfo->colType) ? varDataTLen(data) : pInfo->colBytes;
|
||||||
SModeItem** pHashItem = taosHashGet(pInfo->pHash, data, hashKeyBytes);
|
SModeItem** pHashItem = taosHashGet(pInfo->pHash, data, hashKeyBytes);
|
||||||
if (pHashItem == NULL) {
|
if (pHashItem == NULL) {
|
||||||
|
@ -5480,10 +5488,17 @@ static void doModeAdd(SModeInfo* pInfo, char* data) {
|
||||||
memcpy(pItem->data, data, hashKeyBytes);
|
memcpy(pItem->data, data, hashKeyBytes);
|
||||||
pItem->count += 1;
|
pItem->count += 1;
|
||||||
|
|
||||||
|
if (pCtx->subsidiaries.num > 0) {
|
||||||
|
pItem->tuplePos = saveTupleData(pCtx, rowIndex, pCtx->pSrcBlock, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
taosHashPut(pInfo->pHash, data, hashKeyBytes, &pItem, sizeof(SModeItem*));
|
taosHashPut(pInfo->pHash, data, hashKeyBytes, &pItem, sizeof(SModeItem*));
|
||||||
pInfo->numOfPoints++;
|
pInfo->numOfPoints++;
|
||||||
} else {
|
} else {
|
||||||
(*pHashItem)->count += 1;
|
(*pHashItem)->count += 1;
|
||||||
|
if (pCtx->subsidiaries.num > 0) {
|
||||||
|
updateTupleData(pCtx, rowIndex, pCtx->pSrcBlock, &((*pHashItem)->tuplePos));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5505,7 +5520,7 @@ int32_t modeFunction(SqlFunctionCtx* pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
numOfElems++;
|
numOfElems++;
|
||||||
doModeAdd(pInfo, data);
|
doModeAdd(pInfo, i, pCtx, data);
|
||||||
|
|
||||||
if (sizeof(SModeInfo) + pInfo->numOfPoints * (sizeof(SModeItem) + pInfo->colBytes) >= MODE_MAX_RESULT_SIZE) {
|
if (sizeof(SModeInfo) + pInfo->numOfPoints * (sizeof(SModeItem) + pInfo->colBytes) >= MODE_MAX_RESULT_SIZE) {
|
||||||
taosHashCleanup(pInfo->pHash);
|
taosHashCleanup(pInfo->pHash);
|
||||||
|
@ -5513,6 +5528,11 @@ int32_t modeFunction(SqlFunctionCtx* pCtx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (numOfElems == 0 && pCtx->subsidiaries.num > 0 && !pInfo->nullTupleSaved) {
|
||||||
|
pInfo->nullTuplePos = saveTupleData(pCtx, pInput->startRowIndex, pCtx->pSrcBlock, NULL);
|
||||||
|
pInfo->nullTupleSaved = true;
|
||||||
|
}
|
||||||
|
|
||||||
SET_VAL(pResInfo, numOfElems, 1);
|
SET_VAL(pResInfo, numOfElems, 1);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -5538,8 +5558,10 @@ int32_t modeFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
|
||||||
if (maxCount != 0) {
|
if (maxCount != 0) {
|
||||||
SModeItem* pResItem = (SModeItem*)(pInfo->pItems + resIndex * (sizeof(SModeItem) + pInfo->colBytes));
|
SModeItem* pResItem = (SModeItem*)(pInfo->pItems + resIndex * (sizeof(SModeItem) + pInfo->colBytes));
|
||||||
colDataAppend(pCol, currentRow, pResItem->data, false);
|
colDataAppend(pCol, currentRow, pResItem->data, false);
|
||||||
|
setSelectivityValue(pCtx, pBlock, &pResItem->tuplePos, currentRow);
|
||||||
} else {
|
} else {
|
||||||
colDataAppendNULL(pCol, currentRow);
|
colDataAppendNULL(pCol, currentRow);
|
||||||
|
setSelectivityValue(pCtx, pBlock, &pInfo->nullTuplePos, currentRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosHashCleanup(pInfo->pHash);
|
taosHashCleanup(pInfo->pHash);
|
||||||
|
|
|
@ -792,9 +792,24 @@ void nodesDestroyNode(SNode* pNode) {
|
||||||
nodesDestroyNode((SNode*)pStmt->pSlimit);
|
nodesDestroyNode((SNode*)pStmt->pSlimit);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QUERY_NODE_VNODE_MODIF_STMT:
|
case QUERY_NODE_VNODE_MODIF_STMT: {
|
||||||
destroyVgDataBlockArray(((SVnodeModifOpStmt*)pNode)->pDataBlocks);
|
SVnodeModifOpStmt* pStmt = (SVnodeModifOpStmt*)pNode;
|
||||||
|
destroyVgDataBlockArray(pStmt->pDataBlocks);
|
||||||
|
taosMemoryFreeClear(pStmt->pTableMeta);
|
||||||
|
taosHashCleanup(pStmt->pVgroupsHashObj);
|
||||||
|
taosHashCleanup(pStmt->pSubTableHashObj);
|
||||||
|
taosHashCleanup(pStmt->pTableNameHashObj);
|
||||||
|
taosHashCleanup(pStmt->pDbFNameHashObj);
|
||||||
|
if (pStmt->freeHashFunc) {
|
||||||
|
pStmt->freeHashFunc(pStmt->pTableBlockHashObj);
|
||||||
|
}
|
||||||
|
if (pStmt->freeArrayFunc) {
|
||||||
|
pStmt->freeArrayFunc(pStmt->pVgDataBlocks);
|
||||||
|
}
|
||||||
|
tdDestroySVCreateTbReq(&pStmt->createTblReq);
|
||||||
|
taosCloseFile(&pStmt->fp);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case QUERY_NODE_CREATE_DATABASE_STMT:
|
case QUERY_NODE_CREATE_DATABASE_STMT:
|
||||||
nodesDestroyNode((SNode*)((SCreateDatabaseStmt*)pNode)->pOptions);
|
nodesDestroyNode((SNode*)((SCreateDatabaseStmt*)pNode)->pOptions);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -79,29 +79,6 @@ typedef struct SInsertParseBaseContext {
|
||||||
SMsgBuf msg;
|
SMsgBuf msg;
|
||||||
} SInsertParseBaseContext;
|
} SInsertParseBaseContext;
|
||||||
|
|
||||||
typedef struct SInsertParseContext {
|
|
||||||
SParseContext *pComCxt; // input
|
|
||||||
char *pSql; // input
|
|
||||||
SMsgBuf msg; // input
|
|
||||||
STableMeta *pTableMeta; // each table
|
|
||||||
SParsedDataColInfo tags; // each table
|
|
||||||
SVCreateTbReq createTblReq; // each table
|
|
||||||
SHashObj *pVgroupsHashObj; // global
|
|
||||||
SHashObj *pTableBlockHashObj; // global
|
|
||||||
SHashObj *pSubTableHashObj; // global
|
|
||||||
SArray *pVgDataBlocks; // global
|
|
||||||
SHashObj *pTableNameHashObj; // global
|
|
||||||
SHashObj *pDbFNameHashObj; // global
|
|
||||||
int32_t totalNum;
|
|
||||||
SVnodeModifOpStmt *pOutput;
|
|
||||||
SStmtCallback *pStmtCb;
|
|
||||||
SParseMetaCache *pMetaCache;
|
|
||||||
char sTableName[TSDB_TABLE_NAME_LEN];
|
|
||||||
char tmpTokenBuf[TSDB_MAX_BYTES_PER_ROW];
|
|
||||||
int64_t memElapsed;
|
|
||||||
int64_t parRowElapsed;
|
|
||||||
} SInsertParseContext;
|
|
||||||
|
|
||||||
typedef struct SInsertParseSyntaxCxt {
|
typedef struct SInsertParseSyntaxCxt {
|
||||||
SParseContext *pComCxt;
|
SParseContext *pComCxt;
|
||||||
char *pSql;
|
char *pSql;
|
||||||
|
@ -142,7 +119,7 @@ typedef struct STableDataBlocks {
|
||||||
|
|
||||||
int32_t insGetExtendedRowSize(STableDataBlocks *pBlock);
|
int32_t insGetExtendedRowSize(STableDataBlocks *pBlock);
|
||||||
void insGetSTSRowAppendInfo(uint8_t rowType, SParsedDataColInfo *spd, col_id_t idx, int32_t *toffset, col_id_t *colIdx);
|
void insGetSTSRowAppendInfo(uint8_t rowType, SParsedDataColInfo *spd, col_id_t idx, int32_t *toffset, col_id_t *colIdx);
|
||||||
int32_t insSetBlockInfo(SSubmitBlk *pBlocks, STableDataBlocks *dataBuf, int32_t numOfRows);
|
int32_t insSetBlockInfo(SSubmitBlk *pBlocks, STableDataBlocks *dataBuf, int32_t numOfRows, SMsgBuf *pMsg);
|
||||||
int32_t insSchemaIdxCompar(const void *lhs, const void *rhs);
|
int32_t insSchemaIdxCompar(const void *lhs, const void *rhs);
|
||||||
int32_t insBoundIdxCompar(const void *lhs, const void *rhs);
|
int32_t insBoundIdxCompar(const void *lhs, const void *rhs);
|
||||||
void insSetBoundColumnInfo(SParsedDataColInfo *pColList, SSchema *pSchema, col_id_t numOfCols);
|
void insSetBoundColumnInfo(SParsedDataColInfo *pColList, SSchema *pSchema, col_id_t numOfCols);
|
||||||
|
@ -161,7 +138,7 @@ void insBuildCreateTbReq(SVCreateTbReq *pTbReq, const char *tname, STag *pTag
|
||||||
SArray *tagName, uint8_t tagNum);
|
SArray *tagName, uint8_t tagNum);
|
||||||
int32_t insMemRowAppend(SMsgBuf *pMsgBuf, const void *value, int32_t len, void *param);
|
int32_t insMemRowAppend(SMsgBuf *pMsgBuf, const void *value, int32_t len, void *param);
|
||||||
int32_t insCheckTimestamp(STableDataBlocks *pDataBlocks, const char *start);
|
int32_t insCheckTimestamp(STableDataBlocks *pDataBlocks, const char *start);
|
||||||
int32_t insBuildOutput(SInsertParseContext *pCxt);
|
int32_t insBuildOutput(SHashObj *pVgroupsHashObj, SArray *pVgDataBlocks, SArray **pDataBlocks);
|
||||||
void insDestroyDataBlock(STableDataBlocks *pDataBlock);
|
void insDestroyDataBlock(STableDataBlocks *pDataBlock);
|
||||||
|
|
||||||
#endif // TDENGINE_PAR_INSERT_UTIL_H
|
#endif // TDENGINE_PAR_INSERT_UTIL_H
|
||||||
|
|
|
@ -27,8 +27,7 @@ extern "C" {
|
||||||
#define QUERY_SMA_OPTIMIZE_DISABLE 0
|
#define QUERY_SMA_OPTIMIZE_DISABLE 0
|
||||||
#define QUERY_SMA_OPTIMIZE_ENABLE 1
|
#define QUERY_SMA_OPTIMIZE_ENABLE 1
|
||||||
|
|
||||||
int32_t parseInsertSyntax(SParseContext* pContext, SQuery** pQuery, SParseMetaCache* pMetaCache);
|
int32_t parseInsertSql(SParseContext* pCxt, SQuery** pQuery, SCatalogReq* pCatalogReq, const SMetaData* pMetaData);
|
||||||
int32_t parseInsertSql(SParseContext* pContext, SQuery** pQuery, SParseMetaCache* pMetaCache);
|
|
||||||
int32_t parse(SParseContext* pParseCxt, SQuery** pQuery);
|
int32_t parse(SParseContext* pParseCxt, SQuery** pQuery);
|
||||||
int32_t collectMetaKey(SParseContext* pParseCxt, SQuery* pQuery, SParseMetaCache* pMetaCache);
|
int32_t collectMetaKey(SParseContext* pParseCxt, SQuery* pQuery, SParseMetaCache* pMetaCache);
|
||||||
int32_t authenticate(SParseContext* pParseCxt, SQuery* pQuery, SParseMetaCache* pMetaCache);
|
int32_t authenticate(SParseContext* pParseCxt, SQuery* pQuery, SParseMetaCache* pMetaCache);
|
||||||
|
|
|
@ -71,11 +71,6 @@ typedef struct SParseMetaCache {
|
||||||
SHashObj* pTableCfg; // key is tbFName, element is STableCfg*
|
SHashObj* pTableCfg; // key is tbFName, element is STableCfg*
|
||||||
SArray* pDnodes; // element is SEpSet
|
SArray* pDnodes; // element is SEpSet
|
||||||
bool dnodeRequired;
|
bool dnodeRequired;
|
||||||
SHashObj* pInsertTables; // key is dbName, element is SInsertTablesMetaReq*, for insert
|
|
||||||
const char* pUser;
|
|
||||||
const SArray* pTableMetaData; // pRes = STableMeta*
|
|
||||||
const SArray* pTableVgroupData; // pRes = SVgroupInfo*
|
|
||||||
int32_t sqlTableNum;
|
|
||||||
} SParseMetaCache;
|
} SParseMetaCache;
|
||||||
|
|
||||||
int32_t generateSyntaxErrMsg(SMsgBuf* pBuf, int32_t errCode, ...);
|
int32_t generateSyntaxErrMsg(SMsgBuf* pBuf, int32_t errCode, ...);
|
||||||
|
@ -93,9 +88,8 @@ STableMeta* tableMetaDup(const STableMeta* pTableMeta);
|
||||||
int32_t trimString(const char* src, int32_t len, char* dst, int32_t dlen);
|
int32_t trimString(const char* src, int32_t len, char* dst, int32_t dlen);
|
||||||
int32_t getInsTagsTableTargetName(int32_t acctId, SNode* pWhere, SName* pName);
|
int32_t getInsTagsTableTargetName(int32_t acctId, SNode* pWhere, SName* pName);
|
||||||
|
|
||||||
int32_t buildCatalogReq(SParseContext* pCxt, const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq);
|
int32_t buildCatalogReq(const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq);
|
||||||
int32_t putMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache,
|
int32_t putMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache);
|
||||||
bool insertValuesStmt);
|
|
||||||
int32_t reserveTableMetaInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache);
|
int32_t reserveTableMetaInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache);
|
||||||
int32_t reserveTableMetaInCacheExt(const SName* pName, SParseMetaCache* pMetaCache);
|
int32_t reserveTableMetaInCacheExt(const SName* pName, SParseMetaCache* pMetaCache);
|
||||||
int32_t reserveDbVgInfoInCache(int32_t acctId, const char* pDb, SParseMetaCache* pMetaCache);
|
int32_t reserveDbVgInfoInCache(int32_t acctId, const char* pDb, SParseMetaCache* pMetaCache);
|
||||||
|
@ -122,12 +116,6 @@ int32_t getUdfInfoFromCache(SParseMetaCache* pMetaCache, const char* pFunc, SFun
|
||||||
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);
|
||||||
int32_t getDnodeListFromCache(SParseMetaCache* pMetaCache, SArray** pDnodes);
|
int32_t getDnodeListFromCache(SParseMetaCache* pMetaCache, SArray** pDnodes);
|
||||||
int32_t reserveTableMetaInCacheForInsert(const SName* pName, ECatalogReqType reqType, int32_t tableNo,
|
|
||||||
SParseMetaCache* pMetaCache);
|
|
||||||
int32_t getTableMetaFromCacheForInsert(SArray* pTableMetaPos, SParseMetaCache* pMetaCache, int32_t tableNo,
|
|
||||||
STableMeta** pMeta);
|
|
||||||
int32_t getTableVgroupFromCacheForInsert(SArray* pTableVgroupPos, SParseMetaCache* pMetaCache, int32_t tableNo,
|
|
||||||
SVgroupInfo* pVgroup);
|
|
||||||
void destoryParseMetaCache(SParseMetaCache* pMetaCache, bool request);
|
void destoryParseMetaCache(SParseMetaCache* pMetaCache, bool request);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -84,6 +84,7 @@ abort_parse:
|
||||||
(*pQuery)->pRoot = cxt.pRootNode;
|
(*pQuery)->pRoot = cxt.pRootNode;
|
||||||
(*pQuery)->placeholderNum = cxt.placeholderNo;
|
(*pQuery)->placeholderNum = cxt.placeholderNo;
|
||||||
TSWAP((*pQuery)->pPlaceholderValues, cxt.pPlaceholderValues);
|
TSWAP((*pQuery)->pPlaceholderValues, cxt.pPlaceholderValues);
|
||||||
|
(*pQuery)->execStage = QUERY_EXEC_STAGE_ANALYSE;
|
||||||
}
|
}
|
||||||
taosArrayDestroy(cxt.pPlaceholderValues);
|
taosArrayDestroy(cxt.pPlaceholderValues);
|
||||||
return cxt.errCode;
|
return cxt.errCode;
|
||||||
|
|
|
@ -333,11 +333,7 @@ int32_t smlBindData(void* handle, SArray* tags, SArray* colsSchema, SArray* cols
|
||||||
}
|
}
|
||||||
|
|
||||||
SSubmitBlk* pBlocks = (SSubmitBlk*)(pDataBlock->pData);
|
SSubmitBlk* pBlocks = (SSubmitBlk*)(pDataBlock->pData);
|
||||||
if (TSDB_CODE_SUCCESS != insSetBlockInfo(pBlocks, pDataBlock, rowNum)) {
|
return insSetBlockInfo(pBlocks, pDataBlock, rowNum, &pBuf);
|
||||||
return buildInvalidOperationMsg(&pBuf, "too many rows in sql, total number of rows should be less than INT32_MAX");
|
|
||||||
}
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void* smlInitHandle(SQuery* pQuery) {
|
void* smlInitHandle(SQuery* pQuery) {
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -30,23 +30,17 @@ typedef struct SKvParam {
|
||||||
} SKvParam;
|
} SKvParam;
|
||||||
|
|
||||||
int32_t qBuildStmtOutput(SQuery* pQuery, SHashObj* pVgHash, SHashObj* pBlockHash) {
|
int32_t qBuildStmtOutput(SQuery* pQuery, SHashObj* pVgHash, SHashObj* pBlockHash) {
|
||||||
SVnodeModifOpStmt* modifyNode = (SVnodeModifOpStmt*)pQuery->pRoot;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
int32_t code = 0;
|
SArray* pVgDataBlocks = NULL;
|
||||||
SInsertParseContext insertCtx = {
|
|
||||||
.pVgroupsHashObj = pVgHash,
|
|
||||||
.pTableBlockHashObj = pBlockHash,
|
|
||||||
.pOutput = (SVnodeModifOpStmt*)pQuery->pRoot,
|
|
||||||
};
|
|
||||||
|
|
||||||
// merge according to vgId
|
// merge according to vgId
|
||||||
if (taosHashGetSize(insertCtx.pTableBlockHashObj) > 0) {
|
if (taosHashGetSize(pBlockHash) > 0) {
|
||||||
CHECK_CODE(insMergeTableDataBlocks(insertCtx.pTableBlockHashObj, &insertCtx.pVgDataBlocks));
|
code = insMergeTableDataBlocks(pBlockHash, &pVgDataBlocks);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
CHECK_CODE(insBuildOutput(&insertCtx));
|
code = insBuildOutput(pVgHash, pVgDataBlocks, &((SVnodeModifOpStmt*)pQuery->pRoot)->pDataBlocks);
|
||||||
|
}
|
||||||
insDestroyBlockArrayList(insertCtx.pVgDataBlocks);
|
insDestroyBlockArrayList(pVgDataBlocks);
|
||||||
return TSDB_CODE_SUCCESS;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, const char* sTableName, char* tName,
|
int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, const char* sTableName, char* tName,
|
||||||
|
@ -222,11 +216,7 @@ int32_t qBindStmtColsValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, in
|
||||||
}
|
}
|
||||||
|
|
||||||
SSubmitBlk* pBlocks = (SSubmitBlk*)(pDataBlock->pData);
|
SSubmitBlk* pBlocks = (SSubmitBlk*)(pDataBlock->pData);
|
||||||
if (TSDB_CODE_SUCCESS != insSetBlockInfo(pBlocks, pDataBlock, bind->num)) {
|
return insSetBlockInfo(pBlocks, pDataBlock, bind->num, &pBuf);
|
||||||
return buildInvalidOperationMsg(&pBuf, "too many rows in sql, total number of rows should be less than INT32_MAX");
|
|
||||||
}
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qBindStmtSingleColValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen, int32_t colIdx,
|
int32_t qBindStmtSingleColValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen, int32_t colIdx,
|
||||||
|
@ -308,10 +298,7 @@ int32_t qBindStmtSingleColValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBu
|
||||||
pDataBlock->size += extendedRowSize * bind->num;
|
pDataBlock->size += extendedRowSize * bind->num;
|
||||||
|
|
||||||
SSubmitBlk* pBlocks = (SSubmitBlk*)(pDataBlock->pData);
|
SSubmitBlk* pBlocks = (SSubmitBlk*)(pDataBlock->pData);
|
||||||
if (TSDB_CODE_SUCCESS != insSetBlockInfo(pBlocks, pDataBlock, bind->num)) {
|
CHECK_CODE(insSetBlockInfo(pBlocks, pDataBlock, bind->num, &pBuf));
|
||||||
return buildInvalidOperationMsg(&pBuf,
|
|
||||||
"too many rows in sql, total number of rows should be less than INT32_MAX");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
|
@ -110,19 +110,18 @@ void insGetSTSRowAppendInfo(uint8_t rowType, SParsedDataColInfo* spd, col_id_t i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t insSetBlockInfo(SSubmitBlk* pBlocks, STableDataBlocks* dataBuf, int32_t numOfRows) {
|
int32_t insSetBlockInfo(SSubmitBlk* pBlocks, STableDataBlocks* dataBuf, int32_t numOfRows, SMsgBuf* pMsg) {
|
||||||
pBlocks->suid = (TSDB_NORMAL_TABLE == dataBuf->pTableMeta->tableType ? 0 : dataBuf->pTableMeta->suid);
|
pBlocks->suid = (TSDB_NORMAL_TABLE == dataBuf->pTableMeta->tableType ? 0 : dataBuf->pTableMeta->suid);
|
||||||
pBlocks->uid = dataBuf->pTableMeta->uid;
|
pBlocks->uid = dataBuf->pTableMeta->uid;
|
||||||
pBlocks->sversion = dataBuf->pTableMeta->sversion;
|
pBlocks->sversion = dataBuf->pTableMeta->sversion;
|
||||||
pBlocks->schemaLen = dataBuf->createTbReqLen;
|
pBlocks->schemaLen = dataBuf->createTbReqLen;
|
||||||
|
|
||||||
if (pBlocks->numOfRows + numOfRows >= INT32_MAX) {
|
if (pBlocks->numOfRows + numOfRows >= INT32_MAX) {
|
||||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
return buildInvalidOperationMsg(pMsg, "too many rows in sql, total number of rows should be less than INT32_MAX");
|
||||||
} else {
|
}
|
||||||
pBlocks->numOfRows += numOfRows;
|
pBlocks->numOfRows += numOfRows;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void insSetBoundColumnInfo(SParsedDataColInfo* pColList, SSchema* pSchema, col_id_t numOfCols) {
|
void insSetBoundColumnInfo(SParsedDataColInfo* pColList, SSchema* pSchema, col_id_t numOfCols) {
|
||||||
pColList->numOfCols = numOfCols;
|
pColList->numOfCols = numOfCols;
|
||||||
|
@ -271,12 +270,8 @@ void insDestroyDataBlock(STableDataBlocks* pDataBlock) {
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFreeClear(pDataBlock->pData);
|
taosMemoryFreeClear(pDataBlock->pData);
|
||||||
// if (!pDataBlock->cloned) {
|
|
||||||
// free the refcount for metermeta
|
|
||||||
taosMemoryFreeClear(pDataBlock->pTableMeta);
|
taosMemoryFreeClear(pDataBlock->pTableMeta);
|
||||||
|
|
||||||
destroyBoundColumnInfo(&pDataBlock->boundColumnInfo);
|
destroyBoundColumnInfo(&pDataBlock->boundColumnInfo);
|
||||||
// }
|
|
||||||
taosMemoryFreeClear(pDataBlock);
|
taosMemoryFreeClear(pDataBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,20 +307,6 @@ int32_t insGetDataBlockFromList(SHashObj* pHashList, void* id, int32_t idLen, in
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
static int32_t getRowExpandSize(STableMeta* pTableMeta) {
|
|
||||||
int32_t result = TD_ROW_HEAD_LEN - sizeof(TSKEY);
|
|
||||||
int32_t columns = getNumOfColumns(pTableMeta);
|
|
||||||
SSchema* pSchema = getTableColumnSchema(pTableMeta);
|
|
||||||
for (int32_t i = 0; i < columns; ++i) {
|
|
||||||
if (IS_VAR_DATA_TYPE((pSchema + i)->type)) {
|
|
||||||
result += TYPE_BYTES[TSDB_DATA_TYPE_BINARY];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result += (int32_t)TD_BITMAP_BYTES(columns - 1);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void insDestroyBlockArrayList(SArray* pDataBlockList) {
|
void insDestroyBlockArrayList(SArray* pDataBlockList) {
|
||||||
if (pDataBlockList == NULL) {
|
if (pDataBlockList == NULL) {
|
||||||
|
@ -357,51 +338,6 @@ void insDestroyBlockHashmap(SHashObj* pDataBlockHash) {
|
||||||
taosHashCleanup(pDataBlockHash);
|
taosHashCleanup(pDataBlockHash);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
// data block is disordered, sort it in ascending order
|
|
||||||
void sortRemoveDataBlockDupRowsRaw(STableDataBlocks* dataBuf) {
|
|
||||||
SSubmitBlk* pBlocks = (SSubmitBlk*)dataBuf->pData;
|
|
||||||
|
|
||||||
// size is less than the total size, since duplicated rows may be removed yet.
|
|
||||||
assert(pBlocks->numOfRows * dataBuf->rowSize + sizeof(SSubmitBlk) == dataBuf->size);
|
|
||||||
|
|
||||||
if (!dataBuf->ordered) {
|
|
||||||
char* pBlockData = pBlocks->data;
|
|
||||||
|
|
||||||
// todo. qsort is unstable, if timestamp is same, should get the last one
|
|
||||||
taosSort(pBlockData, pBlocks->numOfRows, dataBuf->rowSize, rowDataCompar);
|
|
||||||
|
|
||||||
int32_t i = 0;
|
|
||||||
int32_t j = 1;
|
|
||||||
|
|
||||||
// delete rows with timestamp conflicts
|
|
||||||
while (j < pBlocks->numOfRows) {
|
|
||||||
TSKEY ti = *(TSKEY*)(pBlockData + dataBuf->rowSize * i);
|
|
||||||
TSKEY tj = *(TSKEY*)(pBlockData + dataBuf->rowSize * j);
|
|
||||||
|
|
||||||
if (ti == tj) {
|
|
||||||
++j;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t nextPos = (++i);
|
|
||||||
if (nextPos != j) {
|
|
||||||
memmove(pBlockData + dataBuf->rowSize * nextPos, pBlockData + dataBuf->rowSize * j, dataBuf->rowSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
++j;
|
|
||||||
}
|
|
||||||
|
|
||||||
dataBuf->ordered = true;
|
|
||||||
|
|
||||||
pBlocks->numOfRows = i + 1;
|
|
||||||
dataBuf->size = sizeof(SSubmitBlk) + dataBuf->rowSize * pBlocks->numOfRows;
|
|
||||||
}
|
|
||||||
|
|
||||||
dataBuf->prevTS = INT64_MIN;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// data block is disordered, sort it in ascending order
|
// data block is disordered, sort it in ascending order
|
||||||
static int sortRemoveDataBlockDupRows(STableDataBlocks* dataBuf, SBlockKeyInfo* pBlkKeyInfo) {
|
static int sortRemoveDataBlockDupRows(STableDataBlocks* dataBuf, SBlockKeyInfo* pBlkKeyInfo) {
|
||||||
SSubmitBlk* pBlocks = (SSubmitBlk*)dataBuf->pData;
|
SSubmitBlk* pBlocks = (SSubmitBlk*)dataBuf->pData;
|
||||||
|
@ -896,6 +832,10 @@ int32_t insCreateSName(SName* pName, SToken* pTableName, int32_t acctId, const c
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (NULL != strchr(pName->tname, '.')) {
|
||||||
|
code = generateSyntaxErrMsgExt(pMsgBuf, TSDB_CODE_PAR_INVALID_IDENTIFIER_NAME, "The table name cannot contain '.'");
|
||||||
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -994,24 +934,24 @@ static void buildMsgHeader(STableDataBlocks* src, SVgDataBlocks* blocks) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t insBuildOutput(SInsertParseContext* pCxt) {
|
int32_t insBuildOutput(SHashObj* pVgroupsHashObj, SArray* pVgDataBlocks, SArray** pDataBlocks) {
|
||||||
size_t numOfVg = taosArrayGetSize(pCxt->pVgDataBlocks);
|
size_t numOfVg = taosArrayGetSize(pVgDataBlocks);
|
||||||
pCxt->pOutput->pDataBlocks = taosArrayInit(numOfVg, POINTER_BYTES);
|
*pDataBlocks = taosArrayInit(numOfVg, POINTER_BYTES);
|
||||||
if (NULL == pCxt->pOutput->pDataBlocks) {
|
if (NULL == *pDataBlocks) {
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < numOfVg; ++i) {
|
for (size_t i = 0; i < numOfVg; ++i) {
|
||||||
STableDataBlocks* src = taosArrayGetP(pCxt->pVgDataBlocks, i);
|
STableDataBlocks* src = taosArrayGetP(pVgDataBlocks, i);
|
||||||
SVgDataBlocks* dst = taosMemoryCalloc(1, sizeof(SVgDataBlocks));
|
SVgDataBlocks* dst = taosMemoryCalloc(1, sizeof(SVgDataBlocks));
|
||||||
if (NULL == dst) {
|
if (NULL == dst) {
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
taosHashGetDup(pCxt->pVgroupsHashObj, (const char*)&src->vgId, sizeof(src->vgId), &dst->vg);
|
taosHashGetDup(pVgroupsHashObj, (const char*)&src->vgId, sizeof(src->vgId), &dst->vg);
|
||||||
dst->numOfTables = src->numOfTables;
|
dst->numOfTables = src->numOfTables;
|
||||||
dst->size = src->size;
|
dst->size = src->size;
|
||||||
TSWAP(dst->pData, src->pData);
|
TSWAP(dst->pData, src->pData);
|
||||||
buildMsgHeader(src, dst);
|
buildMsgHeader(src, dst);
|
||||||
taosArrayPush(pCxt->pOutput->pDataBlocks, &dst);
|
taosArrayPush(*pDataBlocks, &dst);
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2181,7 +2181,8 @@ static int32_t getTagsTableVgroupListImpl(STranslateContext* pCxt, SName* pTarge
|
||||||
|
|
||||||
if (TSDB_DB_NAME_T == pTargetName->type) {
|
if (TSDB_DB_NAME_T == pTargetName->type) {
|
||||||
int32_t code = getDBVgInfoImpl(pCxt, pTargetName, pVgroupList);
|
int32_t code = getDBVgInfoImpl(pCxt, pTargetName, pVgroupList);
|
||||||
if (TSDB_CODE_MND_DB_NOT_EXIST == code) {
|
if (TSDB_CODE_MND_DB_NOT_EXIST == code || TSDB_CODE_MND_DB_IN_CREATING == code ||
|
||||||
|
TSDB_CODE_MND_DB_IN_DROPPING == code) {
|
||||||
code = TSDB_CODE_SUCCESS;
|
code = TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
|
@ -2196,7 +2197,8 @@ static int32_t getTagsTableVgroupListImpl(STranslateContext* pCxt, SName* pTarge
|
||||||
} else {
|
} else {
|
||||||
taosArrayPush(*pVgroupList, &vgInfo);
|
taosArrayPush(*pVgroupList, &vgInfo);
|
||||||
}
|
}
|
||||||
} else if (TSDB_CODE_MND_DB_NOT_EXIST == code) {
|
} else if (TSDB_CODE_MND_DB_NOT_EXIST == code || TSDB_CODE_MND_DB_IN_CREATING == code ||
|
||||||
|
TSDB_CODE_MND_DB_IN_DROPPING == code) {
|
||||||
code = TSDB_CODE_SUCCESS;
|
code = TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
|
@ -3021,20 +3023,17 @@ static int32_t translateIntervalWindow(STranslateContext* pCxt, SSelectStmt* pSe
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static EDealRes checkStateExpr(SNode* pNode, void* pContext) {
|
static int32_t checkStateExpr(STranslateContext* pCxt, SNode* pNode) {
|
||||||
if (QUERY_NODE_COLUMN == nodeType(pNode)) {
|
int32_t type = ((SExprNode*)pNode)->resType.type;
|
||||||
STranslateContext* pCxt = pContext;
|
|
||||||
SColumnNode* pCol = (SColumnNode*)pNode;
|
|
||||||
|
|
||||||
int32_t type = pCol->node.resType.type;
|
|
||||||
if (!IS_INTEGER_TYPE(type) && type != TSDB_DATA_TYPE_BOOL && !IS_VAR_DATA_TYPE(type)) {
|
if (!IS_INTEGER_TYPE(type) && type != TSDB_DATA_TYPE_BOOL && !IS_VAR_DATA_TYPE(type)) {
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_STATE_WIN_TYPE);
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STATE_WIN_TYPE);
|
||||||
}
|
}
|
||||||
if (COLUMN_TYPE_TAG == pCol->colType) {
|
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_STATE_WIN_COL);
|
if (QUERY_NODE_COLUMN == nodeType(pNode) && COLUMN_TYPE_TAG == ((SColumnNode*)pNode)->colType) {
|
||||||
|
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STATE_WIN_COL);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return DEAL_RES_CONTINUE;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool hasPartitionByTbname(SNodeList* pPartitionByList) {
|
static bool hasPartitionByTbname(SNodeList* pPartitionByList) {
|
||||||
|
@ -3066,11 +3065,11 @@ static int32_t translateStateWindow(STranslateContext* pCxt, SSelectStmt* pSelec
|
||||||
}
|
}
|
||||||
|
|
||||||
SStateWindowNode* pState = (SStateWindowNode*)pSelect->pWindow;
|
SStateWindowNode* pState = (SStateWindowNode*)pSelect->pWindow;
|
||||||
nodesWalkExprPostOrder(pState->pExpr, checkStateExpr, pCxt);
|
int32_t code = checkStateExpr(pCxt, pState->pExpr);
|
||||||
if (TSDB_CODE_SUCCESS == pCxt->errCode) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
pCxt->errCode = checkStateWindowForStream(pCxt, pSelect);
|
code = checkStateWindowForStream(pCxt, pSelect);
|
||||||
}
|
}
|
||||||
return pCxt->errCode;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t translateSessionWindow(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
static int32_t translateSessionWindow(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
|
|
|
@ -612,62 +612,7 @@ static int32_t buildUdfReq(SHashObj* pUdfHash, SArray** pUdf) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t buildCatalogReqForInsert(SParseContext* pCxt, const SParseMetaCache* pMetaCache,
|
int32_t buildCatalogReq(const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq) {
|
||||||
SCatalogReq* pCatalogReq) {
|
|
||||||
int32_t ndbs = taosHashGetSize(pMetaCache->pInsertTables);
|
|
||||||
pCatalogReq->pTableMeta = taosArrayInit(ndbs, sizeof(STablesReq));
|
|
||||||
if (NULL == pCatalogReq->pTableMeta) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
pCatalogReq->pTableHash = taosArrayInit(ndbs, sizeof(STablesReq));
|
|
||||||
if (NULL == pCatalogReq->pTableHash) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
pCatalogReq->pUser = taosArrayInit(ndbs, sizeof(SUserAuthInfo));
|
|
||||||
if (NULL == pCatalogReq->pUser) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
pCxt->pTableMetaPos = taosArrayInit(pMetaCache->sqlTableNum, sizeof(int32_t));
|
|
||||||
pCxt->pTableVgroupPos = taosArrayInit(pMetaCache->sqlTableNum, sizeof(int32_t));
|
|
||||||
|
|
||||||
int32_t metaReqNo = 0;
|
|
||||||
int32_t vgroupReqNo = 0;
|
|
||||||
SInsertTablesMetaReq* p = taosHashIterate(pMetaCache->pInsertTables, NULL);
|
|
||||||
while (NULL != p) {
|
|
||||||
STablesReq req = {0};
|
|
||||||
strcpy(req.dbFName, p->dbFName);
|
|
||||||
TSWAP(req.pTables, p->pTableMetaReq);
|
|
||||||
taosArrayPush(pCatalogReq->pTableMeta, &req);
|
|
||||||
|
|
||||||
req.pTables = NULL;
|
|
||||||
TSWAP(req.pTables, p->pTableVgroupReq);
|
|
||||||
taosArrayPush(pCatalogReq->pTableHash, &req);
|
|
||||||
|
|
||||||
int32_t ntables = taosArrayGetSize(p->pTableMetaPos);
|
|
||||||
for (int32_t i = 0; i < ntables; ++i) {
|
|
||||||
taosArrayInsert(pCxt->pTableMetaPos, *(int32_t*)taosArrayGet(p->pTableMetaPos, i), &metaReqNo);
|
|
||||||
++metaReqNo;
|
|
||||||
}
|
|
||||||
|
|
||||||
ntables = taosArrayGetSize(p->pTableVgroupPos);
|
|
||||||
for (int32_t i = 0; i < ntables; ++i) {
|
|
||||||
taosArrayInsert(pCxt->pTableVgroupPos, *(int32_t*)taosArrayGet(p->pTableVgroupPos, i), &vgroupReqNo);
|
|
||||||
++vgroupReqNo;
|
|
||||||
}
|
|
||||||
|
|
||||||
SUserAuthInfo auth = {0};
|
|
||||||
snprintf(auth.user, sizeof(auth.user), "%s", pCxt->pUser);
|
|
||||||
snprintf(auth.dbFName, sizeof(auth.dbFName), "%s", p->dbFName);
|
|
||||||
auth.type = AUTH_TYPE_WRITE;
|
|
||||||
taosArrayPush(pCatalogReq->pUser, &auth);
|
|
||||||
|
|
||||||
p = taosHashIterate(pMetaCache->pInsertTables, p);
|
|
||||||
}
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t buildCatalogReqForQuery(const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq) {
|
|
||||||
int32_t code = buildTableReqFromDb(pMetaCache->pTableMeta, &pCatalogReq->pTableMeta);
|
int32_t code = buildTableReqFromDb(pMetaCache->pTableMeta, &pCatalogReq->pTableMeta);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = buildDbReq(pMetaCache->pDbVgroup, &pCatalogReq->pDbVgroup);
|
code = buildDbReq(pMetaCache->pDbVgroup, &pCatalogReq->pDbVgroup);
|
||||||
|
@ -697,13 +642,6 @@ int32_t buildCatalogReqForQuery(const SParseMetaCache* pMetaCache, SCatalogReq*
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t buildCatalogReq(SParseContext* pCxt, const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq) {
|
|
||||||
if (NULL != pMetaCache->pInsertTables) {
|
|
||||||
return buildCatalogReqForInsert(pCxt, pMetaCache, pCatalogReq);
|
|
||||||
}
|
|
||||||
return buildCatalogReqForQuery(pMetaCache, pCatalogReq);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t putMetaDataToHash(const char* pKey, int32_t len, const SArray* pData, int32_t index, SHashObj** pHash) {
|
static int32_t putMetaDataToHash(const char* pKey, int32_t len, const SArray* pData, int32_t index, SHashObj** pHash) {
|
||||||
if (NULL == *pHash) {
|
if (NULL == *pHash) {
|
||||||
*pHash = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
*pHash = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
||||||
|
@ -791,8 +729,7 @@ static int32_t putUdfToCache(const SArray* pUdfReq, const SArray* pUdfData, SHas
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t putMetaDataToCacheForQuery(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData,
|
int32_t putMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache) {
|
||||||
SParseMetaCache* pMetaCache) {
|
|
||||||
int32_t code = putDbTableDataToCache(pCatalogReq->pTableMeta, pMetaData->pTableMeta, &pMetaCache->pTableMeta);
|
int32_t code = putDbTableDataToCache(pCatalogReq->pTableMeta, pMetaData->pTableMeta, &pMetaCache->pTableMeta);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = putDbDataToCache(pCatalogReq->pDbVgroup, pMetaData->pDbVgroup, &pMetaCache->pDbVgroup);
|
code = putDbDataToCache(pCatalogReq->pDbVgroup, pMetaData->pDbVgroup, &pMetaCache->pDbVgroup);
|
||||||
|
@ -822,30 +759,6 @@ int32_t putMetaDataToCacheForQuery(const SCatalogReq* pCatalogReq, const SMetaDa
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t putMetaDataToCacheForInsert(const SMetaData* pMetaData, SParseMetaCache* pMetaCache) {
|
|
||||||
int32_t ndbs = taosArrayGetSize(pMetaData->pUser);
|
|
||||||
for (int32_t i = 0; i < ndbs; ++i) {
|
|
||||||
SMetaRes* pRes = taosArrayGet(pMetaData->pUser, i);
|
|
||||||
if (TSDB_CODE_SUCCESS != pRes->code) {
|
|
||||||
return pRes->code;
|
|
||||||
}
|
|
||||||
if (!(*(bool*)pRes->pRes)) {
|
|
||||||
return TSDB_CODE_PAR_PERMISSION_DENIED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pMetaCache->pTableMetaData = pMetaData->pTableMeta;
|
|
||||||
pMetaCache->pTableVgroupData = pMetaData->pTableHash;
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t putMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache,
|
|
||||||
bool insertValuesStmt) {
|
|
||||||
if (insertValuesStmt) {
|
|
||||||
return putMetaDataToCacheForInsert(pMetaData, pMetaCache);
|
|
||||||
}
|
|
||||||
return putMetaDataToCacheForQuery(pCatalogReq, pMetaData, pMetaCache);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t reserveTableReqInCacheImpl(const char* pTbFName, int32_t len, SHashObj** pTables) {
|
static int32_t reserveTableReqInCacheImpl(const char* pTbFName, int32_t len, SHashObj** pTables) {
|
||||||
if (NULL == *pTables) {
|
if (NULL == *pTables) {
|
||||||
*pTables = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
*pTables = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
||||||
|
@ -1146,82 +1059,6 @@ int32_t getDnodeListFromCache(SParseMetaCache* pMetaCache, SArray** pDnodes) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t reserveTableReqInCacheForInsert(const SName* pName, ECatalogReqType reqType, int32_t tableNo,
|
|
||||||
SInsertTablesMetaReq* pReq) {
|
|
||||||
switch (reqType) {
|
|
||||||
case CATALOG_REQ_TYPE_META:
|
|
||||||
taosArrayPush(pReq->pTableMetaReq, pName);
|
|
||||||
taosArrayPush(pReq->pTableMetaPos, &tableNo);
|
|
||||||
break;
|
|
||||||
case CATALOG_REQ_TYPE_VGROUP:
|
|
||||||
taosArrayPush(pReq->pTableVgroupReq, pName);
|
|
||||||
taosArrayPush(pReq->pTableVgroupPos, &tableNo);
|
|
||||||
break;
|
|
||||||
case CATALOG_REQ_TYPE_BOTH:
|
|
||||||
taosArrayPush(pReq->pTableMetaReq, pName);
|
|
||||||
taosArrayPush(pReq->pTableMetaPos, &tableNo);
|
|
||||||
taosArrayPush(pReq->pTableVgroupReq, pName);
|
|
||||||
taosArrayPush(pReq->pTableVgroupPos, &tableNo);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t reserveTableReqInDbCacheForInsert(const SName* pName, ECatalogReqType reqType, int32_t tableNo,
|
|
||||||
SHashObj* pDbs) {
|
|
||||||
SInsertTablesMetaReq req = {.pTableMetaReq = taosArrayInit(4, sizeof(SName)),
|
|
||||||
.pTableMetaPos = taosArrayInit(4, sizeof(int32_t)),
|
|
||||||
.pTableVgroupReq = taosArrayInit(4, sizeof(SName)),
|
|
||||||
.pTableVgroupPos = taosArrayInit(4, sizeof(int32_t))};
|
|
||||||
tNameGetFullDbName(pName, req.dbFName);
|
|
||||||
int32_t code = reserveTableReqInCacheForInsert(pName, reqType, tableNo, &req);
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = taosHashPut(pDbs, pName->dbname, strlen(pName->dbname), &req, sizeof(SInsertTablesMetaReq));
|
|
||||||
}
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t reserveTableMetaInCacheForInsert(const SName* pName, ECatalogReqType reqType, int32_t tableNo,
|
|
||||||
SParseMetaCache* pMetaCache) {
|
|
||||||
if (NULL == pMetaCache->pInsertTables) {
|
|
||||||
pMetaCache->pInsertTables = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
|
||||||
if (NULL == pMetaCache->pInsertTables) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pMetaCache->sqlTableNum = tableNo;
|
|
||||||
SInsertTablesMetaReq* pReq = taosHashGet(pMetaCache->pInsertTables, pName->dbname, strlen(pName->dbname));
|
|
||||||
if (NULL == pReq) {
|
|
||||||
return reserveTableReqInDbCacheForInsert(pName, reqType, tableNo, pMetaCache->pInsertTables);
|
|
||||||
}
|
|
||||||
return reserveTableReqInCacheForInsert(pName, reqType, tableNo, pReq);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t getTableMetaFromCacheForInsert(SArray* pTableMetaPos, SParseMetaCache* pMetaCache, int32_t tableNo,
|
|
||||||
STableMeta** pMeta) {
|
|
||||||
int32_t reqIndex = *(int32_t*)taosArrayGet(pTableMetaPos, tableNo);
|
|
||||||
SMetaRes* pRes = taosArrayGet(pMetaCache->pTableMetaData, reqIndex);
|
|
||||||
if (TSDB_CODE_SUCCESS == pRes->code) {
|
|
||||||
*pMeta = tableMetaDup((const STableMeta*)pRes->pRes);
|
|
||||||
if (NULL == *pMeta) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return pRes->code;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t getTableVgroupFromCacheForInsert(SArray* pTableVgroupPos, SParseMetaCache* pMetaCache, int32_t tableNo,
|
|
||||||
SVgroupInfo* pVgroup) {
|
|
||||||
int32_t reqIndex = *(int32_t*)taosArrayGet(pTableVgroupPos, tableNo);
|
|
||||||
SMetaRes* pRes = taosArrayGet(pMetaCache->pTableVgroupData, reqIndex);
|
|
||||||
if (TSDB_CODE_SUCCESS == pRes->code) {
|
|
||||||
memcpy(pVgroup, pRes->pRes, sizeof(SVgroupInfo));
|
|
||||||
}
|
|
||||||
return pRes->code;
|
|
||||||
}
|
|
||||||
|
|
||||||
void destoryParseTablesMetaReqHash(SHashObj* pHash) {
|
void destoryParseTablesMetaReqHash(SHashObj* pHash) {
|
||||||
SParseTablesMetaReq* p = taosHashIterate(pHash, NULL);
|
SParseTablesMetaReq* p = taosHashIterate(pHash, NULL);
|
||||||
while (NULL != p) {
|
while (NULL != p) {
|
||||||
|
@ -1239,16 +1076,6 @@ void destoryParseMetaCache(SParseMetaCache* pMetaCache, bool request) {
|
||||||
taosHashCleanup(pMetaCache->pTableMeta);
|
taosHashCleanup(pMetaCache->pTableMeta);
|
||||||
taosHashCleanup(pMetaCache->pTableVgroup);
|
taosHashCleanup(pMetaCache->pTableVgroup);
|
||||||
}
|
}
|
||||||
SInsertTablesMetaReq* p = taosHashIterate(pMetaCache->pInsertTables, NULL);
|
|
||||||
while (NULL != p) {
|
|
||||||
taosArrayDestroy(p->pTableMetaPos);
|
|
||||||
taosArrayDestroy(p->pTableMetaReq);
|
|
||||||
taosArrayDestroy(p->pTableVgroupPos);
|
|
||||||
taosArrayDestroy(p->pTableVgroupReq);
|
|
||||||
|
|
||||||
p = taosHashIterate(pMetaCache->pInsertTables, p);
|
|
||||||
}
|
|
||||||
taosHashCleanup(pMetaCache->pInsertTables);
|
|
||||||
taosHashCleanup(pMetaCache->pDbVgroup);
|
taosHashCleanup(pMetaCache->pDbVgroup);
|
||||||
taosHashCleanup(pMetaCache->pDbCfg);
|
taosHashCleanup(pMetaCache->pDbCfg);
|
||||||
taosHashCleanup(pMetaCache->pDbInfo);
|
taosHashCleanup(pMetaCache->pDbInfo);
|
||||||
|
|
|
@ -167,7 +167,7 @@ static void rewriteExprAlias(SNode* pRoot) {
|
||||||
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery) {
|
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if (qIsInsertValuesSql(pCxt->pSql, pCxt->sqlLen)) {
|
if (qIsInsertValuesSql(pCxt->pSql, pCxt->sqlLen)) {
|
||||||
code = parseInsertSql(pCxt, pQuery, NULL);
|
code = parseInsertSql(pCxt, pQuery, NULL, NULL);
|
||||||
} else {
|
} else {
|
||||||
code = parseSqlIntoAst(pCxt, pQuery);
|
code = parseSqlIntoAst(pCxt, pQuery);
|
||||||
}
|
}
|
||||||
|
@ -175,21 +175,26 @@ int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq) {
|
static int32_t parseQuerySyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq) {
|
||||||
SParseMetaCache metaCache = {0};
|
SParseMetaCache metaCache = {0};
|
||||||
|
int32_t code = parseSqlSyntax(pCxt, pQuery, &metaCache);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = buildCatalogReq(&metaCache, pCatalogReq);
|
||||||
|
}
|
||||||
|
destoryParseMetaCache(&metaCache, true);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq) {
|
||||||
int32_t code = nodesAcquireAllocator(pCxt->allocatorId);
|
int32_t code = nodesAcquireAllocator(pCxt->allocatorId);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
if (qIsInsertValuesSql(pCxt->pSql, pCxt->sqlLen)) {
|
if (qIsInsertValuesSql(pCxt->pSql, pCxt->sqlLen)) {
|
||||||
code = parseInsertSyntax(pCxt, pQuery, &metaCache);
|
code = parseInsertSql(pCxt, pQuery, pCatalogReq, NULL);
|
||||||
} else {
|
} else {
|
||||||
code = parseSqlSyntax(pCxt, pQuery, &metaCache);
|
code = parseQuerySyntax(pCxt, pQuery, pCatalogReq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = buildCatalogReq(pCxt, &metaCache, pCatalogReq);
|
|
||||||
}
|
|
||||||
nodesReleaseAllocator(pCxt->allocatorId);
|
nodesReleaseAllocator(pCxt->allocatorId);
|
||||||
destoryParseMetaCache(&metaCache, true);
|
|
||||||
terrno = code;
|
terrno = code;
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -199,21 +204,22 @@ int32_t qAnalyseSqlSemantic(SParseContext* pCxt, const struct SCatalogReq* pCata
|
||||||
SParseMetaCache metaCache = {0};
|
SParseMetaCache metaCache = {0};
|
||||||
int32_t code = nodesAcquireAllocator(pCxt->allocatorId);
|
int32_t code = nodesAcquireAllocator(pCxt->allocatorId);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = putMetaDataToCache(pCatalogReq, pMetaData, &metaCache, NULL == pQuery->pRoot);
|
code = putMetaDataToCache(pCatalogReq, pMetaData, &metaCache);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
if (NULL == pQuery->pRoot) {
|
|
||||||
code = parseInsertSql(pCxt, &pQuery, &metaCache);
|
|
||||||
} else {
|
|
||||||
code = analyseSemantic(pCxt, pQuery, &metaCache);
|
code = analyseSemantic(pCxt, pQuery, &metaCache);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
nodesReleaseAllocator(pCxt->allocatorId);
|
nodesReleaseAllocator(pCxt->allocatorId);
|
||||||
destoryParseMetaCache(&metaCache, false);
|
destoryParseMetaCache(&metaCache, false);
|
||||||
terrno = code;
|
terrno = code;
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t qContinueParseSql(SParseContext* pCxt, struct SCatalogReq* pCatalogReq, const struct SMetaData* pMetaData,
|
||||||
|
SQuery* pQuery) {
|
||||||
|
return parseInsertSql(pCxt, &pQuery, pCatalogReq, pMetaData);
|
||||||
|
}
|
||||||
|
|
||||||
void qDestroyParseContext(SParseContext* pCxt) {
|
void qDestroyParseContext(SParseContext* pCxt) {
|
||||||
if (NULL == pCxt) {
|
if (NULL == pCxt) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -228,11 +228,21 @@ int32_t __catalogGetTableMeta(struct SCatalog* pCatalog, SRequestConnInfo* pConn
|
||||||
return g_mockCatalogService->catalogGetTableMeta(pTableName, pTableMeta);
|
return g_mockCatalogService->catalogGetTableMeta(pTableName, pTableMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t __catalogGetCachedTableMeta(SCatalog* pCtg, const SName* pTableName, STableMeta** pTableMeta) {
|
||||||
|
return g_mockCatalogService->catalogGetTableMeta(pTableName, pTableMeta, true);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t __catalogGetTableHashVgroup(struct SCatalog* pCatalog, SRequestConnInfo* pConn, const SName* pTableName,
|
int32_t __catalogGetTableHashVgroup(struct SCatalog* pCatalog, SRequestConnInfo* pConn, const SName* pTableName,
|
||||||
SVgroupInfo* vgInfo) {
|
SVgroupInfo* vgInfo) {
|
||||||
return g_mockCatalogService->catalogGetTableHashVgroup(pTableName, vgInfo);
|
return g_mockCatalogService->catalogGetTableHashVgroup(pTableName, vgInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t __catalogGetCachedTableHashVgroup(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, bool* exists) {
|
||||||
|
int32_t code = g_mockCatalogService->catalogGetTableHashVgroup(pTableName, pVgroup, true);
|
||||||
|
*exists = 0 != pVgroup->vgId;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t __catalogGetTableDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
|
int32_t __catalogGetTableDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
|
||||||
SArray** pVgList) {
|
SArray** pVgList) {
|
||||||
return g_mockCatalogService->catalogGetTableDistVgInfo(pTableName, pVgList);
|
return g_mockCatalogService->catalogGetTableDistVgInfo(pTableName, pVgList);
|
||||||
|
@ -257,6 +267,13 @@ int32_t __catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* us
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t __catalogChkAuthFromCache(SCatalog* pCtg, const char* user, const char* dbFName, AUTH_TYPE type, bool* pass,
|
||||||
|
bool* exists) {
|
||||||
|
*pass = true;
|
||||||
|
*exists = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t __catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* funcName, SFuncInfo* pInfo) {
|
int32_t __catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* funcName, SFuncInfo* pInfo) {
|
||||||
return g_mockCatalogService->catalogGetUdfInfo(funcName, pInfo);
|
return g_mockCatalogService->catalogGetUdfInfo(funcName, pInfo);
|
||||||
}
|
}
|
||||||
|
@ -289,13 +306,17 @@ void initMetaDataEnv() {
|
||||||
static Stub stub;
|
static Stub stub;
|
||||||
stub.set(catalogGetHandle, __catalogGetHandle);
|
stub.set(catalogGetHandle, __catalogGetHandle);
|
||||||
stub.set(catalogGetTableMeta, __catalogGetTableMeta);
|
stub.set(catalogGetTableMeta, __catalogGetTableMeta);
|
||||||
|
stub.set(catalogGetCachedTableMeta, __catalogGetCachedTableMeta);
|
||||||
stub.set(catalogGetSTableMeta, __catalogGetTableMeta);
|
stub.set(catalogGetSTableMeta, __catalogGetTableMeta);
|
||||||
|
stub.set(catalogGetCachedSTableMeta, __catalogGetCachedTableMeta);
|
||||||
stub.set(catalogGetTableHashVgroup, __catalogGetTableHashVgroup);
|
stub.set(catalogGetTableHashVgroup, __catalogGetTableHashVgroup);
|
||||||
|
stub.set(catalogGetCachedTableHashVgroup, __catalogGetCachedTableHashVgroup);
|
||||||
stub.set(catalogGetTableDistVgInfo, __catalogGetTableDistVgInfo);
|
stub.set(catalogGetTableDistVgInfo, __catalogGetTableDistVgInfo);
|
||||||
stub.set(catalogGetDBVgVersion, __catalogGetDBVgVersion);
|
stub.set(catalogGetDBVgVersion, __catalogGetDBVgVersion);
|
||||||
stub.set(catalogGetDBVgList, __catalogGetDBVgList);
|
stub.set(catalogGetDBVgList, __catalogGetDBVgList);
|
||||||
stub.set(catalogGetDBCfg, __catalogGetDBCfg);
|
stub.set(catalogGetDBCfg, __catalogGetDBCfg);
|
||||||
stub.set(catalogChkAuth, __catalogChkAuth);
|
stub.set(catalogChkAuth, __catalogChkAuth);
|
||||||
|
stub.set(catalogChkAuthFromCache, __catalogChkAuthFromCache);
|
||||||
stub.set(catalogGetUdfInfo, __catalogGetUdfInfo);
|
stub.set(catalogGetUdfInfo, __catalogGetUdfInfo);
|
||||||
stub.set(catalogRefreshGetTableMeta, __catalogRefreshGetTableMeta);
|
stub.set(catalogRefreshGetTableMeta, __catalogRefreshGetTableMeta);
|
||||||
stub.set(catalogRemoveTableMeta, __catalogRemoveTableMeta);
|
stub.set(catalogRemoveTableMeta, __catalogRemoveTableMeta);
|
||||||
|
|
|
@ -91,7 +91,7 @@ class MockCatalogServiceImpl {
|
||||||
public:
|
public:
|
||||||
static const int32_t numOfDataTypes = sizeof(tDataTypes) / sizeof(tDataTypes[0]);
|
static const int32_t numOfDataTypes = sizeof(tDataTypes) / sizeof(tDataTypes[0]);
|
||||||
|
|
||||||
MockCatalogServiceImpl() : id_(1) {}
|
MockCatalogServiceImpl() : id_(1), havaCache_(true) {}
|
||||||
|
|
||||||
~MockCatalogServiceImpl() {
|
~MockCatalogServiceImpl() {
|
||||||
for (auto& cfg : dbCfg_) {
|
for (auto& cfg : dbCfg_) {
|
||||||
|
@ -106,7 +106,11 @@ class MockCatalogServiceImpl {
|
||||||
|
|
||||||
int32_t catalogGetHandle() const { return 0; }
|
int32_t catalogGetHandle() const { return 0; }
|
||||||
|
|
||||||
int32_t catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta) const {
|
int32_t catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta, bool onlyCache = false) const {
|
||||||
|
if (onlyCache && !havaCache_) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_ptr<STableMeta> table;
|
std::unique_ptr<STableMeta> table;
|
||||||
|
|
||||||
char db[TSDB_DB_NAME_LEN] = {0};
|
char db[TSDB_DB_NAME_LEN] = {0};
|
||||||
|
@ -121,7 +125,12 @@ class MockCatalogServiceImpl {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo) const {
|
int32_t catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo, bool onlyCache = false) const {
|
||||||
|
if (onlyCache && !havaCache_) {
|
||||||
|
vgInfo->vgId = 0;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
vgInfo->vgId = 1;
|
vgInfo->vgId = 1;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -618,6 +627,7 @@ class MockCatalogServiceImpl {
|
||||||
IndexMetaCache index_;
|
IndexMetaCache index_;
|
||||||
DnodeCache dnode_;
|
DnodeCache dnode_;
|
||||||
DbCfgCache dbCfg_;
|
DbCfgCache dbCfg_;
|
||||||
|
bool havaCache_;
|
||||||
};
|
};
|
||||||
|
|
||||||
MockCatalogService::MockCatalogService() : impl_(new MockCatalogServiceImpl()) {}
|
MockCatalogService::MockCatalogService() : impl_(new MockCatalogServiceImpl()) {}
|
||||||
|
@ -651,12 +661,14 @@ void MockCatalogService::createDatabase(const std::string& db, bool rollup, int8
|
||||||
impl_->createDatabase(db, rollup, cacheLast);
|
impl_->createDatabase(db, rollup, cacheLast);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t MockCatalogService::catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta) const {
|
int32_t MockCatalogService::catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta,
|
||||||
return impl_->catalogGetTableMeta(pTableName, pTableMeta);
|
bool onlyCache) const {
|
||||||
|
return impl_->catalogGetTableMeta(pTableName, pTableMeta, onlyCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t MockCatalogService::catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo) const {
|
int32_t MockCatalogService::catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo,
|
||||||
return impl_->catalogGetTableHashVgroup(pTableName, vgInfo);
|
bool onlyCache) const {
|
||||||
|
return impl_->catalogGetTableHashVgroup(pTableName, vgInfo, onlyCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t MockCatalogService::catalogGetTableDistVgInfo(const SName* pTableName, SArray** pVgList) const {
|
int32_t MockCatalogService::catalogGetTableDistVgInfo(const SName* pTableName, SArray** pVgList) const {
|
||||||
|
|
|
@ -67,8 +67,8 @@ class MockCatalogService {
|
||||||
void createDnode(int32_t dnodeId, const std::string& host, int16_t port);
|
void createDnode(int32_t dnodeId, const std::string& host, int16_t port);
|
||||||
void createDatabase(const std::string& db, bool rollup = false, int8_t cacheLast = 0);
|
void createDatabase(const std::string& db, bool rollup = false, int8_t cacheLast = 0);
|
||||||
|
|
||||||
int32_t catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta) const;
|
int32_t catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta, bool onlyCache = false) const;
|
||||||
int32_t catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo) const;
|
int32_t catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo, bool onlyCache = false) const;
|
||||||
int32_t catalogGetTableDistVgInfo(const SName* pTableName, SArray** pVgList) const;
|
int32_t catalogGetTableDistVgInfo(const SName* pTableName, SArray** pVgList) const;
|
||||||
int32_t catalogGetDBVgList(const char* pDbFName, SArray** pVgList) const;
|
int32_t catalogGetDBVgList(const char* pDbFName, SArray** pVgList) const;
|
||||||
int32_t catalogGetDBCfg(const char* pDbFName, SDbCfgInfo* pDbCfg) const;
|
int32_t catalogGetDBCfg(const char* pDbFName, SDbCfgInfo* pDbCfg) const;
|
||||||
|
|
|
@ -233,16 +233,15 @@ class ParserTestBaseImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
void doBuildCatalogReq(SParseContext* pCxt, const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq) {
|
void doBuildCatalogReq(SParseContext* pCxt, const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq) {
|
||||||
DO_WITH_THROW(buildCatalogReq, pCxt, pMetaCache, pCatalogReq);
|
DO_WITH_THROW(buildCatalogReq, pMetaCache, pCatalogReq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void doGetAllMeta(const SCatalogReq* pCatalogReq, SMetaData* pMetaData) {
|
void doGetAllMeta(const SCatalogReq* pCatalogReq, SMetaData* pMetaData) {
|
||||||
DO_WITH_THROW(g_mockCatalogService->catalogGetAllMeta, pCatalogReq, pMetaData);
|
DO_WITH_THROW(g_mockCatalogService->catalogGetAllMeta, pCatalogReq, pMetaData);
|
||||||
}
|
}
|
||||||
|
|
||||||
void doPutMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache,
|
void doPutMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache) {
|
||||||
bool isInsertValues) {
|
DO_WITH_THROW(putMetaDataToCache, pCatalogReq, pMetaData, pMetaCache);
|
||||||
DO_WITH_THROW(putMetaDataToCache, pCatalogReq, pMetaData, pMetaCache, isInsertValues);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void doAuthenticate(SParseContext* pCxt, SQuery* pQuery, SParseMetaCache* pMetaCache) {
|
void doAuthenticate(SParseContext* pCxt, SQuery* pQuery, SParseMetaCache* pMetaCache) {
|
||||||
|
@ -280,15 +279,14 @@ class ParserTestBaseImpl {
|
||||||
res_.calcConstAst_ = toString(pQuery->pRoot);
|
res_.calcConstAst_ = toString(pQuery->pRoot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void doParseInsertSql(SParseContext* pCxt, SQuery** pQuery, SParseMetaCache* pMetaCache) {
|
void doParseInsertSql(SParseContext* pCxt, SQuery** pQuery, SCatalogReq* pCatalogReq, const SMetaData* pMetaData) {
|
||||||
DO_WITH_THROW(parseInsertSql, pCxt, pQuery, pMetaCache);
|
DO_WITH_THROW(parseInsertSql, pCxt, pQuery, pCatalogReq, pMetaData);
|
||||||
ASSERT_NE(*pQuery, nullptr);
|
ASSERT_NE(*pQuery, nullptr);
|
||||||
res_.parsedAst_ = toString((*pQuery)->pRoot);
|
res_.parsedAst_ = toString((*pQuery)->pRoot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void doParseInsertSyntax(SParseContext* pCxt, SQuery** pQuery, SParseMetaCache* pMetaCache) {
|
void doContinueParseSql(SParseContext* pCxt, SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SQuery* pQuery) {
|
||||||
DO_WITH_THROW(parseInsertSyntax, pCxt, pQuery, pMetaCache);
|
DO_WITH_THROW(qContinueParseSql, pCxt, pCatalogReq, pMetaData, pQuery);
|
||||||
ASSERT_NE(*pQuery, nullptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string toString(const SNode* pRoot) {
|
string toString(const SNode* pRoot) {
|
||||||
|
@ -314,7 +312,7 @@ class ParserTestBaseImpl {
|
||||||
|
|
||||||
if (qIsInsertValuesSql(cxt.pSql, cxt.sqlLen)) {
|
if (qIsInsertValuesSql(cxt.pSql, cxt.sqlLen)) {
|
||||||
unique_ptr<SQuery*, void (*)(SQuery**)> query((SQuery**)taosMemoryCalloc(1, sizeof(SQuery*)), destroyQuery);
|
unique_ptr<SQuery*, void (*)(SQuery**)> query((SQuery**)taosMemoryCalloc(1, sizeof(SQuery*)), destroyQuery);
|
||||||
doParseInsertSql(&cxt, query.get(), nullptr);
|
doParseInsertSql(&cxt, query.get(), nullptr, nullptr);
|
||||||
} else {
|
} else {
|
||||||
unique_ptr<SQuery*, void (*)(SQuery**)> query((SQuery**)taosMemoryCalloc(1, sizeof(SQuery*)), destroyQuery);
|
unique_ptr<SQuery*, void (*)(SQuery**)> query((SQuery**)taosMemoryCalloc(1, sizeof(SQuery*)), destroyQuery);
|
||||||
doParse(&cxt, query.get());
|
doParse(&cxt, query.get());
|
||||||
|
@ -360,29 +358,19 @@ class ParserTestBaseImpl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void runAsyncInternalFuncs(const string& sql, int32_t expect, ParserStage checkStage) {
|
void runQueryAsyncInternalFuncs(SParseContext* pParCxt) {
|
||||||
reset(expect, checkStage, TEST_INTERFACE_ASYNC_INTERNAL);
|
|
||||||
try {
|
|
||||||
unique_ptr<SParseContext, function<void(SParseContext*)> > cxt(new SParseContext(), destoryParseContext);
|
|
||||||
setParseContext(sql, cxt.get(), true);
|
|
||||||
|
|
||||||
unique_ptr<SQuery*, void (*)(SQuery**)> query((SQuery**)taosMemoryCalloc(1, sizeof(SQuery*)), destroyQuery);
|
unique_ptr<SQuery*, void (*)(SQuery**)> query((SQuery**)taosMemoryCalloc(1, sizeof(SQuery*)), destroyQuery);
|
||||||
bool request = true;
|
bool request = true;
|
||||||
unique_ptr<SParseMetaCache, function<void(SParseMetaCache*)> > metaCache(
|
unique_ptr<SParseMetaCache, function<void(SParseMetaCache*)> > metaCache(
|
||||||
new SParseMetaCache(), bind(destoryParseMetaCacheWarpper, _1, cref(request)));
|
new SParseMetaCache(), bind(destoryParseMetaCacheWarpper, _1, cref(request)));
|
||||||
bool isInsertValues = qIsInsertValuesSql(cxt->pSql, cxt->sqlLen);
|
doParse(pParCxt, query.get());
|
||||||
if (isInsertValues) {
|
doCollectMetaKey(pParCxt, *(query.get()), metaCache.get());
|
||||||
doParseInsertSyntax(cxt.get(), query.get(), metaCache.get());
|
|
||||||
} else {
|
|
||||||
doParse(cxt.get(), query.get());
|
|
||||||
doCollectMetaKey(cxt.get(), *(query.get()), metaCache.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
SQuery* pQuery = *(query.get());
|
SQuery* pQuery = *(query.get());
|
||||||
|
|
||||||
unique_ptr<SCatalogReq, void (*)(SCatalogReq*)> catalogReq(new SCatalogReq(),
|
unique_ptr<SCatalogReq, void (*)(SCatalogReq*)> catalogReq(new SCatalogReq(),
|
||||||
MockCatalogService::destoryCatalogReq);
|
MockCatalogService::destoryCatalogReq);
|
||||||
doBuildCatalogReq(cxt.get(), metaCache.get(), catalogReq.get());
|
doBuildCatalogReq(pParCxt, metaCache.get(), catalogReq.get());
|
||||||
|
|
||||||
string err;
|
string err;
|
||||||
thread t1([&]() {
|
thread t1([&]() {
|
||||||
|
@ -392,16 +380,45 @@ class ParserTestBaseImpl {
|
||||||
|
|
||||||
metaCache.reset(new SParseMetaCache());
|
metaCache.reset(new SParseMetaCache());
|
||||||
request = false;
|
request = false;
|
||||||
doPutMetaDataToCache(catalogReq.get(), metaData.get(), metaCache.get(), isInsertValues);
|
doPutMetaDataToCache(catalogReq.get(), metaData.get(), metaCache.get());
|
||||||
|
|
||||||
if (isInsertValues) {
|
doAuthenticate(pParCxt, pQuery, metaCache.get());
|
||||||
doParseInsertSql(cxt.get(), query.get(), metaCache.get());
|
|
||||||
} else {
|
|
||||||
doAuthenticate(cxt.get(), pQuery, metaCache.get());
|
|
||||||
|
|
||||||
doTranslate(cxt.get(), pQuery, metaCache.get());
|
doTranslate(pParCxt, pQuery, metaCache.get());
|
||||||
|
|
||||||
doCalculateConstant(cxt.get(), pQuery);
|
doCalculateConstant(pParCxt, pQuery);
|
||||||
|
} catch (const TerminateFlag& e) {
|
||||||
|
// success and terminate
|
||||||
|
} catch (const runtime_error& e) {
|
||||||
|
err = e.what();
|
||||||
|
} catch (...) {
|
||||||
|
err = "unknown error";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
t1.join();
|
||||||
|
if (!err.empty()) {
|
||||||
|
throw runtime_error(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void runInsertAsyncInternalFuncsImpl(SParseContext* pParCxt, SQuery** pQuery, SCatalogReq* pCatalogReq,
|
||||||
|
SMetaData* pMetaData) {
|
||||||
|
doParseInsertSql(pParCxt, pQuery, pCatalogReq, pMetaData);
|
||||||
|
|
||||||
|
if (QUERY_EXEC_STAGE_SCHEDULE == (*pQuery)->execStage) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string err;
|
||||||
|
thread t1([&]() {
|
||||||
|
try {
|
||||||
|
doGetAllMeta(pCatalogReq, pMetaData);
|
||||||
|
|
||||||
|
doParseInsertSql(pParCxt, pQuery, pCatalogReq, pMetaData);
|
||||||
|
|
||||||
|
if (QUERY_EXEC_STAGE_SCHEDULE != (*pQuery)->execStage) {
|
||||||
|
runInsertAsyncInternalFuncsImpl(pParCxt, pQuery, pCatalogReq, pMetaData);
|
||||||
}
|
}
|
||||||
} catch (const TerminateFlag& e) {
|
} catch (const TerminateFlag& e) {
|
||||||
// success and terminate
|
// success and terminate
|
||||||
|
@ -416,6 +433,28 @@ class ParserTestBaseImpl {
|
||||||
if (!err.empty()) {
|
if (!err.empty()) {
|
||||||
throw runtime_error(err);
|
throw runtime_error(err);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void runInsertAsyncInternalFuncs(SParseContext* pParCxt) {
|
||||||
|
unique_ptr<SQuery*, void (*)(SQuery**)> query((SQuery**)taosMemoryCalloc(1, sizeof(SQuery*)), destroyQuery);
|
||||||
|
unique_ptr<SCatalogReq, void (*)(SCatalogReq*)> catalogReq(new SCatalogReq(),
|
||||||
|
MockCatalogService::destoryCatalogReq);
|
||||||
|
unique_ptr<SMetaData, void (*)(SMetaData*)> metaData(new SMetaData(), MockCatalogService::destoryMetaData);
|
||||||
|
runInsertAsyncInternalFuncsImpl(pParCxt, query.get(), catalogReq.get(), metaData.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
void runAsyncInternalFuncs(const string& sql, int32_t expect, ParserStage checkStage) {
|
||||||
|
reset(expect, checkStage, TEST_INTERFACE_ASYNC_INTERNAL);
|
||||||
|
try {
|
||||||
|
unique_ptr<SParseContext, function<void(SParseContext*)> > cxt(new SParseContext(), destoryParseContext);
|
||||||
|
setParseContext(sql, cxt.get(), true);
|
||||||
|
|
||||||
|
bool isInsertValues = qIsInsertValuesSql(cxt->pSql, cxt->sqlLen);
|
||||||
|
if (isInsertValues) {
|
||||||
|
runInsertAsyncInternalFuncs(cxt.get());
|
||||||
|
} else {
|
||||||
|
runQueryAsyncInternalFuncs(cxt.get());
|
||||||
|
}
|
||||||
|
|
||||||
if (g_dump) {
|
if (g_dump) {
|
||||||
dump();
|
dump();
|
||||||
|
@ -441,13 +480,20 @@ class ParserTestBaseImpl {
|
||||||
doParseSqlSyntax(cxt.get(), query.get(), catalogReq.get());
|
doParseSqlSyntax(cxt.get(), query.get(), catalogReq.get());
|
||||||
SQuery* pQuery = *(query.get());
|
SQuery* pQuery = *(query.get());
|
||||||
|
|
||||||
|
switch (pQuery->execStage) {
|
||||||
|
case QUERY_EXEC_STAGE_PARSE:
|
||||||
|
case QUERY_EXEC_STAGE_ANALYSE: {
|
||||||
string err;
|
string err;
|
||||||
thread t1([&]() {
|
thread t1([&]() {
|
||||||
try {
|
try {
|
||||||
unique_ptr<SMetaData, void (*)(SMetaData*)> metaData(new SMetaData(), MockCatalogService::destoryMetaData);
|
unique_ptr<SMetaData, void (*)(SMetaData*)> metaData(new SMetaData(),
|
||||||
|
MockCatalogService::destoryMetaData);
|
||||||
doGetAllMeta(catalogReq.get(), metaData.get());
|
doGetAllMeta(catalogReq.get(), metaData.get());
|
||||||
|
if (QUERY_EXEC_STAGE_PARSE == pQuery->execStage) {
|
||||||
|
doContinueParseSql(cxt.get(), catalogReq.get(), metaData.get(), pQuery);
|
||||||
|
} else {
|
||||||
doAnalyseSqlSemantic(cxt.get(), catalogReq.get(), metaData.get(), pQuery);
|
doAnalyseSqlSemantic(cxt.get(), catalogReq.get(), metaData.get(), pQuery);
|
||||||
|
}
|
||||||
} catch (const TerminateFlag& e) {
|
} catch (const TerminateFlag& e) {
|
||||||
// success and terminate
|
// success and terminate
|
||||||
} catch (const runtime_error& e) {
|
} catch (const runtime_error& e) {
|
||||||
|
@ -461,6 +507,13 @@ class ParserTestBaseImpl {
|
||||||
if (!err.empty()) {
|
if (!err.empty()) {
|
||||||
throw runtime_error(err);
|
throw runtime_error(err);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case QUERY_EXEC_STAGE_SCHEDULE:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (g_dump) {
|
if (g_dump) {
|
||||||
dump();
|
dump();
|
||||||
|
|
|
@ -66,16 +66,36 @@ static SLogicSubplan* splCreateScanSubplan(SSplitContext* pCxt, SLogicNode* pNod
|
||||||
return pSubplan;
|
return pSubplan;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SLogicSubplan* splCreateSubplan(SSplitContext* pCxt, SLogicNode* pNode, ESubplanType subplanType) {
|
static bool splHasScan(SLogicNode* pNode) {
|
||||||
|
if (QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(pNode)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
SNode* pChild = NULL;
|
||||||
|
FOREACH(pChild, pNode->pChildren) {
|
||||||
|
if (QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(pChild)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return splHasScan((SLogicNode*)pChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void splSetSubplanType(SLogicSubplan* pSubplan) {
|
||||||
|
pSubplan->subplanType = splHasScan(pSubplan->pNode) ? SUBPLAN_TYPE_SCAN : SUBPLAN_TYPE_MERGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SLogicSubplan* splCreateSubplan(SSplitContext* pCxt, SLogicNode* pNode) {
|
||||||
SLogicSubplan* pSubplan = (SLogicSubplan*)nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN);
|
SLogicSubplan* pSubplan = (SLogicSubplan*)nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN);
|
||||||
if (NULL == pSubplan) {
|
if (NULL == pSubplan) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
pSubplan->id.queryId = pCxt->queryId;
|
pSubplan->id.queryId = pCxt->queryId;
|
||||||
pSubplan->id.groupId = pCxt->groupId;
|
pSubplan->id.groupId = pCxt->groupId;
|
||||||
pSubplan->subplanType = subplanType;
|
|
||||||
pSubplan->pNode = pNode;
|
pSubplan->pNode = pNode;
|
||||||
pNode->pParent = NULL;
|
pNode->pParent = NULL;
|
||||||
|
splSetSubplanType(pSubplan);
|
||||||
return pSubplan;
|
return pSubplan;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1204,7 +1224,7 @@ static int32_t unionSplitSubplan(SSplitContext* pCxt, SLogicSubplan* pUnionSubpl
|
||||||
|
|
||||||
SNode* pChild = NULL;
|
SNode* pChild = NULL;
|
||||||
FOREACH(pChild, pSplitNode->pChildren) {
|
FOREACH(pChild, pSplitNode->pChildren) {
|
||||||
SLogicSubplan* pNewSubplan = splCreateSubplan(pCxt, (SLogicNode*)pChild, pUnionSubplan->subplanType);
|
SLogicSubplan* pNewSubplan = splCreateSubplan(pCxt, (SLogicNode*)pChild);
|
||||||
code = nodesListMakeStrictAppend(&pUnionSubplan->pChildren, (SNode*)pNewSubplan);
|
code = nodesListMakeStrictAppend(&pUnionSubplan->pChildren, (SNode*)pNewSubplan);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
REPLACE_NODE(NULL);
|
REPLACE_NODE(NULL);
|
||||||
|
@ -1390,10 +1410,9 @@ static int32_t insertSelectSplit(SSplitContext* pCxt, SLogicSubplan* pSubplan) {
|
||||||
|
|
||||||
SLogicSubplan* pNewSubplan = NULL;
|
SLogicSubplan* pNewSubplan = NULL;
|
||||||
SNodeList* pSubplanChildren = info.pSubplan->pChildren;
|
SNodeList* pSubplanChildren = info.pSubplan->pChildren;
|
||||||
ESubplanType subplanType = info.pSubplan->subplanType;
|
|
||||||
int32_t code = splCreateExchangeNodeForSubplan(pCxt, info.pSubplan, info.pQueryRoot, SUBPLAN_TYPE_MODIFY);
|
int32_t code = splCreateExchangeNodeForSubplan(pCxt, info.pSubplan, info.pQueryRoot, SUBPLAN_TYPE_MODIFY);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
pNewSubplan = splCreateSubplan(pCxt, info.pQueryRoot, subplanType);
|
pNewSubplan = splCreateSubplan(pCxt, info.pQueryRoot);
|
||||||
if (NULL == pNewSubplan) {
|
if (NULL == pNewSubplan) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ TEST_F(PlanStateTest, basic) {
|
||||||
TEST_F(PlanStateTest, stateExpr) {
|
TEST_F(PlanStateTest, stateExpr) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("SELECT COUNT(*) FROM t1 STATE_WINDOW(c1 + 10)");
|
run("SELECT COUNT(*) FROM t1 STATE_WINDOW(CASE WHEN c1 > 10 THEN 1 ELSE 0 END)");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(PlanStateTest, selectFunc) {
|
TEST_F(PlanStateTest, selectFunc) {
|
||||||
|
|
|
@ -306,6 +306,15 @@ int32_t queryProcessUseDBRsp(void *output, char *msg, int32_t msgSize) {
|
||||||
goto PROCESS_USEDB_OVER;
|
goto PROCESS_USEDB_OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qTrace("db:%s, usedbRsp received, numOfVgroups:%d", usedbRsp.db, usedbRsp.vgNum);
|
||||||
|
for (int32_t i = 0; i < usedbRsp.vgNum; ++i) {
|
||||||
|
SVgroupInfo *pInfo = taosArrayGet(usedbRsp.pVgroupInfos, i);
|
||||||
|
qTrace("vgId:%d, numOfEps:%d inUse:%d ", pInfo->vgId, pInfo->epSet.numOfEps, pInfo->epSet.inUse);
|
||||||
|
for (int32_t j = 0; j < pInfo->epSet.numOfEps; ++j) {
|
||||||
|
qTrace("vgId:%d, index:%d epset:%s:%u", pInfo->vgId, j, pInfo->epSet.eps[j].fqdn, pInfo->epSet.eps[j].port);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
code = queryBuildUseDbOutput(pOut, &usedbRsp);
|
code = queryBuildUseDbOutput(pOut, &usedbRsp);
|
||||||
|
|
||||||
PROCESS_USEDB_OVER:
|
PROCESS_USEDB_OVER:
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
#include "tname.h"
|
#include "tname.h"
|
||||||
|
#include "tgrant.h"
|
||||||
|
|
||||||
int32_t qwMallocFetchRsp(int8_t rpcMalloc, int32_t length, SRetrieveTableRsp **rsp) {
|
int32_t qwMallocFetchRsp(int8_t rpcMalloc, int32_t length, SRetrieveTableRsp **rsp) {
|
||||||
int32_t msgSize = sizeof(SRetrieveTableRsp) + length;
|
int32_t msgSize = sizeof(SRetrieveTableRsp) + length;
|
||||||
|
@ -305,7 +306,7 @@ int32_t qwRegisterHbBrokenLinkArg(SQWorker *mgmt, uint64_t sId, SRpcHandleInfo *
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qWorkerPreprocessQueryMsg(void *qWorkerMgmt, SRpcMsg *pMsg) {
|
int32_t qWorkerPreprocessQueryMsg(void *qWorkerMgmt, SRpcMsg *pMsg, bool chkGrant) {
|
||||||
if (NULL == qWorkerMgmt || NULL == pMsg) {
|
if (NULL == qWorkerMgmt || NULL == pMsg) {
|
||||||
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
@ -326,6 +327,12 @@ int32_t qWorkerPreprocessQueryMsg(void *qWorkerMgmt, SRpcMsg *pMsg) {
|
||||||
msg->execId = ntohl(msg->execId);
|
msg->execId = ntohl(msg->execId);
|
||||||
msg->phyLen = ntohl(msg->phyLen);
|
msg->phyLen = ntohl(msg->phyLen);
|
||||||
msg->sqlLen = ntohl(msg->sqlLen);
|
msg->sqlLen = ntohl(msg->sqlLen);
|
||||||
|
msg->msgMask = ntohl(msg->msgMask);
|
||||||
|
|
||||||
|
if (chkGrant && (!TEST_SHOW_REWRITE_MASK(msg->msgMask)) && (grantCheck(TSDB_GRANT_TIME) != TSDB_CODE_SUCCESS)) {
|
||||||
|
QW_ELOG("query failed cause of grant expired, msgMask:%d", msg->msgMask);
|
||||||
|
QW_ERR_RET(TSDB_CODE_GRANT_EXPIRED);
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t sId = msg->sId;
|
uint64_t sId = msg->sId;
|
||||||
uint64_t qId = msg->queryId;
|
uint64_t qId = msg->queryId;
|
||||||
|
|
|
@ -912,8 +912,8 @@ int32_t filterDetachCnfGroups(SArray *group, SArray *left, SArray *right) {
|
||||||
|
|
||||||
if (taosArrayGetSize(left) <= 0) {
|
if (taosArrayGetSize(left) <= 0) {
|
||||||
if (taosArrayGetSize(right) <= 0) {
|
if (taosArrayGetSize(right) <= 0) {
|
||||||
fltError("both groups are empty");
|
fltDebug("both groups are empty");
|
||||||
FLT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SFilterGroup *gp = NULL;
|
SFilterGroup *gp = NULL;
|
||||||
|
@ -1169,7 +1169,7 @@ int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) {
|
||||||
|
|
||||||
SScalarParam out = {.columnData = taosMemoryCalloc(1, sizeof(SColumnInfoData))};
|
SScalarParam out = {.columnData = taosMemoryCalloc(1, sizeof(SColumnInfoData))};
|
||||||
out.columnData->info.type = type;
|
out.columnData->info.type = type;
|
||||||
out.columnData->info.bytes = tDataTypes[type].bytes;
|
out.columnData->info.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes; //reserved space for simple_copy
|
||||||
|
|
||||||
for (int32_t i = 0; i < listNode->pNodeList->length; ++i) {
|
for (int32_t i = 0; i < listNode->pNodeList->length; ++i) {
|
||||||
SValueNode *valueNode = (SValueNode *)cell->pNode;
|
SValueNode *valueNode = (SValueNode *)cell->pNode;
|
||||||
|
@ -1191,7 +1191,7 @@ int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) {
|
||||||
filterAddField(info, NULL, (void **)&out.columnData->pData, FLD_TYPE_VALUE, &right, len, true);
|
filterAddField(info, NULL, (void **)&out.columnData->pData, FLD_TYPE_VALUE, &right, len, true);
|
||||||
out.columnData->pData = NULL;
|
out.columnData->pData = NULL;
|
||||||
} else {
|
} else {
|
||||||
void *data = taosMemoryCalloc(1, tDataTypes[type].bytes);
|
void *data = taosMemoryCalloc(1, tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes); //reserved space for simple_copy
|
||||||
if (NULL == data) {
|
if (NULL == data) {
|
||||||
FLT_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
FLT_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1047,7 +1047,6 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr,
|
||||||
|
|
||||||
SSubQueryMsg *pMsg = msg;
|
SSubQueryMsg *pMsg = msg;
|
||||||
pMsg->header.vgId = htonl(addr->nodeId);
|
pMsg->header.vgId = htonl(addr->nodeId);
|
||||||
pMsg->header.msgMask = htonl((pTask->plan->showRewrite) ? SHOW_REWRITE_MASK() : 0);
|
|
||||||
pMsg->sId = htobe64(schMgmt.sId);
|
pMsg->sId = htobe64(schMgmt.sId);
|
||||||
pMsg->queryId = htobe64(pJob->queryId);
|
pMsg->queryId = htobe64(pJob->queryId);
|
||||||
pMsg->taskId = htobe64(pTask->taskId);
|
pMsg->taskId = htobe64(pTask->taskId);
|
||||||
|
@ -1058,6 +1057,7 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr,
|
||||||
pMsg->needFetch = SCH_TASK_NEED_FETCH(pTask);
|
pMsg->needFetch = SCH_TASK_NEED_FETCH(pTask);
|
||||||
pMsg->phyLen = htonl(pTask->msgLen);
|
pMsg->phyLen = htonl(pTask->msgLen);
|
||||||
pMsg->sqlLen = htonl(len);
|
pMsg->sqlLen = htonl(len);
|
||||||
|
pMsg->msgMask = htonl((pTask->plan->showRewrite) ? QUERY_MSG_MASK_SHOW_REWRITE() : 0);
|
||||||
|
|
||||||
memcpy(pMsg->msg, pJob->sql, len);
|
memcpy(pMsg->msg, pJob->sql, len);
|
||||||
memcpy(pMsg->msg + len, pTask->msg, pTask->msgLen);
|
memcpy(pMsg->msg + len, pTask->msg, pTask->msgLen);
|
||||||
|
@ -1157,6 +1157,7 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr,
|
||||||
SCH_ERR_RET(schAppendTaskExecNode(pJob, pTask, addr, pTask->execId));
|
SCH_ERR_RET(schAppendTaskExecNode(pJob, pTask, addr, pTask->execId));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
taosMemoryFree(msg);
|
||||||
SCH_ERR_RET(schProcessOnTaskSuccess(pJob, pTask));
|
SCH_ERR_RET(schProcessOnTaskSuccess(pJob, pTask));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -32,8 +32,6 @@ typedef struct {
|
||||||
|
|
||||||
static SStreamGlobalEnv streamEnv;
|
static SStreamGlobalEnv streamEnv;
|
||||||
|
|
||||||
// int32_t streamPipelineExec(SStreamTask* pTask, int32_t batchNum, bool dispatch);
|
|
||||||
|
|
||||||
int32_t streamDispatch(SStreamTask* pTask);
|
int32_t streamDispatch(SStreamTask* pTask);
|
||||||
int32_t streamDispatchReqToData(const SStreamDispatchReq* pReq, SStreamDataBlock* pData);
|
int32_t streamDispatchReqToData(const SStreamDispatchReq* pReq, SStreamDataBlock* pData);
|
||||||
int32_t streamRetrieveReqToData(const SStreamRetrieveReq* pReq, SStreamDataBlock* pData);
|
int32_t streamRetrieveReqToData(const SStreamRetrieveReq* pReq, SStreamDataBlock* pData);
|
||||||
|
|
|
@ -240,43 +240,6 @@ int32_t streamProcessRunReq(SStreamTask* pTask) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
int32_t streamProcessRecoverReq(SStreamTask* pTask, SStreamTaskRecoverReq* pReq, SRpcMsg* pRsp) {
|
|
||||||
void* buf = rpcMallocCont(sizeof(SMsgHead) + sizeof(SStreamTaskRecoverRsp));
|
|
||||||
((SMsgHead*)buf)->vgId = htonl(pReq->upstreamNodeId);
|
|
||||||
|
|
||||||
SStreamTaskRecoverRsp* pCont = POINTER_SHIFT(buf, sizeof(SMsgHead));
|
|
||||||
pCont->inputStatus = pTask->inputStatus;
|
|
||||||
pCont->streamId = pTask->streamId;
|
|
||||||
pCont->reqTaskId = pTask->taskId;
|
|
||||||
pCont->rspTaskId = pReq->upstreamTaskId;
|
|
||||||
|
|
||||||
pRsp->pCont = buf;
|
|
||||||
pRsp->contLen = sizeof(SMsgHead) + sizeof(SStreamTaskRecoverRsp);
|
|
||||||
tmsgSendRsp(pRsp);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t streamProcessRecoverRsp(SStreamMeta* pMeta, SStreamTask* pTask, SStreamRecoverDownstreamRsp* pRsp) {
|
|
||||||
streamProcessRunReq(pTask);
|
|
||||||
|
|
||||||
if (pTask->taskLevel == TASK_LEVEL__SOURCE) {
|
|
||||||
// scan data to recover
|
|
||||||
pTask->inputStatus = TASK_INPUT_STATUS__RECOVER;
|
|
||||||
pTask->taskStatus = TASK_STATUS__RECOVER_SELF;
|
|
||||||
qStreamPrepareRecover(pTask->exec.executor, pTask->startVer, pTask->recoverSnapVer);
|
|
||||||
if (streamPipelineExec(pTask, 100, true) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pTask->inputStatus = TASK_INPUT_STATUS__NORMAL;
|
|
||||||
pTask->taskStatus = TASK_STATUS__NORMAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int32_t streamProcessRetrieveReq(SStreamTask* pTask, SStreamRetrieveReq* pReq, SRpcMsg* pRsp) {
|
int32_t streamProcessRetrieveReq(SStreamTask* pTask, SStreamRetrieveReq* pReq, SRpcMsg* pRsp) {
|
||||||
qDebug("task %d receive retrieve req from node %d task %d", pTask->taskId, pReq->srcNodeId, pReq->srcTaskId);
|
qDebug("task %d receive retrieve req from node %d task %d", pTask->taskId, pReq->srcNodeId, pReq->srcTaskId);
|
||||||
|
|
||||||
|
|
|
@ -138,63 +138,39 @@ int32_t streamScanExec(SStreamTask* pTask, int32_t batchSz) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
int32_t streamPipelineExec(SStreamTask* pTask, int32_t batchNum, bool dispatch) {
|
int32_t streamBatchExec(SStreamTask* pTask, int32_t batchLimit) {
|
||||||
ASSERT(pTask->taskLevel != TASK_LEVEL__SINK);
|
// fetch all queue item, merge according to batchLimit
|
||||||
|
int32_t numOfItems = taosReadAllQitems(pTask->inputQueue1, pTask->inputQall);
|
||||||
void* exec = pTask->exec.executor;
|
if (numOfItems == 0) {
|
||||||
|
qDebug("task: %d, stream task exec over, queue empty", pTask->taskId);
|
||||||
while (1) {
|
return 0;
|
||||||
SArray* pRes = taosArrayInit(0, sizeof(SSDataBlock));
|
|
||||||
if (pRes == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t batchCnt = 0;
|
|
||||||
while (1) {
|
|
||||||
SSDataBlock* output = NULL;
|
|
||||||
uint64_t ts = 0;
|
|
||||||
if (qExecTask(exec, &output, &ts) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
if (output == NULL) break;
|
|
||||||
|
|
||||||
SSDataBlock block = {0};
|
|
||||||
assignOneDataBlock(&block, output);
|
|
||||||
block.info.childId = pTask->selfChildId;
|
|
||||||
taosArrayPush(pRes, &block);
|
|
||||||
|
|
||||||
if (++batchCnt >= batchNum) break;
|
|
||||||
}
|
|
||||||
if (taosArrayGetSize(pRes) == 0) {
|
|
||||||
taosArrayDestroy(pRes);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (dispatch) {
|
|
||||||
SStreamDataBlock* qRes = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM);
|
|
||||||
if (qRes == NULL) {
|
|
||||||
taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
qRes->type = STREAM_INPUT__DATA_BLOCK;
|
|
||||||
qRes->blocks = pRes;
|
|
||||||
qRes->childId = pTask->selfChildId;
|
|
||||||
|
|
||||||
if (streamTaskOutput(pTask, qRes) < 0) {
|
|
||||||
taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes);
|
|
||||||
taosFreeQitem(qRes);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pTask->outputType == TASK_OUTPUT__FIXED_DISPATCH || pTask->outputType == TASK_OUTPUT__SHUFFLE_DISPATCH) {
|
|
||||||
streamDispatch(pTask);
|
|
||||||
}
|
}
|
||||||
|
SStreamQueueItem* pMerged = NULL;
|
||||||
|
SStreamQueueItem* pItem = NULL;
|
||||||
|
taosGetQitem(pTask->inputQall, (void**)&pItem);
|
||||||
|
if (pItem == NULL) {
|
||||||
|
if (pMerged != NULL) {
|
||||||
|
// process merged item
|
||||||
} else {
|
} else {
|
||||||
taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes);
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if drop
|
||||||
|
if (pItem->type == STREAM_INPUT__DESTROY) {
|
||||||
|
// set status drop
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pTask->taskLevel == TASK_LEVEL__SINK) {
|
||||||
|
ASSERT(((SStreamQueueItem*)pItem)->type == STREAM_INPUT__DATA_BLOCK);
|
||||||
|
streamTaskOutput(pTask, (SStreamDataBlock*)pItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
// exec impl
|
||||||
|
|
||||||
|
// output
|
||||||
|
// try dispatch
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -70,6 +70,7 @@ _err:
|
||||||
|
|
||||||
void streamMetaClose(SStreamMeta* pMeta) {
|
void streamMetaClose(SStreamMeta* pMeta) {
|
||||||
tdbCommit(pMeta->db, &pMeta->txn);
|
tdbCommit(pMeta->db, &pMeta->txn);
|
||||||
|
tdbPostCommit(pMeta->db, &pMeta->txn);
|
||||||
tdbTbClose(pMeta->pTaskDb);
|
tdbTbClose(pMeta->pTaskDb);
|
||||||
tdbTbClose(pMeta->pCheckpointDb);
|
tdbTbClose(pMeta->pCheckpointDb);
|
||||||
tdbClose(pMeta->db);
|
tdbClose(pMeta->db);
|
||||||
|
|
|
@ -142,6 +142,7 @@ _err:
|
||||||
|
|
||||||
void streamStateClose(SStreamState* pState) {
|
void streamStateClose(SStreamState* pState) {
|
||||||
tdbCommit(pState->db, &pState->txn);
|
tdbCommit(pState->db, &pState->txn);
|
||||||
|
tdbPostCommit(pState->db, &pState->txn);
|
||||||
tdbTbClose(pState->pStateDb);
|
tdbTbClose(pState->pStateDb);
|
||||||
tdbTbClose(pState->pFuncStateDb);
|
tdbTbClose(pState->pFuncStateDb);
|
||||||
tdbTbClose(pState->pFillStateDb);
|
tdbTbClose(pState->pFillStateDb);
|
||||||
|
@ -168,6 +169,9 @@ int32_t streamStateCommit(SStreamState* pState) {
|
||||||
if (tdbCommit(pState->db, &pState->txn) < 0) {
|
if (tdbCommit(pState->db, &pState->txn) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (tdbPostCommit(pState->db, &pState->txn) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
memset(&pState->txn, 0, sizeof(TXN));
|
memset(&pState->txn, 0, sizeof(TXN));
|
||||||
if (tdbTxnOpen(&pState->txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) <
|
if (tdbTxnOpen(&pState->txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) <
|
||||||
0) {
|
0) {
|
||||||
|
|
|
@ -28,18 +28,42 @@ extern "C" {
|
||||||
#include "ttimer.h"
|
#include "ttimer.h"
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
#define sFatal(...) do { if (sDebugFlag & DEBUG_FATAL) { taosPrintLog("SYN FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }} while(0)
|
|
||||||
#define sError(...) do { if (sDebugFlag & DEBUG_ERROR) { taosPrintLog("SYN ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }} while(0)
|
#define sFatal(...) if (sDebugFlag & DEBUG_FATAL) { taosPrintLog("SYN FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }
|
||||||
#define sWarn(...) do { if (sDebugFlag & DEBUG_WARN) { taosPrintLog("SYN WARN ", DEBUG_WARN, 255, __VA_ARGS__); }} while(0)
|
#define sError(...) if (sDebugFlag & DEBUG_ERROR) { taosPrintLog("SYN ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }
|
||||||
#define sInfo(...) do { if (sDebugFlag & DEBUG_INFO) { taosPrintLog("SYN ", DEBUG_INFO, 255, __VA_ARGS__); }} while(0)
|
#define sWarn(...) if (sDebugFlag & DEBUG_WARN) { taosPrintLog("SYN WARN ", DEBUG_WARN, 255, __VA_ARGS__); }
|
||||||
#define sDebug(...) do { if (sDebugFlag & DEBUG_DEBUG) { taosPrintLog("SYN ", DEBUG_DEBUG, sDebugFlag, __VA_ARGS__); }} while(0)
|
#define sInfo(...) if (sDebugFlag & DEBUG_INFO) { taosPrintLog("SYN ", DEBUG_INFO, 255, __VA_ARGS__); }
|
||||||
#define sTrace(...) do { if (sDebugFlag & DEBUG_TRACE) { taosPrintLog("SYN ", DEBUG_TRACE, sDebugFlag, __VA_ARGS__); }} while(0)
|
#define sDebug(...) if (sDebugFlag & DEBUG_DEBUG) { taosPrintLog("SYN ", DEBUG_DEBUG, sDebugFlag, __VA_ARGS__); }
|
||||||
#define sFatalLong(...) do { if (sDebugFlag & DEBUG_FATAL) { taosPrintLongString("SYN FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }} while(0)
|
#define sTrace(...) if (sDebugFlag & DEBUG_TRACE) { taosPrintLog("SYN ", DEBUG_TRACE, sDebugFlag, __VA_ARGS__); }
|
||||||
#define sErrorLong(...) do { if (sDebugFlag & DEBUG_ERROR) { taosPrintLongString("SYN ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }} while(0)
|
|
||||||
#define sWarnLong(...) do { if (sDebugFlag & DEBUG_WARN) { taosPrintLongString("SYN WARN ", DEBUG_WARN, 255, __VA_ARGS__); }} while(0)
|
#define sLFatal(...) if (sDebugFlag & DEBUG_FATAL) { taosPrintLongString("SYN FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }
|
||||||
#define sInfoLong(...) do { if (sDebugFlag & DEBUG_INFO) { taosPrintLongString("SYN ", DEBUG_INFO, 255, __VA_ARGS__); }} while(0)
|
#define sLError(...) if (sDebugFlag & DEBUG_ERROR) { taosPrintLongString("SYN ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }
|
||||||
#define sDebugLong(...) do { if (sDebugFlag & DEBUG_DEBUG) { taosPrintLongString("SYN ", DEBUG_DEBUG, sDebugFlag, __VA_ARGS__); }} while(0)
|
#define sLWarn(...) if (sDebugFlag & DEBUG_WARN) { taosPrintLongString("SYN WARN ", DEBUG_WARN, 255, __VA_ARGS__); }
|
||||||
#define sTraceLong(...) do { if (sDebugFlag & DEBUG_TRACE) { taosPrintLongString("SYN ", DEBUG_TRACE, sDebugFlag, __VA_ARGS__); }} while(0)
|
#define sLInfo(...) if (sDebugFlag & DEBUG_INFO) { taosPrintLongString("SYN ", DEBUG_INFO, 255, __VA_ARGS__); }
|
||||||
|
#define sLDebug(...) if (sDebugFlag & DEBUG_DEBUG) { taosPrintLongString("SYN ", DEBUG_DEBUG, sDebugFlag, __VA_ARGS__); }
|
||||||
|
#define sLTrace(...) if (sDebugFlag & DEBUG_TRACE) { taosPrintLongString("SYN ", DEBUG_TRACE, sDebugFlag, __VA_ARGS__); }
|
||||||
|
|
||||||
|
#define sNFatal(pNode, ...) if (sDebugFlag & DEBUG_FATAL) { syncPrintNodeLog("SYN FATAL ", DEBUG_FATAL, 255, pNode, __VA_ARGS__); }
|
||||||
|
#define sNError(pNode, ...) if (sDebugFlag & DEBUG_ERROR) { syncPrintNodeLog("SYN ERROR ", DEBUG_ERROR, 255, pNode, __VA_ARGS__); }
|
||||||
|
#define sNWarn(pNode, ...) if (sDebugFlag & DEBUG_WARN) { syncPrintNodeLog("SYN WARN ", DEBUG_WARN, 255, pNode, __VA_ARGS__); }
|
||||||
|
#define sNInfo(pNode, ...) if (sDebugFlag & DEBUG_INFO) { syncPrintNodeLog("SYN ", DEBUG_INFO, 255, pNode, __VA_ARGS__); }
|
||||||
|
#define sNDebug(pNode, ...) if (sDebugFlag & DEBUG_DEBUG) { syncPrintNodeLog("SYN ", DEBUG_DEBUG, sDebugFlag, pNode, __VA_ARGS__); }
|
||||||
|
#define sNTrace(pNode, ...) if (sDebugFlag & DEBUG_TRACE) { syncPrintNodeLog("SYN ", DEBUG_TRACE, sDebugFlag, pNode, __VA_ARGS__); }
|
||||||
|
|
||||||
|
#define sSFatal(pSender, ...) if (sDebugFlag & DEBUG_FATAL) { syncPrintSnapshotSenderLog("SYN FATAL ", DEBUG_FATAL, 255, pSender, __VA_ARGS__); }
|
||||||
|
#define sSError(pSender, ...) if (sDebugFlag & DEBUG_ERROR) { syncPrintSnapshotSenderLog("SYN ERROR ", DEBUG_ERROR, 255, pSender, __VA_ARGS__); }
|
||||||
|
#define sSWarn(pSender, ...) if (sDebugFlag & DEBUG_WARN) { syncPrintSnapshotSenderLog("SYN WARN ", DEBUG_WARN, 255, pSender, __VA_ARGS__); }
|
||||||
|
#define sSInfo(pSender, ...) if (sDebugFlag & DEBUG_INFO) { syncPrintSnapshotSenderLog("SYN ", DEBUG_INFO, 255, pSender, __VA_ARGS__); }
|
||||||
|
#define sSDebug(pSender, ...) if (sDebugFlag & DEBUG_DEBUG) { syncPrintSnapshotSenderLog("SYN ", DEBUG_DEBUG, sDebugFlag, pSender, __VA_ARGS__); }
|
||||||
|
#define sSTrace(pSender, ...) if (sDebugFlag & DEBUG_TRACE) { syncPrintSnapshotSenderLog("SYN ", DEBUG_TRACE, sDebugFlag, pSender, __VA_ARGS__); }
|
||||||
|
|
||||||
|
#define sRFatal(pReceiver, ...) if (sDebugFlag & DEBUG_FATAL) { syncPrintSnapshotReceiverLog("SYN FATAL ", DEBUG_FATAL, 255, pReceiver, __VA_ARGS__); }
|
||||||
|
#define sRError(pReceiver, ...) if (sDebugFlag & DEBUG_ERROR) { syncPrintSnapshotReceiverLog("SYN ERROR ", DEBUG_ERROR, 255, pReceiver, __VA_ARGS__); }
|
||||||
|
#define sRWarn(pReceiver, ...) if (sDebugFlag & DEBUG_WARN) { syncPrintSnapshotReceiverLog("SYN WARN ", DEBUG_WARN, 255, pReceiver, __VA_ARGS__); }
|
||||||
|
#define sRInfo(pReceiver, ...) if (sDebugFlag & DEBUG_INFO) { syncPrintSnapshotReceiverLog("SYN ", DEBUG_INFO, 255, pReceiver, __VA_ARGS__); }
|
||||||
|
#define sRDebug(pReceiver, ...) if (sDebugFlag & DEBUG_DEBUG) { syncPrintSnapshotReceiverLog("SYN ", DEBUG_DEBUG, sDebugFlag, pReceiver, __VA_ARGS__); }
|
||||||
|
#define sRTrace(pReceiver, ...) if (sDebugFlag & DEBUG_TRACE) { syncPrintSnapshotReceiverLog("SYN ", DEBUG_TRACE, sDebugFlag, pReceiver, __VA_ARGS__); }
|
||||||
|
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
typedef struct SyncTimeout SyncTimeout;
|
typedef struct SyncTimeout SyncTimeout;
|
||||||
|
@ -87,10 +111,6 @@ typedef struct SElectTimer {
|
||||||
void* pData;
|
void* pData;
|
||||||
} SElectTimer;
|
} SElectTimer;
|
||||||
|
|
||||||
int32_t syncHbTimerInit(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer, SRaftId destId);
|
|
||||||
int32_t syncHbTimerStart(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer);
|
|
||||||
int32_t syncHbTimerStop(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer);
|
|
||||||
|
|
||||||
typedef struct SPeerState {
|
typedef struct SPeerState {
|
||||||
SyncIndex lastSendIndex;
|
SyncIndex lastSendIndex;
|
||||||
int64_t lastSendTime;
|
int64_t lastSendTime;
|
||||||
|
@ -250,13 +270,10 @@ int32_t syncNodeSendMsgById(const SRaftId* destRaftId, SSyncNode* pSyncNode, S
|
||||||
int32_t syncNodeSendMsgByInfo(const SNodeInfo* nodeInfo, SSyncNode* pSyncNode, SRpcMsg* pMsg);
|
int32_t syncNodeSendMsgByInfo(const SNodeInfo* nodeInfo, SSyncNode* pSyncNode, SRpcMsg* pMsg);
|
||||||
cJSON* syncNode2Json(const SSyncNode* pSyncNode);
|
cJSON* syncNode2Json(const SSyncNode* pSyncNode);
|
||||||
char* syncNode2Str(const SSyncNode* pSyncNode);
|
char* syncNode2Str(const SSyncNode* pSyncNode);
|
||||||
void syncNodeEventLog(const SSyncNode* pSyncNode, char* str);
|
|
||||||
void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str);
|
|
||||||
char* syncNode2SimpleStr(const SSyncNode* pSyncNode);
|
char* syncNode2SimpleStr(const SSyncNode* pSyncNode);
|
||||||
bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config);
|
bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config);
|
||||||
void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* newConfig, SyncIndex lastConfigChangeIndex);
|
void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* newConfig, SyncIndex lastConfigChangeIndex);
|
||||||
SyncIndex syncMinMatchIndex(SSyncNode* pSyncNode);
|
SyncIndex syncMinMatchIndex(SSyncNode* pSyncNode);
|
||||||
char* syncNodePeerState2Str(const SSyncNode* pSyncNode);
|
|
||||||
|
|
||||||
// raft state change --------------
|
// raft state change --------------
|
||||||
void syncNodeUpdateTerm(SSyncNode* pSyncNode, SyncTerm term);
|
void syncNodeUpdateTerm(SSyncNode* pSyncNode, SyncTerm term);
|
||||||
|
@ -350,12 +367,12 @@ void syncLogRecvSyncSnapshotSend(SSyncNode* pSyncNode, const SyncSnapshotSend* p
|
||||||
void syncLogSendSyncSnapshotRsp(SSyncNode* pSyncNode, const SyncSnapshotRsp* pMsg, const char* s);
|
void syncLogSendSyncSnapshotRsp(SSyncNode* pSyncNode, const SyncSnapshotRsp* pMsg, const char* s);
|
||||||
void syncLogRecvSyncSnapshotRsp(SSyncNode* pSyncNode, const SyncSnapshotRsp* pMsg, const char* s);
|
void syncLogRecvSyncSnapshotRsp(SSyncNode* pSyncNode, const SyncSnapshotRsp* pMsg, const char* s);
|
||||||
|
|
||||||
// for debug --------------
|
// syncUtil.h
|
||||||
void syncNodePrint(SSyncNode* pObj);
|
void syncPrintNodeLog(const char* flags, ELogLevel level, int32_t dflag, SSyncNode* pNode, const char* format, ...);
|
||||||
void syncNodePrint2(char* s, SSyncNode* pObj);
|
void syncPrintSnapshotSenderLog(const char* flags, ELogLevel level, int32_t dflag, SSyncSnapshotSender* pSender,
|
||||||
void syncNodeLog(SSyncNode* pObj);
|
const char* format, ...);
|
||||||
void syncNodeLog2(char* s, SSyncNode* pObj);
|
void syncPrintSnapshotReceiverLog(const char* flags, ELogLevel level, int32_t dflag, SSyncSnapshotReceiver* pReceiver,
|
||||||
void syncNodeLog3(char* s, SSyncNode* pObj);
|
const char* format, ...);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,7 @@ int32_t raftCfgAddConfigIndex(SRaftCfg *pRaftCfg, SyncIndex configIndex);
|
||||||
|
|
||||||
cJSON *syncCfg2Json(SSyncCfg *pSyncCfg);
|
cJSON *syncCfg2Json(SSyncCfg *pSyncCfg);
|
||||||
char *syncCfg2Str(SSyncCfg *pSyncCfg);
|
char *syncCfg2Str(SSyncCfg *pSyncCfg);
|
||||||
char * syncCfg2SimpleStr(SSyncCfg *pSyncCfg);
|
void syncCfg2SimpleStr(const SSyncCfg *pCfg, char *str, int32_t bufLen);
|
||||||
int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg);
|
int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg);
|
||||||
int32_t syncCfgFromStr(const char *s, SSyncCfg *pSyncCfg);
|
int32_t syncCfgFromStr(const char *s, SSyncCfg *pSyncCfg);
|
||||||
|
|
||||||
|
@ -93,23 +93,6 @@ typedef struct SRaftCfgMeta {
|
||||||
|
|
||||||
int32_t raftCfgCreateFile(SSyncCfg *pCfg, SRaftCfgMeta meta, const char *path);
|
int32_t raftCfgCreateFile(SSyncCfg *pCfg, SRaftCfgMeta meta, const char *path);
|
||||||
|
|
||||||
// for debug ----------------------
|
|
||||||
void syncCfgPrint(SSyncCfg *pCfg);
|
|
||||||
void syncCfgPrint2(char *s, SSyncCfg *pCfg);
|
|
||||||
void syncCfgLog(SSyncCfg *pCfg);
|
|
||||||
void syncCfgLog2(char *s, SSyncCfg *pCfg);
|
|
||||||
void syncCfgLog3(char *s, SSyncCfg *pCfg);
|
|
||||||
|
|
||||||
void raftCfgPrint(SRaftCfg *pCfg);
|
|
||||||
void raftCfgPrint2(char *s, SRaftCfg *pCfg);
|
|
||||||
void raftCfgLog(SRaftCfg *pCfg);
|
|
||||||
void raftCfgLog2(char *s, SRaftCfg *pCfg);
|
|
||||||
|
|
||||||
void raftCfgIndexPrint(SRaftCfgIndex *pCfg);
|
|
||||||
void raftCfgIndexPrint2(char *s, SRaftCfgIndex *pCfg);
|
|
||||||
void raftCfgIndexLog(SRaftCfgIndex *pCfg);
|
|
||||||
void raftCfgIndexLog2(char *s, SRaftCfgIndex *pCfg);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -67,7 +67,6 @@ int32_t snapshotReSend(SSyncSnapshotSender *pSender);
|
||||||
|
|
||||||
cJSON *snapshotSender2Json(SSyncSnapshotSender *pSender);
|
cJSON *snapshotSender2Json(SSyncSnapshotSender *pSender);
|
||||||
char *snapshotSender2Str(SSyncSnapshotSender *pSender);
|
char *snapshotSender2Str(SSyncSnapshotSender *pSender);
|
||||||
char *snapshotSender2SimpleStr(SSyncSnapshotSender *pSender, char *event);
|
|
||||||
|
|
||||||
int32_t syncNodeStartSnapshot(SSyncNode *pSyncNode, SRaftId *pDestId);
|
int32_t syncNodeStartSnapshot(SSyncNode *pSyncNode, SRaftId *pDestId);
|
||||||
|
|
||||||
|
@ -96,7 +95,6 @@ void snapshotReceiverForceStop(SSyncSnapshotReceiver *pReceive
|
||||||
|
|
||||||
cJSON *snapshotReceiver2Json(SSyncSnapshotReceiver *pReceiver);
|
cJSON *snapshotReceiver2Json(SSyncSnapshotReceiver *pReceiver);
|
||||||
char *snapshotReceiver2Str(SSyncSnapshotReceiver *pReceiver);
|
char *snapshotReceiver2Str(SSyncSnapshotReceiver *pReceiver);
|
||||||
char *snapshotReceiver2SimpleStr(SSyncSnapshotReceiver *pReceiver, char *event);
|
|
||||||
|
|
||||||
//---------------------------------------------------
|
//---------------------------------------------------
|
||||||
// on message
|
// on message
|
||||||
|
|
|
@ -26,8 +26,6 @@ typedef struct SRaftId {
|
||||||
SyncGroupId vgId;
|
SyncGroupId vgId;
|
||||||
} SRaftId;
|
} SRaftId;
|
||||||
|
|
||||||
char* sync2SimpleStr(int64_t rid);
|
|
||||||
|
|
||||||
// for compatibility, the same as syncPropose
|
// for compatibility, the same as syncPropose
|
||||||
int32_t syncForwardToPeer(int64_t rid, SRpcMsg* pMsg, bool isWeak);
|
int32_t syncForwardToPeer(int64_t rid, SRpcMsg* pMsg, bool isWeak);
|
||||||
|
|
||||||
|
@ -184,9 +182,8 @@ typedef struct SyncClientRequest {
|
||||||
char data[]; // origin RpcMsg.pCont
|
char data[]; // origin RpcMsg.pCont
|
||||||
} SyncClientRequest;
|
} SyncClientRequest;
|
||||||
|
|
||||||
SyncClientRequest* syncClientRequestBuild(uint32_t dataLen);
|
SyncClientRequest* syncClientRequestAlloc(uint32_t dataLen);
|
||||||
SyncClientRequest* syncClientRequestBuild2(const SRpcMsg* pOriginalRpcMsg, uint64_t seqNum, bool isWeak,
|
SyncClientRequest* syncClientRequestBuild(const SRpcMsg* pMsg, uint64_t seqNum, bool isWeak, int32_t vgId); // step 1
|
||||||
int32_t vgId); // step 1
|
|
||||||
void syncClientRequestDestroy(SyncClientRequest* pMsg);
|
void syncClientRequestDestroy(SyncClientRequest* pMsg);
|
||||||
void syncClientRequestSerialize(const SyncClientRequest* pMsg, char* buf, uint32_t bufLen);
|
void syncClientRequestSerialize(const SyncClientRequest* pMsg, char* buf, uint32_t bufLen);
|
||||||
void syncClientRequestDeserialize(const char* buf, uint32_t len, SyncClientRequest* pMsg);
|
void syncClientRequestDeserialize(const char* buf, uint32_t len, SyncClientRequest* pMsg);
|
||||||
|
@ -688,45 +685,6 @@ SyncLeaderTransfer* syncLeaderTransferFromRpcMsg2(const SRpcMsg* pRpcMsg);
|
||||||
cJSON* syncLeaderTransfer2Json(const SyncLeaderTransfer* pMsg);
|
cJSON* syncLeaderTransfer2Json(const SyncLeaderTransfer* pMsg);
|
||||||
char* syncLeaderTransfer2Str(const SyncLeaderTransfer* pMsg);
|
char* syncLeaderTransfer2Str(const SyncLeaderTransfer* pMsg);
|
||||||
|
|
||||||
// for debug ----------------------
|
|
||||||
void syncLeaderTransferPrint(const SyncLeaderTransfer* pMsg);
|
|
||||||
void syncLeaderTransferPrint2(char* s, const SyncLeaderTransfer* pMsg);
|
|
||||||
void syncLeaderTransferLog(const SyncLeaderTransfer* pMsg);
|
|
||||||
void syncLeaderTransferLog2(char* s, const SyncLeaderTransfer* pMsg);
|
|
||||||
|
|
||||||
// ---------------------------------------------
|
|
||||||
typedef struct SyncReconfigFinish {
|
|
||||||
uint32_t bytes;
|
|
||||||
int32_t vgId;
|
|
||||||
uint32_t msgType;
|
|
||||||
SSyncCfg oldCfg;
|
|
||||||
SSyncCfg newCfg;
|
|
||||||
SyncIndex newCfgIndex;
|
|
||||||
SyncTerm newCfgTerm;
|
|
||||||
uint64_t newCfgSeqNum;
|
|
||||||
|
|
||||||
} SyncReconfigFinish;
|
|
||||||
|
|
||||||
SyncReconfigFinish* syncReconfigFinishBuild(int32_t vgId);
|
|
||||||
void syncReconfigFinishDestroy(SyncReconfigFinish* pMsg);
|
|
||||||
void syncReconfigFinishSerialize(const SyncReconfigFinish* pMsg, char* buf, uint32_t bufLen);
|
|
||||||
void syncReconfigFinishDeserialize(const char* buf, uint32_t len, SyncReconfigFinish* pMsg);
|
|
||||||
char* syncReconfigFinishSerialize2(const SyncReconfigFinish* pMsg, uint32_t* len);
|
|
||||||
SyncReconfigFinish* syncReconfigFinishDeserialize2(const char* buf, uint32_t len);
|
|
||||||
void syncReconfigFinish2RpcMsg(const SyncReconfigFinish* pMsg, SRpcMsg* pRpcMsg);
|
|
||||||
void syncReconfigFinishFromRpcMsg(const SRpcMsg* pRpcMsg, SyncReconfigFinish* pMsg);
|
|
||||||
SyncReconfigFinish* syncReconfigFinishFromRpcMsg2(const SRpcMsg* pRpcMsg);
|
|
||||||
cJSON* syncReconfigFinish2Json(const SyncReconfigFinish* pMsg);
|
|
||||||
char* syncReconfigFinish2Str(const SyncReconfigFinish* pMsg);
|
|
||||||
|
|
||||||
// for debug ----------------------
|
|
||||||
void syncReconfigFinishPrint(const SyncReconfigFinish* pMsg);
|
|
||||||
void syncReconfigFinishPrint2(char* s, const SyncReconfigFinish* pMsg);
|
|
||||||
void syncReconfigFinishLog(const SyncReconfigFinish* pMsg);
|
|
||||||
void syncReconfigFinishLog2(char* s, const SyncReconfigFinish* pMsg);
|
|
||||||
|
|
||||||
// ---------------------------------------------
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SYNC_LOCAL_CMD_STEP_DOWN = 100,
|
SYNC_LOCAL_CMD_STEP_DOWN = 100,
|
||||||
SYNC_LOCAL_CMD_FOLLOWER_CMT,
|
SYNC_LOCAL_CMD_FOLLOWER_CMT,
|
||||||
|
|
|
@ -20,48 +20,35 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "syncInt.h"
|
#include "syncInt.h"
|
||||||
#include "syncMessage.h"
|
|
||||||
#include "taosdef.h"
|
|
||||||
|
|
||||||
// ---- encode / decode
|
|
||||||
uint64_t syncUtilAddr2U64(const char* host, uint16_t port);
|
uint64_t syncUtilAddr2U64(const char* host, uint16_t port);
|
||||||
void syncUtilU642Addr(uint64_t u64, char* host, size_t len, uint16_t* port);
|
void syncUtilU642Addr(uint64_t u64, char* host, int64_t len, uint16_t* port);
|
||||||
void syncUtilnodeInfo2EpSet(const SNodeInfo* pNodeInfo, SEpSet* pEpSet);
|
void syncUtilnodeInfo2EpSet(const SNodeInfo* pInfo, SEpSet* pEpSet);
|
||||||
void syncUtilraftId2EpSet(const SRaftId* raftId, SEpSet* pEpSet);
|
void syncUtilraftId2EpSet(const SRaftId* raftId, SEpSet* pEpSet);
|
||||||
bool syncUtilnodeInfo2raftId(const SNodeInfo* pNodeInfo, SyncGroupId vgId, SRaftId* raftId);
|
bool syncUtilnodeInfo2raftId(const SNodeInfo* pInfo, SyncGroupId vgId, SRaftId* raftId);
|
||||||
bool syncUtilSameId(const SRaftId* pId1, const SRaftId* pId2);
|
bool syncUtilSameId(const SRaftId* pId1, const SRaftId* pId2);
|
||||||
bool syncUtilEmptyId(const SRaftId* pId);
|
bool syncUtilEmptyId(const SRaftId* pId);
|
||||||
|
|
||||||
// ---- SSyncBuffer ----
|
|
||||||
void syncUtilbufBuild(SSyncBuffer* syncBuf, size_t len);
|
|
||||||
void syncUtilbufDestroy(SSyncBuffer* syncBuf);
|
|
||||||
void syncUtilbufCopy(const SSyncBuffer* src, SSyncBuffer* dest);
|
|
||||||
void syncUtilbufCopyDeep(const SSyncBuffer* src, SSyncBuffer* dest);
|
|
||||||
|
|
||||||
// ---- misc ----
|
|
||||||
int32_t syncUtilRand(int32_t max);
|
|
||||||
int32_t syncUtilElectRandomMS(int32_t min, int32_t max);
|
int32_t syncUtilElectRandomMS(int32_t min, int32_t max);
|
||||||
int32_t syncUtilQuorum(int32_t replicaNum);
|
int32_t syncUtilQuorum(int32_t replicaNum);
|
||||||
cJSON* syncUtilNodeInfo2Json(const SNodeInfo* p);
|
cJSON* syncUtilNodeInfo2Json(const SNodeInfo* p);
|
||||||
cJSON* syncUtilRaftId2Json(const SRaftId* p);
|
cJSON* syncUtilRaftId2Json(const SRaftId* p);
|
||||||
char* syncUtilRaftId2Str(const SRaftId* p);
|
char* syncUtilRaftId2Str(const SRaftId* p);
|
||||||
const char* syncStr(ESyncState state);
|
const char* syncStr(ESyncState state);
|
||||||
bool syncUtilCanPrint(char c);
|
char* syncUtilPrintBin(char* ptr, uint32_t len);
|
||||||
char* syncUtilprintBin(char* ptr, uint32_t len);
|
char* syncUtilPrintBin2(char* ptr, uint32_t len);
|
||||||
char* syncUtilprintBin2(char* ptr, uint32_t len);
|
|
||||||
SyncIndex syncUtilMinIndex(SyncIndex a, SyncIndex b);
|
|
||||||
SyncIndex syncUtilMaxIndex(SyncIndex a, SyncIndex b);
|
|
||||||
void syncUtilMsgHtoN(void* msg);
|
void syncUtilMsgHtoN(void* msg);
|
||||||
void syncUtilMsgNtoH(void* msg);
|
void syncUtilMsgNtoH(void* msg);
|
||||||
bool syncUtilIsData(tmsg_t msgType);
|
|
||||||
bool syncUtilUserPreCommit(tmsg_t msgType);
|
bool syncUtilUserPreCommit(tmsg_t msgType);
|
||||||
bool syncUtilUserCommit(tmsg_t msgType);
|
bool syncUtilUserCommit(tmsg_t msgType);
|
||||||
bool syncUtilUserRollback(tmsg_t msgType);
|
bool syncUtilUserRollback(tmsg_t msgType);
|
||||||
void syncUtilJson2Line(char* jsonStr);
|
|
||||||
|
void syncPrintNodeLog(const char* flags, ELogLevel level, int32_t dflag, SSyncNode* pNode, const char* format, ...);
|
||||||
|
void syncPrintSnapshotSenderLog(const char* flags, ELogLevel level, int32_t dflag, SSyncSnapshotSender* pSender,
|
||||||
|
const char* format, ...);
|
||||||
|
void syncPrintSnapshotReceiverLog(const char* flags, ELogLevel level, int32_t dflag, SSyncSnapshotReceiver* pReceiver,
|
||||||
|
const char* format, ...);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,15 +20,8 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "syncInt.h"
|
#include "syncInt.h"
|
||||||
#include "syncMessage.h"
|
|
||||||
#include "syncUtil.h"
|
|
||||||
#include "taosdef.h"
|
|
||||||
|
|
||||||
// SVotesGranted -----------------------------
|
|
||||||
typedef struct SVotesGranted {
|
typedef struct SVotesGranted {
|
||||||
SRaftId (*replicas)[TSDB_MAX_REPLICA];
|
SRaftId (*replicas)[TSDB_MAX_REPLICA];
|
||||||
bool isGranted[TSDB_MAX_REPLICA];
|
bool isGranted[TSDB_MAX_REPLICA];
|
||||||
|
@ -49,13 +42,6 @@ void voteGrantedReset(SVotesGranted *pVotesGranted, SyncTerm term);
|
||||||
cJSON *voteGranted2Json(SVotesGranted *pVotesGranted);
|
cJSON *voteGranted2Json(SVotesGranted *pVotesGranted);
|
||||||
char *voteGranted2Str(SVotesGranted *pVotesGranted);
|
char *voteGranted2Str(SVotesGranted *pVotesGranted);
|
||||||
|
|
||||||
// for debug -------------------
|
|
||||||
void voteGrantedPrint(SVotesGranted *pObj);
|
|
||||||
void voteGrantedPrint2(char *s, SVotesGranted *pObj);
|
|
||||||
void voteGrantedLog(SVotesGranted *pObj);
|
|
||||||
void voteGrantedLog2(char *s, SVotesGranted *pObj);
|
|
||||||
|
|
||||||
// SVotesRespond -----------------------------
|
|
||||||
typedef struct SVotesRespond {
|
typedef struct SVotesRespond {
|
||||||
SRaftId (*replicas)[TSDB_MAX_REPLICA];
|
SRaftId (*replicas)[TSDB_MAX_REPLICA];
|
||||||
bool isRespond[TSDB_MAX_REPLICA];
|
bool isRespond[TSDB_MAX_REPLICA];
|
||||||
|
@ -73,12 +59,6 @@ void votesRespondReset(SVotesRespond *pVotesRespond, SyncTerm term);
|
||||||
cJSON *votesRespond2Json(SVotesRespond *pVotesRespond);
|
cJSON *votesRespond2Json(SVotesRespond *pVotesRespond);
|
||||||
char *votesRespond2Str(SVotesRespond *pVotesRespond);
|
char *votesRespond2Str(SVotesRespond *pVotesRespond);
|
||||||
|
|
||||||
// for debug -------------------
|
|
||||||
void votesRespondPrint(SVotesRespond *pObj);
|
|
||||||
void votesRespondPrint2(char *s, SVotesRespond *pObj);
|
|
||||||
void votesRespondLog(SVotesRespond *pObj);
|
|
||||||
void votesRespondLog2(char *s, SVotesRespond *pObj);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -91,7 +91,7 @@
|
||||||
|
|
||||||
int32_t syncNodeFollowerCommit(SSyncNode* ths, SyncIndex newCommitIndex) {
|
int32_t syncNodeFollowerCommit(SSyncNode* ths, SyncIndex newCommitIndex) {
|
||||||
if (ths->state != TAOS_SYNC_STATE_FOLLOWER) {
|
if (ths->state != TAOS_SYNC_STATE_FOLLOWER) {
|
||||||
syncNodeEventLog(ths, "can not do follower commit");
|
sNTrace(ths, "can not do follower commit");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,11 +106,7 @@ int32_t syncNodeFollowerCommit(SSyncNode* ths, SyncIndex newCommitIndex) {
|
||||||
SyncIndex commitBegin = ths->commitIndex;
|
SyncIndex commitBegin = ths->commitIndex;
|
||||||
SyncIndex commitEnd = snapshot.lastApplyIndex;
|
SyncIndex commitEnd = snapshot.lastApplyIndex;
|
||||||
ths->commitIndex = snapshot.lastApplyIndex;
|
ths->commitIndex = snapshot.lastApplyIndex;
|
||||||
|
sNTrace(ths, "commit by snapshot from index:%" PRId64 " to index:%" PRId64, commitBegin, commitEnd);
|
||||||
char eventLog[128];
|
|
||||||
snprintf(eventLog, sizeof(eventLog), "commit by snapshot from index:%" PRId64 " to index:%" PRId64, commitBegin,
|
|
||||||
commitEnd);
|
|
||||||
syncNodeEventLog(ths, eventLog);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncIndex beginIndex = ths->commitIndex + 1;
|
SyncIndex beginIndex = ths->commitIndex + 1;
|
||||||
|
@ -192,11 +188,7 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
if (pLocalEntry->term == pAppendEntry->term) {
|
if (pLocalEntry->term == pAppendEntry->term) {
|
||||||
// do nothing
|
// do nothing
|
||||||
|
sNTrace(ths, "log match, do nothing, index:%" PRId64, appendIndex);
|
||||||
char logBuf[128];
|
|
||||||
snprintf(logBuf, sizeof(logBuf), "log match, do nothing, index:%" PRId64, appendIndex);
|
|
||||||
syncNodeEventLog(ths, logBuf);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// truncate
|
// truncate
|
||||||
code = ths->pLogStore->syncLogTruncate(ths->pLogStore, appendIndex);
|
code = ths->pLogStore->syncLogTruncate(ths->pLogStore, appendIndex);
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue