Merge branch '3.0' into enh/TD-32406-3.0
This commit is contained in:
commit
bad8d9dd2f
|
@ -163,4 +163,12 @@ geos_c.h
|
||||||
source/libs/parser/src/sql.c
|
source/libs/parser/src/sql.c
|
||||||
include/common/ttokenauto.h
|
include/common/ttokenauto.h
|
||||||
!packaging/smokeTest/pytest_require.txt
|
!packaging/smokeTest/pytest_require.txt
|
||||||
tdengine-test-dir
|
tdengine-test-dir/
|
||||||
|
localtime.c
|
||||||
|
private.h
|
||||||
|
strftime.c
|
||||||
|
tzdir.h
|
||||||
|
tzfile.h
|
||||||
|
coverage.info
|
||||||
|
taos
|
||||||
|
taosd
|
||||||
|
|
|
@ -112,14 +112,14 @@ Fill in the example data from the MQTT message body in **Message Body**.
|
||||||
|
|
||||||
JSON data supports JSONObject or JSONArray, and the json parser can parse the following data:
|
JSON data supports JSONObject or JSONArray, and the json parser can parse the following data:
|
||||||
|
|
||||||
``` json
|
```json
|
||||||
{"id": 1, "message": "hello-word"}
|
{"id": 1, "message": "hello-word"}
|
||||||
{"id": 2, "message": "hello-word"}
|
{"id": 2, "message": "hello-word"}
|
||||||
```
|
```
|
||||||
|
|
||||||
or
|
or
|
||||||
|
|
||||||
``` json
|
```json
|
||||||
[{"id": 1, "message": "hello-word"},{"id": 2, "message": "hello-word"}]
|
[{"id": 1, "message": "hello-word"},{"id": 2, "message": "hello-word"}]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -109,7 +109,7 @@ In addition, the [Kerberos](https://web.mit.edu/kerberos/) authentication servic
|
||||||
|
|
||||||
After configuration, you can use the [kcat](https://github.com/edenhill/kcat) tool to verify Kafka topic consumption:
|
After configuration, you can use the [kcat](https://github.com/edenhill/kcat) tool to verify Kafka topic consumption:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
kcat <topic> \
|
kcat <topic> \
|
||||||
-b <kafka-server:port> \
|
-b <kafka-server:port> \
|
||||||
-G kcat \
|
-G kcat \
|
||||||
|
@ -171,14 +171,14 @@ Enter sample data from the Kafka message body in **Message Body**.
|
||||||
|
|
||||||
JSON data supports JSONObject or JSONArray, and the following data can be parsed using a JSON parser:
|
JSON data supports JSONObject or JSONArray, and the following data can be parsed using a JSON parser:
|
||||||
|
|
||||||
``` json
|
```json
|
||||||
{"id": 1, "message": "hello-word"}
|
{"id": 1, "message": "hello-word"}
|
||||||
{"id": 2, "message": "hello-word"}
|
{"id": 2, "message": "hello-word"}
|
||||||
```
|
```
|
||||||
|
|
||||||
or
|
or
|
||||||
|
|
||||||
``` json
|
```json
|
||||||
[{"id": 1, "message": "hello-word"},{"id": 2, "message": "hello-word"}]
|
[{"id": 1, "message": "hello-word"},{"id": 2, "message": "hello-word"}]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ Parsing is the process of parsing unstructured strings into structured data. The
|
||||||
|
|
||||||
JSON parsing supports JSONObject or JSONArray. The following JSON sample data can automatically parse fields: `groupid`, `voltage`, `current`, `ts`, `inuse`, `location`.
|
JSON parsing supports JSONObject or JSONArray. The following JSON sample data can automatically parse fields: `groupid`, `voltage`, `current`, `ts`, `inuse`, `location`.
|
||||||
|
|
||||||
``` json
|
```json
|
||||||
{"groupid": 170001, "voltage": "221V", "current": 12.3, "ts": "2023-12-18T22:12:00", "inuse": true, "location": "beijing.chaoyang.datun"}
|
{"groupid": 170001, "voltage": "221V", "current": 12.3, "ts": "2023-12-18T22:12:00", "inuse": true, "location": "beijing.chaoyang.datun"}
|
||||||
{"groupid": 170001, "voltage": "220V", "current": 12.2, "ts": "2023-12-18T22:12:02", "inuse": true, "location": "beijing.chaoyang.datun"}
|
{"groupid": 170001, "voltage": "220V", "current": 12.2, "ts": "2023-12-18T22:12:02", "inuse": true, "location": "beijing.chaoyang.datun"}
|
||||||
{"groupid": 170001, "voltage": "216V", "current": 12.5, "ts": "2023-12-18T22:12:04", "inuse": false, "location": "beijing.chaoyang.datun"}
|
{"groupid": 170001, "voltage": "216V", "current": 12.5, "ts": "2023-12-18T22:12:04", "inuse": false, "location": "beijing.chaoyang.datun"}
|
||||||
|
@ -91,7 +91,7 @@ JSON parsing supports JSONObject or JSONArray. The following JSON sample data ca
|
||||||
|
|
||||||
Or
|
Or
|
||||||
|
|
||||||
``` json
|
```json
|
||||||
[{"groupid": 170001, "voltage": "221V", "current": 12.3, "ts": "2023-12-18T22:12:00", "inuse": true, "location": "beijing.chaoyang.datun"},
|
[{"groupid": 170001, "voltage": "221V", "current": 12.3, "ts": "2023-12-18T22:12:00", "inuse": true, "location": "beijing.chaoyang.datun"},
|
||||||
{"groupid": 170001, "voltage": "220V", "current": 12.2, "ts": "2023-12-18T22:12:02", "inuse": true, "location": "beijing.chaoyang.datun"},
|
{"groupid": 170001, "voltage": "220V", "current": 12.2, "ts": "2023-12-18T22:12:02", "inuse": true, "location": "beijing.chaoyang.datun"},
|
||||||
{"groupid": 170001, "voltage": "216V", "current": 12.5, "ts": "2023-12-18T22:12:04", "inuse": false, "location": "beijing.chaoyang.datun"}]
|
{"groupid": 170001, "voltage": "216V", "current": 12.5, "ts": "2023-12-18T22:12:04", "inuse": false, "location": "beijing.chaoyang.datun"}]
|
||||||
|
@ -101,7 +101,7 @@ Subsequent examples will only explain using JSONObject.
|
||||||
|
|
||||||
The following nested JSON data can automatically parse fields `groupid`, `data_voltage`, `data_current`, `ts`, `inuse`, `location_0_province`, `location_0_city`, `location_0_datun`, and you can also choose which fields to parse and set aliases for the parsed fields.
|
The following nested JSON data can automatically parse fields `groupid`, `data_voltage`, `data_current`, `ts`, `inuse`, `location_0_province`, `location_0_city`, `location_0_datun`, and you can also choose which fields to parse and set aliases for the parsed fields.
|
||||||
|
|
||||||
``` json
|
```json
|
||||||
{"groupid": 170001, "data": { "voltage": "221V", "current": 12.3 }, "ts": "2023-12-18T22:12:00", "inuse": true, "location": [{"province": "beijing", "city":"chaoyang", "street": "datun"}]}
|
{"groupid": 170001, "data": { "voltage": "221V", "current": 12.3 }, "ts": "2023-12-18T22:12:00", "inuse": true, "location": [{"province": "beijing", "city":"chaoyang", "street": "datun"}]}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ The following nested JSON data can automatically parse fields `groupid`, `data_v
|
||||||
|
|
||||||
You can use **named capture groups** in regular expressions to extract multiple fields from any string (text) field. As shown in the figure, extract fields such as access IP, timestamp, and accessed URL from nginx logs.
|
You can use **named capture groups** in regular expressions to extract multiple fields from any string (text) field. As shown in the figure, extract fields such as access IP, timestamp, and accessed URL from nginx logs.
|
||||||
|
|
||||||
``` re
|
```regex
|
||||||
(?<ip>\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b)\s-\s-\s\[(?<ts>\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2}\s\+\d{4})\]\s"(?<method>[A-Z]+)\s(?<url>[^\s"]+).*(?<status>\d{3})\s(?<length>\d+)
|
(?<ip>\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b)\s-\s-\s\[(?<ts>\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2}\s\+\d{4})\]\s"(?<method>[A-Z]+)\s(?<url>[^\s"]+).*(?<status>\d{3})\s(?<length>\d+)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ Custom rhai syntax scripts for parsing input data (refer to `https://rhai.rs/boo
|
||||||
|
|
||||||
For example, for data reporting three-phase voltage values, which are entered into three subtables respectively, such data needs to be parsed
|
For example, for data reporting three-phase voltage values, which are entered into three subtables respectively, such data needs to be parsed
|
||||||
|
|
||||||
``` json
|
```json
|
||||||
{
|
{
|
||||||
"ts": "2024-06-27 18:00:00",
|
"ts": "2024-06-27 18:00:00",
|
||||||
"voltage": "220.1,220.3,221.1",
|
"voltage": "220.1,220.3,221.1",
|
||||||
|
@ -164,7 +164,7 @@ The final parsing result is shown below:
|
||||||
|
|
||||||
The parsed data may still not meet the data requirements of the target table. For example, the original data collected by a smart meter is as follows (in json format):
|
The parsed data may still not meet the data requirements of the target table. For example, the original data collected by a smart meter is as follows (in json format):
|
||||||
|
|
||||||
``` json
|
```json
|
||||||
{"groupid": 170001, "voltage": "221V", "current": 12.3, "ts": "2023-12-18T22:12:00", "inuse": true, "location": "beijing.chaoyang.datun"}
|
{"groupid": 170001, "voltage": "221V", "current": 12.3, "ts": "2023-12-18T22:12:00", "inuse": true, "location": "beijing.chaoyang.datun"}
|
||||||
{"groupid": 170001, "voltage": "220V", "current": 12.2, "ts": "2023-12-18T22:12:02", "inuse": true, "location": "beijing.chaoyang.datun"}
|
{"groupid": 170001, "voltage": "220V", "current": 12.2, "ts": "2023-12-18T22:12:02", "inuse": true, "location": "beijing.chaoyang.datun"}
|
||||||
{"groupid": 170001, "voltage": "216V", "current": 12.5, "ts": "2023-12-18T22:12:04", "inuse": false, "location": "beijing.chaoyang.datun"}
|
{"groupid": 170001, "voltage": "216V", "current": 12.5, "ts": "2023-12-18T22:12:04", "inuse": false, "location": "beijing.chaoyang.datun"}
|
||||||
|
|
|
@ -83,14 +83,14 @@ Next, create a supertable (STABLE) named `meters`, whose table structure include
|
||||||
|
|
||||||
Create Database
|
Create Database
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql' \
|
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql' \
|
||||||
--data 'CREATE DATABASE IF NOT EXISTS power'
|
--data 'CREATE DATABASE IF NOT EXISTS power'
|
||||||
```
|
```
|
||||||
|
|
||||||
Create Table, specify the database as `power` in the URL
|
Create Table, specify the database as `power` in the URL
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql/power' \
|
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql/power' \
|
||||||
--data 'CREATE STABLE IF NOT EXISTS meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (groupId INT, location BINARY(24))'
|
--data 'CREATE STABLE IF NOT EXISTS meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (groupId INT, location BINARY(24))'
|
||||||
```
|
```
|
||||||
|
@ -167,7 +167,7 @@ NOW is an internal system function, defaulting to the current time of the client
|
||||||
|
|
||||||
Write data
|
Write data
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql' \
|
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql' \
|
||||||
--data 'INSERT INTO power.d1001 USING power.meters TAGS(2,'\''California.SanFrancisco'\'') VALUES (NOW + 1a, 10.30000, 219, 0.31000) (NOW + 2a, 12.60000, 218, 0.33000) (NOW + 3a, 12.30000, 221, 0.31000) power.d1002 USING power.meters TAGS(3, '\''California.SanFrancisco'\'') VALUES (NOW + 1a, 10.30000, 218, 0.25000)'
|
--data 'INSERT INTO power.d1001 USING power.meters TAGS(2,'\''California.SanFrancisco'\'') VALUES (NOW + 1a, 10.30000, 219, 0.31000) (NOW + 2a, 12.60000, 218, 0.33000) (NOW + 3a, 12.30000, 221, 0.31000) power.d1002 USING power.meters TAGS(3, '\''California.SanFrancisco'\'') VALUES (NOW + 1a, 10.30000, 218, 0.25000)'
|
||||||
```
|
```
|
||||||
|
@ -247,7 +247,7 @@ Rust connector also supports using **serde** for deserializing to get structured
|
||||||
|
|
||||||
Query Data
|
Query Data
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql' \
|
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql' \
|
||||||
--data 'SELECT ts, current, location FROM power.meters limit 100'
|
--data 'SELECT ts, current, location FROM power.meters limit 100'
|
||||||
```
|
```
|
||||||
|
@ -329,7 +329,7 @@ Below are code examples of setting reqId to execute SQL in various language conn
|
||||||
|
|
||||||
Query data, specify reqId as 3
|
Query data, specify reqId as 3
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql?req_id=3' \
|
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql?req_id=3' \
|
||||||
--data 'SELECT ts, current, location FROM power.meters limit 1'
|
--data 'SELECT ts, current, location FROM power.meters limit 1'
|
||||||
```
|
```
|
||||||
|
|
|
@ -273,19 +273,19 @@ To better operate the above data structures, some convenience functions are prov
|
||||||
|
|
||||||
Create table:
|
Create table:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
create table battery(ts timestamp, vol1 float, vol2 float, vol3 float, deviceId varchar(16));
|
create table battery(ts timestamp, vol1 float, vol2 float, vol3 float, deviceId varchar(16));
|
||||||
```
|
```
|
||||||
|
|
||||||
Create custom function:
|
Create custom function:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
create aggregate function max_vol as '/root/udf/libmaxvol.so' outputtype binary(64) bufsize 10240 language 'C';
|
create aggregate function max_vol as '/root/udf/libmaxvol.so' outputtype binary(64) bufsize 10240 language 'C';
|
||||||
```
|
```
|
||||||
|
|
||||||
Use custom function:
|
Use custom function:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
select max_vol(vol1, vol2, vol3, deviceid) from battery;
|
select max_vol(vol1, vol2, vol3, deviceid) from battery;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -334,7 +334,7 @@ When developing UDFs in Python, you need to implement the specified interface fu
|
||||||
|
|
||||||
The interface for scalar functions is as follows.
|
The interface for scalar functions is as follows.
|
||||||
|
|
||||||
```Python
|
```python
|
||||||
def process(input: datablock) -> tuple[output_type]:
|
def process(input: datablock) -> tuple[output_type]:
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -347,7 +347,7 @@ The main parameters are as follows:
|
||||||
|
|
||||||
The interface for aggregate functions is as follows.
|
The interface for aggregate functions is as follows.
|
||||||
|
|
||||||
```Python
|
```python
|
||||||
def start() -> bytes:
|
def start() -> bytes:
|
||||||
def reduce(inputs: datablock, buf: bytes) -> bytes
|
def reduce(inputs: datablock, buf: bytes) -> bytes
|
||||||
def finish(buf: bytes) -> output_type:
|
def finish(buf: bytes) -> output_type:
|
||||||
|
@ -365,7 +365,7 @@ Finally, when all row data blocks have been processed, the finish function is ca
|
||||||
|
|
||||||
The interfaces for initialization and destruction are as follows.
|
The interfaces for initialization and destruction are as follows.
|
||||||
|
|
||||||
```Python
|
```python
|
||||||
def init()
|
def init()
|
||||||
def destroy()
|
def destroy()
|
||||||
```
|
```
|
||||||
|
@ -381,7 +381,7 @@ Parameter description:
|
||||||
|
|
||||||
The template for developing scalar functions in Python is as follows.
|
The template for developing scalar functions in Python is as follows.
|
||||||
|
|
||||||
```Python
|
```python
|
||||||
def init():
|
def init():
|
||||||
# initialization
|
# initialization
|
||||||
def destroy():
|
def destroy():
|
||||||
|
@ -393,7 +393,7 @@ def process(input: datablock) -> tuple[output_type]:
|
||||||
|
|
||||||
The template for developing aggregate functions in Python is as follows.
|
The template for developing aggregate functions in Python is as follows.
|
||||||
|
|
||||||
```Python
|
```python
|
||||||
def init():
|
def init():
|
||||||
#initialization
|
#initialization
|
||||||
def destroy():
|
def destroy():
|
||||||
|
@ -828,7 +828,7 @@ Through this example, we learned how to define aggregate functions and print cus
|
||||||
<details>
|
<details>
|
||||||
<summary>pybitand.py</summary>
|
<summary>pybitand.py</summary>
|
||||||
|
|
||||||
```Python
|
```python
|
||||||
{{#include tests/script/sh/pybitand.py}}
|
{{#include tests/script/sh/pybitand.py}}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ TDengine is designed for various writing scenarios, and many of these scenarios
|
||||||
|
|
||||||
### Syntax
|
### Syntax
|
||||||
|
|
||||||
```SQL
|
```sql
|
||||||
COMPACT DATABASE db_name [start with 'XXXX'] [end with 'YYYY'];
|
COMPACT DATABASE db_name [start with 'XXXX'] [end with 'YYYY'];
|
||||||
SHOW COMPACTS [compact_id];
|
SHOW COMPACTS [compact_id];
|
||||||
KILL COMPACT compact_id;
|
KILL COMPACT compact_id;
|
||||||
|
@ -41,7 +41,7 @@ KILL COMPACT compact_id;
|
||||||
|
|
||||||
When one or more nodes in a multi-replica cluster restart due to upgrades or other reasons, it may lead to an imbalance in the load among the various dnodes in the cluster. In extreme cases, all vgroup leaders may be located on the same dnode. To solve this problem, you can use the following commands, which were first released in version 3.0.4.0. It is recommended to use the latest version as much as possible.
|
When one or more nodes in a multi-replica cluster restart due to upgrades or other reasons, it may lead to an imbalance in the load among the various dnodes in the cluster. In extreme cases, all vgroup leaders may be located on the same dnode. To solve this problem, you can use the following commands, which were first released in version 3.0.4.0. It is recommended to use the latest version as much as possible.
|
||||||
|
|
||||||
```SQL
|
```sql
|
||||||
balance vgroup leader; # Rebalance all vgroup leaders
|
balance vgroup leader; # Rebalance all vgroup leaders
|
||||||
balance vgroup leader on <vgroup_id>; # Rebalance a vgroup leader
|
balance vgroup leader on <vgroup_id>; # Rebalance a vgroup leader
|
||||||
balance vgroup leader database <database_name>; # Rebalance all vgroup leaders within a database
|
balance vgroup leader database <database_name>; # Rebalance all vgroup leaders within a database
|
||||||
|
|
|
@ -121,7 +121,7 @@ The cost of using object storage services is related to the amount of data store
|
||||||
|
|
||||||
When the TSDB time-series data exceeds the time specified by the `s3_keeplocal` parameter, the related data files will be split into multiple file blocks, each with a default size of 512 MB (`s3_chunkpages * tsdb_pagesize`). Except for the last file block, which is retained on the local file system, the rest of the file blocks are uploaded to the object storage service.
|
When the TSDB time-series data exceeds the time specified by the `s3_keeplocal` parameter, the related data files will be split into multiple file blocks, each with a default size of 512 MB (`s3_chunkpages * tsdb_pagesize`). Except for the last file block, which is retained on the local file system, the rest of the file blocks are uploaded to the object storage service.
|
||||||
|
|
||||||
```math
|
```text
|
||||||
Upload Count = Data File Size / (s3_chunkpages * tsdb_pagesize) - 1
|
Upload Count = Data File Size / (s3_chunkpages * tsdb_pagesize) - 1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ During query operations, if data in object storage needs to be accessed, TSDB do
|
||||||
|
|
||||||
Adjacent multiple data pages are downloaded as a single data block from object storage to reduce the number of downloads. The size of each data page is specified by the `tsdb_pagesize` parameter when creating the database, with a default of 4 KB.
|
Adjacent multiple data pages are downloaded as a single data block from object storage to reduce the number of downloads. The size of each data page is specified by the `tsdb_pagesize` parameter when creating the database, with a default of 4 KB.
|
||||||
|
|
||||||
```math
|
```text
|
||||||
Download Count = Number of Data Blocks Needed for Query - Number of Cached Data Blocks
|
Download Count = Number of Data Blocks Needed for Query - Number of Cached Data Blocks
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -155,7 +155,7 @@ For deployment methods, please refer to the [Flexify](https://azuremarketplace.m
|
||||||
|
|
||||||
In the configuration file /etc/taos/taos.cfg, add parameters for S3 access:
|
In the configuration file /etc/taos/taos.cfg, add parameters for S3 access:
|
||||||
|
|
||||||
```cfg
|
```text
|
||||||
s3EndPoint http //20.191.157.23,http://20.191.157.24,http://20.191.157.25
|
s3EndPoint http //20.191.157.23,http://20.191.157.24,http://20.191.157.25
|
||||||
s3AccessKey FLIOMMNL0:uhRNdeZMLD4wo,ABCIOMMN:uhRNdeZMD4wog,DEFOMMNL049ba:uhRNdeZMLD4wogXd
|
s3AccessKey FLIOMMNL0:uhRNdeZMLD4wo,ABCIOMMN:uhRNdeZMD4wog,DEFOMMNL049ba:uhRNdeZMLD4wogXd
|
||||||
s3BucketName td-test
|
s3BucketName td-test
|
||||||
|
|
|
@ -18,14 +18,14 @@ create user user_name pass'password' [sysinfo {1|0}] [createdb {1|0}]
|
||||||
The parameters are explained as follows.
|
The parameters are explained as follows.
|
||||||
|
|
||||||
- user_name: Up to 23 B long.
|
- user_name: Up to 23 B long.
|
||||||
- password: Up to 128 B long, valid characters include letters and numbers as well as special characters other than single and double quotes, apostrophes, backslashes, and spaces, and it cannot be empty.
|
- password: The password must be between 8 and 16 characters long and include at least three types of characters from the following: uppercase letters, lowercase letters, numbers, and special characters. Special characters include `! @ # $ % ^ & * ( ) - _ + = [ ] { } : ; > < ? | ~ , .`.
|
||||||
- sysinfo: Whether the user can view system information. 1 means they can view it, 0 means they cannot. System information includes server configuration information, various node information such as dnode, query node (qnode), etc., as well as storage-related information, etc. The default is to view system information.
|
- sysinfo: Whether the user can view system information. 1 means they can view it, 0 means they cannot. System information includes server configuration information, various node information such as dnode, query node (qnode), etc., as well as storage-related information, etc. The default is to view system information.
|
||||||
- createdb: Whether the user can create databases. 1 means they can create databases, 0 means they cannot. The default value is 0. // Supported starting from TDengine Enterprise version 3.3.2.0
|
- createdb: Whether the user can create databases. 1 means they can create databases, 0 means they cannot. The default value is 0. // Supported starting from TDengine Enterprise version 3.3.2.0
|
||||||
|
|
||||||
The following SQL can create a user named test with the password 123456 who can view system information.
|
The following SQL can create a user named test with the password abc123!@# who can view system information.
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
create user test pass '123456' sysinfo 1
|
create user test pass 'abc123!@#' sysinfo 1
|
||||||
```
|
```
|
||||||
|
|
||||||
### Viewing Users
|
### Viewing Users
|
||||||
|
|
|
@ -140,7 +140,7 @@ Finally, click the "Create" button at the bottom left to save the rule.
|
||||||
|
|
||||||
## Write a Mock Test Program
|
## Write a Mock Test Program
|
||||||
|
|
||||||
```javascript
|
```js
|
||||||
{{#include docs/examples/other/mock.js}}
|
{{#include docs/examples/other/mock.js}}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ curl http://localhost:8083/connectors
|
||||||
|
|
||||||
If all components have started successfully, the following output will be displayed:
|
If all components have started successfully, the following output will be displayed:
|
||||||
|
|
||||||
```txt
|
```text
|
||||||
[]
|
[]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -181,7 +181,7 @@ If the above command is executed successfully, the following output will be disp
|
||||||
|
|
||||||
Prepare a text file with test data, content as follows:
|
Prepare a text file with test data, content as follows:
|
||||||
|
|
||||||
```txt title="test-data.txt"
|
```text title="test-data.txt"
|
||||||
meters,location=California.LosAngeles,groupid=2 current=11.8,voltage=221,phase=0.28 1648432611249000000
|
meters,location=California.LosAngeles,groupid=2 current=11.8,voltage=221,phase=0.28 1648432611249000000
|
||||||
meters,location=California.LosAngeles,groupid=2 current=13.4,voltage=223,phase=0.29 1648432611250000000
|
meters,location=California.LosAngeles,groupid=2 current=13.4,voltage=223,phase=0.29 1648432611250000000
|
||||||
meters,location=California.LosAngeles,groupid=3 current=10.8,voltage=223,phase=0.29 1648432611249000000
|
meters,location=California.LosAngeles,groupid=3 current=10.8,voltage=223,phase=0.29 1648432611249000000
|
||||||
|
@ -303,7 +303,7 @@ kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --t
|
||||||
|
|
||||||
Output:
|
Output:
|
||||||
|
|
||||||
```txt
|
```text
|
||||||
......
|
......
|
||||||
meters,location="California.SanFrancisco",groupid=2i32 current=10.3f32,voltage=219i32,phase=0.31f32 1538548685000000000
|
meters,location="California.SanFrancisco",groupid=2i32 current=10.3f32,voltage=219i32,phase=0.31f32 1538548685000000000
|
||||||
meters,location="California.SanFrancisco",groupid=2i32 current=12.6f32,voltage=218i32,phase=0.33f32 1538548695000000000
|
meters,location="California.SanFrancisco",groupid=2i32 current=12.6f32,voltage=218i32,phase=0.33f32 1538548695000000000
|
||||||
|
|
|
@ -60,7 +60,7 @@ Click `Save & Test` to test, if successful, it will prompt: `TDengine Data sourc
|
||||||
|
|
||||||
For users using Grafana version 7.x or configuring with [Grafana Provisioning](https://grafana.com/docs/grafana/latest/administration/provisioning/), you can use the installation script on the Grafana server to automatically install the plugin and add the data source Provisioning configuration file.
|
For users using Grafana version 7.x or configuring with [Grafana Provisioning](https://grafana.com/docs/grafana/latest/administration/provisioning/), you can use the installation script on the Grafana server to automatically install the plugin and add the data source Provisioning configuration file.
|
||||||
|
|
||||||
```sh
|
```shell
|
||||||
bash -c "$(curl -fsSL \
|
bash -c "$(curl -fsSL \
|
||||||
https://raw.githubusercontent.com/taosdata/grafanaplugin/master/install.sh)" -- \
|
https://raw.githubusercontent.com/taosdata/grafanaplugin/master/install.sh)" -- \
|
||||||
-a http://localhost:6041 \
|
-a http://localhost:6041 \
|
||||||
|
@ -77,7 +77,7 @@ Save the script and execute `./install.sh --help` to view detailed help document
|
||||||
|
|
||||||
Use the [`grafana-cli` command line tool](https://grafana.com/docs/grafana/latest/administration/cli/) to install the plugin [installation](https://grafana.com/grafana/plugins/tdengine-datasource/?tab=installation).
|
Use the [`grafana-cli` command line tool](https://grafana.com/docs/grafana/latest/administration/cli/) to install the plugin [installation](https://grafana.com/grafana/plugins/tdengine-datasource/?tab=installation).
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
grafana-cli plugins install tdengine-datasource
|
grafana-cli plugins install tdengine-datasource
|
||||||
# with sudo
|
# with sudo
|
||||||
sudo -u grafana grafana-cli plugins install tdengine-datasource
|
sudo -u grafana grafana-cli plugins install tdengine-datasource
|
||||||
|
@ -85,7 +85,7 @@ sudo -u grafana grafana-cli plugins install tdengine-datasource
|
||||||
|
|
||||||
Alternatively, download the .zip file from [GitHub](https://github.com/taosdata/grafanaplugin/releases/tag/latest) or [Grafana](https://grafana.com/grafana/plugins/tdengine-datasource/?tab=installation) to your local machine and unzip it into the Grafana plugins directory. Example command line download is as follows:
|
Alternatively, download the .zip file from [GitHub](https://github.com/taosdata/grafanaplugin/releases/tag/latest) or [Grafana](https://grafana.com/grafana/plugins/tdengine-datasource/?tab=installation) to your local machine and unzip it into the Grafana plugins directory. Example command line download is as follows:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
GF_VERSION=3.5.1
|
GF_VERSION=3.5.1
|
||||||
# from GitHub
|
# from GitHub
|
||||||
wget https://github.com/taosdata/grafanaplugin/releases/download/v$GF_VERSION/tdengine-datasource-$GF_VERSION.zip
|
wget https://github.com/taosdata/grafanaplugin/releases/download/v$GF_VERSION/tdengine-datasource-$GF_VERSION.zip
|
||||||
|
@ -95,13 +95,13 @@ wget -O tdengine-datasource-$GF_VERSION.zip https://grafana.com/api/plugins/tden
|
||||||
|
|
||||||
For CentOS 7.2 operating system, unzip the plugin package into the /var/lib/grafana/plugins directory and restart Grafana.
|
For CentOS 7.2 operating system, unzip the plugin package into the /var/lib/grafana/plugins directory and restart Grafana.
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
sudo unzip tdengine-datasource-$GF_VERSION.zip -d /var/lib/grafana/plugins/
|
sudo unzip tdengine-datasource-$GF_VERSION.zip -d /var/lib/grafana/plugins/
|
||||||
```
|
```
|
||||||
|
|
||||||
If Grafana is running in a Docker environment, you can use the following environment variable to set up automatic installation of the TDengine data source plugin:
|
If Grafana is running in a Docker environment, you can use the following environment variable to set up automatic installation of the TDengine data source plugin:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
GF_INSTALL_PLUGINS=tdengine-datasource
|
GF_INSTALL_PLUGINS=tdengine-datasource
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ Click `Save & Test` to test, if successful, it will prompt: `TDengine Data sourc
|
||||||
|
|
||||||
Refer to [Grafana containerized installation instructions](https://grafana.com/docs/grafana/next/setup-grafana/installation/docker/#install-plugins-in-the-docker-container). Use the following command to start a container and automatically install the TDengine plugin:
|
Refer to [Grafana containerized installation instructions](https://grafana.com/docs/grafana/next/setup-grafana/installation/docker/#install-plugins-in-the-docker-container). Use the following command to start a container and automatically install the TDengine plugin:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
docker run -d \
|
docker run -d \
|
||||||
-p 3000:3000 \
|
-p 3000:3000 \
|
||||||
--name=grafana \
|
--name=grafana \
|
|
@ -31,7 +31,7 @@ The following parameter descriptions and examples use `<content>` as a placehold
|
||||||
|
|
||||||
In command line mode, taosX uses DSN to represent a data source (source or destination), a typical DSN is as follows:
|
In command line mode, taosX uses DSN to represent a data source (source or destination), a typical DSN is as follows:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
# url-like
|
# url-like
|
||||||
<driver>[+<protocol>]://[[<username>:<password>@]<host>:<port>][/<object>][?<p1>=<v1>[&<p2>=<v2>]]
|
<driver>[+<protocol>]://[[<username>:<password>@]<host>:<port>][/<object>][?<p1>=<v1>[&<p2>=<v2>]]
|
||||||
|------|------------|---|-----------|-----------|------|------|----------|-----------------------|
|
|------|------------|---|-----------|-----------|------|------|----------|-----------------------|
|
||||||
|
@ -390,7 +390,7 @@ You can view the log files or use the `journalctl` command to view the logs of `
|
||||||
|
|
||||||
The command to view logs under Linux using `journalctl` is as follows:
|
The command to view logs under Linux using `journalctl` is as follows:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
journalctl -u taosx [-f]
|
journalctl -u taosx [-f]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -572,7 +572,7 @@ uint32_t len: The binary length of this string (excluding `\0`).
|
||||||
|
|
||||||
**Return Value**:
|
**Return Value**:
|
||||||
|
|
||||||
``` c
|
```c
|
||||||
struct parser_resp_t {
|
struct parser_resp_t {
|
||||||
int e; // 0 if success.
|
int e; // 0 if success.
|
||||||
void* p; // Success if contains.
|
void* p; // Success if contains.
|
||||||
|
@ -589,7 +589,7 @@ When creation is successful, e = 0, p is the parser object.
|
||||||
|
|
||||||
Parse the input payload and return the result in JSON format [u8]. The returned JSON will be fully decoded using the default JSON parser (expanding the root array and all objects).
|
Parse the input payload and return the result in JSON format [u8]. The returned JSON will be fully decoded using the default JSON parser (expanding the root array and all objects).
|
||||||
|
|
||||||
``` c
|
```c
|
||||||
const char* parser_mutate(
|
const char* parser_mutate(
|
||||||
void* parser,
|
void* parser,
|
||||||
const uint8_t* in_ptr, uint32_t in_len,
|
const uint8_t* in_ptr, uint32_t in_len,
|
||||||
|
|
|
@ -26,7 +26,7 @@ The default configuration file for `Agent` is located at `/etc/taos/agent.toml`,
|
||||||
|
|
||||||
As shown below:
|
As shown below:
|
||||||
|
|
||||||
```TOML
|
```toml
|
||||||
# taosX service endpoint
|
# taosX service endpoint
|
||||||
#
|
#
|
||||||
#endpoint = "http://localhost:6055"
|
#endpoint = "http://localhost:6055"
|
||||||
|
@ -83,7 +83,7 @@ You don't need to be confused about how to set up the configuration file. Read a
|
||||||
|
|
||||||
On Linux systems, the `Agent` can be started with the Systemd command:
|
On Linux systems, the `Agent` can be started with the Systemd command:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
systemctl start taosx-agent
|
systemctl start taosx-agent
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -95,6 +95,6 @@ You can view the log files or use the `journalctl` command to view the logs of t
|
||||||
|
|
||||||
The command to view logs with `journalctl` on Linux is as follows:
|
The command to view logs with `journalctl` on Linux is as follows:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
journalctl -u taosx-agent [-f]
|
journalctl -u taosx-agent [-f]
|
||||||
```
|
```
|
||||||
|
|
|
@ -143,13 +143,13 @@ For details on TDengine monitoring configuration, please refer to: [TDengine Mon
|
||||||
|
|
||||||
After installation, please use the `systemctl` command to start the taoskeeper service process.
|
After installation, please use the `systemctl` command to start the taoskeeper service process.
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
systemctl start taoskeeper
|
systemctl start taoskeeper
|
||||||
```
|
```
|
||||||
|
|
||||||
Check if the service is working properly:
|
Check if the service is working properly:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
systemctl status taoskeeper
|
systemctl status taoskeeper
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -261,7 +261,7 @@ Query OK, 14 row(s) in set (0.006542s)
|
||||||
|
|
||||||
You can view the most recent report record of a supertable, such as:
|
You can view the most recent report record of a supertable, such as:
|
||||||
|
|
||||||
``` shell
|
```shell
|
||||||
taos> select last_row(*) from taosd_dnodes_info;
|
taos> select last_row(*) from taosd_dnodes_info;
|
||||||
last_row(_ts) | last_row(disk_engine) | last_row(system_net_in) | last_row(vnodes_num) | last_row(system_net_out) | last_row(uptime) | last_row(has_mnode) | last_row(io_read_disk) | last_row(error_log_count) | last_row(io_read) | last_row(cpu_cores) | last_row(has_qnode) | last_row(has_snode) | last_row(disk_total) | last_row(mem_engine) | last_row(info_log_count) | last_row(cpu_engine) | last_row(io_write_disk) | last_row(debug_log_count) | last_row(disk_used) | last_row(mem_total) | last_row(io_write) | last_row(masters) | last_row(cpu_system) | last_row(trace_log_count) | last_row(mem_free) |
|
last_row(_ts) | last_row(disk_engine) | last_row(system_net_in) | last_row(vnodes_num) | last_row(system_net_out) | last_row(uptime) | last_row(has_mnode) | last_row(io_read_disk) | last_row(error_log_count) | last_row(io_read) | last_row(cpu_cores) | last_row(has_qnode) | last_row(has_snode) | last_row(disk_total) | last_row(mem_engine) | last_row(info_log_count) | last_row(cpu_engine) | last_row(io_write_disk) | last_row(debug_log_count) | last_row(disk_used) | last_row(mem_total) | last_row(io_write) | last_row(masters) | last_row(cpu_system) | last_row(trace_log_count) | last_row(mem_free) |
|
||||||
======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
|
======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
|
||||||
|
|
|
@ -14,7 +14,7 @@ taosExplorer does not require separate installation. Starting from TDengine vers
|
||||||
|
|
||||||
Before starting taosExplorer, please make sure the content in the configuration file is correct.
|
Before starting taosExplorer, please make sure the content in the configuration file is correct.
|
||||||
|
|
||||||
```TOML
|
```toml
|
||||||
# This is an automatically generated configuration file for Explorer in [TOML](https://toml.io/) format.
|
# This is an automatically generated configuration file for Explorer in [TOML](https://toml.io/) format.
|
||||||
#
|
#
|
||||||
# Here is a full list of available options.
|
# Here is a full list of available options.
|
||||||
|
@ -148,7 +148,7 @@ Description:
|
||||||
|
|
||||||
Then start taosExplorer, you can directly execute taos-explorer in the command line or use the systemctl command:
|
Then start taosExplorer, you can directly execute taos-explorer in the command line or use the systemctl command:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
systemctl start taos-explorer # Linux
|
systemctl start taos-explorer # Linux
|
||||||
sc.exe start taos-explorer # Windows
|
sc.exe start taos-explorer # Windows
|
||||||
```
|
```
|
||||||
|
|
|
@ -248,13 +248,13 @@ The new version of the plugin uses the Grafana unified alerting feature, the `-E
|
||||||
|
|
||||||
Assuming you start the TDengine database on the host `tdengine` with HTTP API port `6041`, user `root1`, and password `pass5ord`. Execute the script:
|
Assuming you start the TDengine database on the host `tdengine` with HTTP API port `6041`, user `root1`, and password `pass5ord`. Execute the script:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
./TDinsight.sh -a http://tdengine:6041 -u root1 -p pass5ord
|
./TDinsight.sh -a http://tdengine:6041 -u root1 -p pass5ord
|
||||||
```
|
```
|
||||||
|
|
||||||
If you want to monitor multiple TDengine clusters, you need to set up multiple TDinsight dashboards. Setting up a non-default TDinsight requires some changes: the `-n` `-i` `-t` options need to be changed to non-default names, and if using the built-in SMS alert feature, `-N` and `-L` should also be changed.
|
If you want to monitor multiple TDengine clusters, you need to set up multiple TDinsight dashboards. Setting up a non-default TDinsight requires some changes: the `-n` `-i` `-t` options need to be changed to non-default names, and if using the built-in SMS alert feature, `-N` and `-L` should also be changed.
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
sudo ./TDengine.sh -n TDengine-Env1 -a http://another:6041 -u root -p taosdata -i tdinsight-env1 -t 'TDinsight Env1'
|
sudo ./TDengine.sh -n TDengine-Env1 -a http://another:6041 -u root -p taosdata -i tdinsight-env1 -t 'TDinsight Env1'
|
||||||
```
|
```
|
||||||
|
|
|
@ -10,7 +10,7 @@ The TDengine command line program (hereinafter referred to as TDengine CLI) is t
|
||||||
|
|
||||||
To enter the TDengine CLI, simply execute `taos` in the terminal.
|
To enter the TDengine CLI, simply execute `taos` in the terminal.
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
taos
|
taos
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ There are many other parameters:
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
taos -h h1.taos.com -s "use db; show tables;"
|
taos -h h1.taos.com -s "use db; show tables;"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ taosBenchmark supports comprehensive performance testing for TDengine, and the T
|
||||||
|
|
||||||
Execute the following command to quickly experience taosBenchmark performing a write performance test on TDengine based on the default configuration.
|
Execute the following command to quickly experience taosBenchmark performing a write performance test on TDengine based on the default configuration.
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
taosBenchmark
|
taosBenchmark
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ When running without parameters, taosBenchmark by default connects to the TDengi
|
||||||
|
|
||||||
When running taosBenchmark using command line parameters and controlling its behavior, the `-f <json file>` parameter cannot be used. All configuration parameters must be specified through the command line. Below is an example of using command line mode to test the write performance of taosBenchmark.
|
When running taosBenchmark using command line parameters and controlling its behavior, the `-f <json file>` parameter cannot be used. All configuration parameters must be specified through the command line. Below is an example of using command line mode to test the write performance of taosBenchmark.
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
taosBenchmark -I stmt -n 200 -t 100
|
taosBenchmark -I stmt -n 200 -t 100
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ The taosBenchmark installation package includes examples of configuration files,
|
||||||
|
|
||||||
Use the following command line to run taosBenchmark and control its behavior through a configuration file.
|
Use the following command line to run taosBenchmark and control its behavior through a configuration file.
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
taosBenchmark -f <json file>
|
taosBenchmark -f <json file>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -170,7 +170,7 @@ ALTER TABLE [db_name.]tb_name alter_table_clause
|
||||||
|
|
||||||
alter_table_clause: {
|
alter_table_clause: {
|
||||||
alter_table_options
|
alter_table_options
|
||||||
| SET tag tag_name = new_tag_value,tag_name2=new_tag2_value...
|
| SET tag tag_name = new_tag_value, tag_name2=new_tag2_value ...
|
||||||
}
|
}
|
||||||
|
|
||||||
alter_table_options:
|
alter_table_options:
|
||||||
|
@ -194,7 +194,7 @@ alter_table_option: {
|
||||||
### Modify Subtable Tag Value
|
### Modify Subtable Tag Value
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
ALTER TABLE tb_name SET TAG tag_name1=new_tag_value1,tag_name2=new_tag_value2...;
|
ALTER TABLE tb_name SET TAG tag_name1=new_tag_value1, tag_name2=new_tag_value2 ...;
|
||||||
```
|
```
|
||||||
|
|
||||||
### Modify Table Lifespan
|
### Modify Table Lifespan
|
||||||
|
|
|
@ -210,19 +210,19 @@ However, renaming individual columns is not supported for `first(*)`, `last(*)`,
|
||||||
|
|
||||||
Retrieve all subtable names and related tag information from a supertable:
|
Retrieve all subtable names and related tag information from a supertable:
|
||||||
|
|
||||||
```mysql
|
```sql
|
||||||
SELECT TAGS TBNAME, location FROM meters;
|
SELECT TAGS TBNAME, location FROM meters;
|
||||||
```
|
```
|
||||||
|
|
||||||
It is recommended that users query the subtable tag information of supertables using the INS_TAGS system table under INFORMATION_SCHEMA, for example, to get all subtable names and tag values of the supertable meters:
|
It is recommended that users query the subtable tag information of supertables using the INS_TAGS system table under INFORMATION_SCHEMA, for example, to get all subtable names and tag values of the supertable meters:
|
||||||
|
|
||||||
```mysql
|
```sql
|
||||||
SELECT table_name, tag_name, tag_type, tag_value FROM information_schema.ins_tags WHERE stable_name='meters';
|
SELECT table_name, tag_name, tag_type, tag_value FROM information_schema.ins_tags WHERE stable_name='meters';
|
||||||
```
|
```
|
||||||
|
|
||||||
Count the number of subtables under a supertable:
|
Count the number of subtables under a supertable:
|
||||||
|
|
||||||
```mysql
|
```sql
|
||||||
SELECT COUNT(*) FROM (SELECT DISTINCT TBNAME FROM meters);
|
SELECT COUNT(*) FROM (SELECT DISTINCT TBNAME FROM meters);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -385,7 +385,7 @@ SELECT CURRENT_USER();
|
||||||
|
|
||||||
### Syntax
|
### Syntax
|
||||||
|
|
||||||
```txt
|
```text
|
||||||
WHERE (column|tbname) match/MATCH/nmatch/NMATCH _regex_
|
WHERE (column|tbname) match/MATCH/nmatch/NMATCH _regex_
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -403,7 +403,7 @@ The length of the regular match string cannot exceed 128 bytes. You can set and
|
||||||
|
|
||||||
### Syntax
|
### Syntax
|
||||||
|
|
||||||
```txt
|
```text
|
||||||
CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END
|
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
|
CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END
|
||||||
```
|
```
|
||||||
|
@ -493,7 +493,7 @@ SELECT ... FROM (SELECT ... FROM ...) ...;
|
||||||
|
|
||||||
## UNION ALL Clause
|
## UNION ALL Clause
|
||||||
|
|
||||||
```txt title=Syntax
|
```text title=Syntax
|
||||||
SELECT ...
|
SELECT ...
|
||||||
UNION ALL SELECT ...
|
UNION ALL SELECT ...
|
||||||
[UNION ALL SELECT ...]
|
[UNION ALL SELECT ...]
|
||||||
|
|
|
@ -417,7 +417,7 @@ MOD(expr1, expr2)
|
||||||
|
|
||||||
**Example**:
|
**Example**:
|
||||||
|
|
||||||
``` sql
|
```sql
|
||||||
taos> select mod(10,3);
|
taos> select mod(10,3);
|
||||||
mod(10,3) |
|
mod(10,3) |
|
||||||
============================
|
============================
|
||||||
|
@ -454,7 +454,7 @@ RAND([seed])
|
||||||
|
|
||||||
**Example**:
|
**Example**:
|
||||||
|
|
||||||
``` sql
|
```sql
|
||||||
taos> select rand();
|
taos> select rand();
|
||||||
rand() |
|
rand() |
|
||||||
============================
|
============================
|
||||||
|
|
|
@ -13,16 +13,16 @@ CREATE USER user_name PASS 'password' [SYSINFO {1|0}] [CREATEDB {1|0}];
|
||||||
|
|
||||||
The username can be up to 23 bytes long.
|
The username can be up to 23 bytes long.
|
||||||
|
|
||||||
The password can be up to 31 bytes long. The password can include letters, numbers, and special characters except for single quotes, double quotes, backticks, backslashes, and spaces, and it cannot be an empty string.
|
The password must be between 8 and 16 characters long and include at least three types of characters from the following: uppercase letters, lowercase letters, numbers, and special characters. Special characters include `! @ # $ % ^ & * ( ) - _ + = [ ] { } : ; > < ? | ~ , .`.
|
||||||
|
|
||||||
`SYSINFO` indicates whether the user can view system information. `1` means they can view, `0` means they have no permission to view. System information includes service configuration, dnode, vnode, storage, etc. The default value is `1`.
|
`SYSINFO` indicates whether the user can view system information. `1` means they can view, `0` means they have no permission to view. System information includes service configuration, dnode, vnode, storage, etc. The default value is `1`.
|
||||||
|
|
||||||
`CREATEDB` indicates whether the user can create databases. `1` means they can create databases, `0` means they have no permission to create databases. The default value is `0`. // Supported starting from TDengine Enterprise version 3.3.2.0
|
`CREATEDB` indicates whether the user can create databases. `1` means they can create databases, `0` means they have no permission to create databases. The default value is `0`. // Supported starting from TDengine Enterprise version 3.3.2.0
|
||||||
|
|
||||||
In the example below, we create a user with the password `123456` who can view system information.
|
In the example below, we create a user with the password `abc123!@#` who can view system information.
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
taos> create user test pass '123456' sysinfo 1;
|
taos> create user test pass 'abc123!@#' sysinfo 1;
|
||||||
Query OK, 0 of 0 rows affected (0.001254s)
|
Query OK, 0 of 0 rows affected (0.001254s)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -29,13 +29,13 @@ In this document, it specifically refers to the internal levels of the second-le
|
||||||
- Default compression algorithms list and applicable range for each data type
|
- Default compression algorithms list and applicable range for each data type
|
||||||
|
|
||||||
| Data Type |Available Encoding Algorithms | Default Encoding Algorithm | Available Compression Algorithms | Default Compression Algorithm | Default Compression Level |
|
| Data Type |Available Encoding Algorithms | Default Encoding Algorithm | Available Compression Algorithms | Default Compression Algorithm | Default Compression Level |
|
||||||
|:------------------------------------:|:----------------:|:-----------:|:--------------------:|:----:|:------:|
|
|:------------------------------------:|:-------------------------:|:-----------:|:--------------------:|:----:|:------:|
|
||||||
| int/uint | simple8b | simple8b | lz4/zlib/zstd/xz | lz4 | medium |
|
| int/uint | disabled/simple8b | simple8b | lz4/zlib/zstd/xz | lz4 | medium |
|
||||||
| tinyint/untinyint/smallint/usmallint | simple8b | simple8b | lz4/zlib/zstd/xz | zlib | medium |
|
| tinyint/untinyint/smallint/usmallint | disabled/simple8b | simple8b | lz4/zlib/zstd/xz | zlib | medium |
|
||||||
| bigint/ubigint/timestamp | simple8b/delta-i | delta-i | lz4/zlib/zstd/xz | lz4 | medium |
|
| bigint/ubigint/timestamp | disabled/simple8b/delta-i | delta-i | lz4/zlib/zstd/xz | lz4 | medium |
|
||||||
| float/double | delta-d | delta-d | lz4/zlib/zstd/xz/tsz | lz4 | medium |
|
| float/double | disabled/delta-d | delta-d | lz4/zlib/zstd/xz/tsz | lz4 | medium |
|
||||||
| binary/nchar | disabled | disabled | lz4/zlib/zstd/xz | zstd | medium |
|
| binary/nchar | disabled | disabled | lz4/zlib/zstd/xz | zstd | medium |
|
||||||
| bool | bit-packing | bit-packing | lz4/zlib/zstd/xz | zstd | medium |
|
| bool | disabled/bit-packing | bit-packing | lz4/zlib/zstd/xz | zstd | medium |
|
||||||
|
|
||||||
## SQL Syntax
|
## SQL Syntax
|
||||||
|
|
||||||
|
|
|
@ -108,7 +108,7 @@ For the source code of the example programs, please refer to: [Example Programs]
|
||||||
|
|
||||||
The Data Source Name has a generic format, similar to [PEAR DB](http://pear.php.net/manual/en/package.database.db.intro-dsn.php), but without the type prefix (brackets indicate optional):
|
The Data Source Name has a generic format, similar to [PEAR DB](http://pear.php.net/manual/en/package.database.db.intro-dsn.php), but without the type prefix (brackets indicate optional):
|
||||||
|
|
||||||
``` text
|
```text
|
||||||
[username[:password]@][protocol[(address)]]/[dbname][?param1=value1&...¶mN=valueN]
|
[username[:password]@][protocol[(address)]]/[dbname][?param1=value1&...¶mN=valueN]
|
||||||
```
|
```
|
||||||
|
|
|
@ -21,7 +21,7 @@ Below is an example using the `curl` tool in an Ubuntu environment (please confi
|
||||||
|
|
||||||
The following example lists all databases, please replace `h1.tdengine.com` and 6041 (default value) with the actual running TDengine service FQDN and port number:
|
The following example lists all databases, please replace `h1.tdengine.com` and 6041 (default value) with the actual running TDengine service FQDN and port number:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
curl -L -H "Authorization: Basic cm9vdDp0YW9zZGF0YQ==" \
|
curl -L -H "Authorization: Basic cm9vdDp0YW9zZGF0YQ==" \
|
||||||
-d "select name, ntables, status from information_schema.ins_databases;" \
|
-d "select name, ntables, status from information_schema.ins_databases;" \
|
||||||
h1.tdengine.com:6041/rest/sql
|
h1.tdengine.com:6041/rest/sql
|
||||||
|
@ -100,13 +100,13 @@ The BODY of the HTTP request contains a complete SQL statement. The data table i
|
||||||
|
|
||||||
Use `curl` to initiate an HTTP Request with custom authentication as follows:
|
Use `curl` to initiate an HTTP Request with custom authentication as follows:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
curl -L -H "Authorization: Basic <TOKEN>" -d "<SQL>" <ip>:<PORT>/rest/sql/[db_name][?tz=timezone[&req_id=req_id][&row_with_meta=true]]
|
curl -L -H "Authorization: Basic <TOKEN>" -d "<SQL>" <ip>:<PORT>/rest/sql/[db_name][?tz=timezone[&req_id=req_id][&row_with_meta=true]]
|
||||||
```
|
```
|
||||||
|
|
||||||
Or,
|
Or,
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
curl -L -u username:password -d "<SQL>" <ip>:<PORT>/rest/sql/[db_name][?tz=timezone[&req_id=req_id][&row_with_meta=true]]
|
curl -L -u username:password -d "<SQL>" <ip>:<PORT>/rest/sql/[db_name][?tz=timezone[&req_id=req_id][&row_with_meta=true]]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -279,7 +279,7 @@ Column types use the following strings:
|
||||||
|
|
||||||
Prepare data
|
Prepare data
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
create database demo
|
create database demo
|
||||||
use demo
|
use demo
|
||||||
create table t(ts timestamp,c1 varbinary(20),c2 geometry(100))
|
create table t(ts timestamp,c1 varbinary(20),c2 geometry(100))
|
||||||
|
@ -288,7 +288,7 @@ insert into t values(now,'\x7f8290','point(100 100)')
|
||||||
|
|
||||||
Execute query
|
Execute query
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
curl --location 'http://<fqdn>:<port>/rest/sql' \
|
curl --location 'http://<fqdn>:<port>/rest/sql' \
|
||||||
--header 'Content-Type: text/plain' \
|
--header 'Content-Type: text/plain' \
|
||||||
--header 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' \
|
--header 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' \
|
||||||
|
@ -428,7 +428,7 @@ Data Query Return Example
|
||||||
|
|
||||||
HTTP requests need to include an authorization code `<TOKEN>`, used for identity verification. The authorization code is usually provided by the administrator and can be simply obtained by sending an `HTTP GET` request as follows:
|
HTTP requests need to include an authorization code `<TOKEN>`, used for identity verification. The authorization code is usually provided by the administrator and can be simply obtained by sending an `HTTP GET` request as follows:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
curl http://<fqnd>:<port>/rest/login/<username>/<password>
|
curl http://<fqnd>:<port>/rest/login/<username>/<password>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -440,7 +440,7 @@ Here, `fqdn` is the FQDN or IP address of the TDengine database, `port` is the p
|
||||||
|
|
||||||
Example of obtaining an authorization code:
|
Example of obtaining an authorization code:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
curl http://192.168.0.1:6041/rest/login/root/taosdata
|
curl http://192.168.0.1:6041/rest/login/root/taosdata
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -457,7 +457,7 @@ Return value:
|
||||||
|
|
||||||
- Query all records of table d1001 in the demo database:
|
- Query all records of table d1001 in the demo database:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
curl -L -H "Authorization: Basic cm9vdDp0YW9zZGF0YQ==" -d "select * from demo.d1001" 192.168.0.1:6041/rest/sql
|
curl -L -H "Authorization: Basic cm9vdDp0YW9zZGF0YQ==" -d "select * from demo.d1001" 192.168.0.1:6041/rest/sql
|
||||||
curl -L -H "Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04" -d "select * from demo.d1001" 192.168.0.1:6041/rest/sql
|
curl -L -H "Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04" -d "select * from demo.d1001" 192.168.0.1:6041/rest/sql
|
||||||
```
|
```
|
||||||
|
@ -509,7 +509,7 @@ Return value:
|
||||||
|
|
||||||
- Create database demo:
|
- Create database demo:
|
||||||
|
|
||||||
```bash
|
```shell
|
||||||
curl -L -H "Authorization: Basic cm9vdDp0YW9zZGF0YQ==" -d "create database demo" 192.168.0.1:6041/rest/sql
|
curl -L -H "Authorization: Basic cm9vdDp0YW9zZGF0YQ==" -d "create database demo" 192.168.0.1:6041/rest/sql
|
||||||
curl -L -H "Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04" -d "create database demo" 192.168.0.1:6041/rest/sql
|
curl -L -H "Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04" -d "create database demo" 192.168.0.1:6041/rest/sql
|
||||||
```
|
```
|
||||||
|
@ -560,7 +560,7 @@ Return value:
|
||||||
|
|
||||||
#### TDengine 2.x response codes and message bodies
|
#### TDengine 2.x response codes and message bodies
|
||||||
|
|
||||||
```JSON
|
```json
|
||||||
{
|
{
|
||||||
"status": "succ",
|
"status": "succ",
|
||||||
"head": [
|
"head": [
|
||||||
|
@ -624,7 +624,7 @@ Return value:
|
||||||
|
|
||||||
#### TDengine 3.0 Response Codes and Message Body
|
#### TDengine 3.0 Response Codes and Message Body
|
||||||
|
|
||||||
```JSON
|
```json
|
||||||
{
|
{
|
||||||
"code": 0,
|
"code": 0,
|
||||||
"column_meta": [
|
"column_meta": [
|
|
@ -129,7 +129,7 @@ This document details the server error codes that may be encountered when using
|
||||||
| 0x80000350 | User already exists | Create user, duplicate creation | Confirm if the operation is correct |
|
| 0x80000350 | User already exists | Create user, duplicate creation | Confirm if the operation is correct |
|
||||||
| 0x80000351 | Invalid user | User does not exist | Confirm if the operation is correct |
|
| 0x80000351 | Invalid user | User does not exist | Confirm if the operation is correct |
|
||||||
| 0x80000352 | Invalid user format | Incorrect format | Confirm if the operation is correct |
|
| 0x80000352 | Invalid user format | Incorrect format | Confirm if the operation is correct |
|
||||||
| 0x80000353 | Invalid password format | Incorrect format | Confirm if the operation is correct |
|
| 0x80000353 | Invalid password format | The password must be between 8 and 16 characters long and include at least three types of characters from the following: uppercase letters, lowercase letters, numbers, and special characters. | Confirm the format of the password string |
|
||||||
| 0x80000354 | Can not get user from conn | Internal error | Report issue |
|
| 0x80000354 | Can not get user from conn | Internal error | Report issue |
|
||||||
| 0x80000355 | Too many users | (Enterprise only) Exceeding user limit | Adjust configuration |
|
| 0x80000355 | Too many users | (Enterprise only) Exceeding user limit | Adjust configuration |
|
||||||
| 0x80000357 | Authentication failure | Incorrect password | Confirm if the operation is correct |
|
| 0x80000357 | Authentication failure | Incorrect password | Confirm if the operation is correct |
|
||||||
|
@ -251,6 +251,7 @@ This document details the server error codes that may be encountered when using
|
||||||
| 0x80000529 | Vnode is stopped | Vnode is closed | Report issue |
|
| 0x80000529 | Vnode is stopped | Vnode is closed | Report issue |
|
||||||
| 0x80000530 | Duplicate write request | Duplicate write request, internal error | Report issue |
|
| 0x80000530 | Duplicate write request | Duplicate write request, internal error | Report issue |
|
||||||
| 0x80000531 | Vnode query is busy | Query is busy | Report issue |
|
| 0x80000531 | Vnode query is busy | Query is busy | Report issue |
|
||||||
|
| 0x80000540 | Vnode already exist but Dbid not match | Internal error | Report issue |
|
||||||
|
|
||||||
## tsdb
|
## tsdb
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,7 @@ Batch insertion. Each insert statement can insert multiple records into one tabl
|
||||||
|
|
||||||
When inserting nchar type data containing Chinese characters on Windows, first ensure that the system's regional settings are set to China (this can be set in the Control Panel). At this point, the `taos` client in cmd should already be working properly; if developing a Java application in an IDE, such as Eclipse or IntelliJ, ensure that the file encoding in the IDE is set to GBK (which is the default encoding type for Java), then initialize the client configuration when creating the Connection, as follows:
|
When inserting nchar type data containing Chinese characters on Windows, first ensure that the system's regional settings are set to China (this can be set in the Control Panel). At this point, the `taos` client in cmd should already be working properly; if developing a Java application in an IDE, such as Eclipse or IntelliJ, ensure that the file encoding in the IDE is set to GBK (which is the default encoding type for Java), then initialize the client configuration when creating the Connection, as follows:
|
||||||
|
|
||||||
```JAVA
|
```java
|
||||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||||
Properties properties = new Properties();
|
Properties properties = new Properties();
|
||||||
properties.setProperty(TSDBDriver.LOCALE_KEY, "UTF-8");
|
properties.setProperty(TSDBDriver.LOCALE_KEY, "UTF-8");
|
||||||
|
@ -145,7 +145,7 @@ Version 3.0 of TDengine includes a standalone component developed in Go called `
|
||||||
|
|
||||||
The Go language version requirement is 1.14 or higher. If there are Go compilation errors, often due to issues accessing Go mod in China, they can be resolved by setting Go environment variables:
|
The Go language version requirement is 1.14 or higher. If there are Go compilation errors, often due to issues accessing Go mod in China, they can be resolved by setting Go environment variables:
|
||||||
|
|
||||||
```sh
|
```shell
|
||||||
go env -w GO111MODULE=on
|
go env -w GO111MODULE=on
|
||||||
go env -w GOPROXY=https://goproxy.cn,direct
|
go env -w GOPROXY=https://goproxy.cn,direct
|
||||||
```
|
```
|
||||||
|
@ -196,7 +196,7 @@ Here are the solutions:
|
||||||
|
|
||||||
1. Create a file /Library/LaunchDaemons/limit.maxfiles.plist, write the following content (the example changes limit and maxfiles to 100,000, modify as needed):
|
1. Create a file /Library/LaunchDaemons/limit.maxfiles.plist, write the following content (the example changes limit and maxfiles to 100,000, modify as needed):
|
||||||
|
|
||||||
```plist
|
```xml
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
||||||
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
|
|
@ -68,19 +68,19 @@ dataDir /mnt/data6 2 0
|
||||||
|
|
||||||
在配置文件 /etc/taos/taos.cfg 中,添加用于 S3 访问的参数:
|
在配置文件 /etc/taos/taos.cfg 中,添加用于 S3 访问的参数:
|
||||||
|
|
||||||
|参数名称 | 参数含义 |
|
| 参数名称 | 参数含义 |
|
||||||
|:-------------|:-----------------------------------------------|
|
|:---------------------|:-----------------------------------------------|
|
||||||
|s3EndPoint | 用户所在地域的 COS 服务域名,支持 http 和 https,bucket 的区域需要与 endpoint 的保持一致,否则无法访问。 |
|
| s3EndPoint | 用户所在地域的 COS 服务域名,支持 http 和 https,bucket 的区域需要与 endpoint 的保持一致,否则无法访问。 |
|
||||||
|s3AccessKey |冒号分隔的用户 SecretId:SecretKey。例如:AKIDsQmwsfKxTo2A6nGVXZN0UlofKn6JRRSJ:lIdoy99ygEacU7iHfogaN2Xq0yumSm1E |
|
| s3AccessKey | 冒号分隔的用户 SecretId:SecretKey。例如:AKIDsQmwsfKxTo2A6nGVXZN0UlofKn6JRRSJ:lIdoy99ygEacU7iHfogaN2Xq0yumSm1E |
|
||||||
|s3BucketName | 存储桶名称,减号后面是用户注册 COS 服务的 AppId。其中 AppId 是 COS 特有,AWS 和阿里云都没有,配置时需要作为 bucket name 的一部分,使用减号分隔。参数值均为字符串类型,但不需要引号。例如:test0711-1309024725 |
|
| s3BucketName | 存储桶名称,减号后面是用户注册 COS 服务的 AppId。其中 AppId 是 COS 特有,AWS 和阿里云都没有,配置时需要作为 bucket name 的一部分,使用减号分隔。参数值均为字符串类型,但不需要引号。例如:test0711-1309024725 |
|
||||||
|s3UploadDelaySec | data 文件持续多长时间不再变动后上传至 s3,单位:秒。最小值:1;最大值:2592000 (30天),默认值 60 秒 |
|
| s3UploadDelaySec | data 文件持续多长时间不再变动后上传至 s3,单位:秒。最小值:1;最大值:2592000(30天),默认值 60 秒 |
|
||||||
|s3PageCacheSize |s3 page cache 缓存页数目,单位:页。最小值:4;最大值:1024*1024\*1024。 ,默认值 4096|
|
| s3PageCacheSize | S3 page cache 缓存页数目,单位:页。最小值:4;最大值:1024*1024*1024。 ,默认值 4096|
|
||||||
|s3MigrateIntervalSec | 本地数据文件自动上传 S3 的触发周期,单位为秒。最小值:600;最大值:100000。默认值 3600 |
|
| s3MigrateIntervalSec | 本地数据文件自动上传 S3 的触发周期,单位为秒。最小值:600;最大值:100000。默认值 3600 |
|
||||||
|s3MigrateEnabled | 是否自动进行 S3 迁移,默认值为 0,表示关闭自动 S3 迁移,可配置为 1。 |
|
| s3MigrateEnabled | 是否自动进行 S3 迁移,默认值为 0,表示关闭自动 S3 迁移,可配置为 1。 |
|
||||||
|
|
||||||
### 检查配置参数可用性
|
### 检查配置参数可用性
|
||||||
|
|
||||||
在 taos.cfg 中完成对 s3 的配置后,通过 taosd 命令的 checks3 参数可以检查所配置的 S3 服务是否可用:
|
在 taos.cfg 中完成对 S3 的配置后,通过 taosd 命令的 checks3 参数可以检查所配置的 S3 服务是否可用:
|
||||||
|
|
||||||
```
|
```
|
||||||
taosd --checks3
|
taosd --checks3
|
||||||
|
@ -106,11 +106,11 @@ s3migrate database <db_name>;
|
||||||
|
|
||||||
详细的 DB 参数见下表:
|
详细的 DB 参数见下表:
|
||||||
|
|
||||||
| # | 参数 | 默认值 | 最小值 | 最大值 | 描述 |
|
| # | 参数 | 默认值 | 最小值 | 最大值 | 描述 |
|
||||||
| :--- | :----------- | :----- | :----- | :------ | :----------------------------------------------------------- |
|
|:--|:--------------|:-------|:------ |:------- | :----------------------------------------------------------- |
|
||||||
| 1 | s3_keeplocal | 365 | 1 | 365000 | 数据在本地保留的天数,即 data 文件在本地磁盘保留多长时间后可以上传到 S3。默认单位:天,支持 m(分钟)、h(小时)和 d(天)三个单位 |
|
| 1 | s3_keeplocal | 365 | 1 | 365000 | 数据在本地保留的天数,即 data 文件在本地磁盘保留多长时间后可以上传到 S3。默认单位:天,支持 m(分钟)、h(小时)和 d(天)三个单位 |
|
||||||
| 2 | s3_chunkpages | 131072 | 131072 | 1048576 | 上传对象的大小阈值,与 tsdb_pagesize 参数一样,不可修改,单位为 TSDB 页 |
|
| 2 | s3_chunkpages | 131072 | 131072 | 1048576 | 上传对象的大小阈值,与 tsdb_pagesize 参数一样,不可修改,单位为 TSDB 页 |
|
||||||
| 3 | s3_compact | 1 | 0 | 1 | TSDB 文件组首次上传 S3 时,是否自动进行 compact 操作。 |
|
| 3 | s3_compact | 1 | 0 | 1 | TSDB 文件组首次上传 S3 时,是否自动进行 compact 操作 |
|
||||||
|
|
||||||
### 对象存储读写次数估算
|
### 对象存储读写次数估算
|
||||||
|
|
||||||
|
@ -168,10 +168,10 @@ s3BucketName td-test
|
||||||
|
|
||||||
用户界面同 S3,不同的地方在于下面三个参数的配置:
|
用户界面同 S3,不同的地方在于下面三个参数的配置:
|
||||||
|
|
||||||
| # | 参数 | 示例值 | 描述 |
|
| # | 参数 | 示例值 | 描述 |
|
||||||
| :--- | :----------- | :--------------------------------------- | :----------------------------------------------------------- |
|
|:--|:-------------|:-----------------------------------------|:----------------------------------|
|
||||||
| 1 | s3EndPoint | https://fd2d01c73.blob.core.windows.net | Blob URL |
|
| 1 | s3EndPoint | https://fd2d01c73.blob.core.windows.net | Blob URL |
|
||||||
| 2 | s3AccessKey | fd2d01c73:veUy/iRBeWaI2YAerl+AStw6PPqg== | 冒号分隔的用户 accountId:accountKey |
|
| 2 | s3AccessKey | fd2d01c73:veUy/iRBeWaI2YAerl+AStw6PPqg== | 冒号分隔的用户 accountId:accountKey |
|
||||||
| 3 | s3BucketName | test-container | Container name |
|
| 3 | s3BucketName | test-container | Container name |
|
||||||
|
|
||||||
其中 fd2d01c73 是账户 ID;微软 Blob 存储服务只支持 Https 协议,不支持 Http。
|
其中 fd2d01c73 是账户 ID;微软 Blob 存储服务只支持 Https 协议,不支持 Http。
|
||||||
|
|
|
@ -16,15 +16,15 @@ create user user_name pass'password' [sysinfo {1|0}] [createdb {1|0}]
|
||||||
```
|
```
|
||||||
|
|
||||||
相关参数说明如下。
|
相关参数说明如下。
|
||||||
- user_name:最长为 23 B。
|
- user_name:用户名最长不超过 23 个字节。
|
||||||
- password:最长为 128 B,合法字符包括字母和数字以及单双引号、撇号、反斜杠和空格以外的特殊字符,且不可以为空。
|
- password:密码长度必须为 8 到 16 位,并且至少包含大写字母、小写字母、数字、特殊字符中的三类。特殊字符包括 `! @ # $ % ^ & * ( ) - _ + = [ ] { } : ; > < ? | ~ , .`。
|
||||||
- sysinfo :用户是否可以查看系统信息。1 表示可以查看,0 表示不可以查看。系统信息包括服务端配置信息、服务端各种节点信息,如 dnode、查询节点(qnode)等,以及与存储相关的信息等。默认为可以查看系统信息。
|
- sysinfo :用户是否可以查看系统信息。1 表示可以查看,0 表示不可以查看。系统信息包括服务端配置信息、服务端各种节点信息,如 dnode、查询节点(qnode)等,以及与存储相关的信息等。默认为可以查看系统信息。
|
||||||
- createdb:用户是否可以创建数据库。1 表示可以创建,0 表示不可以创建。缺省值为 0。// 从 TDengine 企业版 3.3.2.0 开始支持
|
- createdb:用户是否可以创建数据库。1 表示可以创建,0 表示不可以创建。缺省值为 0。// 从 TDengine 企业版 3.3.2.0 开始支持
|
||||||
|
|
||||||
如下 SQL 可以创建密码为 123456 且可以查看系统信息的用户 test。
|
如下 SQL 可以创建密码为 abc123!@# 且可以查看系统信息的用户 test。
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
create user test pass '123456' sysinfo 1
|
create user test pass 'abc123!@#' sysinfo 1
|
||||||
```
|
```
|
||||||
|
|
||||||
### 查看用户
|
### 查看用户
|
||||||
|
|
|
@ -54,7 +54,7 @@ taos> SET MAX_BINARY_DISPLAY_WIDTH <nn>;
|
||||||
- -h HOST: 要连接的 TDengine 服务端所在服务器的 FQDN, 默认为连接本地服务
|
- -h HOST: 要连接的 TDengine 服务端所在服务器的 FQDN, 默认为连接本地服务
|
||||||
- -P PORT: 指定服务端所用端口号
|
- -P PORT: 指定服务端所用端口号
|
||||||
- -u USER: 连接时使用的用户名
|
- -u USER: 连接时使用的用户名
|
||||||
- -p PASSWORD: 连接服务端时使用的密码
|
- -p PASSWORD: 连接服务端时使用的密码,特殊字符如 `! & ( ) < > ; |` 需使用字符 `\` 进行转义处理
|
||||||
- -?, --help: 打印出所有命令行参数
|
- -?, --help: 打印出所有命令行参数
|
||||||
|
|
||||||
还有更多其他参数:
|
还有更多其他参数:
|
||||||
|
|
|
@ -64,7 +64,8 @@ database_option: {
|
||||||
- DURATION:数据文件存储数据的时间跨度。可以使用加单位的表示形式,如 DURATION 100h、DURATION 10d 等,支持 m(分钟)、h(小时)和 d(天)三个单位。不加时间单位时默认单位为天,如 DURATION 50 表示 50 天。
|
- DURATION:数据文件存储数据的时间跨度。可以使用加单位的表示形式,如 DURATION 100h、DURATION 10d 等,支持 m(分钟)、h(小时)和 d(天)三个单位。不加时间单位时默认单位为天,如 DURATION 50 表示 50 天。
|
||||||
- MAXROWS:文件块中记录的最大条数,默认为 4096 条。
|
- MAXROWS:文件块中记录的最大条数,默认为 4096 条。
|
||||||
- MINROWS:文件块中记录的最小条数,默认为 100 条。
|
- MINROWS:文件块中记录的最小条数,默认为 100 条。
|
||||||
- KEEP:表示数据文件保存的天数,缺省值为 3650,取值范围 [1, 365000],且必须大于或等于 3 倍的 DURATION 参数值。数据库会自动删除保存时间超过 KEEP 值的数据从而释放存储空间。KEEP 可以使用加单位的表示形式,如 KEEP 100h、KEEP 10d 等,支持 m(分钟)、h(小时)和 d(天)三个单位。也可以不写单位,如 KEEP 50,此时默认单位为天。企业版支持[多级存储](https://docs.taosdata.com/tdinternal/arch/#%E5%A4%9A%E7%BA%A7%E5%AD%98%E5%82%A8)功能, 因此, 可以设置多个保存时间(多个以英文逗号分隔,最多 3 个,满足 keep 0 \<= keep 1 \<= keep 2,如 KEEP 100h,100d,3650d); 社区版不支持多级存储功能(即使配置了多个保存时间, 也不会生效, KEEP 会取最大的保存时间)。了解更多,请点击 [关于主键时间戳](https://docs.taosdata.com/reference/taos-sql/insert/)
|
- KEEP:表示数据文件保存的天数,缺省值为 3650,取值范围 [1, 365000],且必须大于或等于 3 倍的 DURATION 参数值。数据库会自动删除保存时间超过 KEEP 值的数据从而释放存储空间。KEEP 可以使用加单位的表示形式,如 KEEP 100h、KEEP 10d 等,支持 m(分钟)、h(小时)和 d(天)三个单位。也可以不写单位,如 KEEP 50,此时默认单位为天。企业版支持[多级存储](../../operation/planning/#%E5%A4%9A%E7%BA%A7%E5%AD%98%E5%82%A8)功能, 因此, 可以设置多个保存时间(多个以英文逗号分隔,最多 3 个,满足 keep 0 \<= keep 1 \<= keep 2,如 KEEP 100h,100d,3650d); 社区版不支持多级存储功能(即使配置了多个保存时间, 也不会生效, KEEP 会取最大的保存时间)。了解更多,请点击 [关于主键时间戳](https://docs.taosdata.com/reference/taos-sql/insert/)
|
||||||
|
|
||||||
- KEEP_TIME_OFFSET:自 3.2.0.0 版本生效。删除或迁移保存时间超过 KEEP 值的数据的延迟执行时间,默认值为 0 (小时)。在数据文件保存时间超过 KEEP 后,删除或迁移操作不会立即执行,而会额外等待本参数指定的时间间隔,以实现与业务高峰期错开的目的。
|
- KEEP_TIME_OFFSET:自 3.2.0.0 版本生效。删除或迁移保存时间超过 KEEP 值的数据的延迟执行时间,默认值为 0 (小时)。在数据文件保存时间超过 KEEP 后,删除或迁移操作不会立即执行,而会额外等待本参数指定的时间间隔,以实现与业务高峰期错开的目的。
|
||||||
- STT_TRIGGER:表示落盘文件触发文件合并的个数。开源版本固定为 1,企业版本可设置范围为 1 到 16。对于少表高频写入场景,此参数建议使用默认配置;而对于多表低频写入场景,此参数建议配置较大的值。
|
- STT_TRIGGER:表示落盘文件触发文件合并的个数。开源版本固定为 1,企业版本可设置范围为 1 到 16。对于少表高频写入场景,此参数建议使用默认配置;而对于多表低频写入场景,此参数建议配置较大的值。
|
||||||
- SINGLE_STABLE:表示此数据库中是否只可以创建一个超级表,用于超级表列非常多的情况。
|
- SINGLE_STABLE:表示此数据库中是否只可以创建一个超级表,用于超级表列非常多的情况。
|
||||||
|
|
|
@ -171,7 +171,7 @@ ALTER TABLE [db_name.]tb_name alter_table_clause
|
||||||
|
|
||||||
alter_table_clause: {
|
alter_table_clause: {
|
||||||
alter_table_options
|
alter_table_options
|
||||||
| SET TAG tag_name = new_tag_value,tag_name2=new_tag2_value...
|
| SET TAG tag_name = new_tag_value, tag_name2=new_tag2_value ...
|
||||||
}
|
}
|
||||||
|
|
||||||
alter_table_options:
|
alter_table_options:
|
||||||
|
@ -195,7 +195,7 @@ alter_table_option: {
|
||||||
### 修改子表标签值
|
### 修改子表标签值
|
||||||
|
|
||||||
```
|
```
|
||||||
ALTER TABLE tb_name SET TAG tag_name1=new_tag_value1,tag_name2=new_tag_value2...;
|
ALTER TABLE tb_name SET TAG tag_name1=new_tag_value1, tag_name2=new_tag_value2 ...;
|
||||||
```
|
```
|
||||||
|
|
||||||
### 修改表生命周期
|
### 修改表生命周期
|
||||||
|
|
|
@ -6,7 +6,7 @@ title: "删除数据"
|
||||||
|
|
||||||
删除数据是 TDengine 提供的根据指定时间段删除指定表或超级表中数据记录的功能,方便用户清理由于设备故障等原因产生的异常数据。
|
删除数据是 TDengine 提供的根据指定时间段删除指定表或超级表中数据记录的功能,方便用户清理由于设备故障等原因产生的异常数据。
|
||||||
|
|
||||||
**注意**:删除数据并不会立即释放该表所占用的磁盘空间,而是把该表的数据标记为已删除,在查询时这些数据将不会再出现,但释放磁盘空间会延迟到系统自动或用户手动进行数据重整时。
|
**注意**:删除数据并不会立即释放该表所占用的磁盘空间,而是把该表的数据标记为已删除,在查询时这些数据将不会再出现,但释放磁盘空间会延迟到系统自动清理(建库参数 keep 生效)或用户手动进行数据重整时(企业版功能 compact)。
|
||||||
|
|
||||||
**语法:**
|
**语法:**
|
||||||
|
|
||||||
|
|
|
@ -1817,7 +1817,7 @@ ignore_null_values: {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:返回指定时间截面指定列的记录值或插值。ignore_null_values 参数的值可以是 0 或 1,为 1 时表示忽略 NULL 值, 缺省值为0。
|
**功能说明**:返回指定时间截面指定列的记录值或插值。ignore_null_values 参数的值可以是 0 或 1,为 1 时表示忽略 NULL 值, 缺省值为 0。
|
||||||
|
|
||||||
**返回数据类型**:同字段类型。
|
**返回数据类型**:同字段类型。
|
||||||
|
|
||||||
|
@ -1838,9 +1838,9 @@ ignore_null_values: {
|
||||||
- INTERP 可以与伪列 _irowts 一起使用,返回插值点所对应的时间戳(3.0.2.0 版本以后支持)。
|
- INTERP 可以与伪列 _irowts 一起使用,返回插值点所对应的时间戳(3.0.2.0 版本以后支持)。
|
||||||
- INTERP 可以与伪列 _isfilled 一起使用,显示返回结果是否为原始记录或插值算法产生的数据(3.0.3.0 版本以后支持)。
|
- INTERP 可以与伪列 _isfilled 一起使用,显示返回结果是否为原始记录或插值算法产生的数据(3.0.3.0 版本以后支持)。
|
||||||
- INTERP 对于带复合主键的表的查询,若存在相同时间戳的数据,则只有对应的复合主键最小的数据参与运算。
|
- INTERP 对于带复合主键的表的查询,若存在相同时间戳的数据,则只有对应的复合主键最小的数据参与运算。
|
||||||
- INTERP 查询支持NEAR FILL模式, 即当需要FILL时, 使用距离当前时间点最近的数据进行插值, 当前后时间戳与当前时间断面一样近时, FILL 前一行的值. 此模式在流计算中和窗口查询中不支持。例如: SELECT INTERP(col) FROM tb RANGE('2023-01-01 00:00:00', '2023-01-01 00:10:00') FILL(NEAR)。(3.3.4.9版本及以后支持)。
|
- INTERP 查询支持 NEAR FILL 模式, 即当需要 FILL 时, 使用距离当前时间点最近的数据进行插值, 当前后时间戳与当前时间断面一样近时, FILL 前一行的值. 此模式在流计算中和窗口查询中不支持。例如: SELECT INTERP(col) FROM tb RANGE('2023-01-01 00:00:00', '2023-01-01 00:10:00') FILL(NEAR)(3.3.4.9 版本及以后支持)。
|
||||||
- INTERP 只有在使用FILL PREV/NEXT/NEAR 模式时才可以使用伪列 `_irowts_origin`。`_irowts_origin`在3.3.4.9版本及以后支持。
|
- INTERP 只有在使用 FILL PREV/NEXT/NEAR 模式时才可以使用伪列 `_irowts_origin`。`_irowts_origin`在 3.3.4.9 版本及以后支持。
|
||||||
- INTERP `RANEG`子句支持时间范围的扩展(3.3.4.9版本及以后支持), 如`RANGE('2023-01-01 00:00:00', 10s)`表示在时间点'2023-01-01 00:00:00'查找前后10s的数据进行插值, FILL PREV/NEXT/NEAR分别表示从时间点向前/向后/前后查找数据, 若时间点周围没有数据, 则使用FILL指定的值进行插值, 因此此时FILL子句必须指定值。例如: SELECT INTERP(col) FROM tb RANGE('2023-01-01 00:00:00', 10s) FILL(PREV, 1). 目前仅支持时间点和时间范围的组合, 不支持时间区间和时间范围的组合, 即不支持RANGE('2023-01-01 00:00:00', '2023-02-01 00:00:00', 1h)。所指定的时间范围规则与EVERY类似, 单位不能是年或月, 值不能为0, 不能带引号。使用该扩展时, 不支持除FILL PREV/NEXT/NEAR外的其他FILL模式, 且不能指定EVERY子句。
|
- INTERP `RANGE`子句支持时间范围的扩展(3.3.4.9 版本及以后支持), 如`RANGE('2023-01-01 00:00:00', 10s)`表示在时间点 '2023-01-01 00:00:00' 查找前后 10s 的数据进行插值, FILL PREV/NEXT/NEAR 分别表示从时间点向前/向后/前后查找数据, 若时间点周围没有数据, 则使用 FILL 指定的值进行插值, 因此此时 FILL 子句必须指定值。例如: SELECT INTERP(col) FROM tb RANGE('2023-01-01 00:00:00', 10s) FILL(PREV, 1)。目前仅支持时间点和时间范围的组合, 不支持时间区间和时间范围的组合, 即不支持 RANGE('2023-01-01 00:00:00', '2023-02-01 00:00:00', 1h)。所指定的时间范围规则与 EVERY 类似, 单位不能是年或月, 值不能为 0, 不能带引号。使用该扩展时, 不支持除FILL PREV/NEXT/NEAR外的其他 FILL 模式, 且不能指定 EVERY 子句。
|
||||||
|
|
||||||
### LAST
|
### LAST
|
||||||
|
|
||||||
|
|
|
@ -14,16 +14,16 @@ CREATE USER user_name PASS 'password' [SYSINFO {1|0}] [CREATEDB {1|0}];
|
||||||
|
|
||||||
用户名最长不超过 23 个字节。
|
用户名最长不超过 23 个字节。
|
||||||
|
|
||||||
密码最长不超过 31 个字节。密码可以包含字母、数字以及除单引号、双引号、反引号、反斜杠和空格以外的特殊字符,密码不能为空字符串。
|
密码长度必须为 8 到 16 位,并且至少包含大写字母、小写字母、数字、特殊字符中的三类。特殊字符包括 `! @ # $ % ^ & * ( ) - _ + = [ ] { } : ; > < ? | ~ , .`。
|
||||||
|
|
||||||
`SYSINFO` 表示该用户是否能够查看系统信息。`1` 表示可以查看,`0` 表示无权查看。系统信息包括服务配置、dnode、vnode、存储等信息。缺省值为 `1`。
|
`SYSINFO` 表示该用户是否能够查看系统信息。`1` 表示可以查看,`0` 表示无权查看。系统信息包括服务配置、dnode、vnode、存储等信息。缺省值为 `1`。
|
||||||
|
|
||||||
`CREATEDB` 表示该用户是否能够创建数据库。`1` 表示可以创建,`0` 表示无权创建。缺省值为 `0`。// 从 TDengine 企业版 3.3.2.0 开始支持
|
`CREATEDB` 表示该用户是否能够创建数据库。`1` 表示可以创建,`0` 表示无权创建。缺省值为 `0`。// 从 TDengine 企业版 3.3.2.0 开始支持
|
||||||
|
|
||||||
在下面的示例中,我们创建一个密码为 `123456` 且可以查看系统信息的用户。
|
在下面的示例中,我们创建一个密码为 `abc123!@#` 且可以查看系统信息的用户。
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
taos> create user test pass '123456' sysinfo 1;
|
taos> create user test pass 'abc123!@#' sysinfo 1;
|
||||||
Query OK, 0 of 0 rows affected (0.001254s)
|
Query OK, 0 of 0 rows affected (0.001254s)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -30,13 +30,13 @@ description: 可配置压缩算法
|
||||||
- 各个数据类型的默认压缩算法列表和适用范围
|
- 各个数据类型的默认压缩算法列表和适用范围
|
||||||
|
|
||||||
| 数据类型 | 可选编码算法 | 编码算法默认值 | 可选压缩算法 | 压缩算法默认值 |压缩等级默认值|
|
| 数据类型 | 可选编码算法 | 编码算法默认值 | 可选压缩算法 | 压缩算法默认值 |压缩等级默认值|
|
||||||
|:------------------------------------:|:----------------:|:-----------:|:--------------------:|:----:|:------:|
|
|:------------------------------------:|:-------------------------:|:-----------:|:--------------------:|:----:|:------:|
|
||||||
| int/uint | simple8b | simple8b | lz4/zlib/zstd/xz | lz4 | medium |
|
| int/uint | disabled/simple8b | simple8b | lz4/zlib/zstd/xz | lz4 | medium |
|
||||||
| tinyint/untinyint/smallint/usmallint | simple8b | simple8b | lz4/zlib/zstd/xz | zlib | medium |
|
| tinyint/untinyint/smallint/usmallint | disabled/simple8b | simple8b | lz4/zlib/zstd/xz | zlib | medium |
|
||||||
| bigint/ubigint/timestamp | simple8b/delta-i | delta-i | lz4/zlib/zstd/xz | lz4 | medium |
|
| bigint/ubigint/timestamp | disabled/simple8b/delta-i | delta-i | lz4/zlib/zstd/xz | lz4 | medium |
|
||||||
| float/double | delta-d | delta-d | lz4/zlib/zstd/xz/tsz | lz4 | medium |
|
| float/double | disabled/delta-d | delta-d | lz4/zlib/zstd/xz/tsz | lz4 | medium |
|
||||||
| binary/nchar | disabled | disabled | lz4/zlib/zstd/xz | zstd | medium |
|
| binary/nchar | disabled | disabled | lz4/zlib/zstd/xz | zstd | medium |
|
||||||
| bool | bit-packing | bit-packing | lz4/zlib/zstd/xz | zstd | medium |
|
| bool | disabled/bit-packing | bit-packing | lz4/zlib/zstd/xz | zstd | medium |
|
||||||
|
|
||||||
|
|
||||||
## SQL 语法
|
## SQL 语法
|
||||||
|
|
|
@ -172,7 +172,7 @@ WKB规范请参考[Well-Known Binary (WKB)](https://libgeos.org/specifications/w
|
||||||
|
|
||||||
**原因**:程序没有找到依赖的本地函数库 taos。
|
**原因**:程序没有找到依赖的本地函数库 taos。
|
||||||
|
|
||||||
**解决方法**:Windows 下可以将 C:\TDengine\driver\taos.dll 拷贝到 C:\Windows\System32\ 目录下,Linux 下将建立如下软链 `ln -s /usr/local/taos/driver/libtaos.so.x.x.x.x /usr/lib/libtaos.so` 即可,macOS 下需要建立软链 `ln -s /usr/local/lib/libtaos.dylib`。
|
**解决方法**:Windows 下可以将 C:\TDengine\driver\taos.dll 拷贝到 C:\Windows\System32\ 目录下,Linux 下将建立如下软链 `ln -s /usr/local/taos/driver/libtaos.so.x.x.x.x /usr/lib/libtaos.so` 即可,macOS 下需要建立软链 `ln -s /usr/local/lib/libtaos.dylib /usr/lib/libtaos.dylib`。
|
||||||
|
|
||||||
3. java.lang.UnsatisfiedLinkError: taos.dll Can't load AMD 64 bit on a IA 32-bit platform
|
3. java.lang.UnsatisfiedLinkError: taos.dll Can't load AMD 64 bit on a IA 32-bit platform
|
||||||
|
|
||||||
|
|
|
@ -136,7 +136,7 @@ description: TDengine 服务端的错误码列表和详细说明
|
||||||
| 0x80000350 | User already exists | Create user, 重复创建 | 确认操作是否正确 |
|
| 0x80000350 | User already exists | Create user, 重复创建 | 确认操作是否正确 |
|
||||||
| 0x80000351 | Invalid user | 用户不存在 | 确认操作是否正确 |
|
| 0x80000351 | Invalid user | 用户不存在 | 确认操作是否正确 |
|
||||||
| 0x80000352 | Invalid user format | 格式不正确 | 确认操作是否正确 |
|
| 0x80000352 | Invalid user format | 格式不正确 | 确认操作是否正确 |
|
||||||
| 0x80000353 | Invalid password format | 格式不正确 | 确认操作是否正确 |
|
| 0x80000353 | Invalid password format | 密码长度必须为 8 到 16 位,并且至少包含大写字母、小写字母、数字、特殊字符中的三类 | 确认密码字符串的格式 |
|
||||||
| 0x80000354 | Can not get user from conn | 内部错误 | 上报issue |
|
| 0x80000354 | Can not get user from conn | 内部错误 | 上报issue |
|
||||||
| 0x80000355 | Too many users | (仅企业版)用户数量超限 | 调整配置 |
|
| 0x80000355 | Too many users | (仅企业版)用户数量超限 | 调整配置 |
|
||||||
| 0x80000357 | Authentication failure | 密码不正确 | 确认操作是否正确 |
|
| 0x80000357 | Authentication failure | 密码不正确 | 确认操作是否正确 |
|
||||||
|
@ -261,6 +261,7 @@ description: TDengine 服务端的错误码列表和详细说明
|
||||||
| 0x80000529 | Vnode is stopped | Vnode 已经关闭 | 上报问题 |
|
| 0x80000529 | Vnode is stopped | Vnode 已经关闭 | 上报问题 |
|
||||||
| 0x80000530 | Duplicate write request | 重复写入请求,内部错误 | 上报问题 |
|
| 0x80000530 | Duplicate write request | 重复写入请求,内部错误 | 上报问题 |
|
||||||
| 0x80000531 | Vnode query is busy | 查询忙碌 | 上报问题 |
|
| 0x80000531 | Vnode query is busy | 查询忙碌 | 上报问题 |
|
||||||
|
| 0x80000540 | Vnode already exist but Dbid not match | 内部错误 | 上报问题 |
|
||||||
|
|
||||||
|
|
||||||
## tsdb
|
## tsdb
|
||||||
|
|
|
@ -280,4 +280,12 @@ TDinsight插件中展示的数据是通过taosKeeper和taosAdapter服务收集
|
||||||
https://docs.taosdata.com/reference/components/taosd/#%E7%9B%91%E6%8E%A7%E7%9B%B8%E5%85%B3
|
https://docs.taosdata.com/reference/components/taosd/#%E7%9B%91%E6%8E%A7%E7%9B%B8%E5%85%B3
|
||||||
您可以随时关闭该参数,只需要在taos.cfg 中修改telemetryReporting为 0,然后重启数据库服务即可。
|
您可以随时关闭该参数,只需要在taos.cfg 中修改telemetryReporting为 0,然后重启数据库服务即可。
|
||||||
代码位于:https://github.com/taosdata/TDengine/blob/62e609c558deb764a37d1a01ba84bc35115a85a4/source/dnode/mnode/impl/src/mndTelem.c
|
代码位于:https://github.com/taosdata/TDengine/blob/62e609c558deb764a37d1a01ba84bc35115a85a4/source/dnode/mnode/impl/src/mndTelem.c
|
||||||
此外,对于安全性要求极高的企业版 TDengine Enterprise 来说,此参数不会工作。
|
此外,对于安全性要求极高的企业版 TDengine Enterprise 来说,此参数不会工作。
|
||||||
|
### 31 第一次连接集群时遇到“Sync leader is unreachable”怎么办?
|
||||||
|
报这个错,说明第一次向集群的连接是成功的,但第一次访问的IP不是mnode的leader节点,客户端试图与leader建立连接时发生错误。客户端通过EP,也就是指定的fqdn与端口号寻找leader节点,常见的报错原因有两个:
|
||||||
|
|
||||||
|
- 集群中其他节点的端口没有打开
|
||||||
|
- 客户端的hosts未正确配置
|
||||||
|
|
||||||
|
因此用户首先要检查服务端,集群的所有端口(原生连接默认6030,http连接默认6041)有无打开;其次是客户端的hosts文件中是否配置了集群所有节点的fqdn与IP信息。
|
||||||
|
如仍无法解决,则需要联系涛思技术人员支持。
|
||||||
|
|
|
@ -25,7 +25,7 @@ typedef int32_t TdUcs4;
|
||||||
#if !defined(DISALLOW_NCHAR_WITHOUT_ICONV)// && defined(DARWIN)
|
#if !defined(DISALLOW_NCHAR_WITHOUT_ICONV)// && defined(DARWIN)
|
||||||
#include "iconv.h"
|
#include "iconv.h"
|
||||||
#else
|
#else
|
||||||
typedef void *iconv_t;
|
typedef void *iconv_t;
|
||||||
#endif
|
#endif
|
||||||
typedef enum { M2C = 0, C2M, CM_NUM } ConvType;
|
typedef enum { M2C = 0, C2M, CM_NUM } ConvType;
|
||||||
|
|
||||||
|
@ -67,29 +67,34 @@ typedef struct {
|
||||||
#ifdef strndup
|
#ifdef strndup
|
||||||
#undef strndup
|
#undef strndup
|
||||||
#endif
|
#endif
|
||||||
#define strndup STR_TO_F_FUNC_TAOS_FORBID
|
#define strndup STR_TO_F_FUNC_TAOS_FORBID
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define tstrncpy(dst, src, size) \
|
#define tstrncpy(dst, src, size) \
|
||||||
do { \
|
do { \
|
||||||
(void)strncpy((dst), (src), (size)); \
|
(void)strncpy((dst), (src), (size)); \
|
||||||
(dst)[(size) - 1] = 0; \
|
(dst)[(size)-1] = 0; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
int64_t tsnprintf(char *dst, int64_t size, const char *format, ...);
|
int64_t tsnprintf(char *dst, int64_t size, const char *format, ...);
|
||||||
#define TAOS_STRCPY(_dst, _src) ((void)strcpy(_dst, _src))
|
#define TAOS_STRCPY(_dst, _src) ((void)strcpy(_dst, _src))
|
||||||
#define TAOS_STRNCPY(_dst, _src, _size) ((void)strncpy(_dst, _src, _size))
|
#define TAOS_STRNCPY(_dst, _src, _size) ((void)strncpy(_dst, _src, _size))
|
||||||
#define TAOS_STRCAT(_dst, _src) ((void)strcat(_dst, _src))
|
#define TAOS_STRCAT(_dst, _src) ((void)strcat(_dst, _src))
|
||||||
#define TAOS_STRNCAT(_dst, _src, len) ((void)strncat(_dst, _src, len))
|
#define TAOS_STRNCAT(_dst, _src, len) ((void)strncat(_dst, _src, len))
|
||||||
|
|
||||||
char *tstrdup(const char *src);
|
char *tstrdup(const char *src);
|
||||||
int32_t taosUcs4len(TdUcs4 *ucs4);
|
int32_t taosUcs4len(TdUcs4 *ucs4);
|
||||||
int32_t taosStr2int64(const char *str, int64_t *val);
|
int32_t taosStr2int64(const char *str, int64_t *val);
|
||||||
int32_t taosStr2int16(const char *str, int16_t *val);
|
|
||||||
int32_t taosStr2int32(const char *str, int32_t *val);
|
int32_t taosStr2int32(const char *str, int32_t *val);
|
||||||
|
int32_t taosStr2int16(const char *str, int16_t *val);
|
||||||
int32_t taosStr2int8(const char *str, int8_t *val);
|
int32_t taosStr2int8(const char *str, int8_t *val);
|
||||||
|
|
||||||
|
int32_t taosStr2Uint64(const char *str, uint64_t *val);
|
||||||
|
int32_t taosStr2Uint32(const char *str, uint32_t *val);
|
||||||
|
int32_t taosStr2Uint16(const char *str, uint16_t *val);
|
||||||
|
int32_t taosStr2Uint8(const char *str, uint8_t *val);
|
||||||
|
|
||||||
iconv_t taosAcquireConv(int32_t *idx, ConvType type, void* charsetCxt);
|
iconv_t taosAcquireConv(int32_t *idx, ConvType type, void* charsetCxt);
|
||||||
void taosReleaseConv(int32_t idx, iconv_t conv, ConvType type, void* charsetCxt);
|
void taosReleaseConv(int32_t idx, iconv_t conv, ConvType type, void* charsetCxt);
|
||||||
int32_t taosUcs4ToMbs(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs, void* charsetCxt);
|
int32_t taosUcs4ToMbs(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs, void* charsetCxt);
|
||||||
|
@ -122,9 +127,9 @@ float taosStr2Float(const char *str, char **pEnd);
|
||||||
int32_t taosHex2Ascii(const char *z, uint32_t n, void **data, uint32_t *size);
|
int32_t taosHex2Ascii(const char *z, uint32_t n, void **data, uint32_t *size);
|
||||||
int32_t taosAscii2Hex(const char *z, uint32_t n, void **data, uint32_t *size);
|
int32_t taosAscii2Hex(const char *z, uint32_t n, void **data, uint32_t *size);
|
||||||
char *taosStrndup(const char *s, int n);
|
char *taosStrndup(const char *s, int n);
|
||||||
//int32_t taosBin2Ascii(const char *z, uint32_t n, void** data, uint32_t* size);
|
// int32_t taosBin2Ascii(const char *z, uint32_t n, void** data, uint32_t* size);
|
||||||
bool isHex(const char* z, uint32_t n);
|
bool isHex(const char *z, uint32_t n);
|
||||||
bool isValidateHex(const char* z, uint32_t n);
|
bool isValidateHex(const char *z, uint32_t n);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -565,6 +565,7 @@ int32_t taosGetErrSize();
|
||||||
#define TSDB_CODE_VND_ARB_NOT_SYNCED TAOS_DEF_ERROR_CODE(0, 0x0537) // internal
|
#define TSDB_CODE_VND_ARB_NOT_SYNCED TAOS_DEF_ERROR_CODE(0, 0x0537) // internal
|
||||||
#define TSDB_CODE_VND_WRITE_DISABLED TAOS_DEF_ERROR_CODE(0, 0x0538) // internal
|
#define TSDB_CODE_VND_WRITE_DISABLED TAOS_DEF_ERROR_CODE(0, 0x0538) // internal
|
||||||
#define TSDB_CODE_VND_TTL_FLUSH_INCOMPLETION TAOS_DEF_ERROR_CODE(0, 0x0539) // internal
|
#define TSDB_CODE_VND_TTL_FLUSH_INCOMPLETION TAOS_DEF_ERROR_CODE(0, 0x0539) // internal
|
||||||
|
#define TSDB_CODE_VND_ALREADY_EXIST_BUT_NOT_MATCH TAOS_DEF_ERROR_CODE(0, 0x0540)
|
||||||
|
|
||||||
// tsdb
|
// tsdb
|
||||||
#define TSDB_CODE_TDB_INVALID_TABLE_ID TAOS_DEF_ERROR_CODE(0, 0x0600)
|
#define TSDB_CODE_TDB_INVALID_TABLE_ID TAOS_DEF_ERROR_CODE(0, 0x0600)
|
||||||
|
|
|
@ -318,6 +318,8 @@ typedef enum ELogicConditionType {
|
||||||
#define TSDB_MAX_JSON_KEY_LEN 256
|
#define TSDB_MAX_JSON_KEY_LEN 256
|
||||||
|
|
||||||
#define TSDB_AUTH_LEN 16
|
#define TSDB_AUTH_LEN 16
|
||||||
|
#define TSDB_PASSWORD_MIN_LEN 8
|
||||||
|
#define TSDB_PASSWORD_MAX_LEN 16
|
||||||
#define TSDB_PASSWORD_LEN 32
|
#define TSDB_PASSWORD_LEN 32
|
||||||
#define TSDB_USET_PASSWORD_LEN 129
|
#define TSDB_USET_PASSWORD_LEN 129
|
||||||
#define TSDB_VERSION_LEN 32
|
#define TSDB_VERSION_LEN 32
|
||||||
|
|
|
@ -227,6 +227,11 @@ static FORCE_INLINE int32_t taosGetTbHashVal(const char *tbname, int32_t tblen,
|
||||||
|
|
||||||
#define TAOS_UNUSED(expr) (void)(expr)
|
#define TAOS_UNUSED(expr) (void)(expr)
|
||||||
|
|
||||||
|
bool taosIsBigChar(char c);
|
||||||
|
bool taosIsSmallChar(char c);
|
||||||
|
bool taosIsNumberChar(char c);
|
||||||
|
bool taosIsSpecialChar(char c);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -300,7 +300,13 @@ void* doConsumeData(void* param) {
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
testing::InitGoogleTest(&argc, argv);
|
testing::InitGoogleTest(&argc, argv);
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
numOfThreads = atoi(argv[1]);
|
//numOfThreads = atoi(argv[1]);
|
||||||
|
int32_t code = taosStr2int32(argv[1], &numOfThreads);
|
||||||
|
if (code != 0) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
numOfThreads = TMAX(numOfThreads, 1);
|
numOfThreads = TMAX(numOfThreads, 1);
|
||||||
|
|
|
@ -299,8 +299,8 @@ TEST(connectionCase, setConnectionOption_Test) {
|
||||||
taosMsleep(2 * HEARTBEAT_INTERVAL);
|
taosMsleep(2 * HEARTBEAT_INTERVAL);
|
||||||
|
|
||||||
//test user APP and user IP
|
//test user APP and user IP
|
||||||
check_sql_result(pConn, "select user_app from performance_schema.perf_connections", "aaaaaaaaaaaaaaaaaaaaaab");
|
check_sql_result_integer(pConn, "select count(*) from performance_schema.perf_connections where user_app = 'aaaaaaaaaaaaaaaaaaaaaab'", 1);
|
||||||
check_sql_result(pConn, "select user_ip from performance_schema.perf_connections", "192.168.0.2");
|
check_sql_result_integer(pConn, "select count(*) from performance_schema.perf_connections where user_ip = '192.168.0.2'", 1);
|
||||||
|
|
||||||
code = taos_options_connection(pConn, TSDB_OPTION_CONNECTION_USER_IP, "192.168.1.2");
|
code = taos_options_connection(pConn, TSDB_OPTION_CONNECTION_USER_IP, "192.168.1.2");
|
||||||
ASSERT(code == 0);
|
ASSERT(code == 0);
|
||||||
|
@ -313,9 +313,8 @@ TEST(connectionCase, setConnectionOption_Test) {
|
||||||
|
|
||||||
taosMsleep(2 * HEARTBEAT_INTERVAL);
|
taosMsleep(2 * HEARTBEAT_INTERVAL);
|
||||||
|
|
||||||
check_sql_result(pConn, "select user_app from performance_schema.perf_connections", "user");
|
check_sql_result_integer(pConn, "select count(*) from performance_schema.perf_connections where user_app = 'user'", 1);
|
||||||
check_sql_result(pConn, "select user_ip from performance_schema.perf_connections", "192.168.1.2");
|
check_sql_result_integer(pConn, "select count(*) from performance_schema.perf_connections where user_ip = '192.168.1.2'", 1);
|
||||||
|
|
||||||
|
|
||||||
// test clear
|
// test clear
|
||||||
code = taos_options_connection(pConn, TSDB_OPTION_CONNECTION_CLEAR, "192.168.0.2");
|
code = taos_options_connection(pConn, TSDB_OPTION_CONNECTION_CLEAR, "192.168.0.2");
|
||||||
|
@ -944,3 +943,4 @@ TEST(timezoneCase, localtime_performance_Test) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
|
|
|
@ -261,7 +261,7 @@ static void responseCompleteCallback(S3Status status, const S3ErrorDetails *erro
|
||||||
for (int i = 0; i < error->extraDetailsCount; i++) {
|
for (int i = 0; i < error->extraDetailsCount; i++) {
|
||||||
if (elen - len > 0) {
|
if (elen - len > 0) {
|
||||||
len += tsnprintf(&(cbd->err_msg[len]), elen - len, " %s: %s\n", error->extraDetails[i].name,
|
len += tsnprintf(&(cbd->err_msg[len]), elen - len, " %s: %s\n", error->extraDetails[i].name,
|
||||||
error->extraDetails[i].value);
|
error->extraDetails[i].value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -742,9 +742,9 @@ upload:
|
||||||
TAOS_CHECK_GOTO(TAOS_SYSTEM_ERROR(EIO), &lino, _exit);
|
TAOS_CHECK_GOTO(TAOS_SYSTEM_ERROR(EIO), &lino, _exit);
|
||||||
}
|
}
|
||||||
n = tsnprintf(buf, sizeof(buf),
|
n = tsnprintf(buf, sizeof(buf),
|
||||||
"<Part><PartNumber>%d</PartNumber>"
|
"<Part><PartNumber>%d</PartNumber>"
|
||||||
"<ETag>%s</ETag></Part>",
|
"<ETag>%s</ETag></Part>",
|
||||||
i + 1, manager.etags[i]);
|
i + 1, manager.etags[i]);
|
||||||
size += growbuffer_append(&(manager.gb), buf, n);
|
size += growbuffer_append(&(manager.gb), buf, n);
|
||||||
}
|
}
|
||||||
size += growbuffer_append(&(manager.gb), "</CompleteMultipartUpload>", strlen("</CompleteMultipartUpload>"));
|
size += growbuffer_append(&(manager.gb), "</CompleteMultipartUpload>", strlen("</CompleteMultipartUpload>"));
|
||||||
|
@ -908,10 +908,10 @@ upload:
|
||||||
int n;
|
int n;
|
||||||
for (int i = 0; i < cp.part_num; ++i) {
|
for (int i = 0; i < cp.part_num; ++i) {
|
||||||
n = tsnprintf(buf, sizeof(buf),
|
n = tsnprintf(buf, sizeof(buf),
|
||||||
"<Part><PartNumber>%d</PartNumber>"
|
"<Part><PartNumber>%d</PartNumber>"
|
||||||
"<ETag>%s</ETag></Part>",
|
"<ETag>%s</ETag></Part>",
|
||||||
// i + 1, manager.etags[i]);
|
// i + 1, manager.etags[i]);
|
||||||
cp.parts[i].index + 1, cp.parts[i].etag);
|
cp.parts[i].index + 1, cp.parts[i].etag);
|
||||||
size += growbuffer_append(&(manager.gb), buf, n);
|
size += growbuffer_append(&(manager.gb), buf, n);
|
||||||
}
|
}
|
||||||
size += growbuffer_append(&(manager.gb), "</CompleteMultipartUpload>", strlen("</CompleteMultipartUpload>"));
|
size += growbuffer_append(&(manager.gb), "</CompleteMultipartUpload>", strlen("</CompleteMultipartUpload>"));
|
||||||
|
@ -1916,7 +1916,8 @@ void s3EvictCache(const char *path, long object_size) {
|
||||||
}
|
}
|
||||||
|
|
||||||
long s3Size(const char *object_name) {
|
long s3Size(const char *object_name) {
|
||||||
long size = 0;
|
int32_t code = 0;
|
||||||
|
long size = 0;
|
||||||
|
|
||||||
cos_pool_t *p = NULL;
|
cos_pool_t *p = NULL;
|
||||||
int is_cname = 0;
|
int is_cname = 0;
|
||||||
|
@ -1941,7 +1942,10 @@ long s3Size(const char *object_name) {
|
||||||
if (cos_status_is_ok(s)) {
|
if (cos_status_is_ok(s)) {
|
||||||
char *content_length_str = (char *)apr_table_get(resp_headers, COS_CONTENT_LENGTH);
|
char *content_length_str = (char *)apr_table_get(resp_headers, COS_CONTENT_LENGTH);
|
||||||
if (content_length_str != NULL) {
|
if (content_length_str != NULL) {
|
||||||
size = atol(content_length_str);
|
code = taosStr2Int64(content_length_str, &size);
|
||||||
|
if (code != 0) {
|
||||||
|
cos_warn_log("parse content length failed since %s\n", tstrerror(code));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cos_warn_log("head object succeeded: %ld\n", size);
|
cos_warn_log("head object succeeded: %ld\n", size);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -267,7 +267,7 @@ bool checkColumnEncode(char encode[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
||||||
}
|
}
|
||||||
bool checkColumnEncodeOrSetDefault(uint8_t type, char encode[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
bool checkColumnEncodeOrSetDefault(uint8_t type, char encode[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
||||||
if (0 == strlen(encode)) {
|
if (0 == strlen(encode)) {
|
||||||
strncpy(encode, getDefaultEncodeStr(type), TSDB_CL_COMPRESS_OPTION_LEN);
|
tstrncpy(encode, getDefaultEncodeStr(type), TSDB_CL_COMPRESS_OPTION_LEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return checkColumnEncode(encode) && validColEncode(type, columnEncodeVal(encode));
|
return checkColumnEncode(encode) && validColEncode(type, columnEncodeVal(encode));
|
||||||
|
@ -284,7 +284,7 @@ bool checkColumnCompress(char compress[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
||||||
}
|
}
|
||||||
bool checkColumnCompressOrSetDefault(uint8_t type, char compress[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
bool checkColumnCompressOrSetDefault(uint8_t type, char compress[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
||||||
if (0 == strlen(compress)) {
|
if (0 == strlen(compress)) {
|
||||||
strncpy(compress, getDefaultCompressStr(type), TSDB_CL_COMPRESS_OPTION_LEN);
|
tstrncpy(compress, getDefaultCompressStr(type), TSDB_CL_COMPRESS_OPTION_LEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -306,7 +306,7 @@ bool checkColumnLevel(char level[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
||||||
}
|
}
|
||||||
bool checkColumnLevelOrSetDefault(uint8_t type, char level[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
bool checkColumnLevelOrSetDefault(uint8_t type, char level[TSDB_CL_COMPRESS_OPTION_LEN]) {
|
||||||
if (0 == strlen(level)) {
|
if (0 == strlen(level)) {
|
||||||
strncpy(level, getDefaultLevelStr(type), TSDB_CL_COMPRESS_OPTION_LEN);
|
tstrncpy(level, getDefaultLevelStr(type), TSDB_CL_COMPRESS_OPTION_LEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return checkColumnLevel(level) && validColCompressLevel(type, columnLevelVal(level));
|
return checkColumnLevel(level) && validColCompressLevel(type, columnLevelVal(level));
|
||||||
|
@ -330,7 +330,7 @@ void setColLevel(uint32_t* compress, uint8_t level) {
|
||||||
|
|
||||||
int32_t setColCompressByOption(uint8_t type, uint8_t encode, uint16_t compressType, uint8_t level, bool check,
|
int32_t setColCompressByOption(uint8_t type, uint8_t encode, uint16_t compressType, uint8_t level, bool check,
|
||||||
uint32_t* compress) {
|
uint32_t* compress) {
|
||||||
if(compress == NULL) return TSDB_CODE_TSC_ENCODE_PARAM_ERROR;
|
if (compress == NULL) return TSDB_CODE_TSC_ENCODE_PARAM_ERROR;
|
||||||
if (check && !validColEncode(type, encode)) return TSDB_CODE_TSC_ENCODE_PARAM_ERROR;
|
if (check && !validColEncode(type, encode)) return TSDB_CODE_TSC_ENCODE_PARAM_ERROR;
|
||||||
setColEncode(compress, encode);
|
setColEncode(compress, encode);
|
||||||
|
|
||||||
|
|
|
@ -22,12 +22,15 @@
|
||||||
int32_t taosGetFqdnPortFromEp(const char* ep, SEp* pEp) {
|
int32_t taosGetFqdnPortFromEp(const char* ep, SEp* pEp) {
|
||||||
pEp->port = 0;
|
pEp->port = 0;
|
||||||
memset(pEp->fqdn, 0, TSDB_FQDN_LEN);
|
memset(pEp->fqdn, 0, TSDB_FQDN_LEN);
|
||||||
strncpy(pEp->fqdn, ep, TSDB_FQDN_LEN - 1);
|
tstrncpy(pEp->fqdn, ep, TSDB_FQDN_LEN);
|
||||||
|
|
||||||
char* temp = strchr(pEp->fqdn, ':');
|
char* temp = strchr(pEp->fqdn, ':');
|
||||||
if (temp) {
|
if (temp) {
|
||||||
*temp = 0;
|
*temp = 0;
|
||||||
pEp->port = atoi(temp + 1);
|
pEp->port = taosStr2UInt16(temp + 1, NULL, 10);
|
||||||
|
if (pEp->port < 0) {
|
||||||
|
return TSDB_CODE_INVALID_PARA;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pEp->port == 0) {
|
if (pEp->port == 0) {
|
||||||
|
@ -282,7 +285,7 @@ int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol) {
|
||||||
locked = 1;
|
locked = 1;
|
||||||
|
|
||||||
while ((pItem = cfgNextIter(pIter)) != NULL) {
|
while ((pItem = cfgNextIter(pIter)) != NULL) {
|
||||||
_start:
|
_start:
|
||||||
col = startCol;
|
col = startCol;
|
||||||
|
|
||||||
// GRANT_CFG_SKIP;
|
// GRANT_CFG_SKIP;
|
||||||
|
@ -297,12 +300,11 @@ _start:
|
||||||
|
|
||||||
TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, name, false), NULL, _exit);
|
TAOS_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, name, false), NULL, _exit);
|
||||||
|
|
||||||
char value[TSDB_CONFIG_PATH_LEN + VARSTR_HEADER_SIZE] = {0};
|
char value[TSDB_CONFIG_PATH_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
int32_t valueLen = 0;
|
int32_t valueLen = 0;
|
||||||
|
|
||||||
SDiskCfg* pDiskCfg = NULL;
|
SDiskCfg* pDiskCfg = NULL;
|
||||||
if (strcasecmp(pItem->name, "dataDir") == 0 && exSize > 0) {
|
if (strcasecmp(pItem->name, "dataDir") == 0 && exSize > 0) {
|
||||||
char* buf = &value[VARSTR_HEADER_SIZE];
|
char* buf = &value[VARSTR_HEADER_SIZE];
|
||||||
pDiskCfg = taosArrayGet(pItem->array, index);
|
pDiskCfg = taosArrayGet(pItem->array, index);
|
||||||
valueLen = tsnprintf(buf, TSDB_CONFIG_PATH_LEN, "%s", pDiskCfg->dir);
|
valueLen = tsnprintf(buf, TSDB_CONFIG_PATH_LEN, "%s", pDiskCfg->dir);
|
||||||
index++;
|
index++;
|
||||||
|
@ -335,7 +337,7 @@ _start:
|
||||||
if (strcasecmp(pItem->name, "dataDir") == 0 && pDiskCfg) {
|
if (strcasecmp(pItem->name, "dataDir") == 0 && pDiskCfg) {
|
||||||
char* buf = &info[VARSTR_HEADER_SIZE];
|
char* buf = &info[VARSTR_HEADER_SIZE];
|
||||||
valueLen = tsnprintf(buf, TSDB_CONFIG_INFO_LEN, "level %d primary %d disabled %" PRIi8, pDiskCfg->level,
|
valueLen = tsnprintf(buf, TSDB_CONFIG_INFO_LEN, "level %d primary %d disabled %" PRIi8, pDiskCfg->level,
|
||||||
pDiskCfg->primary, pDiskCfg->disable);
|
pDiskCfg->primary, pDiskCfg->disable);
|
||||||
} else {
|
} else {
|
||||||
valueLen = 0;
|
valueLen = 0;
|
||||||
}
|
}
|
||||||
|
@ -352,7 +354,7 @@ _start:
|
||||||
if (index > 0 && index <= exSize) {
|
if (index > 0 && index <= exSize) {
|
||||||
goto _start;
|
goto _start;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pBlock->info.rows = numOfRows;
|
pBlock->info.rows = numOfRows;
|
||||||
_exit:
|
_exit:
|
||||||
if (locked) cfgUnLock(pConf);
|
if (locked) cfgUnLock(pConf);
|
||||||
|
|
|
@ -279,7 +279,7 @@ static int32_t dmParseArgs(int32_t argc, char const *argv[]) {
|
||||||
printf("ERROR: Encrypt key overflow, it should be at most %d characters\n", ENCRYPT_KEY_LEN);
|
printf("ERROR: Encrypt key overflow, it should be at most %d characters\n", ENCRYPT_KEY_LEN);
|
||||||
return TSDB_CODE_INVALID_CFG;
|
return TSDB_CODE_INVALID_CFG;
|
||||||
}
|
}
|
||||||
tstrncpy(global.encryptKey, argv[i], ENCRYPT_KEY_LEN);
|
tstrncpy(global.encryptKey, argv[i], ENCRYPT_KEY_LEN + 1);
|
||||||
} else {
|
} else {
|
||||||
printf("'-y' requires a parameter\n");
|
printf("'-y' requires a parameter\n");
|
||||||
return TSDB_CODE_INVALID_CFG;
|
return TSDB_CODE_INVALID_CFG;
|
||||||
|
|
|
@ -114,7 +114,7 @@ static void dmMayShouldUpdateAnalFunc(SDnodeMgmt *pMgmt, int64_t newVer) {
|
||||||
.pCont = pHead,
|
.pCont = pHead,
|
||||||
.contLen = contLen,
|
.contLen = contLen,
|
||||||
.msgType = TDMT_MND_RETRIEVE_ANAL_ALGO,
|
.msgType = TDMT_MND_RETRIEVE_ANAL_ALGO,
|
||||||
.info.ahandle = (void *)0x9527,
|
.info.ahandle = 0,
|
||||||
.info.refId = 0,
|
.info.refId = 0,
|
||||||
.info.noResp = 0,
|
.info.noResp = 0,
|
||||||
.info.handle = 0,
|
.info.handle = 0,
|
||||||
|
|
|
@ -186,7 +186,7 @@ static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) {
|
||||||
#if defined(TD_ENTERPRISE)
|
#if defined(TD_ENTERPRISE)
|
||||||
pCfg->tsdbCfg.encryptAlgorithm = pCreate->encryptAlgorithm;
|
pCfg->tsdbCfg.encryptAlgorithm = pCreate->encryptAlgorithm;
|
||||||
if (pCfg->tsdbCfg.encryptAlgorithm == DND_CA_SM4) {
|
if (pCfg->tsdbCfg.encryptAlgorithm == DND_CA_SM4) {
|
||||||
strncpy(pCfg->tsdbCfg.encryptKey, tsEncryptKey, ENCRYPT_KEY_LEN);
|
tstrncpy(pCfg->tsdbCfg.encryptKey, tsEncryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
pCfg->tsdbCfg.encryptAlgorithm = 0;
|
pCfg->tsdbCfg.encryptAlgorithm = 0;
|
||||||
|
@ -202,7 +202,7 @@ static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) {
|
||||||
#if defined(TD_ENTERPRISE)
|
#if defined(TD_ENTERPRISE)
|
||||||
pCfg->walCfg.encryptAlgorithm = pCreate->encryptAlgorithm;
|
pCfg->walCfg.encryptAlgorithm = pCreate->encryptAlgorithm;
|
||||||
if (pCfg->walCfg.encryptAlgorithm == DND_CA_SM4) {
|
if (pCfg->walCfg.encryptAlgorithm == DND_CA_SM4) {
|
||||||
strncpy(pCfg->walCfg.encryptKey, tsEncryptKey, ENCRYPT_KEY_LEN);
|
tstrncpy(pCfg->walCfg.encryptKey, tsEncryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
pCfg->walCfg.encryptAlgorithm = 0;
|
pCfg->walCfg.encryptAlgorithm = 0;
|
||||||
|
@ -378,12 +378,11 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
|
|
||||||
snprintf(path, TSDB_FILENAME_LEN, "vnode%svnode%d", TD_DIRSEP, vnodeCfg.vgId);
|
snprintf(path, TSDB_FILENAME_LEN, "vnode%svnode%d", TD_DIRSEP, vnodeCfg.vgId);
|
||||||
|
|
||||||
if (vnodeCreate(path, &vnodeCfg, diskPrimary, pMgmt->pTfs) < 0) {
|
if ((code = vnodeCreate(path, &vnodeCfg, diskPrimary, pMgmt->pTfs)) < 0) {
|
||||||
dError("vgId:%d, failed to create vnode since %s", req.vgId, terrstr());
|
dError("vgId:%d, failed to create vnode since %s", req.vgId, tstrerror(code));
|
||||||
vmReleaseVnode(pMgmt, pVnode);
|
vmReleaseVnode(pMgmt, pVnode);
|
||||||
vmCleanPrimaryDisk(pMgmt, req.vgId);
|
vmCleanPrimaryDisk(pMgmt, req.vgId);
|
||||||
(void)tFreeSCreateVnodeReq(&req);
|
(void)tFreeSCreateVnodeReq(&req);
|
||||||
code = terrno != 0 ? terrno : -1;
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -884,7 +883,7 @@ int32_t vmProcessArbHeartBeatReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
size_t size = taosArrayGetSize(arbHbReq.hbMembers);
|
size_t size = taosArrayGetSize(arbHbReq.hbMembers);
|
||||||
|
|
||||||
arbHbRsp.dnodeId = pMgmt->pData->dnodeId;
|
arbHbRsp.dnodeId = pMgmt->pData->dnodeId;
|
||||||
strncpy(arbHbRsp.arbToken, arbHbReq.arbToken, TSDB_ARB_TOKEN_SIZE);
|
tstrncpy(arbHbRsp.arbToken, arbHbReq.arbToken, TSDB_ARB_TOKEN_SIZE);
|
||||||
arbHbRsp.hbMembers = taosArrayInit(size, sizeof(SVArbHbRspMember));
|
arbHbRsp.hbMembers = taosArrayInit(size, sizeof(SVArbHbRspMember));
|
||||||
if (arbHbRsp.hbMembers == NULL) {
|
if (arbHbRsp.hbMembers == NULL) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
|
|
|
@ -94,7 +94,7 @@ static void vmUnRegisterCreatingState(SVnodeMgmt *pMgmt, int32_t vgId) {
|
||||||
dTrace("vgId:%d, remove from creating Hash", vgId);
|
dTrace("vgId:%d, remove from creating Hash", vgId);
|
||||||
r = taosHashRemove(pMgmt->creatingHash, &vgId, sizeof(int32_t));
|
r = taosHashRemove(pMgmt->creatingHash, &vgId, sizeof(int32_t));
|
||||||
if (r != 0) {
|
if (r != 0) {
|
||||||
dError("vgId:%d, failed to remove vnode from hash", vgId);
|
dError("vgId:%d, failed to remove vnode from creatingHash", vgId);
|
||||||
}
|
}
|
||||||
(void)taosThreadRwlockUnlock(&pMgmt->lock);
|
(void)taosThreadRwlockUnlock(&pMgmt->lock);
|
||||||
|
|
||||||
|
|
|
@ -180,7 +180,7 @@ int32_t dmInitVars(SDnode *pDnode) {
|
||||||
|
|
||||||
//code = taosGetCryptKey(tsAuthCode, pData->machineId, tsCryptKey);
|
//code = taosGetCryptKey(tsAuthCode, pData->machineId, tsCryptKey);
|
||||||
code = 0;
|
code = 0;
|
||||||
strncpy(tsEncryptKey, tsAuthCode, 16);
|
tstrncpy(tsEncryptKey, tsAuthCode, 16);
|
||||||
|
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
if(code == -1){
|
if(code == -1){
|
||||||
|
@ -221,6 +221,7 @@ int32_t dmInitVars(SDnode *pDnode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
extern SMonVloadInfo tsVinfo;
|
extern SMonVloadInfo tsVinfo;
|
||||||
|
|
||||||
void dmClearVars(SDnode *pDnode) {
|
void dmClearVars(SDnode *pDnode) {
|
||||||
for (EDndNodeType ntype = DNODE; ntype < NODE_END; ++ntype) {
|
for (EDndNodeType ntype = DNODE; ntype < NODE_END; ++ntype) {
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
|
||||||
|
|
|
@ -230,7 +230,7 @@ static int32_t dmWriteCheckCodeFile(char *file, char *realfile, char *key, bool
|
||||||
}
|
}
|
||||||
|
|
||||||
SCryptOpts opts;
|
SCryptOpts opts;
|
||||||
strncpy(opts.key, key, ENCRYPT_KEY_LEN);
|
tstrncpy(opts.key, key, ENCRYPT_KEY_LEN + 1);
|
||||||
opts.len = len;
|
opts.len = len;
|
||||||
opts.source = DM_KEY_INDICATOR;
|
opts.source = DM_KEY_INDICATOR;
|
||||||
opts.result = result;
|
opts.result = result;
|
||||||
|
@ -349,7 +349,7 @@ static int32_t dmCompareEncryptKey(char *file, char *key, bool toLogFile) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SCryptOpts opts = {0};
|
SCryptOpts opts = {0};
|
||||||
strncpy(opts.key, key, ENCRYPT_KEY_LEN);
|
tstrncpy(opts.key, key, ENCRYPT_KEY_LEN + 1);
|
||||||
opts.len = len;
|
opts.len = len;
|
||||||
opts.source = content;
|
opts.source = content;
|
||||||
opts.result = result;
|
opts.result = result;
|
||||||
|
@ -551,7 +551,7 @@ int32_t dmGetEncryptKey() {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(tsEncryptKey, encryptKey, ENCRYPT_KEY_LEN);
|
strncpy(tsEncryptKey, encryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
taosMemoryFreeClear(encryptKey);
|
taosMemoryFreeClear(encryptKey);
|
||||||
tsEncryptionKeyChksum = taosCalcChecksum(0, tsEncryptKey, strlen(tsEncryptKey));
|
tsEncryptionKeyChksum = taosCalcChecksum(0, tsEncryptKey, strlen(tsEncryptKey));
|
||||||
tsEncryptionKeyStat = ENCRYPT_KEY_STAT_LOADED;
|
tsEncryptionKeyStat = ENCRYPT_KEY_STAT_LOADED;
|
||||||
|
|
|
@ -1315,7 +1315,7 @@ static int32_t mndRetrieveArbGroups(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
char dbNameInGroup[TSDB_DB_FNAME_LEN];
|
char dbNameInGroup[TSDB_DB_FNAME_LEN];
|
||||||
strncpy(dbNameInGroup, pVgObj->dbName, TSDB_DB_FNAME_LEN);
|
tstrncpy(dbNameInGroup, pVgObj->dbName, TSDB_DB_FNAME_LEN);
|
||||||
sdbRelease(pSdb, pVgObj);
|
sdbRelease(pSdb, pVgObj);
|
||||||
|
|
||||||
char dbname[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
char dbname[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
|
|
|
@ -244,7 +244,7 @@ int32_t mndCompactGetDbName(SMnode *pMnode, int32_t compactId, char *dbname, int
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)strncpy(dbname, pCompact->dbname, len);
|
tstrncpy(dbname, pCompact->dbname, len);
|
||||||
mndReleaseCompact(pMnode, pCompact);
|
mndReleaseCompact(pMnode, pCompact);
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
@ -321,7 +321,7 @@ int32_t mndRetrieveCompact(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock,
|
||||||
TAOS_CHECK_GOTO(tNameFromString(&name, pCompact->dbname, T_NAME_ACCT | T_NAME_DB), &lino, _OVER);
|
TAOS_CHECK_GOTO(tNameFromString(&name, pCompact->dbname, T_NAME_ACCT | T_NAME_DB), &lino, _OVER);
|
||||||
(void)tNameGetDbName(&name, varDataVal(tmpBuf));
|
(void)tNameGetDbName(&name, varDataVal(tmpBuf));
|
||||||
} else {
|
} else {
|
||||||
(void)strncpy(varDataVal(tmpBuf), pCompact->dbname, TSDB_SHOW_SQL_LEN);
|
tstrncpy(varDataVal(tmpBuf), pCompact->dbname, TSDB_SHOW_SQL_LEN);
|
||||||
}
|
}
|
||||||
varDataSetLen(tmpBuf, strlen(varDataVal(tmpBuf)));
|
varDataSetLen(tmpBuf, strlen(varDataVal(tmpBuf)));
|
||||||
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)tmpBuf, false), pCompact, &lino, _OVER);
|
RETRIEVE_CHECK_GOTO(colDataSetVal(pColInfo, numOfRows, (const char *)tmpBuf, false), pCompact, &lino, _OVER);
|
||||||
|
@ -516,11 +516,14 @@ int32_t mndProcessKillCompactReq(SRpcMsg *pReq) {
|
||||||
|
|
||||||
code = TSDB_CODE_ACTION_IN_PROGRESS;
|
code = TSDB_CODE_ACTION_IN_PROGRESS;
|
||||||
|
|
||||||
char obj[TSDB_INT32_ID_LEN] = {0};
|
char obj[TSDB_INT32_ID_LEN] = {0};
|
||||||
(void)sprintf(obj, "%d", pCompact->compactId);
|
int32_t nBytes = snprintf(obj, sizeof(obj), "%d", pCompact->compactId);
|
||||||
|
if ((uint32_t)nBytes < sizeof(obj)) {
|
||||||
auditRecord(pReq, pMnode->clusterId, "killCompact", pCompact->dbname, obj, killCompactReq.sql, killCompactReq.sqlLen);
|
auditRecord(pReq, pMnode->clusterId, "killCompact", pCompact->dbname, obj, killCompactReq.sql,
|
||||||
|
killCompactReq.sqlLen);
|
||||||
|
} else {
|
||||||
|
mError("compact:%" PRId32 " failed to audit since %s", pCompact->compactId, tstrerror(TSDB_CODE_OUT_OF_RANGE));
|
||||||
|
}
|
||||||
_OVER:
|
_OVER:
|
||||||
if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
|
if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
|
||||||
mError("failed to kill compact %" PRId32 " since %s", killCompactReq.compactId, terrstr());
|
mError("failed to kill compact %" PRId32 " since %s", killCompactReq.compactId, terrstr());
|
||||||
|
@ -641,7 +644,7 @@ void mndCompactSendProgressReq(SMnode *pMnode, SCompactObj *pCompact) {
|
||||||
|
|
||||||
char detail[1024] = {0};
|
char detail[1024] = {0};
|
||||||
int32_t len = tsnprintf(detail, sizeof(detail), "msgType:%s numOfEps:%d inUse:%d",
|
int32_t len = tsnprintf(detail, sizeof(detail), "msgType:%s numOfEps:%d inUse:%d",
|
||||||
TMSG_INFO(TDMT_VND_QUERY_COMPACT_PROGRESS), epSet.numOfEps, epSet.inUse);
|
TMSG_INFO(TDMT_VND_QUERY_COMPACT_PROGRESS), epSet.numOfEps, epSet.inUse);
|
||||||
for (int32_t i = 0; i < epSet.numOfEps; ++i) {
|
for (int32_t i = 0; i < epSet.numOfEps; ++i) {
|
||||||
len += tsnprintf(detail + len, sizeof(detail) - len, " ep:%d-%s:%u", i, epSet.eps[i].fqdn, epSet.eps[i].port);
|
len += tsnprintf(detail + len, sizeof(detail) - len, " ep:%d-%s:%u", i, epSet.eps[i].fqdn, epSet.eps[i].port);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "mndDb.h"
|
#include "mndDb.h"
|
||||||
#include "audit.h"
|
#include "audit.h"
|
||||||
|
#include "command.h"
|
||||||
#include "mndArbGroup.h"
|
#include "mndArbGroup.h"
|
||||||
#include "mndCluster.h"
|
#include "mndCluster.h"
|
||||||
#include "mndDnode.h"
|
#include "mndDnode.h"
|
||||||
|
@ -34,7 +35,6 @@
|
||||||
#include "systable.h"
|
#include "systable.h"
|
||||||
#include "thttp.h"
|
#include "thttp.h"
|
||||||
#include "tjson.h"
|
#include "tjson.h"
|
||||||
#include "command.h"
|
|
||||||
|
|
||||||
#define DB_VER_NUMBER 1
|
#define DB_VER_NUMBER 1
|
||||||
#define DB_RESERVE_SIZE 27
|
#define DB_RESERVE_SIZE 27
|
||||||
|
@ -416,7 +416,12 @@ static int32_t mndCheckDbName(const char *dbName, SUserObj *pUser) {
|
||||||
return TSDB_CODE_MND_INVALID_DB;
|
return TSDB_CODE_MND_INVALID_DB;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t acctId = atoi(dbName);
|
int32_t acctId;
|
||||||
|
int32_t code = taosStr2int32(dbName, &acctId);
|
||||||
|
if (code != 0) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
if (acctId != pUser->acctId) {
|
if (acctId != pUser->acctId) {
|
||||||
return TSDB_CODE_MND_INVALID_DB_ACCT;
|
return TSDB_CODE_MND_INVALID_DB_ACCT;
|
||||||
}
|
}
|
||||||
|
@ -1561,8 +1566,8 @@ static int32_t mndBuildDropVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *
|
||||||
|
|
||||||
static int32_t mndSetDropDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
|
static int32_t mndSetDropDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
void *pIter = NULL;
|
void *pIter = NULL;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
SVgObj *pVgroup = NULL;
|
SVgObj *pVgroup = NULL;
|
||||||
|
@ -1942,9 +1947,9 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbCacheInfo *pDbs, int32_t numOfDbs,
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
mTrace("db:%s, valid dbinfo, vgVersion:%d cfgVersion:%d stateTs:%" PRId64
|
mTrace("db:%s, valid dbinfo, vgVersion:%d cfgVersion:%d stateTs:%" PRId64
|
||||||
" numOfTables:%d, changed to vgVersion:%d cfgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
|
" numOfTables:%d, changed to vgVersion:%d cfgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
|
||||||
pDbCacheInfo->dbFName, pDbCacheInfo->vgVersion, pDbCacheInfo->cfgVersion, pDbCacheInfo->stateTs,
|
pDbCacheInfo->dbFName, pDbCacheInfo->vgVersion, pDbCacheInfo->cfgVersion, pDbCacheInfo->stateTs,
|
||||||
pDbCacheInfo->numOfTable, pDb->vgVersion, pDb->cfgVersion, pDb->stateTs, numOfTable);
|
pDbCacheInfo->numOfTable, pDb->vgVersion, pDb->cfgVersion, pDb->stateTs, numOfTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pDbCacheInfo->cfgVersion < pDb->cfgVersion) {
|
if (pDbCacheInfo->cfgVersion < pDb->cfgVersion) {
|
||||||
|
@ -1956,7 +1961,7 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbCacheInfo *pDbs, int32_t numOfDbs,
|
||||||
rsp.pTsmaRsp = taosMemoryCalloc(1, sizeof(STableTSMAInfoRsp));
|
rsp.pTsmaRsp = taosMemoryCalloc(1, sizeof(STableTSMAInfoRsp));
|
||||||
if (rsp.pTsmaRsp) rsp.pTsmaRsp->pTsmas = taosArrayInit(4, POINTER_BYTES);
|
if (rsp.pTsmaRsp) rsp.pTsmaRsp->pTsmas = taosArrayInit(4, POINTER_BYTES);
|
||||||
if (rsp.pTsmaRsp && rsp.pTsmaRsp->pTsmas) {
|
if (rsp.pTsmaRsp && rsp.pTsmaRsp->pTsmas) {
|
||||||
bool exist = false;
|
bool exist = false;
|
||||||
int32_t code = mndGetDbTsmas(pMnode, 0, pDb->uid, rsp.pTsmaRsp, &exist);
|
int32_t code = mndGetDbTsmas(pMnode, 0, pDb->uid, rsp.pTsmaRsp, &exist);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
mndReleaseDb(pMnode, pDb);
|
mndReleaseDb(pMnode, pDb);
|
||||||
|
@ -2387,7 +2392,8 @@ static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb,
|
||||||
TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)strictVstr, false), &lino, _OVER);
|
TAOS_CHECK_GOTO(colDataSetVal(pColInfo, rows, (const char *)strictVstr, false), &lino, _OVER);
|
||||||
|
|
||||||
char durationVstr[128] = {0};
|
char durationVstr[128] = {0};
|
||||||
int32_t len = formatDurationOrKeep(&durationVstr[VARSTR_HEADER_SIZE], sizeof(durationVstr) - VARSTR_HEADER_SIZE, pDb->cfg.daysPerFile);
|
int32_t len = formatDurationOrKeep(&durationVstr[VARSTR_HEADER_SIZE], sizeof(durationVstr) - VARSTR_HEADER_SIZE,
|
||||||
|
pDb->cfg.daysPerFile);
|
||||||
|
|
||||||
varDataSetLen(durationVstr, len);
|
varDataSetLen(durationVstr, len);
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
@ -2403,9 +2409,9 @@ static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb,
|
||||||
int32_t lenKeep2 = formatDurationOrKeep(keep2Str, sizeof(keep2Str), pDb->cfg.daysToKeep2);
|
int32_t lenKeep2 = formatDurationOrKeep(keep2Str, sizeof(keep2Str), pDb->cfg.daysToKeep2);
|
||||||
|
|
||||||
if (pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep1 || pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep2) {
|
if (pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep1 || pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep2) {
|
||||||
len = sprintf(&keepVstr[VARSTR_HEADER_SIZE], "%s,%s,%s", keep1Str, keep2Str, keep0Str);
|
len = sprintf(&keepVstr[VARSTR_HEADER_SIZE], "%s,%s,%s", keep1Str, keep2Str, keep0Str);
|
||||||
} else {
|
} else {
|
||||||
len = sprintf(&keepVstr[VARSTR_HEADER_SIZE], "%s,%s,%s", keep0Str, keep1Str, keep2Str);
|
len = sprintf(&keepVstr[VARSTR_HEADER_SIZE], "%s,%s,%s", keep0Str, keep1Str, keep2Str);
|
||||||
}
|
}
|
||||||
varDataSetLen(keepVstr, len);
|
varDataSetLen(keepVstr, len);
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
|
|
@ -462,7 +462,7 @@ int32_t mndGetDnodeData(SMnode *pMnode, SArray *pDnodeInfo) {
|
||||||
dInfo.isMnode = 0;
|
dInfo.isMnode = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(taosArrayPush(pDnodeInfo, &dInfo) == NULL){
|
if (taosArrayPush(pDnodeInfo, &dInfo) == NULL) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
sdbCancelFetch(pSdb, pIter);
|
sdbCancelFetch(pSdb, pIter);
|
||||||
break;
|
break;
|
||||||
|
@ -471,12 +471,12 @@ int32_t mndGetDnodeData(SMnode *pMnode, SArray *pDnodeInfo) {
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CHECK_MONITOR_PARA(para,err) \
|
#define CHECK_MONITOR_PARA(para, err) \
|
||||||
if (pCfg->monitorParas.para != para) { \
|
if (pCfg->monitorParas.para != para) { \
|
||||||
mError("dnode:%d, para:%d inconsistent with cluster:%d", pDnode->id, pCfg->monitorParas.para, para); \
|
mError("dnode:%d, para:%d inconsistent with cluster:%d", pDnode->id, pCfg->monitorParas.para, para); \
|
||||||
terrno = err; \
|
terrno = err; \
|
||||||
return err;\
|
return err; \
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndCheckClusterCfgPara(SMnode *pMnode, SDnodeObj *pDnode, const SClusterCfg *pCfg) {
|
static int32_t mndCheckClusterCfgPara(SMnode *pMnode, SDnodeObj *pDnode, const SClusterCfg *pCfg) {
|
||||||
CHECK_MONITOR_PARA(tsEnableMonitor, DND_REASON_STATUS_MONITOR_SWITCH_NOT_MATCH);
|
CHECK_MONITOR_PARA(tsEnableMonitor, DND_REASON_STATUS_MONITOR_SWITCH_NOT_MATCH);
|
||||||
|
@ -486,7 +486,8 @@ static int32_t mndCheckClusterCfgPara(SMnode *pMnode, SDnodeObj *pDnode, const S
|
||||||
CHECK_MONITOR_PARA(tsSlowLogScope, DND_REASON_STATUS_MONITOR_SLOW_LOG_SCOPE_NOT_MATCH);
|
CHECK_MONITOR_PARA(tsSlowLogScope, DND_REASON_STATUS_MONITOR_SLOW_LOG_SCOPE_NOT_MATCH);
|
||||||
|
|
||||||
if (0 != strcasecmp(pCfg->monitorParas.tsSlowLogExceptDb, tsSlowLogExceptDb)) {
|
if (0 != strcasecmp(pCfg->monitorParas.tsSlowLogExceptDb, tsSlowLogExceptDb)) {
|
||||||
mError("dnode:%d, tsSlowLogExceptDb:%s inconsistent with cluster:%s", pDnode->id, pCfg->monitorParas.tsSlowLogExceptDb, tsSlowLogExceptDb);
|
mError("dnode:%d, tsSlowLogExceptDb:%s inconsistent with cluster:%s", pDnode->id,
|
||||||
|
pCfg->monitorParas.tsSlowLogExceptDb, tsSlowLogExceptDb);
|
||||||
terrno = TSDB_CODE_DNODE_INVALID_MONITOR_PARAS;
|
terrno = TSDB_CODE_DNODE_INVALID_MONITOR_PARAS;
|
||||||
return DND_REASON_STATUS_MONITOR_NOT_MATCH;
|
return DND_REASON_STATUS_MONITOR_NOT_MATCH;
|
||||||
}
|
}
|
||||||
|
@ -582,8 +583,8 @@ static bool mndUpdateMnodeState(SMnodeObj *pObj, SMnodeLoad *pMload) {
|
||||||
return stateChanged;
|
return stateChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern char* tsMonFwUri;
|
extern char *tsMonFwUri;
|
||||||
extern char* tsMonSlowLogUri;
|
extern char *tsMonSlowLogUri;
|
||||||
static int32_t mndProcessStatisReq(SRpcMsg *pReq) {
|
static int32_t mndProcessStatisReq(SRpcMsg *pReq) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
SStatisReq statisReq = {0};
|
SStatisReq statisReq = {0};
|
||||||
|
@ -595,9 +596,9 @@ static int32_t mndProcessStatisReq(SRpcMsg *pReq) {
|
||||||
mInfo("process statis req,\n %s", statisReq.pCont);
|
mInfo("process statis req,\n %s", statisReq.pCont);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (statisReq.type == MONITOR_TYPE_COUNTER){
|
if (statisReq.type == MONITOR_TYPE_COUNTER) {
|
||||||
monSendContent(statisReq.pCont, tsMonFwUri);
|
monSendContent(statisReq.pCont, tsMonFwUri);
|
||||||
}else if(statisReq.type == MONITOR_TYPE_SLOW_LOG){
|
} else if (statisReq.type == MONITOR_TYPE_SLOW_LOG) {
|
||||||
monSendContent(statisReq.pCont, tsMonSlowLogUri);
|
monSendContent(statisReq.pCont, tsMonSlowLogUri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1057,27 +1058,27 @@ _OVER:
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getSlowLogScopeString(int32_t scope, char* result){
|
static void getSlowLogScopeString(int32_t scope, char *result) {
|
||||||
if(scope == SLOW_LOG_TYPE_NULL) {
|
if (scope == SLOW_LOG_TYPE_NULL) {
|
||||||
(void)strcat(result, "NONE");
|
(void)strcat(result, "NONE");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while(scope > 0){
|
while (scope > 0) {
|
||||||
if(scope & SLOW_LOG_TYPE_QUERY) {
|
if (scope & SLOW_LOG_TYPE_QUERY) {
|
||||||
(void)strcat(result, "QUERY");
|
(void)strcat(result, "QUERY");
|
||||||
scope &= ~SLOW_LOG_TYPE_QUERY;
|
scope &= ~SLOW_LOG_TYPE_QUERY;
|
||||||
} else if(scope & SLOW_LOG_TYPE_INSERT) {
|
} else if (scope & SLOW_LOG_TYPE_INSERT) {
|
||||||
(void)strcat(result, "INSERT");
|
(void)strcat(result, "INSERT");
|
||||||
scope &= ~SLOW_LOG_TYPE_INSERT;
|
scope &= ~SLOW_LOG_TYPE_INSERT;
|
||||||
} else if(scope & SLOW_LOG_TYPE_OTHERS) {
|
} else if (scope & SLOW_LOG_TYPE_OTHERS) {
|
||||||
(void)strcat(result, "OTHERS");
|
(void)strcat(result, "OTHERS");
|
||||||
scope &= ~SLOW_LOG_TYPE_OTHERS;
|
scope &= ~SLOW_LOG_TYPE_OTHERS;
|
||||||
} else{
|
} else {
|
||||||
(void)printf("invalid slow log scope:%d", scope);
|
(void)printf("invalid slow log scope:%d", scope);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(scope > 0) {
|
if (scope > 0) {
|
||||||
(void)strcat(result, "|");
|
(void)strcat(result, "|");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1439,7 +1440,7 @@ _OVER:
|
||||||
|
|
||||||
static int32_t mndMCfg2DCfg(SMCfgDnodeReq *pMCfgReq, SDCfgDnodeReq *pDCfgReq) {
|
static int32_t mndMCfg2DCfg(SMCfgDnodeReq *pMCfgReq, SDCfgDnodeReq *pDCfgReq) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
char *p = pMCfgReq->config;
|
char *p = pMCfgReq->config;
|
||||||
while (*p) {
|
while (*p) {
|
||||||
if (*p == ' ') {
|
if (*p == ' ') {
|
||||||
break;
|
break;
|
||||||
|
@ -1448,7 +1449,7 @@ static int32_t mndMCfg2DCfg(SMCfgDnodeReq *pMCfgReq, SDCfgDnodeReq *pDCfgReq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t optLen = p - pMCfgReq->config;
|
size_t optLen = p - pMCfgReq->config;
|
||||||
(void)strncpy(pDCfgReq->config, pMCfgReq->config, optLen);
|
tstrncpy(pDCfgReq->config, pMCfgReq->config, optLen + 1);
|
||||||
pDCfgReq->config[optLen] = 0;
|
pDCfgReq->config[optLen] = 0;
|
||||||
|
|
||||||
if (' ' == pMCfgReq->config[optLen]) {
|
if (' ' == pMCfgReq->config[optLen]) {
|
||||||
|
@ -1537,7 +1538,7 @@ static int32_t mndProcessConfigDnodeReq(SRpcMsg *pReq) {
|
||||||
snprintf(dcfgReq.value, TSDB_DNODE_VALUE_LEN, "%d", flag);
|
snprintf(dcfgReq.value, TSDB_DNODE_VALUE_LEN, "%d", flag);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
TAOS_CHECK_GOTO (mndMCfg2DCfg(&cfgReq, &dcfgReq), NULL, _err_out);
|
TAOS_CHECK_GOTO(mndMCfg2DCfg(&cfgReq, &dcfgReq), NULL, _err_out);
|
||||||
if (strlen(dcfgReq.config) > TSDB_DNODE_CONFIG_LEN) {
|
if (strlen(dcfgReq.config) > TSDB_DNODE_CONFIG_LEN) {
|
||||||
mError("dnode:%d, failed to config since config is too long", cfgReq.dnodeId);
|
mError("dnode:%d, failed to config since config is too long", cfgReq.dnodeId);
|
||||||
code = TSDB_CODE_INVALID_CFG;
|
code = TSDB_CODE_INVALID_CFG;
|
||||||
|
@ -1880,11 +1881,19 @@ static int32_t mndMCfgGetValInt32(SMCfgDnodeReq *pMCfgReq, int32_t optLen, int32
|
||||||
if (' ' == pMCfgReq->config[optLen]) {
|
if (' ' == pMCfgReq->config[optLen]) {
|
||||||
// 'key value'
|
// 'key value'
|
||||||
if (strlen(pMCfgReq->value) != 0) goto _err;
|
if (strlen(pMCfgReq->value) != 0) goto _err;
|
||||||
*pOutValue = atoi(pMCfgReq->config + optLen + 1);
|
code = taosStr2int32(pMCfgReq->config + optLen + 1, pOutValue);
|
||||||
|
if (code != 0) {
|
||||||
|
mError("dnode:%d, failed to get cfg since %s", pMCfgReq->dnodeId, tstrerror(code));
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// 'key' 'value'
|
// 'key' 'value'
|
||||||
if (strlen(pMCfgReq->value) == 0) goto _err;
|
if (strlen(pMCfgReq->value) == 0) goto _err;
|
||||||
*pOutValue = atoi(pMCfgReq->value);
|
code = taosStr2int32(pMCfgReq->value, pOutValue);
|
||||||
|
if (code != 0) {
|
||||||
|
mError("dnode:%d, failed to get cfg since %s", pMCfgReq->dnodeId, tstrerror(code));
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "mndAcct.h"
|
#include "mndAcct.h"
|
||||||
#include "mndArbGroup.h"
|
|
||||||
#include "mndAnode.h"
|
#include "mndAnode.h"
|
||||||
|
#include "mndArbGroup.h"
|
||||||
#include "mndCluster.h"
|
#include "mndCluster.h"
|
||||||
#include "mndCompact.h"
|
#include "mndCompact.h"
|
||||||
#include "mndCompactDetail.h"
|
#include "mndCompactDetail.h"
|
||||||
|
@ -254,7 +254,7 @@ static void mndIncreaseUpTime(SMnode *pMnode) {
|
||||||
.pCont = pReq,
|
.pCont = pReq,
|
||||||
.contLen = contLen,
|
.contLen = contLen,
|
||||||
.info.notFreeAhandle = 1,
|
.info.notFreeAhandle = 1,
|
||||||
.info.ahandle = (void *)0x9527};
|
.info.ahandle = 0};
|
||||||
// TODO check return value
|
// TODO check return value
|
||||||
if (tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg) < 0) {
|
if (tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg) < 0) {
|
||||||
mError("failed to put into write-queue since %s, line:%d", terrstr(), __LINE__);
|
mError("failed to put into write-queue since %s, line:%d", terrstr(), __LINE__);
|
||||||
|
@ -530,7 +530,7 @@ static int32_t mndInitWal(SMnode *pMnode) {
|
||||||
code = TSDB_CODE_DNODE_INVALID_ENCRYPTKEY;
|
code = TSDB_CODE_DNODE_INVALID_ENCRYPTKEY;
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
} else {
|
} else {
|
||||||
(void)strncpy(cfg.encryptKey, tsEncryptKey, ENCRYPT_KEY_LEN);
|
tstrncpy(cfg.encryptKey, tsEncryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -14,10 +14,10 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "mndMnode.h"
|
||||||
#include "audit.h"
|
#include "audit.h"
|
||||||
#include "mndCluster.h"
|
#include "mndCluster.h"
|
||||||
#include "mndDnode.h"
|
#include "mndDnode.h"
|
||||||
#include "mndMnode.h"
|
|
||||||
#include "mndPrivilege.h"
|
#include "mndPrivilege.h"
|
||||||
#include "mndShow.h"
|
#include "mndShow.h"
|
||||||
#include "mndSync.h"
|
#include "mndSync.h"
|
||||||
|
@ -722,10 +722,13 @@ static int32_t mndProcessCreateMnodeReq(SRpcMsg *pReq) {
|
||||||
code = mndCreateMnode(pMnode, pReq, pDnode, &createReq);
|
code = mndCreateMnode(pMnode, pReq, pDnode, &createReq);
|
||||||
if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
|
if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
|
||||||
|
|
||||||
char obj[40] = {0};
|
char obj[40] = {0};
|
||||||
sprintf(obj, "%d", createReq.dnodeId);
|
int32_t bytes = snprintf(obj, sizeof(obj), "%d", createReq.dnodeId);
|
||||||
|
if ((uint32_t)bytes < sizeof(obj)) {
|
||||||
auditRecord(pReq, pMnode->clusterId, "createMnode", "", obj, createReq.sql, createReq.sqlLen);
|
auditRecord(pReq, pMnode->clusterId, "createMnode", "", obj, createReq.sql, createReq.sqlLen);
|
||||||
|
} else {
|
||||||
|
mError("mnode:%d, failed to audit create req since %s", createReq.dnodeId, tstrerror(TSDB_CODE_OUT_OF_RANGE));
|
||||||
|
}
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
|
if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
|
||||||
|
|
|
@ -14,12 +14,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "mndProfile.h"
|
||||||
#include "audit.h"
|
#include "audit.h"
|
||||||
#include "mndDb.h"
|
#include "mndDb.h"
|
||||||
#include "mndDnode.h"
|
#include "mndDnode.h"
|
||||||
#include "mndMnode.h"
|
#include "mndMnode.h"
|
||||||
#include "mndPrivilege.h"
|
#include "mndPrivilege.h"
|
||||||
#include "mndProfile.h"
|
|
||||||
#include "mndQnode.h"
|
#include "mndQnode.h"
|
||||||
#include "mndShow.h"
|
#include "mndShow.h"
|
||||||
#include "mndSma.h"
|
#include "mndSma.h"
|
||||||
|
@ -344,10 +344,13 @@ static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
|
||||||
|
|
||||||
code = 0;
|
code = 0;
|
||||||
|
|
||||||
char detail[1000] = {0};
|
char detail[1000] = {0};
|
||||||
(void)sprintf(detail, "app:%s", connReq.app);
|
int32_t nBytes = snprintf(detail, sizeof(detail), "app:%s", connReq.app);
|
||||||
|
if ((uint32_t)nBytes < sizeof(detail)) {
|
||||||
auditRecord(pReq, pMnode->clusterId, "login", "", "", detail, strlen(detail));
|
auditRecord(pReq, pMnode->clusterId, "login", "", "", detail, strlen(detail));
|
||||||
|
} else {
|
||||||
|
mError("failed to audit logic since %s", tstrerror(TSDB_CODE_OUT_OF_RANGE));
|
||||||
|
}
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "mndSma.h"
|
#include "mndSma.h"
|
||||||
|
#include "functionMgt.h"
|
||||||
#include "mndDb.h"
|
#include "mndDb.h"
|
||||||
#include "mndDnode.h"
|
#include "mndDnode.h"
|
||||||
#include "mndIndex.h"
|
#include "mndIndex.h"
|
||||||
|
@ -31,7 +32,6 @@
|
||||||
#include "mndVgroup.h"
|
#include "mndVgroup.h"
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
#include "tname.h"
|
#include "tname.h"
|
||||||
#include "functionMgt.h"
|
|
||||||
|
|
||||||
#define TSDB_SMA_VER_NUMBER 1
|
#define TSDB_SMA_VER_NUMBER 1
|
||||||
#define TSDB_SMA_RESERVE_SIZE 64
|
#define TSDB_SMA_RESERVE_SIZE 64
|
||||||
|
@ -48,8 +48,8 @@ static int32_t mndProcessGetTbSmaReq(SRpcMsg *pReq);
|
||||||
static int32_t mndRetrieveSma(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
|
static int32_t mndRetrieveSma(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
|
||||||
static void mndDestroySmaObj(SSmaObj *pSmaObj);
|
static void mndDestroySmaObj(SSmaObj *pSmaObj);
|
||||||
|
|
||||||
static int32_t mndProcessCreateTSMAReq(SRpcMsg* pReq);
|
static int32_t mndProcessCreateTSMAReq(SRpcMsg *pReq);
|
||||||
static int32_t mndProcessDropTSMAReq(SRpcMsg* pReq);
|
static int32_t mndProcessDropTSMAReq(SRpcMsg *pReq);
|
||||||
|
|
||||||
// sma and tag index comm func
|
// sma and tag index comm func
|
||||||
static int32_t mndProcessDropIdxReq(SRpcMsg *pReq);
|
static int32_t mndProcessDropIdxReq(SRpcMsg *pReq);
|
||||||
|
@ -61,11 +61,11 @@ static void mndCancelRetrieveTSMA(SMnode *pMnode, void *pIter);
|
||||||
static int32_t mndProcessGetTbTSMAReq(SRpcMsg *pReq);
|
static int32_t mndProcessGetTbTSMAReq(SRpcMsg *pReq);
|
||||||
|
|
||||||
typedef struct SCreateTSMACxt {
|
typedef struct SCreateTSMACxt {
|
||||||
SMnode * pMnode;
|
SMnode *pMnode;
|
||||||
const SRpcMsg *pRpcReq;
|
const SRpcMsg *pRpcReq;
|
||||||
union {
|
union {
|
||||||
const SMCreateSmaReq *pCreateSmaReq;
|
const SMCreateSmaReq *pCreateSmaReq;
|
||||||
const SMDropSmaReq * pDropSmaReq;
|
const SMDropSmaReq *pDropSmaReq;
|
||||||
};
|
};
|
||||||
SDbObj *pDb;
|
SDbObj *pDb;
|
||||||
SStbObj *pSrcStb;
|
SStbObj *pSrcStb;
|
||||||
|
@ -298,16 +298,13 @@ void mndReleaseSma(SMnode *pMnode, SSmaObj *pSma) {
|
||||||
sdbRelease(pSdb, pSma);
|
sdbRelease(pSdb, pSma);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDbObj *mndAcquireDbBySma(SMnode *pMnode, const char *db) {
|
SDbObj *mndAcquireDbBySma(SMnode *pMnode, const char *db) { return mndAcquireDb(pMnode, db); }
|
||||||
|
|
||||||
return mndAcquireDb(pMnode, db);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *mndBuildVCreateSmaReq(SMnode *pMnode, SVgObj *pVgroup, SSmaObj *pSma, int32_t *pContLen) {
|
static void *mndBuildVCreateSmaReq(SMnode *pMnode, SVgObj *pVgroup, SSmaObj *pSma, int32_t *pContLen) {
|
||||||
SEncoder encoder = {0};
|
SEncoder encoder = {0};
|
||||||
int32_t contLen = 0;
|
int32_t contLen = 0;
|
||||||
SName name = {0};
|
SName name = {0};
|
||||||
int32_t code = tNameFromString(&name, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
int32_t code = tNameFromString(&name, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -368,7 +365,7 @@ static void *mndBuildVDropSmaReq(SMnode *pMnode, SVgObj *pVgroup, SSmaObj *pSma,
|
||||||
SEncoder encoder = {0};
|
SEncoder encoder = {0};
|
||||||
int32_t contLen;
|
int32_t contLen;
|
||||||
SName name = {0};
|
SName name = {0};
|
||||||
int32_t code = tNameFromString(&name, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
int32_t code = tNameFromString(&name, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
terrno = code;
|
terrno = code;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -424,9 +421,9 @@ static int32_t mndSetCreateSmaRedoLogs(SMnode *pMnode, STrans *pTrans, SSmaObj *
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndSetCreateSmaUndoLogs(SMnode* pMnode, STrans* pTrans, SSmaObj* pSma) {
|
static int32_t mndSetCreateSmaUndoLogs(SMnode *pMnode, STrans *pTrans, SSmaObj *pSma) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SSdbRaw * pUndoRaw = mndSmaActionEncode(pSma);
|
SSdbRaw *pUndoRaw = mndSmaActionEncode(pSma);
|
||||||
if (!pUndoRaw) {
|
if (!pUndoRaw) {
|
||||||
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
|
code = TSDB_CODE_MND_RETURN_VALUE_NULL;
|
||||||
if (terrno != 0) code = terrno;
|
if (terrno != 0) code = terrno;
|
||||||
|
@ -670,7 +667,8 @@ static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCrea
|
||||||
// check the maxDelay
|
// check the maxDelay
|
||||||
if (streamObj.conf.triggerParam < TSDB_MIN_ROLLUP_MAX_DELAY) {
|
if (streamObj.conf.triggerParam < TSDB_MIN_ROLLUP_MAX_DELAY) {
|
||||||
int64_t msInterval = -1;
|
int64_t msInterval = -1;
|
||||||
int32_t code = convertTimeFromPrecisionToUnit(pCreate->interval, pDb->cfg.precision, TIME_UNIT_MILLISECOND, &msInterval);
|
int32_t code =
|
||||||
|
convertTimeFromPrecisionToUnit(pCreate->interval, pDb->cfg.precision, TIME_UNIT_MILLISECOND, &msInterval);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
mError("sma:%s, failed to create since convert time failed: %s", smaObj.name, tstrerror(code));
|
mError("sma:%s, failed to create since convert time failed: %s", smaObj.name, tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
|
@ -792,7 +790,7 @@ static int32_t mndCheckCreateSmaReq(SMCreateSmaReq *pCreate) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndGetStreamNameFromSmaName(char *streamName, char *smaName) {
|
static int32_t mndGetStreamNameFromSmaName(char *streamName, char *smaName) {
|
||||||
SName n;
|
SName n;
|
||||||
int32_t code = tNameFromString(&n, smaName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
int32_t code = tNameFromString(&n, smaName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
return code;
|
return code;
|
||||||
|
@ -984,10 +982,10 @@ static int32_t mndSetDropSmaVgroupRedoActions(SMnode *pMnode, STrans *pTrans, SD
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndDropSma(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SSmaObj *pSma) {
|
static int32_t mndDropSma(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SSmaObj *pSma) {
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
SVgObj *pVgroup = NULL;
|
SVgObj *pVgroup = NULL;
|
||||||
SStbObj *pStb = NULL;
|
SStbObj *pStb = NULL;
|
||||||
STrans *pTrans = NULL;
|
STrans *pTrans = NULL;
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
|
|
||||||
pVgroup = mndAcquireVgroup(pMnode, pSma->dstVgId);
|
pVgroup = mndAcquireVgroup(pMnode, pSma->dstVgId);
|
||||||
|
@ -1023,7 +1021,6 @@ static int32_t mndDropSma(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SSmaObj *p
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
code = mndAcquireStream(pMnode, streamName, &pStream);
|
code = mndAcquireStream(pMnode, streamName, &pStream);
|
||||||
if (pStream == NULL || pStream->smaId != pSma->uid || code != 0) {
|
if (pStream == NULL || pStream->smaId != pSma->uid || code != 0) {
|
||||||
sdbRelease(pMnode->pSdb, pStream);
|
sdbRelease(pMnode->pSdb, pStream);
|
||||||
|
@ -1124,8 +1121,8 @@ _OVER:
|
||||||
|
|
||||||
int32_t mndDropSmasByDb(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
|
int32_t mndDropSmasByDb(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
void *pIter = NULL;
|
void *pIter = NULL;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
SSmaObj *pSma = NULL;
|
SSmaObj *pSma = NULL;
|
||||||
|
@ -1232,7 +1229,7 @@ static int32_t mndGetSma(SMnode *pMnode, SUserIndexReq *indexReq, SUserIndexRsp
|
||||||
FOREACH(node, pList) {
|
FOREACH(node, pList) {
|
||||||
SFunctionNode *pFunc = (SFunctionNode *)node;
|
SFunctionNode *pFunc = (SFunctionNode *)node;
|
||||||
extOffset += tsnprintf(rsp->indexExts + extOffset, sizeof(rsp->indexExts) - extOffset - 1, "%s%s",
|
extOffset += tsnprintf(rsp->indexExts + extOffset, sizeof(rsp->indexExts) - extOffset - 1, "%s%s",
|
||||||
(extOffset ? "," : ""), pFunc->functionName);
|
(extOffset ? "," : ""), pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
*exist = true;
|
*exist = true;
|
||||||
|
@ -1439,8 +1436,8 @@ static int32_t mndRetrieveSma(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBloc
|
||||||
|
|
||||||
SName smaName = {0};
|
SName smaName = {0};
|
||||||
SName stbName = {0};
|
SName stbName = {0};
|
||||||
char n2[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
char n2[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
char n3[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
char n3[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
code = tNameFromString(&smaName, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
code = tNameFromString(&smaName, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
||||||
char n1[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
char n1[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
@ -1448,7 +1445,7 @@ static int32_t mndRetrieveSma(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBloc
|
||||||
STR_TO_VARSTR(n2, (char *)mndGetDbStr(pSma->db));
|
STR_TO_VARSTR(n2, (char *)mndGetDbStr(pSma->db));
|
||||||
code = tNameFromString(&stbName, pSma->stb, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
code = tNameFromString(&stbName, pSma->stb, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
||||||
}
|
}
|
||||||
SColumnInfoData* pColInfo = NULL;
|
SColumnInfoData *pColInfo = NULL;
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
STR_TO_VARSTR(n3, (char *)tNameGetTableName(&stbName));
|
STR_TO_VARSTR(n3, (char *)tNameGetTableName(&stbName));
|
||||||
|
|
||||||
|
@ -1540,7 +1537,7 @@ static void mndCancelRetrieveIdx(SMnode *pMnode, void *pIter) {
|
||||||
taosMemoryFree(p);
|
taosMemoryFree(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initSMAObj(SCreateTSMACxt* pCxt) {
|
static void initSMAObj(SCreateTSMACxt *pCxt) {
|
||||||
memcpy(pCxt->pSma->name, pCxt->pCreateSmaReq->name, TSDB_TABLE_FNAME_LEN);
|
memcpy(pCxt->pSma->name, pCxt->pCreateSmaReq->name, TSDB_TABLE_FNAME_LEN);
|
||||||
memcpy(pCxt->pSma->stb, pCxt->pCreateSmaReq->stb, TSDB_TABLE_FNAME_LEN);
|
memcpy(pCxt->pSma->stb, pCxt->pCreateSmaReq->stb, TSDB_TABLE_FNAME_LEN);
|
||||||
memcpy(pCxt->pSma->db, pCxt->pDb->name, TSDB_DB_FNAME_LEN);
|
memcpy(pCxt->pSma->db, pCxt->pDb->name, TSDB_DB_FNAME_LEN);
|
||||||
|
@ -1549,7 +1546,7 @@ static void initSMAObj(SCreateTSMACxt* pCxt) {
|
||||||
pCxt->pSma->uid = mndGenerateUid(pCxt->pCreateSmaReq->name, TSDB_TABLE_FNAME_LEN);
|
pCxt->pSma->uid = mndGenerateUid(pCxt->pCreateSmaReq->name, TSDB_TABLE_FNAME_LEN);
|
||||||
|
|
||||||
memcpy(pCxt->pSma->dstTbName, pCxt->targetStbFullName, TSDB_TABLE_FNAME_LEN);
|
memcpy(pCxt->pSma->dstTbName, pCxt->targetStbFullName, TSDB_TABLE_FNAME_LEN);
|
||||||
pCxt->pSma->dstTbUid = 0; // not used
|
pCxt->pSma->dstTbUid = 0; // not used
|
||||||
pCxt->pSma->stbUid = pCxt->pSrcStb ? pCxt->pSrcStb->uid : pCxt->pCreateSmaReq->normSourceTbUid;
|
pCxt->pSma->stbUid = pCxt->pSrcStb ? pCxt->pSrcStb->uid : pCxt->pCreateSmaReq->normSourceTbUid;
|
||||||
pCxt->pSma->dbUid = pCxt->pDb->uid;
|
pCxt->pSma->dbUid = pCxt->pDb->uid;
|
||||||
pCxt->pSma->interval = pCxt->pCreateSmaReq->interval;
|
pCxt->pSma->interval = pCxt->pCreateSmaReq->interval;
|
||||||
|
@ -1598,7 +1595,7 @@ static int32_t mndCreateTSMABuildCreateStreamReq(SCreateTSMACxt *pCxt) {
|
||||||
if (!pCxt->pCreateStreamReq->pTags) {
|
if (!pCxt->pCreateStreamReq->pTags) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
SField f = {0};
|
SField f = {0};
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
if (pCxt->pSrcStb) {
|
if (pCxt->pSrcStb) {
|
||||||
for (int32_t idx = 0; idx < pCxt->pCreateStreamReq->numOfTags - 1; ++idx) {
|
for (int32_t idx = 0; idx < pCxt->pCreateStreamReq->numOfTags - 1; ++idx) {
|
||||||
|
@ -1626,9 +1623,9 @@ static int32_t mndCreateTSMABuildCreateStreamReq(SCreateTSMACxt *pCxt) {
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
// construct output cols
|
// construct output cols
|
||||||
SNode* pNode;
|
SNode *pNode;
|
||||||
FOREACH(pNode, pCxt->pProjects) {
|
FOREACH(pNode, pCxt->pProjects) {
|
||||||
SExprNode* pExprNode = (SExprNode*)pNode;
|
SExprNode *pExprNode = (SExprNode *)pNode;
|
||||||
f.bytes = pExprNode->resType.bytes;
|
f.bytes = pExprNode->resType.bytes;
|
||||||
f.type = pExprNode->resType.type;
|
f.type = pExprNode->resType.type;
|
||||||
f.flags = COL_SMA_ON;
|
f.flags = COL_SMA_ON;
|
||||||
|
@ -1642,7 +1639,7 @@ static int32_t mndCreateTSMABuildCreateStreamReq(SCreateTSMACxt *pCxt) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndCreateTSMABuildDropStreamReq(SCreateTSMACxt* pCxt) {
|
static int32_t mndCreateTSMABuildDropStreamReq(SCreateTSMACxt *pCxt) {
|
||||||
tstrncpy(pCxt->pDropStreamReq->name, pCxt->streamName, TSDB_STREAM_FNAME_LEN);
|
tstrncpy(pCxt->pDropStreamReq->name, pCxt->streamName, TSDB_STREAM_FNAME_LEN);
|
||||||
pCxt->pDropStreamReq->igNotExists = false;
|
pCxt->pDropStreamReq->igNotExists = false;
|
||||||
pCxt->pDropStreamReq->sql = taosStrdup(pCxt->pDropSmaReq->name);
|
pCxt->pDropStreamReq->sql = taosStrdup(pCxt->pDropSmaReq->name);
|
||||||
|
@ -1685,14 +1682,13 @@ static int32_t mndSetUpdateDbTsmaVersionCommitLogs(SMnode *pMnode, STrans *pTran
|
||||||
TAOS_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
|
TAOS_RETURN(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndCreateTSMATxnPrepare(SCreateTSMACxt* pCxt) {
|
static int32_t mndCreateTSMATxnPrepare(SCreateTSMACxt *pCxt) {
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
STransAction createStreamRedoAction = {0};
|
STransAction createStreamRedoAction = {0};
|
||||||
STransAction createStreamUndoAction = {0};
|
STransAction createStreamUndoAction = {0};
|
||||||
STransAction dropStbUndoAction = {0};
|
STransAction dropStbUndoAction = {0};
|
||||||
SMDropStbReq dropStbReq = {0};
|
SMDropStbReq dropStbReq = {0};
|
||||||
STrans *pTrans =
|
STrans *pTrans = mndTransCreate(pCxt->pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_TSMA, pCxt->pRpcReq, "create-tsma");
|
||||||
mndTransCreate(pCxt->pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_TSMA, pCxt->pRpcReq, "create-tsma");
|
|
||||||
if (!pTrans) {
|
if (!pTrans) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
|
@ -1713,7 +1709,9 @@ static int32_t mndCreateTSMATxnPrepare(SCreateTSMACxt* pCxt) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
if (createStreamRedoAction.contLen != tSerializeSCMCreateStreamReq(createStreamRedoAction.pCont, createStreamRedoAction.contLen, pCxt->pCreateStreamReq)) {
|
if (createStreamRedoAction.contLen != tSerializeSCMCreateStreamReq(createStreamRedoAction.pCont,
|
||||||
|
createStreamRedoAction.contLen,
|
||||||
|
pCxt->pCreateStreamReq)) {
|
||||||
mError("sma: %s, failed to create due to create stream req encode failure", pCxt->pCreateSmaReq->name);
|
mError("sma: %s, failed to create due to create stream req encode failure", pCxt->pCreateSmaReq->name);
|
||||||
code = TSDB_CODE_INVALID_MSG;
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
|
@ -1728,7 +1726,8 @@ static int32_t mndCreateTSMATxnPrepare(SCreateTSMACxt* pCxt) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
if (createStreamUndoAction.contLen != tSerializeSMDropStreamReq(createStreamUndoAction.pCont, createStreamUndoAction.contLen, pCxt->pDropStreamReq)) {
|
if (createStreamUndoAction.contLen !=
|
||||||
|
tSerializeSMDropStreamReq(createStreamUndoAction.pCont, createStreamUndoAction.contLen, pCxt->pDropStreamReq)) {
|
||||||
mError("sma: %s, failed to create due to drop stream req encode failure", pCxt->pCreateSmaReq->name);
|
mError("sma: %s, failed to create due to drop stream req encode failure", pCxt->pCreateSmaReq->name);
|
||||||
code = TSDB_CODE_INVALID_MSG;
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
|
@ -1746,7 +1745,8 @@ static int32_t mndCreateTSMATxnPrepare(SCreateTSMACxt* pCxt) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
if (dropStbUndoAction.contLen != tSerializeSMDropStbReq(dropStbUndoAction.pCont, dropStbUndoAction.contLen, &dropStbReq)) {
|
if (dropStbUndoAction.contLen !=
|
||||||
|
tSerializeSMDropStbReq(dropStbUndoAction.pCont, dropStbUndoAction.contLen, &dropStbReq)) {
|
||||||
mError("sma: %s, failed to create due to drop stb req encode failure", pCxt->pCreateSmaReq->name);
|
mError("sma: %s, failed to create due to drop stb req encode failure", pCxt->pCreateSmaReq->name);
|
||||||
code = TSDB_CODE_INVALID_MSG;
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
|
@ -1781,7 +1781,7 @@ static int32_t mndCreateTSMA(SCreateTSMACxt *pCxt) {
|
||||||
pCxt->pSma = &sma;
|
pCxt->pSma = &sma;
|
||||||
initSMAObj(pCxt);
|
initSMAObj(pCxt);
|
||||||
|
|
||||||
SNodeList* pProjects = NULL;
|
SNodeList *pProjects = NULL;
|
||||||
code = nodesStringToList(pCxt->pCreateSmaReq->expr, &pProjects);
|
code = nodesStringToList(pCxt->pCreateSmaReq->expr, &pProjects);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
|
@ -1830,8 +1830,8 @@ _OVER:
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndTSMAGenerateOutputName(const char* tsmaName, char* streamName, char* targetStbName) {
|
static int32_t mndTSMAGenerateOutputName(const char *tsmaName, char *streamName, char *targetStbName) {
|
||||||
SName smaName;
|
SName smaName;
|
||||||
int32_t code = tNameFromString(&smaName, tsmaName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
int32_t code = tNameFromString(&smaName, tsmaName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
return code;
|
return code;
|
||||||
|
@ -1841,17 +1841,17 @@ static int32_t mndTSMAGenerateOutputName(const char* tsmaName, char* streamName,
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndProcessCreateTSMAReq(SRpcMsg* pReq) {
|
static int32_t mndProcessCreateTSMAReq(SRpcMsg *pReq) {
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
TAOS_RETURN(TSDB_CODE_MND_INVALID_PLATFORM);
|
TAOS_RETURN(TSDB_CODE_MND_INVALID_PLATFORM);
|
||||||
#endif
|
#endif
|
||||||
SMnode * pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
SDbObj * pDb = NULL;
|
SDbObj *pDb = NULL;
|
||||||
SStbObj * pStb = NULL;
|
SStbObj *pStb = NULL;
|
||||||
SSmaObj * pSma = NULL;
|
SSmaObj *pSma = NULL;
|
||||||
SSmaObj * pBaseTsma = NULL;
|
SSmaObj *pBaseTsma = NULL;
|
||||||
SStreamObj * pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
int64_t mTraceId = TRACE_GET_ROOTID(&pReq->info.traceId);
|
int64_t mTraceId = TRACE_GET_ROOTID(&pReq->info.traceId);
|
||||||
SMCreateSmaReq createReq = {0};
|
SMCreateSmaReq createReq = {0};
|
||||||
|
|
||||||
|
@ -1941,16 +1941,16 @@ static int32_t mndProcessCreateTSMAReq(SRpcMsg* pReq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SCreateTSMACxt cxt = {
|
SCreateTSMACxt cxt = {
|
||||||
.pMnode = pMnode,
|
.pMnode = pMnode,
|
||||||
.pCreateSmaReq = &createReq,
|
.pCreateSmaReq = &createReq,
|
||||||
.pCreateStreamReq = NULL,
|
.pCreateStreamReq = NULL,
|
||||||
.streamName = streamName,
|
.streamName = streamName,
|
||||||
.targetStbFullName = streamTargetStbFullName,
|
.targetStbFullName = streamTargetStbFullName,
|
||||||
.pDb = pDb,
|
.pDb = pDb,
|
||||||
.pRpcReq = pReq,
|
.pRpcReq = pReq,
|
||||||
.pSma = NULL,
|
.pSma = NULL,
|
||||||
.pBaseSma = pBaseTsma,
|
.pBaseSma = pBaseTsma,
|
||||||
.pSrcStb = pStb,
|
.pSrcStb = pStb,
|
||||||
};
|
};
|
||||||
|
|
||||||
code = mndCreateTSMA(&cxt);
|
code = mndCreateTSMA(&cxt);
|
||||||
|
@ -1971,10 +1971,10 @@ _OVER:
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndDropTSMA(SCreateTSMACxt* pCxt) {
|
static int32_t mndDropTSMA(SCreateTSMACxt *pCxt) {
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
STransAction dropStreamRedoAction = {0};
|
STransAction dropStreamRedoAction = {0};
|
||||||
STrans *pTrans = mndTransCreate(pCxt->pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_TSMA, pCxt->pRpcReq, "drop-tsma");
|
STrans *pTrans = mndTransCreate(pCxt->pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_TSMA, pCxt->pRpcReq, "drop-tsma");
|
||||||
if (!pTrans) {
|
if (!pTrans) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
|
@ -2021,7 +2021,8 @@ static int32_t mndDropTSMA(SCreateTSMACxt* pCxt) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
if (dropStbRedoAction.contLen != tSerializeSMDropStbReq(dropStbRedoAction.pCont, dropStbRedoAction.contLen, &dropStbReq)) {
|
if (dropStbRedoAction.contLen !=
|
||||||
|
tSerializeSMDropStbReq(dropStbRedoAction.pCont, dropStbRedoAction.contLen, &dropStbReq)) {
|
||||||
mError("tsma: %s, failedto drop due to drop stb req encode failure", pCxt->pDropSmaReq->name);
|
mError("tsma: %s, failedto drop due to drop stb req encode failure", pCxt->pDropSmaReq->name);
|
||||||
code = TSDB_CODE_INVALID_MSG;
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
|
@ -2044,9 +2045,9 @@ _OVER:
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool hasRecursiveTsmasBasedOnMe(SMnode* pMnode, const SSmaObj* pSma) {
|
static bool hasRecursiveTsmasBasedOnMe(SMnode *pMnode, const SSmaObj *pSma) {
|
||||||
SSmaObj *pSmaObj = NULL;
|
SSmaObj *pSmaObj = NULL;
|
||||||
void * pIter = NULL;
|
void *pIter = NULL;
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = sdbFetch(pMnode->pSdb, SDB_SMA, pIter, (void **)&pSmaObj);
|
pIter = sdbFetch(pMnode->pSdb, SDB_SMA, pIter, (void **)&pSmaObj);
|
||||||
if (pIter == NULL) break;
|
if (pIter == NULL) break;
|
||||||
|
@ -2060,25 +2061,25 @@ static bool hasRecursiveTsmasBasedOnMe(SMnode* pMnode, const SSmaObj* pSma) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndProcessDropTSMAReq(SRpcMsg* pReq) {
|
static int32_t mndProcessDropTSMAReq(SRpcMsg *pReq) {
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
SMDropSmaReq dropReq = {0};
|
SMDropSmaReq dropReq = {0};
|
||||||
SSmaObj * pSma = NULL;
|
SSmaObj *pSma = NULL;
|
||||||
SDbObj * pDb = NULL;
|
SDbObj *pDb = NULL;
|
||||||
SMnode * pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
if (tDeserializeSMDropSmaReq(pReq->pCont, pReq->contLen, &dropReq) != TSDB_CODE_SUCCESS) {
|
if (tDeserializeSMDropSmaReq(pReq->pCont, pReq->contLen, &dropReq) != TSDB_CODE_SUCCESS) {
|
||||||
code = TSDB_CODE_INVALID_MSG;
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
char streamName[TSDB_TABLE_FNAME_LEN] = {0};
|
char streamName[TSDB_TABLE_FNAME_LEN] = {0};
|
||||||
char streamTargetStbFullName[TSDB_TABLE_FNAME_LEN] = {0};
|
char streamTargetStbFullName[TSDB_TABLE_FNAME_LEN] = {0};
|
||||||
code = mndTSMAGenerateOutputName(dropReq.name, streamName, streamTargetStbFullName);
|
code = mndTSMAGenerateOutputName(dropReq.name, streamName, streamTargetStbFullName);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
SStbObj* pStb = mndAcquireStb(pMnode, streamTargetStbFullName);
|
SStbObj *pStb = mndAcquireStb(pMnode, streamTargetStbFullName);
|
||||||
|
|
||||||
pSma = mndAcquireSma(pMnode, dropReq.name);
|
pSma = mndAcquireSma(pMnode, dropReq.name);
|
||||||
if (!pSma && dropReq.igNotExists) {
|
if (!pSma && dropReq.igNotExists) {
|
||||||
|
@ -2113,13 +2114,13 @@ static int32_t mndProcessDropTSMAReq(SRpcMsg* pReq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SCreateTSMACxt cxt = {
|
SCreateTSMACxt cxt = {
|
||||||
.pDb = pDb,
|
.pDb = pDb,
|
||||||
.pMnode = pMnode,
|
.pMnode = pMnode,
|
||||||
.pRpcReq = pReq,
|
.pRpcReq = pReq,
|
||||||
.pSma = pSma,
|
.pSma = pSma,
|
||||||
.streamName = streamName,
|
.streamName = streamName,
|
||||||
.targetStbFullName = streamTargetStbFullName,
|
.targetStbFullName = streamTargetStbFullName,
|
||||||
.pDropSmaReq = &dropReq,
|
.pDropSmaReq = &dropReq,
|
||||||
};
|
};
|
||||||
|
|
||||||
code = mndDropTSMA(&cxt);
|
code = mndDropTSMA(&cxt);
|
||||||
|
@ -2134,10 +2135,10 @@ _OVER:
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndRetrieveTSMA(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
|
static int32_t mndRetrieveTSMA(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
|
||||||
SDbObj * pDb = NULL;
|
SDbObj *pDb = NULL;
|
||||||
int32_t numOfRows = 0;
|
int32_t numOfRows = 0;
|
||||||
SSmaObj * pSma = NULL;
|
SSmaObj *pSma = NULL;
|
||||||
SMnode * pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SColumnInfoData *pColInfo;
|
SColumnInfoData *pColInfo;
|
||||||
if (pShow->pIter == NULL) {
|
if (pShow->pIter == NULL) {
|
||||||
|
@ -2153,7 +2154,7 @@ static int32_t mndRetrieveTSMA(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlo
|
||||||
while (numOfRows < rows) {
|
while (numOfRows < rows) {
|
||||||
pIter->pSmaIter = sdbFetch(pMnode->pSdb, SDB_SMA, pIter->pSmaIter, (void **)&pSma);
|
pIter->pSmaIter = sdbFetch(pMnode->pSdb, SDB_SMA, pIter->pSmaIter, (void **)&pSma);
|
||||||
if (pIter->pSmaIter == NULL) break;
|
if (pIter->pSmaIter == NULL) break;
|
||||||
SDbObj* pSrcDb = mndAcquireDb(pMnode, pSma->db);
|
SDbObj *pSrcDb = mndAcquireDb(pMnode, pSma->db);
|
||||||
|
|
||||||
if ((pDb && pSma->dbUid != pDb->uid) || !pSrcDb) {
|
if ((pDb && pSma->dbUid != pDb->uid) || !pSrcDb) {
|
||||||
sdbRelease(pMnode->pSdb, pSma);
|
sdbRelease(pMnode->pSdb, pSma);
|
||||||
|
@ -2176,7 +2177,7 @@ static int32_t mndRetrieveTSMA(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlo
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
STR_TO_VARSTR(db, (char *)mndGetDbStr(pSma->db));
|
STR_TO_VARSTR(db, (char *)mndGetDbStr(pSma->db));
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
code = colDataSetVal(pColInfo, numOfRows, (const char*)db, false);
|
code = colDataSetVal(pColInfo, numOfRows, (const char *)db, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
@ -2186,12 +2187,12 @@ static int32_t mndRetrieveTSMA(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlo
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
STR_TO_VARSTR(srcTb, (char *)tNameGetTableName(&n));
|
STR_TO_VARSTR(srcTb, (char *)tNameGetTableName(&n));
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
code = colDataSetVal(pColInfo, numOfRows, (const char*)srcTb, false);
|
code = colDataSetVal(pColInfo, numOfRows, (const char *)srcTb, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
code = colDataSetVal(pColInfo, numOfRows, (const char*)db, false);
|
code = colDataSetVal(pColInfo, numOfRows, (const char *)db, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
@ -2200,29 +2201,29 @@ static int32_t mndRetrieveTSMA(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlo
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
char targetTb[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
char targetTb[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
STR_TO_VARSTR(targetTb, (char*)tNameGetTableName(&n));
|
STR_TO_VARSTR(targetTb, (char *)tNameGetTableName(&n));
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
code = colDataSetVal(pColInfo, numOfRows, (const char*)targetTb, false);
|
code = colDataSetVal(pColInfo, numOfRows, (const char *)targetTb, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
// stream name
|
// stream name
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
code = colDataSetVal(pColInfo, numOfRows, (const char*)smaName, false);
|
code = colDataSetVal(pColInfo, numOfRows, (const char *)smaName, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
code = colDataSetVal(pColInfo, numOfRows, (const char*)(&pSma->createdTime), false);
|
code = colDataSetVal(pColInfo, numOfRows, (const char *)(&pSma->createdTime), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// interval
|
// interval
|
||||||
char interval[64 + VARSTR_HEADER_SIZE] = {0};
|
char interval[64 + VARSTR_HEADER_SIZE] = {0};
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
if (!IS_CALENDAR_TIME_DURATION(pSma->intervalUnit)) {
|
if (!IS_CALENDAR_TIME_DURATION(pSma->intervalUnit)) {
|
||||||
len = tsnprintf(interval + VARSTR_HEADER_SIZE, 64, "%" PRId64 "%c", pSma->interval,
|
len = tsnprintf(interval + VARSTR_HEADER_SIZE, 64, "%" PRId64 "%c", pSma->interval,
|
||||||
getPrecisionUnit(pSrcDb->cfg.precision));
|
getPrecisionUnit(pSrcDb->cfg.precision));
|
||||||
} else {
|
} else {
|
||||||
len = tsnprintf(interval + VARSTR_HEADER_SIZE, 64, "%" PRId64 "%c", pSma->interval, pSma->intervalUnit);
|
len = tsnprintf(interval + VARSTR_HEADER_SIZE, 64, "%" PRId64 "%c", pSma->interval, pSma->intervalUnit);
|
||||||
}
|
}
|
||||||
|
@ -2243,17 +2244,17 @@ static int32_t mndRetrieveTSMA(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlo
|
||||||
// func list
|
// func list
|
||||||
len = 0;
|
len = 0;
|
||||||
SNode *pNode = NULL, *pFunc = NULL;
|
SNode *pNode = NULL, *pFunc = NULL;
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = nodesStringToNode(pSma->ast, &pNode);
|
code = nodesStringToNode(pSma->ast, &pNode);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
char * start = buf + VARSTR_HEADER_SIZE;
|
char *start = buf + VARSTR_HEADER_SIZE;
|
||||||
FOREACH(pFunc, ((SSelectStmt *)pNode)->pProjectionList) {
|
FOREACH(pFunc, ((SSelectStmt *)pNode)->pProjectionList) {
|
||||||
if (nodeType(pFunc) == QUERY_NODE_FUNCTION) {
|
if (nodeType(pFunc) == QUERY_NODE_FUNCTION) {
|
||||||
SFunctionNode *pFuncNode = (SFunctionNode *)pFunc;
|
SFunctionNode *pFuncNode = (SFunctionNode *)pFunc;
|
||||||
if (!fmIsTSMASupportedFunc(pFuncNode->funcId)) continue;
|
if (!fmIsTSMASupportedFunc(pFuncNode->funcId)) continue;
|
||||||
len += tsnprintf(start, TSDB_MAX_SAVED_SQL_LEN - len, "%s%s", start != buf + VARSTR_HEADER_SIZE ? "," : "",
|
len += tsnprintf(start, TSDB_MAX_SAVED_SQL_LEN - len, "%s%s", start != buf + VARSTR_HEADER_SIZE ? "," : "",
|
||||||
((SExprNode *)pFunc)->userAlias);
|
((SExprNode *)pFunc)->userAlias);
|
||||||
if (len >= TSDB_MAX_SAVED_SQL_LEN) {
|
if (len >= TSDB_MAX_SAVED_SQL_LEN) {
|
||||||
len = TSDB_MAX_SAVED_SQL_LEN;
|
len = TSDB_MAX_SAVED_SQL_LEN;
|
||||||
break;
|
break;
|
||||||
|
@ -2297,7 +2298,8 @@ static void mndCancelRetrieveTSMA(SMnode *pMnode, void *pIter) {
|
||||||
taosMemoryFree(p);
|
taosMemoryFree(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t dumpTSMAInfoFromSmaObj(const SSmaObj* pSma, const SStbObj* pDestStb, STableTSMAInfo* pInfo, const SSmaObj* pBaseTsma) {
|
int32_t dumpTSMAInfoFromSmaObj(const SSmaObj *pSma, const SStbObj *pDestStb, STableTSMAInfo *pInfo,
|
||||||
|
const SSmaObj *pBaseTsma) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
pInfo->interval = pSma->interval;
|
pInfo->interval = pSma->interval;
|
||||||
pInfo->unit = pSma->intervalUnit;
|
pInfo->unit = pSma->intervalUnit;
|
||||||
|
@ -2336,7 +2338,7 @@ int32_t dumpTSMAInfoFromSmaObj(const SSmaObj* pSma, const SStbObj* pDestStb, STa
|
||||||
SSelectStmt *pSelect = (SSelectStmt *)pNode;
|
SSelectStmt *pSelect = (SSelectStmt *)pNode;
|
||||||
FOREACH(pFunc, pSelect->pProjectionList) {
|
FOREACH(pFunc, pSelect->pProjectionList) {
|
||||||
STableTSMAFuncInfo funcInfo = {0};
|
STableTSMAFuncInfo funcInfo = {0};
|
||||||
SFunctionNode * pFuncNode = (SFunctionNode *)pFunc;
|
SFunctionNode *pFuncNode = (SFunctionNode *)pFunc;
|
||||||
if (!fmIsTSMASupportedFunc(pFuncNode->funcId)) continue;
|
if (!fmIsTSMASupportedFunc(pFuncNode->funcId)) continue;
|
||||||
funcInfo.funcId = pFuncNode->funcId;
|
funcInfo.funcId = pFuncNode->funcId;
|
||||||
funcInfo.colId = ((SColumnNode *)pFuncNode->pParameterList->pHead->pNode)->colId;
|
funcInfo.colId = ((SColumnNode *)pFuncNode->pParameterList->pHead->pNode)->colId;
|
||||||
|
@ -2383,9 +2385,9 @@ int32_t dumpTSMAInfoFromSmaObj(const SSmaObj* pSma, const SStbObj* pDestStb, STa
|
||||||
}
|
}
|
||||||
|
|
||||||
// @note remember to mndReleaseSma(*ppOut)
|
// @note remember to mndReleaseSma(*ppOut)
|
||||||
static int32_t mndGetDeepestBaseForTsma(SMnode* pMnode, SSmaObj* pSma, SSmaObj** ppOut) {
|
static int32_t mndGetDeepestBaseForTsma(SMnode *pMnode, SSmaObj *pSma, SSmaObj **ppOut) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SSmaObj* pRecursiveTsma = NULL;
|
SSmaObj *pRecursiveTsma = NULL;
|
||||||
if (pSma->baseSmaName[0]) {
|
if (pSma->baseSmaName[0]) {
|
||||||
pRecursiveTsma = mndAcquireSma(pMnode, pSma->baseSmaName);
|
pRecursiveTsma = mndAcquireSma(pMnode, pSma->baseSmaName);
|
||||||
if (!pRecursiveTsma) {
|
if (!pRecursiveTsma) {
|
||||||
|
@ -2393,7 +2395,7 @@ static int32_t mndGetDeepestBaseForTsma(SMnode* pMnode, SSmaObj* pSma, SSmaObj**
|
||||||
return TSDB_CODE_MND_SMA_NOT_EXIST;
|
return TSDB_CODE_MND_SMA_NOT_EXIST;
|
||||||
}
|
}
|
||||||
while (pRecursiveTsma->baseSmaName[0]) {
|
while (pRecursiveTsma->baseSmaName[0]) {
|
||||||
SSmaObj* pTmpSma = pRecursiveTsma;
|
SSmaObj *pTmpSma = pRecursiveTsma;
|
||||||
pRecursiveTsma = mndAcquireSma(pMnode, pTmpSma->baseSmaName);
|
pRecursiveTsma = mndAcquireSma(pMnode, pTmpSma->baseSmaName);
|
||||||
if (!pRecursiveTsma) {
|
if (!pRecursiveTsma) {
|
||||||
mError("base tsma: %s for tsma: %s not found", pTmpSma->baseSmaName, pTmpSma->name);
|
mError("base tsma: %s for tsma: %s not found", pTmpSma->baseSmaName, pTmpSma->name);
|
||||||
|
@ -2407,7 +2409,6 @@ static int32_t mndGetDeepestBaseForTsma(SMnode* pMnode, SSmaObj* pSma, SSmaObj**
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int32_t mndGetTSMA(SMnode *pMnode, char *tsmaFName, STableTSMAInfoRsp *rsp, bool *exist) {
|
static int32_t mndGetTSMA(SMnode *pMnode, char *tsmaFName, STableTSMAInfoRsp *rsp, bool *exist) {
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
SSmaObj *pSma = NULL;
|
SSmaObj *pSma = NULL;
|
||||||
|
@ -2450,17 +2451,17 @@ static int32_t mndGetTSMA(SMnode *pMnode, char *tsmaFName, STableTSMAInfoRsp *rs
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef bool (*tsmaFilter)(const SSmaObj* pSma, void* param);
|
typedef bool (*tsmaFilter)(const SSmaObj *pSma, void *param);
|
||||||
|
|
||||||
static int32_t mndGetSomeTsmas(SMnode* pMnode, STableTSMAInfoRsp* pRsp, tsmaFilter filtered, void* param, bool* exist) {
|
static int32_t mndGetSomeTsmas(SMnode *pMnode, STableTSMAInfoRsp *pRsp, tsmaFilter filtered, void *param, bool *exist) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SSmaObj * pSma = NULL;
|
SSmaObj *pSma = NULL;
|
||||||
SSmaObj * pBaseTsma = NULL;
|
SSmaObj *pBaseTsma = NULL;
|
||||||
SSdb * pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
void * pIter = NULL;
|
void *pIter = NULL;
|
||||||
SStreamObj * pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
SStbObj * pStb = NULL;
|
SStbObj *pStb = NULL;
|
||||||
bool shouldRetry = false;
|
bool shouldRetry = false;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = sdbFetch(pSdb, SDB_SMA, pIter, (void **)&pSma);
|
pIter = sdbFetch(pSdb, SDB_SMA, pIter, (void **)&pSma);
|
||||||
|
@ -2479,7 +2480,7 @@ static int32_t mndGetSomeTsmas(SMnode* pMnode, STableTSMAInfoRsp* pRsp, tsmaFilt
|
||||||
}
|
}
|
||||||
|
|
||||||
SName smaName;
|
SName smaName;
|
||||||
char streamName[TSDB_TABLE_FNAME_LEN] = {0};
|
char streamName[TSDB_TABLE_FNAME_LEN] = {0};
|
||||||
code = tNameFromString(&smaName, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
code = tNameFromString(&smaName, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
sdbRelease(pSdb, pSma);
|
sdbRelease(pSdb, pSma);
|
||||||
|
@ -2541,8 +2542,8 @@ static int32_t mndGetSomeTsmas(SMnode* pMnode, STableTSMAInfoRsp* pRsp, tsmaFilt
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool tsmaTbFilter(const SSmaObj* pSma, void* param) {
|
static bool tsmaTbFilter(const SSmaObj *pSma, void *param) {
|
||||||
const char* tbFName = param;
|
const char *tbFName = param;
|
||||||
return pSma->stb[0] != tbFName[0] || strcmp(pSma->stb, tbFName) != 0;
|
return pSma->stb[0] != tbFName[0] || strcmp(pSma->stb, tbFName) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2550,7 +2551,7 @@ static int32_t mndGetTableTSMA(SMnode *pMnode, char *tbFName, STableTSMAInfoRsp
|
||||||
return mndGetSomeTsmas(pMnode, pRsp, tsmaTbFilter, tbFName, exist);
|
return mndGetSomeTsmas(pMnode, pRsp, tsmaTbFilter, tbFName, exist);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool tsmaDbFilter(const SSmaObj* pSma, void* param) {
|
static bool tsmaDbFilter(const SSmaObj *pSma, void *param) {
|
||||||
uint64_t *dbUid = param;
|
uint64_t *dbUid = param;
|
||||||
return pSma->dbUid != *dbUid;
|
return pSma->dbUid != *dbUid;
|
||||||
}
|
}
|
||||||
|
@ -2564,7 +2565,7 @@ static int32_t mndProcessGetTbTSMAReq(SRpcMsg *pReq) {
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
STableTSMAInfoReq tsmaReq = {0};
|
STableTSMAInfoReq tsmaReq = {0};
|
||||||
bool exist = false;
|
bool exist = false;
|
||||||
SMnode * pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
|
|
||||||
TAOS_CHECK_GOTO(tDeserializeTableTSMAInfoReq(pReq->pCont, pReq->contLen, &tsmaReq), NULL, _OVER);
|
TAOS_CHECK_GOTO(tDeserializeTableTSMAInfoReq(pReq->pCont, pReq->contLen, &tsmaReq), NULL, _OVER);
|
||||||
|
|
||||||
|
@ -2635,12 +2636,12 @@ static int32_t mkNonExistTSMAInfo(const STSMAVersion *pTsmaVer, STableTSMAInfo *
|
||||||
|
|
||||||
int32_t mndValidateTSMAInfo(SMnode *pMnode, STSMAVersion *pTsmaVersions, int32_t numOfTsmas, void **ppRsp,
|
int32_t mndValidateTSMAInfo(SMnode *pMnode, STSMAVersion *pTsmaVersions, int32_t numOfTsmas, void **ppRsp,
|
||||||
int32_t *pRspLen) {
|
int32_t *pRspLen) {
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
STSMAHbRsp hbRsp = {0};
|
STSMAHbRsp hbRsp = {0};
|
||||||
int32_t rspLen = 0;
|
int32_t rspLen = 0;
|
||||||
void * pRsp = NULL;
|
void *pRsp = NULL;
|
||||||
char tsmaFName[TSDB_TABLE_FNAME_LEN] = {0};
|
char tsmaFName[TSDB_TABLE_FNAME_LEN] = {0};
|
||||||
STableTSMAInfo * pTsmaInfo = NULL;
|
STableTSMAInfo *pTsmaInfo = NULL;
|
||||||
|
|
||||||
hbRsp.pTsmas = taosArrayInit(numOfTsmas, POINTER_BYTES);
|
hbRsp.pTsmas = taosArrayInit(numOfTsmas, POINTER_BYTES);
|
||||||
if (!hbRsp.pTsmas) {
|
if (!hbRsp.pTsmas) {
|
||||||
|
@ -2649,13 +2650,13 @@ int32_t mndValidateTSMAInfo(SMnode *pMnode, STSMAVersion *pTsmaVersions, int32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfTsmas; ++i) {
|
for (int32_t i = 0; i < numOfTsmas; ++i) {
|
||||||
STSMAVersion* pTsmaVer = &pTsmaVersions[i];
|
STSMAVersion *pTsmaVer = &pTsmaVersions[i];
|
||||||
pTsmaVer->dbId = be64toh(pTsmaVer->dbId);
|
pTsmaVer->dbId = be64toh(pTsmaVer->dbId);
|
||||||
pTsmaVer->tsmaId = be64toh(pTsmaVer->tsmaId);
|
pTsmaVer->tsmaId = be64toh(pTsmaVer->tsmaId);
|
||||||
pTsmaVer->version = ntohl(pTsmaVer->version);
|
pTsmaVer->version = ntohl(pTsmaVer->version);
|
||||||
|
|
||||||
snprintf(tsmaFName, sizeof(tsmaFName), "%s.%s", pTsmaVer->dbFName, pTsmaVer->name);
|
snprintf(tsmaFName, sizeof(tsmaFName), "%s.%s", pTsmaVer->dbFName, pTsmaVer->name);
|
||||||
SSmaObj* pSma = mndAcquireSma(pMnode, tsmaFName);
|
SSmaObj *pSma = mndAcquireSma(pMnode, tsmaFName);
|
||||||
if (!pSma) {
|
if (!pSma) {
|
||||||
code = mkNonExistTSMAInfo(pTsmaVer, &pTsmaInfo);
|
code = mkNonExistTSMAInfo(pTsmaVer, &pTsmaInfo);
|
||||||
if (code) goto _OVER;
|
if (code) goto _OVER;
|
||||||
|
@ -2683,7 +2684,7 @@ int32_t mndValidateTSMAInfo(SMnode *pMnode, STSMAVersion *pTsmaVersions, int32_t
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SStbObj* pDestStb = mndAcquireStb(pMnode, pSma->dstTbName);
|
SStbObj *pDestStb = mndAcquireStb(pMnode, pSma->dstTbName);
|
||||||
if (!pDestStb) {
|
if (!pDestStb) {
|
||||||
mInfo("tsma: %s.%" PRIx64 " dest stb: %s not found, maybe dropped", tsmaFName, pTsmaVer->tsmaId, pSma->dstTbName);
|
mInfo("tsma: %s.%" PRIx64 " dest stb: %s not found, maybe dropped", tsmaFName, pTsmaVer->tsmaId, pSma->dstTbName);
|
||||||
code = mkNonExistTSMAInfo(pTsmaVer, &pTsmaInfo);
|
code = mkNonExistTSMAInfo(pTsmaVer, &pTsmaInfo);
|
||||||
|
@ -2698,7 +2699,7 @@ int32_t mndValidateTSMAInfo(SMnode *pMnode, STSMAVersion *pTsmaVersions, int32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
// dump smaObj into rsp
|
// dump smaObj into rsp
|
||||||
STableTSMAInfo * pInfo = NULL;
|
STableTSMAInfo *pInfo = NULL;
|
||||||
pInfo = taosMemoryCalloc(1, sizeof(STableTSMAInfo));
|
pInfo = taosMemoryCalloc(1, sizeof(STableTSMAInfo));
|
||||||
if (!pInfo) {
|
if (!pInfo) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
|
@ -2707,7 +2708,7 @@ int32_t mndValidateTSMAInfo(SMnode *pMnode, STSMAVersion *pTsmaVersions, int32_t
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSmaObj* pBaseSma = NULL;
|
SSmaObj *pBaseSma = NULL;
|
||||||
code = mndGetDeepestBaseForTsma(pMnode, pSma, &pBaseSma);
|
code = mndGetDeepestBaseForTsma(pMnode, pSma, &pBaseSma);
|
||||||
if (code == 0) code = dumpTSMAInfoFromSmaObj(pSma, pDestStb, pInfo, pBaseSma);
|
if (code == 0) code = dumpTSMAInfoFromSmaObj(pSma, pDestStb, pInfo, pBaseSma);
|
||||||
|
|
||||||
|
|
|
@ -1706,8 +1706,8 @@ static int32_t mndCreateUser(SMnode *pMnode, char *acct, SCreateUserReq *pCreate
|
||||||
if (pCreate->isImport != 1) {
|
if (pCreate->isImport != 1) {
|
||||||
taosEncryptPass_c((uint8_t *)pCreate->pass, strlen(pCreate->pass), userObj.pass);
|
taosEncryptPass_c((uint8_t *)pCreate->pass, strlen(pCreate->pass), userObj.pass);
|
||||||
} else {
|
} else {
|
||||||
// mInfo("pCreate->pass:%s", pCreate->pass)
|
// mInfo("pCreate->pass:%s", pCreate->eass)
|
||||||
strncpy(userObj.pass, pCreate->pass, TSDB_PASSWORD_LEN);
|
memcpy(userObj.pass, pCreate->pass, TSDB_PASSWORD_LEN);
|
||||||
}
|
}
|
||||||
tstrncpy(userObj.user, pCreate->user, TSDB_USER_LEN);
|
tstrncpy(userObj.user, pCreate->user, TSDB_USER_LEN);
|
||||||
tstrncpy(userObj.acct, acct, TSDB_USER_LEN);
|
tstrncpy(userObj.acct, acct, TSDB_USER_LEN);
|
||||||
|
@ -1803,6 +1803,43 @@ _OVER:
|
||||||
TAOS_RETURN(code);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndCheckPasswordFmt(const char *pwd) {
|
||||||
|
int32_t len = strlen(pwd);
|
||||||
|
if (len < TSDB_PASSWORD_MIN_LEN || len > TSDB_PASSWORD_MAX_LEN) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(pwd, "taosdata") == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool charTypes[4] = {0};
|
||||||
|
for (int32_t i = 0; i < len; ++i) {
|
||||||
|
if (taosIsBigChar(pwd[i])) {
|
||||||
|
charTypes[0] = true;
|
||||||
|
} else if (taosIsSmallChar(pwd[i])) {
|
||||||
|
charTypes[1] = true;
|
||||||
|
} else if (taosIsNumberChar(pwd[i])) {
|
||||||
|
charTypes[2] = true;
|
||||||
|
} else if (taosIsSpecialChar(pwd[i])) {
|
||||||
|
charTypes[3] = true;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t numOfTypes = 0;
|
||||||
|
for (int32_t i = 0; i < 4; ++i) {
|
||||||
|
numOfTypes += charTypes[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numOfTypes < 3) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndProcessCreateUserReq(SRpcMsg *pReq) {
|
static int32_t mndProcessCreateUserReq(SRpcMsg *pReq) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1836,7 +1873,7 @@ static int32_t mndProcessCreateUserReq(SRpcMsg *pReq) {
|
||||||
TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_USER_FORMAT, &lino, _OVER);
|
TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_USER_FORMAT, &lino, _OVER);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (createReq.pass[0] == 0) {
|
if (mndCheckPasswordFmt(createReq.pass) != 0) {
|
||||||
TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_PASS_FORMAT, &lino, _OVER);
|
TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_PASS_FORMAT, &lino, _OVER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2325,8 +2362,7 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) {
|
||||||
TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_USER_FORMAT, &lino, _OVER);
|
TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_USER_FORMAT, &lino, _OVER);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_ALTER_USER_PASSWD == alterReq.alterType &&
|
if (TSDB_ALTER_USER_PASSWD == alterReq.alterType && mndCheckPasswordFmt(alterReq.pass) != 0) {
|
||||||
(alterReq.pass[0] == 0 || strlen(alterReq.pass) >= TSDB_PASSWORD_LEN)) {
|
|
||||||
TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_PASS_FORMAT, &lino, _OVER);
|
TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_PASS_FORMAT, &lino, _OVER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -370,7 +370,7 @@ static int32_t sdbReadFileImp(SSdb *pSdb) {
|
||||||
opts.source = pRaw->pData;
|
opts.source = pRaw->pData;
|
||||||
opts.result = plantContent;
|
opts.result = plantContent;
|
||||||
opts.unitLen = 16;
|
opts.unitLen = 16;
|
||||||
strncpy(opts.key, tsEncryptKey, ENCRYPT_KEY_LEN);
|
tstrncpy(opts.key, tsEncryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
|
|
||||||
count = CBC_Decrypt(&opts);
|
count = CBC_Decrypt(&opts);
|
||||||
|
|
||||||
|
@ -515,7 +515,7 @@ static int32_t sdbWriteFileImp(SSdb *pSdb, int32_t skip_type) {
|
||||||
opts.source = pRaw->pData;
|
opts.source = pRaw->pData;
|
||||||
opts.result = newData;
|
opts.result = newData;
|
||||||
opts.unitLen = 16;
|
opts.unitLen = 16;
|
||||||
strncpy(opts.key, tsEncryptKey, ENCRYPT_KEY_LEN);
|
tstrncpy(opts.key, tsEncryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
|
|
||||||
int32_t count = CBC_Encrypt(&opts);
|
int32_t count = CBC_Encrypt(&opts);
|
||||||
|
|
||||||
|
|
|
@ -138,6 +138,7 @@ static int32_t metaOpenImpl(SVnode *pVnode, SMeta **ppMeta, const char *metaDir,
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int32_t lino;
|
int32_t lino;
|
||||||
int32_t offset;
|
int32_t offset;
|
||||||
|
int32_t pathLen = 0;
|
||||||
char path[TSDB_FILENAME_LEN] = {0};
|
char path[TSDB_FILENAME_LEN] = {0};
|
||||||
char indexFullPath[128] = {0};
|
char indexFullPath[128] = {0};
|
||||||
|
|
||||||
|
@ -150,14 +151,15 @@ static int32_t metaOpenImpl(SVnode *pVnode, SMeta **ppMeta, const char *metaDir,
|
||||||
taosRemoveDir(path);
|
taosRemoveDir(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pMeta = taosMemoryCalloc(1, sizeof(*pMeta) + strlen(path) + 1)) == NULL) {
|
pathLen = strlen(path) + 1;
|
||||||
|
if ((pMeta = taosMemoryCalloc(1, sizeof(*pMeta) + pathLen)) == NULL) {
|
||||||
TSDB_CHECK_CODE(code = terrno, lino, _exit);
|
TSDB_CHECK_CODE(code = terrno, lino, _exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
metaInitLock(pMeta);
|
metaInitLock(pMeta);
|
||||||
|
|
||||||
pMeta->path = (char *)&pMeta[1];
|
pMeta->path = (char *)&pMeta[1];
|
||||||
strcpy(pMeta->path, path);
|
tstrncpy(pMeta->path, path, pathLen);
|
||||||
int32_t ret = taosRealPath(pMeta->path, NULL, strlen(path) + 1);
|
int32_t ret = taosRealPath(pMeta->path, NULL, strlen(path) + 1);
|
||||||
|
|
||||||
pMeta->pVnode = pVnode;
|
pMeta->pVnode = pVnode;
|
||||||
|
|
|
@ -1189,7 +1189,7 @@ int metaCreateTable(SMeta *pMeta, int64_t ver, SVCreateTbReq *pReq, STableMetaRs
|
||||||
(*pMetaRsp)->tableType = TSDB_CHILD_TABLE;
|
(*pMetaRsp)->tableType = TSDB_CHILD_TABLE;
|
||||||
(*pMetaRsp)->tuid = pReq->uid;
|
(*pMetaRsp)->tuid = pReq->uid;
|
||||||
(*pMetaRsp)->suid = pReq->ctb.suid;
|
(*pMetaRsp)->suid = pReq->ctb.suid;
|
||||||
strcpy((*pMetaRsp)->tbName, pReq->name);
|
tstrncpy((*pMetaRsp)->tbName, pReq->name, strlen(pReq->name) + 1);
|
||||||
} else {
|
} else {
|
||||||
ret = metaUpdateMetaRsp(pReq->uid, pReq->name, &pReq->ntb.schemaRow, *pMetaRsp);
|
ret = metaUpdateMetaRsp(pReq->uid, pReq->name, &pReq->ntb.schemaRow, *pMetaRsp);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -1834,7 +1834,8 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl
|
||||||
pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].type = pAlterTbReq->type;
|
pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].type = pAlterTbReq->type;
|
||||||
pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].flags = pAlterTbReq->flags;
|
pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].flags = pAlterTbReq->flags;
|
||||||
pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].colId = entry.ntbEntry.ncid++;
|
pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].colId = entry.ntbEntry.ncid++;
|
||||||
strcpy(pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].name, pAlterTbReq->colName);
|
tstrncpy(pSchema->pSchema[entry.ntbEntry.schemaRow.nCols - 1].name, pAlterTbReq->colName,
|
||||||
|
strlen(pAlterTbReq->colName) + 1);
|
||||||
|
|
||||||
++pMeta->pVnode->config.vndStats.numOfNTimeSeries;
|
++pMeta->pVnode->config.vndStats.numOfNTimeSeries;
|
||||||
metaTimeSeriesNotifyCheck(pMeta);
|
metaTimeSeriesNotifyCheck(pMeta);
|
||||||
|
@ -1943,7 +1944,7 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
pSchema->version++;
|
pSchema->version++;
|
||||||
strcpy(pColumn->name, pAlterTbReq->colNewName);
|
tstrncpy(pColumn->name, pAlterTbReq->colNewName, strlen(pAlterTbReq->colNewName) + 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,18 +49,20 @@ const char *ttlV1Tbname = "ttlv1.idx";
|
||||||
int32_t ttlMgrOpen(STtlManger **ppTtlMgr, TDB *pEnv, int8_t rollback, const char *logPrefix, int32_t flushThreshold) {
|
int32_t ttlMgrOpen(STtlManger **ppTtlMgr, TDB *pEnv, int8_t rollback, const char *logPrefix, int32_t flushThreshold) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
int64_t startNs = taosGetTimestampNs();
|
int64_t startNs = taosGetTimestampNs();
|
||||||
|
int32_t pathLen = 0;
|
||||||
|
|
||||||
*ppTtlMgr = NULL;
|
*ppTtlMgr = NULL;
|
||||||
|
|
||||||
STtlManger *pTtlMgr = (STtlManger *)tdbOsCalloc(1, sizeof(*pTtlMgr));
|
STtlManger *pTtlMgr = (STtlManger *)tdbOsCalloc(1, sizeof(*pTtlMgr));
|
||||||
if (pTtlMgr == NULL) TAOS_RETURN(terrno);
|
if (pTtlMgr == NULL) TAOS_RETURN(terrno);
|
||||||
|
|
||||||
char *logBuffer = (char *)tdbOsCalloc(1, strlen(logPrefix) + 1);
|
pathLen = strlen(logPrefix) + 1;
|
||||||
|
char *logBuffer = (char *)tdbOsCalloc(1, pathLen);
|
||||||
if (logBuffer == NULL) {
|
if (logBuffer == NULL) {
|
||||||
tdbOsFree(pTtlMgr);
|
tdbOsFree(pTtlMgr);
|
||||||
TAOS_RETURN(terrno);
|
TAOS_RETURN(terrno);
|
||||||
}
|
}
|
||||||
(void)strcpy(logBuffer, logPrefix);
|
tstrncpy(logBuffer, logPrefix, pathLen);
|
||||||
pTtlMgr->logPrefix = logBuffer;
|
pTtlMgr->logPrefix = logBuffer;
|
||||||
pTtlMgr->flushThreshold = flushThreshold;
|
pTtlMgr->flushThreshold = flushThreshold;
|
||||||
|
|
||||||
|
|
|
@ -396,7 +396,7 @@ static int32_t tsdbFSAddEntryToFileObjHash(STFileHash *hash, const char *fname)
|
||||||
STFileHashEntry *entry = taosMemoryMalloc(sizeof(*entry));
|
STFileHashEntry *entry = taosMemoryMalloc(sizeof(*entry));
|
||||||
if (entry == NULL) return terrno;
|
if (entry == NULL) return terrno;
|
||||||
|
|
||||||
strncpy(entry->fname, fname, TSDB_FILENAME_LEN);
|
tstrncpy(entry->fname, fname, TSDB_FILENAME_LEN);
|
||||||
|
|
||||||
uint32_t idx = MurmurHash3_32(fname, strlen(fname)) % hash->numBucket;
|
uint32_t idx = MurmurHash3_32(fname, strlen(fname)) % hash->numBucket;
|
||||||
|
|
||||||
|
|
|
@ -175,7 +175,7 @@ static int32_t tsdbWriteFilePage(STsdbFD *pFD, int32_t encryptAlgorithm, char *e
|
||||||
opts.result = PacketData;
|
opts.result = PacketData;
|
||||||
opts.unitLen = 128;
|
opts.unitLen = 128;
|
||||||
// strncpy(opts.key, tsEncryptKey, 16);
|
// strncpy(opts.key, tsEncryptKey, 16);
|
||||||
strncpy(opts.key, encryptKey, ENCRYPT_KEY_LEN);
|
tstrncpy(opts.key, encryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
|
|
||||||
NewLen = CBC_Encrypt(&opts);
|
NewLen = CBC_Encrypt(&opts);
|
||||||
|
|
||||||
|
@ -249,7 +249,7 @@ static int32_t tsdbReadFilePage(STsdbFD *pFD, int64_t pgno, int32_t encryptAlgor
|
||||||
opts.result = PacketData;
|
opts.result = PacketData;
|
||||||
opts.unitLen = 128;
|
opts.unitLen = 128;
|
||||||
// strncpy(opts.key, tsEncryptKey, 16);
|
// strncpy(opts.key, tsEncryptKey, 16);
|
||||||
strncpy(opts.key, encryptKey, ENCRYPT_KEY_LEN);
|
tstrncpy(opts.key, encryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
|
|
||||||
NewLen = CBC_Decrypt(&opts);
|
NewLen = CBC_Decrypt(&opts);
|
||||||
|
|
||||||
|
|
|
@ -265,7 +265,7 @@ int vnodeDecodeConfig(const SJson *pJson, void *pObj) {
|
||||||
if (tsEncryptKey[0] == 0) {
|
if (tsEncryptKey[0] == 0) {
|
||||||
return terrno = TSDB_CODE_DNODE_INVALID_ENCRYPTKEY;
|
return terrno = TSDB_CODE_DNODE_INVALID_ENCRYPTKEY;
|
||||||
} else {
|
} else {
|
||||||
strncpy(pCfg->tsdbCfg.encryptKey, tsEncryptKey, ENCRYPT_KEY_LEN);
|
tstrncpy(pCfg->tsdbCfg.encryptKey, tsEncryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -292,7 +292,7 @@ int vnodeDecodeConfig(const SJson *pJson, void *pObj) {
|
||||||
if (tsEncryptKey[0] == 0) {
|
if (tsEncryptKey[0] == 0) {
|
||||||
return terrno = TSDB_CODE_DNODE_INVALID_ENCRYPTKEY;
|
return terrno = TSDB_CODE_DNODE_INVALID_ENCRYPTKEY;
|
||||||
} else {
|
} else {
|
||||||
strncpy(pCfg->walCfg.encryptKey, tsEncryptKey, ENCRYPT_KEY_LEN);
|
tstrncpy(pCfg->walCfg.encryptKey, tsEncryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -67,8 +67,17 @@ int32_t vnodeCreate(const char *path, SVnodeCfg *pCfg, int32_t diskPrimary, STfs
|
||||||
SVnodeInfo oldInfo = {0};
|
SVnodeInfo oldInfo = {0};
|
||||||
oldInfo.config = vnodeCfgDefault;
|
oldInfo.config = vnodeCfgDefault;
|
||||||
if (vnodeLoadInfo(dir, &oldInfo) == 0) {
|
if (vnodeLoadInfo(dir, &oldInfo) == 0) {
|
||||||
vWarn("vgId:%d, vnode config info already exists at %s.", oldInfo.config.vgId, dir);
|
code = (oldInfo.config.dbId == info.config.dbId) ? 0 : TSDB_CODE_VND_ALREADY_EXIST_BUT_NOT_MATCH;
|
||||||
return (oldInfo.config.dbId == info.config.dbId) ? 0 : -1;
|
if (code == 0) {
|
||||||
|
vWarn("vgId:%d, vnode config info already exists at %s.", oldInfo.config.vgId, dir);
|
||||||
|
} else {
|
||||||
|
vError("vgId:%d, vnode config info already exists at %s. oldDbId:%" PRId64 "(%s) at cluster:%" PRId64
|
||||||
|
", newDbId:%" PRId64 "(%s) at cluser:%" PRId64 ", code:%s",
|
||||||
|
oldInfo.config.vgId, dir, oldInfo.config.dbId, oldInfo.config.dbname,
|
||||||
|
oldInfo.config.syncCfg.nodeInfo[oldInfo.config.syncCfg.myIndex].clusterId, info.config.dbId,
|
||||||
|
info.config.dbname, info.config.syncCfg.nodeInfo[info.config.syncCfg.myIndex].clusterId, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
vInfo("vgId:%d, save config while create", info.config.vgId);
|
vInfo("vgId:%d, save config while create", info.config.vgId);
|
||||||
|
@ -190,7 +199,14 @@ int32_t vnodeRenameVgroupId(const char *srcPath, const char *dstPath, int32_t sr
|
||||||
char *tsdbFilePrefixPos = strstr(oldRname, tsdbFilePrefix);
|
char *tsdbFilePrefixPos = strstr(oldRname, tsdbFilePrefix);
|
||||||
if (tsdbFilePrefixPos == NULL) continue;
|
if (tsdbFilePrefixPos == NULL) continue;
|
||||||
|
|
||||||
int32_t tsdbFileVgId = atoi(tsdbFilePrefixPos + prefixLen);
|
int32_t tsdbFileVgId = 0; // atoi(tsdbFilePrefixPos + prefixLen);
|
||||||
|
ret = taosStr2int32(tsdbFilePrefixPos + prefixLen, &tsdbFileVgId);
|
||||||
|
if (ret != 0) {
|
||||||
|
vError("vgId:%d, failed to get tsdb file vgid since %s", dstVgId, tstrerror(ret));
|
||||||
|
tfsClosedir(tsdbDir);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (tsdbFileVgId == srcVgId) {
|
if (tsdbFileVgId == srcVgId) {
|
||||||
char *tsdbFileSurfixPos = tsdbFilePrefixPos + prefixLen + vnodeVgroupIdLen(srcVgId);
|
char *tsdbFileSurfixPos = tsdbFilePrefixPos + prefixLen + vnodeVgroupIdLen(srcVgId);
|
||||||
|
|
||||||
|
|
|
@ -1093,7 +1093,7 @@ static int32_t vnodeProcessFetchTtlExpiredTbs(SVnode *pVnode, int64_t ver, void
|
||||||
expiredTb.suid = *uid;
|
expiredTb.suid = *uid;
|
||||||
terrno = metaReaderGetTableEntryByUid(&mr, *uid);
|
terrno = metaReaderGetTableEntryByUid(&mr, *uid);
|
||||||
if (terrno < 0) goto _end;
|
if (terrno < 0) goto _end;
|
||||||
strncpy(buf, mr.me.name, TSDB_TABLE_NAME_LEN);
|
tstrncpy(buf, mr.me.name, TSDB_TABLE_NAME_LEN);
|
||||||
void *p = taosArrayPush(pNames, buf);
|
void *p = taosArrayPush(pNames, buf);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
goto _end;
|
goto _end;
|
||||||
|
|
|
@ -41,10 +41,11 @@ void taos_monitor_split_str_metric(char** arr, taos_metric_t* metric, const char
|
||||||
memset(name, 0, size + 1);
|
memset(name, 0, size + 1);
|
||||||
memcpy(name, metric->name, size);
|
memcpy(name, metric->name, size);
|
||||||
|
|
||||||
char* s = strtok(name, del);
|
char* saveptr;
|
||||||
|
char* s = strtok_r(name, del, &saveptr);
|
||||||
while (s != NULL) {
|
while (s != NULL) {
|
||||||
*arr++ = s;
|
*arr++ = s;
|
||||||
s = strtok(NULL, del);
|
s = strtok_r(NULL, del, &saveptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
*buf = name;
|
*buf = name;
|
||||||
|
|
|
@ -2887,13 +2887,16 @@ static int32_t getIpV4RangeFromWhitelistItem(char* ipRange, SIpV4Range* pIpRange
|
||||||
*slash = '\0';
|
*slash = '\0';
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
if (uv_inet_pton(AF_INET, ipCopy, &addr) == 0) {
|
if (uv_inet_pton(AF_INET, ipCopy, &addr) == 0) {
|
||||||
int prefix = atoi(slash + 1);
|
int32_t prefix = 0;
|
||||||
if (prefix < 0 || prefix > 32) {
|
code = taosStr2int32(slash + 1, &prefix);
|
||||||
code = TSDB_CODE_PAR_INVALID_IP_RANGE;
|
if (code == 0) {
|
||||||
} else {
|
if (prefix < 0 || prefix > 32) {
|
||||||
pIpRange->ip = addr.s_addr;
|
code = TSDB_CODE_PAR_INVALID_IP_RANGE;
|
||||||
pIpRange->mask = prefix;
|
} else {
|
||||||
code = TSDB_CODE_SUCCESS;
|
pIpRange->ip = addr.s_addr;
|
||||||
|
pIpRange->mask = prefix;
|
||||||
|
code = TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
code = TSDB_CODE_PAR_INVALID_IP_RANGE;
|
code = TSDB_CODE_PAR_INVALID_IP_RANGE;
|
||||||
|
|
|
@ -1017,11 +1017,11 @@ int32_t qBuildStmtTagFields(void* pBlock, void* boundTags, int32_t* fieldNum, TA
|
||||||
if (NULL == tags) {
|
if (NULL == tags) {
|
||||||
return TSDB_CODE_APP_ERROR;
|
return TSDB_CODE_APP_ERROR;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
if (pDataBlock->pMeta->tableType != TSDB_SUPER_TABLE && pDataBlock->pMeta->tableType != TSDB_CHILD_TABLE) {
|
if (pDataBlock->pMeta->tableType != TSDB_SUPER_TABLE && pDataBlock->pMeta->tableType != TSDB_CHILD_TABLE) {
|
||||||
return TSDB_CODE_TSC_STMT_API_ERROR;
|
return TSDB_CODE_TSC_STMT_API_ERROR;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
SSchema* pSchema = getTableTagSchema(pDataBlock->pMeta);
|
SSchema* pSchema = getTableTagSchema(pDataBlock->pMeta);
|
||||||
if (tags->numOfBound <= 0) {
|
if (tags->numOfBound <= 0) {
|
||||||
*fieldNum = 0;
|
*fieldNum = 0;
|
||||||
|
|
|
@ -613,10 +613,10 @@ static int32_t getIntegerFromAuthStr(const char* pStart, char** pNext) {
|
||||||
return taosStr2Int32(buf, NULL, 10);
|
return taosStr2Int32(buf, NULL, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getStringFromAuthStr(const char* pStart, char* pStr, char** pNext) {
|
static void getStringFromAuthStr(const char* pStart, char* pStr, uint32_t dstLen, char** pNext) {
|
||||||
char* p = strchr(pStart, '*');
|
char* p = strchr(pStart, '*');
|
||||||
if (NULL == p) {
|
if (NULL == p) {
|
||||||
tstrncpy(pStr, pStart, strlen(pStart) + 1);
|
tstrncpy(pStr, pStart, dstLen);
|
||||||
*pNext = NULL;
|
*pNext = NULL;
|
||||||
} else {
|
} else {
|
||||||
strncpy(pStr, pStart, p - pStart);
|
strncpy(pStr, pStart, p - pStart);
|
||||||
|
@ -629,10 +629,10 @@ static void getStringFromAuthStr(const char* pStart, char* pStr, char** pNext) {
|
||||||
|
|
||||||
static void stringToUserAuth(const char* pStr, int32_t len, SUserAuthInfo* pUserAuth) {
|
static void stringToUserAuth(const char* pStr, int32_t len, SUserAuthInfo* pUserAuth) {
|
||||||
char* p = NULL;
|
char* p = NULL;
|
||||||
getStringFromAuthStr(pStr, pUserAuth->user, &p);
|
getStringFromAuthStr(pStr, pUserAuth->user, TSDB_USER_LEN, &p);
|
||||||
pUserAuth->tbName.acctId = getIntegerFromAuthStr(p, &p);
|
pUserAuth->tbName.acctId = getIntegerFromAuthStr(p, &p);
|
||||||
getStringFromAuthStr(p, pUserAuth->tbName.dbname, &p);
|
getStringFromAuthStr(p, pUserAuth->tbName.dbname, TSDB_DB_NAME_LEN, &p);
|
||||||
getStringFromAuthStr(p, pUserAuth->tbName.tname, &p);
|
getStringFromAuthStr(p, pUserAuth->tbName.tname, TSDB_TABLE_NAME_LEN, &p);
|
||||||
if (pUserAuth->tbName.tname[0]) {
|
if (pUserAuth->tbName.tname[0]) {
|
||||||
pUserAuth->tbName.type = TSDB_TABLE_NAME_T;
|
pUserAuth->tbName.type = TSDB_TABLE_NAME_T;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -90,11 +90,12 @@ static int32_t getSlotKey(SNode* pNode, const char* pStmtName, char** ppKey, int
|
||||||
*pLen = taosHashBinary(*ppKey, strlen(*ppKey));
|
*pLen = taosHashBinary(*ppKey, strlen(*ppKey));
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
*ppKey = taosMemoryCalloc(1, strlen(pVal->literal) + 1 + TSDB_COL_NAME_LEN + 1 + extraBufLen);
|
int32_t literalLen = strlen(pVal->literal);
|
||||||
|
*ppKey = taosMemoryCalloc(1, literalLen + 1 + TSDB_COL_NAME_LEN + 1 + extraBufLen);
|
||||||
if (!*ppKey) {
|
if (!*ppKey) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
TAOS_STRNCAT(*ppKey, pVal->literal, strlen(pVal->literal));
|
TAOS_STRNCAT(*ppKey, pVal->literal, literalLen);
|
||||||
TAOS_STRNCAT(*ppKey, ".", 2);
|
TAOS_STRNCAT(*ppKey, ".", 2);
|
||||||
TAOS_STRNCAT(*ppKey, ((SExprNode*)pNode)->aliasName, TSDB_COL_NAME_LEN);
|
TAOS_STRNCAT(*ppKey, ((SExprNode*)pNode)->aliasName, TSDB_COL_NAME_LEN);
|
||||||
*pLen = taosHashBinary(*ppKey, strlen(*ppKey));
|
*pLen = taosHashBinary(*ppKey, strlen(*ppKey));
|
||||||
|
|
|
@ -166,10 +166,12 @@ int32_t streamStateDel_rocksdb(SStreamState* pState, const SWinKey* key);
|
||||||
int32_t streamStateClear_rocksdb(SStreamState* pState);
|
int32_t streamStateClear_rocksdb(SStreamState* pState);
|
||||||
void streamStateCurNext_rocksdb(SStreamStateCur* pCur);
|
void streamStateCurNext_rocksdb(SStreamStateCur* pCur);
|
||||||
int32_t streamStateGetFirst_rocksdb(SStreamState* pState, SWinKey* key);
|
int32_t streamStateGetFirst_rocksdb(SStreamState* pState, SWinKey* key);
|
||||||
int32_t streamStateGetGroupKVByCur_rocksdb(SStreamState* pState, SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen);
|
int32_t streamStateGetGroupKVByCur_rocksdb(SStreamState* pState, SStreamStateCur* pCur, SWinKey* pKey,
|
||||||
|
const void** pVal, int32_t* pVLen);
|
||||||
int32_t streamStateAddIfNotExist_rocksdb(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen);
|
int32_t streamStateAddIfNotExist_rocksdb(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen);
|
||||||
void streamStateCurPrev_rocksdb(SStreamStateCur* pCur);
|
void streamStateCurPrev_rocksdb(SStreamStateCur* pCur);
|
||||||
int32_t streamStateGetKVByCur_rocksdb(SStreamState* pState, SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen);
|
int32_t streamStateGetKVByCur_rocksdb(SStreamState* pState, SStreamStateCur* pCur, SWinKey* pKey, const void** pVal,
|
||||||
|
int32_t* pVLen);
|
||||||
SStreamStateCur* streamStateGetAndCheckCur_rocksdb(SStreamState* pState, SWinKey* key);
|
SStreamStateCur* streamStateGetAndCheckCur_rocksdb(SStreamState* pState, SWinKey* key);
|
||||||
SStreamStateCur* streamStateSeekKeyNext_rocksdb(SStreamState* pState, const SWinKey* key);
|
SStreamStateCur* streamStateSeekKeyNext_rocksdb(SStreamState* pState, const SWinKey* key);
|
||||||
SStreamStateCur* streamStateSeekKeyPrev_rocksdb(SStreamState* pState, const SWinKey* key);
|
SStreamStateCur* streamStateSeekKeyPrev_rocksdb(SStreamState* pState, const SWinKey* key);
|
||||||
|
@ -217,16 +219,15 @@ int32_t streamStateFillGetGroupKVByCur_rocksdb(SStreamStateCur* pCur, SWinKey* p
|
||||||
// partag cf
|
// partag cf
|
||||||
int32_t streamStatePutParTag_rocksdb(SStreamState* pState, int64_t groupId, const void* tag, int32_t tagLen);
|
int32_t streamStatePutParTag_rocksdb(SStreamState* pState, int64_t groupId, const void* tag, int32_t tagLen);
|
||||||
int32_t streamStateGetParTag_rocksdb(SStreamState* pState, int64_t groupId, void** tagVal, int32_t* tagLen);
|
int32_t streamStateGetParTag_rocksdb(SStreamState* pState, int64_t groupId, void** tagVal, int32_t* tagLen);
|
||||||
void streamStateParTagSeekKeyNext_rocksdb(SStreamState* pState, const int64_t groupId, SStreamStateCur* pCur);
|
void streamStateParTagSeekKeyNext_rocksdb(SStreamState* pState, const int64_t groupId, SStreamStateCur* pCur);
|
||||||
int32_t streamStateParTagGetKVByCur_rocksdb(SStreamStateCur* pCur, int64_t* pGroupId, const void** pVal, int32_t* pVLen);
|
int32_t streamStateParTagGetKVByCur_rocksdb(SStreamStateCur* pCur, int64_t* pGroupId, const void** pVal,
|
||||||
|
int32_t* pVLen);
|
||||||
|
|
||||||
// parname cf
|
// parname cf
|
||||||
int32_t streamStatePutParName_rocksdb(SStreamState* pState, int64_t groupId, const char tbname[TSDB_TABLE_NAME_LEN]);
|
int32_t streamStatePutParName_rocksdb(SStreamState* pState, int64_t groupId, const char tbname[TSDB_TABLE_NAME_LEN]);
|
||||||
int32_t streamStateGetParName_rocksdb(SStreamState* pState, int64_t groupId, void** pVal);
|
int32_t streamStateGetParName_rocksdb(SStreamState* pState, int64_t groupId, void** pVal);
|
||||||
int32_t streamStateDeleteParName_rocksdb(SStreamState* pState, int64_t groupId);
|
int32_t streamStateDeleteParName_rocksdb(SStreamState* pState, int64_t groupId);
|
||||||
|
|
||||||
void streamStateDestroy_rocksdb(SStreamState* pState, bool remove);
|
|
||||||
|
|
||||||
// default cf
|
// default cf
|
||||||
int32_t streamDefaultPut_rocksdb(SStreamState* pState, const void* key, void* pVal, int32_t pVLen);
|
int32_t streamDefaultPut_rocksdb(SStreamState* pState, const void* key, void* pVal, int32_t pVLen);
|
||||||
int32_t streamDefaultGet_rocksdb(SStreamState* pState, const void* key, void** pVal, int32_t* pVLen);
|
int32_t streamDefaultGet_rocksdb(SStreamState* pState, const void* key, void** pVal, int32_t* pVLen);
|
||||||
|
|
|
@ -153,7 +153,6 @@ void taskDbUnRefChkp(STaskDbWrapper* pTaskDb, int64_t chkp);
|
||||||
int32_t chkpAddExtraInfo(char* pChkpIdDir, int64_t chkpId, int64_t processId);
|
int32_t chkpAddExtraInfo(char* pChkpIdDir, int64_t chkpId, int64_t processId);
|
||||||
int32_t chkpLoadExtraInfo(char* pChkpIdDir, int64_t* chkpId, int64_t* processId);
|
int32_t chkpLoadExtraInfo(char* pChkpIdDir, int64_t* chkpId, int64_t* processId);
|
||||||
|
|
||||||
#define GEN_COLUMN_FAMILY_NAME(name, idstr, SUFFIX) sprintf(name, "%s_%s", idstr, (SUFFIX));
|
|
||||||
int32_t copyFiles(const char* src, const char* dst);
|
int32_t copyFiles(const char* src, const char* dst);
|
||||||
uint32_t nextPow2(uint32_t x);
|
uint32_t nextPow2(uint32_t x);
|
||||||
|
|
||||||
|
@ -1156,13 +1155,17 @@ int32_t chkpMayDelObsolete(void* arg, int64_t chkpId, char* path) {
|
||||||
|
|
||||||
taosArrayDestroy(pBackend->chkpSaved);
|
taosArrayDestroy(pBackend->chkpSaved);
|
||||||
pBackend->chkpSaved = chkpDup;
|
pBackend->chkpSaved = chkpDup;
|
||||||
|
chkpDup = NULL;
|
||||||
|
|
||||||
TAOS_UNUSED(taosThreadRwlockUnlock(&pBackend->chkpDirLock));
|
TAOS_UNUSED(taosThreadRwlockUnlock(&pBackend->chkpDirLock));
|
||||||
|
|
||||||
for (int i = 0; i < taosArrayGetSize(chkpDel); i++) {
|
for (int i = 0; i < taosArrayGetSize(chkpDel); i++) {
|
||||||
int64_t id = *(int64_t*)taosArrayGet(chkpDel, i);
|
int64_t id = *(int64_t*)taosArrayGet(chkpDel, i);
|
||||||
char tbuf[256] = {0};
|
char tbuf[256] = {0};
|
||||||
sprintf(tbuf, "%s%scheckpoint%" PRId64 "", path, TD_DIRSEP, id);
|
if (snprintf(tbuf, sizeof(tbuf), "%s%scheckpoint%" PRId64 "", path, TD_DIRSEP, id) >= sizeof(tbuf)) {
|
||||||
|
code = TSDB_CODE_OUT_OF_RANGE;
|
||||||
|
TAOS_CHECK_GOTO(code, NULL, _exception);
|
||||||
|
}
|
||||||
|
|
||||||
stInfo("backend remove obsolete checkpoint: %s", tbuf);
|
stInfo("backend remove obsolete checkpoint: %s", tbuf);
|
||||||
if (taosIsDir(tbuf)) {
|
if (taosIsDir(tbuf)) {
|
||||||
|
@ -1187,12 +1190,17 @@ int chkpIdComp(const void* a, const void* b) {
|
||||||
}
|
}
|
||||||
int32_t taskDbLoadChkpInfo(STaskDbWrapper* pBackend) {
|
int32_t taskDbLoadChkpInfo(STaskDbWrapper* pBackend) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
char* pChkpDir = taosMemoryCalloc(1, 256);
|
int32_t nBytes = 0;
|
||||||
|
int32_t cap = 256;
|
||||||
|
char* pChkpDir = taosMemoryCalloc(1, cap);
|
||||||
if (pChkpDir == NULL) {
|
if (pChkpDir == NULL) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(pChkpDir, "%s%s%s", pBackend->path, TD_DIRSEP, "checkpoints");
|
nBytes = snprintf(pChkpDir, cap, "%s%s%s", pBackend->path, TD_DIRSEP, "checkpoints");
|
||||||
|
if (nBytes >= cap) {
|
||||||
|
return TSDB_CODE_OUT_OF_RANGE;
|
||||||
|
}
|
||||||
if (!taosIsDir(pChkpDir)) {
|
if (!taosIsDir(pChkpDir)) {
|
||||||
taosMemoryFree(pChkpDir);
|
taosMemoryFree(pChkpDir);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1413,12 +1421,18 @@ int32_t taskDbDestroySnap(void* arg, SArray* pSnapInfo) {
|
||||||
if (pSnapInfo == NULL) return 0;
|
if (pSnapInfo == NULL) return 0;
|
||||||
SStreamMeta* pMeta = arg;
|
SStreamMeta* pMeta = arg;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
int32_t cap = 256;
|
||||||
|
int32_t nBytes = 0;
|
||||||
streamMutexLock(&pMeta->backendMutex);
|
streamMutexLock(&pMeta->backendMutex);
|
||||||
|
|
||||||
char buf[128] = {0};
|
char buf[256] = {0};
|
||||||
for (int i = 0; i < taosArrayGetSize(pSnapInfo); i++) {
|
for (int i = 0; i < taosArrayGetSize(pSnapInfo); i++) {
|
||||||
SStreamTaskSnap* pSnap = taosArrayGet(pSnapInfo, i);
|
SStreamTaskSnap* pSnap = taosArrayGet(pSnapInfo, i);
|
||||||
sprintf(buf, "0x%" PRIx64 "-0x%x", pSnap->streamId, (int32_t)pSnap->taskId);
|
nBytes = snprintf(buf, cap, "0x%" PRIx64 "-0x%x", pSnap->streamId, (int32_t)pSnap->taskId);
|
||||||
|
if (nBytes <= 0 || nBytes >= cap) {
|
||||||
|
code = TSDB_CODE_OUT_OF_RANGE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
STaskDbWrapper** pTaskDb = taosHashGet(pMeta->pTaskDbUnique, buf, strlen(buf));
|
STaskDbWrapper** pTaskDb = taosHashGet(pMeta->pTaskDbUnique, buf, strlen(buf));
|
||||||
if (pTaskDb == NULL || *pTaskDb == NULL) {
|
if (pTaskDb == NULL || *pTaskDb == NULL) {
|
||||||
stWarn("stream backend:%p failed to find task db, streamId:% " PRId64 "", pMeta, pSnap->streamId);
|
stWarn("stream backend:%p failed to find task db, streamId:% " PRId64 "", pMeta, pSnap->streamId);
|
||||||
|
@ -1430,7 +1444,7 @@ int32_t taskDbDestroySnap(void* arg, SArray* pSnapInfo) {
|
||||||
taskDbUnRefChkp(*pTaskDb, pSnap->chkpId);
|
taskDbUnRefChkp(*pTaskDb, pSnap->chkpId);
|
||||||
}
|
}
|
||||||
streamMutexUnlock(&pMeta->backendMutex);
|
streamMutexUnlock(&pMeta->backendMutex);
|
||||||
return 0;
|
return code;
|
||||||
}
|
}
|
||||||
#ifdef BUILD_NO_CALL
|
#ifdef BUILD_NO_CALL
|
||||||
int32_t streamBackendAddInUseChkp(void* arg, int64_t chkpId) {
|
int32_t streamBackendAddInUseChkp(void* arg, int64_t chkpId) {
|
||||||
|
@ -1685,9 +1699,6 @@ void streamBackendDelCompare(void* backend, void* arg) {
|
||||||
taosMemoryFree(node);
|
taosMemoryFree(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef BUILD_NO_CALL
|
|
||||||
void streamStateDestroy_rocksdb(SStreamState* pState, bool remove) { streamStateCloseBackend(pState, remove); }
|
|
||||||
#endif
|
|
||||||
void destroyRocksdbCfInst(RocksdbCfInst* inst) {
|
void destroyRocksdbCfInst(RocksdbCfInst* inst) {
|
||||||
int cfLen = sizeof(ginitDict) / sizeof(ginitDict[0]);
|
int cfLen = sizeof(ginitDict) / sizeof(ginitDict[0]);
|
||||||
if (inst->pHandle) {
|
if (inst->pHandle) {
|
||||||
|
@ -1712,7 +1723,7 @@ void destroyRocksdbCfInst(RocksdbCfInst* inst) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// |key|-----value------|
|
// |key|-----value------|
|
||||||
// |key|ttl|len|userData|
|
// |key|ttl|len|userData
|
||||||
|
|
||||||
int defaultKeyComp(void* state, const char* aBuf, size_t aLen, const char* bBuf, size_t bLen) {
|
int defaultKeyComp(void* state, const char* aBuf, size_t aLen, const char* bBuf, size_t bLen) {
|
||||||
int len = aLen < bLen ? aLen : bLen;
|
int len = aLen < bLen ? aLen : bLen;
|
||||||
|
@ -2447,43 +2458,50 @@ void taskDbDestroyChkpOpt(STaskDbWrapper* pTaskDb) {
|
||||||
|
|
||||||
int32_t taskDbBuildFullPath(char* path, char* key, char** dbFullPath, char** stateFullPath) {
|
int32_t taskDbBuildFullPath(char* path, char* key, char** dbFullPath, char** stateFullPath) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
char* statePath = taosMemoryCalloc(1, strlen(path) + 128);
|
int32_t cap = strlen(path) + 128, nBytes = 0;
|
||||||
|
char* statePath = NULL;
|
||||||
|
char* dbPath = NULL;
|
||||||
|
|
||||||
|
statePath = taosMemoryCalloc(1, cap);
|
||||||
if (statePath == NULL) {
|
if (statePath == NULL) {
|
||||||
return terrno;
|
TAOS_CHECK_GOTO(terrno, NULL, _err);
|
||||||
|
}
|
||||||
|
|
||||||
|
nBytes = snprintf(statePath, cap, "%s%s%s", path, TD_DIRSEP, key);
|
||||||
|
if (nBytes < 0 || nBytes >= cap) {
|
||||||
|
code = TSDB_CODE_OUT_OF_RANGE;
|
||||||
|
TAOS_CHECK_GOTO(code, NULL, _err);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(statePath, "%s%s%s", path, TD_DIRSEP, key);
|
|
||||||
if (!taosDirExist(statePath)) {
|
if (!taosDirExist(statePath)) {
|
||||||
code = taosMulMkDir(statePath);
|
code = taosMulMkDir(statePath);
|
||||||
if (code != 0) {
|
TAOS_CHECK_GOTO(code, NULL, _err);
|
||||||
code = TAOS_SYSTEM_ERROR(errno);
|
|
||||||
stError("failed to create dir: %s, reason:%s", statePath, tstrerror(code));
|
|
||||||
taosMemoryFree(statePath);
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char* dbPath = taosMemoryCalloc(1, strlen(statePath) + 128);
|
dbPath = taosMemoryCalloc(1, cap);
|
||||||
if (dbPath == NULL) {
|
if (dbPath == NULL) {
|
||||||
taosMemoryFree(statePath);
|
TAOS_CHECK_GOTO(terrno, NULL, _err);
|
||||||
return terrno;
|
}
|
||||||
|
nBytes = snprintf(dbPath, cap, "%s%s%s", statePath, TD_DIRSEP, "state");
|
||||||
|
if (nBytes < 0 || nBytes >= cap) {
|
||||||
|
code = TSDB_CODE_OUT_OF_RANGE;
|
||||||
|
TAOS_CHECK_GOTO(code, NULL, _err);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(dbPath, "%s%s%s", statePath, TD_DIRSEP, "state");
|
|
||||||
if (!taosDirExist(dbPath)) {
|
if (!taosDirExist(dbPath)) {
|
||||||
code = taosMulMkDir(dbPath);
|
code = taosMulMkDir(dbPath);
|
||||||
if (code != 0) {
|
TAOS_CHECK_GOTO(code, NULL, _err);
|
||||||
code = TAOS_SYSTEM_ERROR(errno);
|
|
||||||
stError("failed to create dir: %s, reason:%s", dbPath, tstrerror(code));
|
|
||||||
taosMemoryFree(statePath);
|
|
||||||
taosMemoryFree(dbPath);
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*dbFullPath = dbPath;
|
*dbFullPath = dbPath;
|
||||||
*stateFullPath = statePath;
|
*stateFullPath = statePath;
|
||||||
return 0;
|
return 0;
|
||||||
|
_err:
|
||||||
|
stError("failed to create dir: %s, reason:%s", dbPath, tstrerror(code));
|
||||||
|
|
||||||
|
taosMemoryFree(statePath);
|
||||||
|
taosMemoryFree(dbPath);
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
void taskDbUpdateChkpId(void* pTaskDb, int64_t chkpId) {
|
void taskDbUpdateChkpId(void* pTaskDb, int64_t chkpId) {
|
||||||
|
@ -2864,6 +2882,7 @@ int32_t streamStateOpenBackendCf(void* backend, char* name, char** cfs, int32_t
|
||||||
int64_t streamId;
|
int64_t streamId;
|
||||||
int32_t taskId, dummy = 0;
|
int32_t taskId, dummy = 0;
|
||||||
char suffix[64] = {0};
|
char suffix[64] = {0};
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
rocksdb_options_t** cfOpts = taosMemoryCalloc(nCf, sizeof(rocksdb_options_t*));
|
rocksdb_options_t** cfOpts = taosMemoryCalloc(nCf, sizeof(rocksdb_options_t*));
|
||||||
RocksdbCfParam* params = taosMemoryCalloc(nCf, sizeof(RocksdbCfParam));
|
RocksdbCfParam* params = taosMemoryCalloc(nCf, sizeof(RocksdbCfParam));
|
||||||
|
@ -2873,6 +2892,7 @@ int32_t streamStateOpenBackendCf(void* backend, char* name, char** cfs, int32_t
|
||||||
for (int i = 0; i < nCf; i++) {
|
for (int i = 0; i < nCf; i++) {
|
||||||
char* cf = cfs[i];
|
char* cf = cfs[i];
|
||||||
char funcname[64] = {0};
|
char funcname[64] = {0};
|
||||||
|
|
||||||
cfOpts[i] = rocksdb_options_create_copy(handle->dbOpt);
|
cfOpts[i] = rocksdb_options_create_copy(handle->dbOpt);
|
||||||
if (i == 0) continue;
|
if (i == 0) continue;
|
||||||
if (3 == sscanf(cf, "0x%" PRIx64 "-%d_%s", &streamId, &taskId, funcname)) {
|
if (3 == sscanf(cf, "0x%" PRIx64 "-%d_%s", &streamId, &taskId, funcname)) {
|
||||||
|
@ -2909,7 +2929,7 @@ int32_t streamStateOpenBackendCf(void* backend, char* name, char** cfs, int32_t
|
||||||
taosMemoryFree(params);
|
taosMemoryFree(params);
|
||||||
taosMemoryFree(cfOpts);
|
taosMemoryFree(cfOpts);
|
||||||
// fix other leak
|
// fix other leak
|
||||||
return -1;
|
return TSDB_CODE_THIRDPARTY_ERROR;
|
||||||
} else {
|
} else {
|
||||||
stDebug("succ to open rocksdb cf");
|
stDebug("succ to open rocksdb cf");
|
||||||
}
|
}
|
||||||
|
@ -2929,8 +2949,13 @@ int32_t streamStateOpenBackendCf(void* backend, char* name, char** cfs, int32_t
|
||||||
|
|
||||||
char funcname[64] = {0};
|
char funcname[64] = {0};
|
||||||
if (3 == sscanf(cf, "0x%" PRIx64 "-%d_%s", &streamId, &taskId, funcname)) {
|
if (3 == sscanf(cf, "0x%" PRIx64 "-%d_%s", &streamId, &taskId, funcname)) {
|
||||||
char idstr[128] = {0};
|
char idstr[128] = {0};
|
||||||
sprintf(idstr, "0x%" PRIx64 "-%d", streamId, taskId);
|
int32_t nBytes = snprintf(idstr, sizeof(idstr), "0x%" PRIx64 "-%d", streamId, taskId);
|
||||||
|
if (nBytes <= 0 || nBytes >= sizeof(idstr)) {
|
||||||
|
code = TSDB_CODE_OUT_OF_RANGE;
|
||||||
|
stError("failed to open cf since %s", tstrerror(code));
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int idx = streamStateGetCfIdx(NULL, funcname);
|
int idx = streamStateGetCfIdx(NULL, funcname);
|
||||||
|
|
||||||
|
@ -2997,117 +3022,7 @@ int32_t streamStateOpenBackendCf(void* backend, char* name, char** cfs, int32_t
|
||||||
taosMemoryFree(cfOpts);
|
taosMemoryFree(cfOpts);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifdef BUILD_NO_CALL
|
|
||||||
int streamStateOpenBackend(void* backend, SStreamState* pState) {
|
|
||||||
taosAcquireRef(streamBackendId, pState->streamBackendRid);
|
|
||||||
SBackendWrapper* handle = backend;
|
|
||||||
SBackendCfWrapper* pBackendCfWrapper = taosMemoryCalloc(1, sizeof(SBackendCfWrapper));
|
|
||||||
|
|
||||||
streamMutexLock(&handle->cfMutex);
|
|
||||||
RocksdbCfInst** ppInst = taosHashGet(handle->cfInst, pState->pTdbState->idstr, strlen(pState->pTdbState->idstr) + 1);
|
|
||||||
if (ppInst != NULL && *ppInst != NULL) {
|
|
||||||
RocksdbCfInst* inst = *ppInst;
|
|
||||||
pBackendCfWrapper->rocksdb = inst->db;
|
|
||||||
pBackendCfWrapper->pHandle = (void**)inst->pHandle;
|
|
||||||
pBackendCfWrapper->writeOpts = inst->wOpt;
|
|
||||||
pBackendCfWrapper->readOpts = inst->rOpt;
|
|
||||||
pBackendCfWrapper->cfOpts = (void**)(inst->cfOpt);
|
|
||||||
pBackendCfWrapper->dbOpt = handle->dbOpt;
|
|
||||||
pBackendCfWrapper->param = inst->param;
|
|
||||||
pBackendCfWrapper->pBackend = handle;
|
|
||||||
pBackendCfWrapper->pComparNode = inst->pCompareNode;
|
|
||||||
streamMutexUnlock(&handle->cfMutex);
|
|
||||||
pBackendCfWrapper->backendId = pState->streamBackendRid;
|
|
||||||
memcpy(pBackendCfWrapper->idstr, pState->pTdbState->idstr, sizeof(pState->pTdbState->idstr));
|
|
||||||
|
|
||||||
int64_t id = taosAddRef(streamBackendCfWrapperId, pBackendCfWrapper);
|
|
||||||
pState->pTdbState->backendCfWrapperId = id;
|
|
||||||
pState->pTdbState->pBackendCfWrapper = pBackendCfWrapper;
|
|
||||||
stInfo("succ to open state %p on backendWrapper, %p, %s", pState, pBackendCfWrapper, pBackendCfWrapper->idstr);
|
|
||||||
|
|
||||||
inst->pHandle = NULL;
|
|
||||||
inst->cfOpt = NULL;
|
|
||||||
inst->param = NULL;
|
|
||||||
|
|
||||||
inst->wOpt = NULL;
|
|
||||||
inst->rOpt = NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
streamMutexUnlock(&handle->cfMutex);
|
|
||||||
|
|
||||||
char* err = NULL;
|
|
||||||
int cfLen = sizeof(ginitDict) / sizeof(ginitDict[0]);
|
|
||||||
|
|
||||||
RocksdbCfParam* param = taosMemoryCalloc(cfLen, sizeof(RocksdbCfParam));
|
|
||||||
const rocksdb_options_t** cfOpt = taosMemoryCalloc(cfLen, sizeof(rocksdb_options_t*));
|
|
||||||
for (int i = 0; i < cfLen; i++) {
|
|
||||||
cfOpt[i] = rocksdb_options_create_copy(handle->dbOpt);
|
|
||||||
// refactor later
|
|
||||||
rocksdb_block_based_table_options_t* tableOpt = rocksdb_block_based_options_create();
|
|
||||||
rocksdb_block_based_options_set_block_cache(tableOpt, handle->cache);
|
|
||||||
rocksdb_block_based_options_set_partition_filters(tableOpt, 1);
|
|
||||||
|
|
||||||
rocksdb_filterpolicy_t* filter = rocksdb_filterpolicy_create_bloom(15);
|
|
||||||
rocksdb_block_based_options_set_filter_policy(tableOpt, filter);
|
|
||||||
|
|
||||||
rocksdb_options_set_block_based_table_factory((rocksdb_options_t*)cfOpt[i], tableOpt);
|
|
||||||
|
|
||||||
param[i].tableOpt = tableOpt;
|
|
||||||
};
|
|
||||||
|
|
||||||
rocksdb_comparator_t** pCompare = taosMemoryCalloc(cfLen, sizeof(rocksdb_comparator_t*));
|
|
||||||
for (int i = 0; i < cfLen; i++) {
|
|
||||||
SCfInit* cf = &ginitDict[i];
|
|
||||||
|
|
||||||
rocksdb_comparator_t* compare = rocksdb_comparator_create(NULL, cf->destroyCmp, cf->cmpKey, cf->cmpName);
|
|
||||||
rocksdb_options_set_comparator((rocksdb_options_t*)cfOpt[i], compare);
|
|
||||||
pCompare[i] = compare;
|
|
||||||
}
|
|
||||||
rocksdb_column_family_handle_t** cfHandle = taosMemoryCalloc(cfLen, sizeof(rocksdb_column_family_handle_t*));
|
|
||||||
pBackendCfWrapper->rocksdb = handle->db;
|
|
||||||
pBackendCfWrapper->pHandle = (void**)cfHandle;
|
|
||||||
pBackendCfWrapper->writeOpts = rocksdb_writeoptions_create();
|
|
||||||
pBackendCfWrapper->readOpts = rocksdb_readoptions_create();
|
|
||||||
pBackendCfWrapper->cfOpts = (void**)cfOpt;
|
|
||||||
pBackendCfWrapper->dbOpt = handle->dbOpt;
|
|
||||||
pBackendCfWrapper->param = param;
|
|
||||||
pBackendCfWrapper->pBackend = handle;
|
|
||||||
pBackendCfWrapper->backendId = pState->streamBackendRid;
|
|
||||||
taosThreadRwlockInit(&pBackendCfWrapper->rwLock, NULL);
|
|
||||||
SCfComparator compare = {.comp = pCompare, .numOfComp = cfLen};
|
|
||||||
pBackendCfWrapper->pComparNode = streamBackendAddCompare(handle, &compare);
|
|
||||||
rocksdb_writeoptions_disable_WAL(pBackendCfWrapper->writeOpts, 1);
|
|
||||||
memcpy(pBackendCfWrapper->idstr, pState->pTdbState->idstr, sizeof(pState->pTdbState->idstr));
|
|
||||||
|
|
||||||
int64_t id = taosAddRef(streamBackendCfWrapperId, pBackendCfWrapper);
|
|
||||||
pState->pTdbState->backendCfWrapperId = id;
|
|
||||||
pState->pTdbState->pBackendCfWrapper = pBackendCfWrapper;
|
|
||||||
stInfo("succ to open state %p on backendWrapper %p %s", pState, pBackendCfWrapper, pBackendCfWrapper->idstr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void streamStateCloseBackend(SStreamState* pState, bool remove) {
|
|
||||||
SBackendCfWrapper* wrapper = pState->pTdbState->pBackendCfWrapper;
|
|
||||||
SBackendWrapper* pHandle = wrapper->pBackend;
|
|
||||||
|
|
||||||
stInfo("start to close state on backend: %p", pHandle);
|
|
||||||
|
|
||||||
streamMutexLock(&pHandle->cfMutex);
|
|
||||||
RocksdbCfInst** ppInst = taosHashGet(pHandle->cfInst, wrapper->idstr, strlen(pState->pTdbState->idstr) + 1);
|
|
||||||
if (ppInst != NULL && *ppInst != NULL) {
|
|
||||||
RocksdbCfInst* inst = *ppInst;
|
|
||||||
taosMemoryFree(inst);
|
|
||||||
taosHashRemove(pHandle->cfInst, pState->pTdbState->idstr, strlen(pState->pTdbState->idstr) + 1);
|
|
||||||
}
|
|
||||||
streamMutexUnlock(&pHandle->cfMutex);
|
|
||||||
|
|
||||||
char* status[] = {"close", "drop"};
|
|
||||||
stInfo("start to %s state %p on backendWrapper %p %s", status[remove == false ? 0 : 1], pState, wrapper,
|
|
||||||
wrapper->idstr);
|
|
||||||
wrapper->remove |= remove; // update by other pState
|
|
||||||
taosReleaseRef(streamBackendCfWrapperId, pState->pTdbState->backendCfWrapperId);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
void streamStateDestroyCompar(void* arg) {
|
void streamStateDestroyCompar(void* arg) {
|
||||||
SCfComparator* comp = (SCfComparator*)arg;
|
SCfComparator* comp = (SCfComparator*)arg;
|
||||||
for (int i = 0; i < comp->numOfComp; i++) {
|
for (int i = 0; i < comp->numOfComp; i++) {
|
||||||
|
@ -3386,7 +3301,8 @@ int32_t streamStateGetFirst_rocksdb(SStreamState* pState, SWinKey* key) {
|
||||||
return streamStateDel_rocksdb(pState, &tmp);
|
return streamStateDel_rocksdb(pState, &tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t streamStateFillGetGroupKVByCur_rocksdb(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen) {
|
int32_t streamStateFillGetGroupKVByCur_rocksdb(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal,
|
||||||
|
int32_t* pVLen) {
|
||||||
if (!pCur) {
|
if (!pCur) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -4343,7 +4259,7 @@ int32_t streamStatePutParTag_rocksdb(SStreamState* pState, int64_t groupId, cons
|
||||||
|
|
||||||
void streamStateParTagSeekKeyNext_rocksdb(SStreamState* pState, const int64_t groupId, SStreamStateCur* pCur) {
|
void streamStateParTagSeekKeyNext_rocksdb(SStreamState* pState, const int64_t groupId, SStreamStateCur* pCur) {
|
||||||
if (pCur == NULL) {
|
if (pCur == NULL) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
STaskDbWrapper* wrapper = pState->pTdbState->pOwner->pBackend;
|
STaskDbWrapper* wrapper = pState->pTdbState->pOwner->pBackend;
|
||||||
pCur->number = pState->number;
|
pCur->number = pState->number;
|
||||||
|
@ -4353,13 +4269,13 @@ void streamStateParTagSeekKeyNext_rocksdb(SStreamState* pState, const int64_t gr
|
||||||
int i = streamStateGetCfIdx(pState, "partag");
|
int i = streamStateGetCfIdx(pState, "partag");
|
||||||
if (i < 0) {
|
if (i < 0) {
|
||||||
stError("streamState failed to put to cf name:%s", "partag");
|
stError("streamState failed to put to cf name:%s", "partag");
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
char buf[128] = {0};
|
char buf[128] = {0};
|
||||||
int32_t klen = ginitDict[i].enFunc((void*)&groupId, buf);
|
int32_t klen = ginitDict[i].enFunc((void*)&groupId, buf);
|
||||||
if (!streamStateIterSeekAndValid(pCur->iter, buf, klen)) {
|
if (!streamStateIterSeekAndValid(pCur->iter, buf, klen)) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
// skip ttl expired data
|
// skip ttl expired data
|
||||||
while (rocksdb_iter_valid(pCur->iter) && iterValueIsStale(pCur->iter)) {
|
while (rocksdb_iter_valid(pCur->iter) && iterValueIsStale(pCur->iter)) {
|
||||||
|
@ -4371,13 +4287,15 @@ void streamStateParTagSeekKeyNext_rocksdb(SStreamState* pState, const int64_t gr
|
||||||
size_t kLen = 0;
|
size_t kLen = 0;
|
||||||
char* keyStr = (char*)rocksdb_iter_key(pCur->iter, &kLen);
|
char* keyStr = (char*)rocksdb_iter_key(pCur->iter, &kLen);
|
||||||
TAOS_UNUSED(parKeyDecode((void*)&curGroupId, keyStr));
|
TAOS_UNUSED(parKeyDecode((void*)&curGroupId, keyStr));
|
||||||
if (curGroupId > groupId) return ;
|
if (curGroupId > groupId) return;
|
||||||
|
|
||||||
rocksdb_iter_next(pCur->iter);
|
rocksdb_iter_next(pCur->iter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t streamStateParTagGetKVByCur_rocksdb(SStreamStateCur* pCur, int64_t* pGroupId, const void** pVal, int32_t* pVLen) {
|
int32_t streamStateParTagGetKVByCur_rocksdb(SStreamStateCur* pCur, int64_t* pGroupId, const void** pVal,
|
||||||
|
int32_t* pVLen) {
|
||||||
|
stDebug("streamStateFillGetKVByCur_rocksdb");
|
||||||
if (!pCur) {
|
if (!pCur) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -4719,7 +4637,7 @@ int32_t compareHashTableImpl(SHashObj* p1, SHashObj* p2, SArray* diff) {
|
||||||
if (fname == NULL) {
|
if (fname == NULL) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
TAOS_UNUSED(strncpy(fname, name, len));
|
tstrncpy(fname, name, strlen(name));
|
||||||
if (taosArrayPush(diff, &fname) == NULL) {
|
if (taosArrayPush(diff, &fname) == NULL) {
|
||||||
taosMemoryFree(fname);
|
taosMemoryFree(fname);
|
||||||
return terrno;
|
return terrno;
|
||||||
|
@ -4743,17 +4661,32 @@ int32_t compareHashTable(SHashObj* p1, SHashObj* p2, SArray* add, SArray* del) {
|
||||||
void hashTableToDebug(SHashObj* pTbl, char** buf) {
|
void hashTableToDebug(SHashObj* pTbl, char** buf) {
|
||||||
size_t sz = taosHashGetSize(pTbl);
|
size_t sz = taosHashGetSize(pTbl);
|
||||||
int32_t total = 0;
|
int32_t total = 0;
|
||||||
char* p = taosMemoryCalloc(1, sz * 16 + 4);
|
int32_t cap = sz * 16 + 4;
|
||||||
void* pIter = taosHashIterate(pTbl, NULL);
|
|
||||||
|
char* p = taosMemoryCalloc(1, cap);
|
||||||
|
if (p == NULL) {
|
||||||
|
stError("failed to alloc memory for stream snapshot debug info");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* pIter = taosHashIterate(pTbl, NULL);
|
||||||
while (pIter) {
|
while (pIter) {
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
char* name = taosHashGetKey(pIter, &len);
|
char* name = taosHashGetKey(pIter, &len);
|
||||||
char* tname = taosMemoryCalloc(1, len + 1);
|
if (name == NULL || len <= 0) {
|
||||||
memcpy(tname, name, len);
|
pIter = taosHashIterate(pTbl, pIter);
|
||||||
total += sprintf(p + total, "%s,", tname);
|
continue;
|
||||||
|
}
|
||||||
|
int32_t left = cap - strlen(p);
|
||||||
|
int32_t nBytes = snprintf(p + total, left, "%s,", name);
|
||||||
|
if (nBytes <= 0 || nBytes >= left) {
|
||||||
|
stError("failed to debug snapshot info since %s", tstrerror(TSDB_CODE_OUT_OF_RANGE));
|
||||||
|
taosMemoryFree(p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
pIter = taosHashIterate(pTbl, pIter);
|
pIter = taosHashIterate(pTbl, pIter);
|
||||||
taosMemoryFree(tname);
|
total += nBytes;
|
||||||
}
|
}
|
||||||
if (total > 0) {
|
if (total > 0) {
|
||||||
p[total - 1] = 0;
|
p[total - 1] = 0;
|
||||||
|
@ -4764,13 +4697,30 @@ void strArrayDebugInfo(SArray* pArr, char** buf) {
|
||||||
int32_t sz = taosArrayGetSize(pArr);
|
int32_t sz = taosArrayGetSize(pArr);
|
||||||
if (sz <= 0) return;
|
if (sz <= 0) return;
|
||||||
|
|
||||||
char* p = (char*)taosMemoryCalloc(1, 64 + sz * 64);
|
int32_t code = 0;
|
||||||
int32_t total = 0;
|
int32_t total = 0, nBytes = 0;
|
||||||
|
int32_t cap = 64 + sz * 64;
|
||||||
|
|
||||||
|
char* p = (char*)taosMemoryCalloc(1, cap);
|
||||||
|
if (p == NULL) {
|
||||||
|
stError("failed to alloc memory for stream snapshot debug info");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < sz; i++) {
|
for (int i = 0; i < sz; i++) {
|
||||||
char* name = taosArrayGetP(pArr, i);
|
char* name = taosArrayGetP(pArr, i);
|
||||||
total += sprintf(p + total, "%s,", name);
|
int32_t left = cap - strlen(p);
|
||||||
|
nBytes = snprintf(p + total, left, "%s,", name);
|
||||||
|
if (nBytes <= 0 || nBytes >= left) {
|
||||||
|
code = TSDB_CODE_OUT_OF_RANGE;
|
||||||
|
stError("failed to debug snapshot info since %s", tstrerror(code));
|
||||||
|
taosMemoryFree(p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
total += nBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
p[total - 1] = 0;
|
p[total - 1] = 0;
|
||||||
|
|
||||||
*buf = p;
|
*buf = p;
|
||||||
|
@ -4780,16 +4730,16 @@ void dbChkpDebugInfo(SDbChkp* pDb) {
|
||||||
char* p[4] = {NULL};
|
char* p[4] = {NULL};
|
||||||
|
|
||||||
hashTableToDebug(pDb->pSstTbl[pDb->idx], &p[0]);
|
hashTableToDebug(pDb->pSstTbl[pDb->idx], &p[0]);
|
||||||
stTrace("chkp previous file: [%s]", p[0]);
|
if (p[0]) stTrace("chkp previous file: [%s]", p[0]);
|
||||||
|
|
||||||
hashTableToDebug(pDb->pSstTbl[1 - pDb->idx], &p[1]);
|
hashTableToDebug(pDb->pSstTbl[1 - pDb->idx], &p[1]);
|
||||||
stTrace("chkp curr file: [%s]", p[1]);
|
if (p[1]) stTrace("chkp curr file: [%s]", p[1]);
|
||||||
|
|
||||||
strArrayDebugInfo(pDb->pAdd, &p[2]);
|
strArrayDebugInfo(pDb->pAdd, &p[2]);
|
||||||
stTrace("chkp newly addded file: [%s]", p[2]);
|
if (p[2]) stTrace("chkp newly addded file: [%s]", p[2]);
|
||||||
|
|
||||||
strArrayDebugInfo(pDb->pDel, &p[3]);
|
strArrayDebugInfo(pDb->pDel, &p[3]);
|
||||||
stTrace("chkp newly deleted file: [%s]", p[3]);
|
if (p[3]) stTrace("chkp newly deleted file: [%s]", p[3]);
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
taosMemoryFree(p[i]);
|
taosMemoryFree(p[i]);
|
||||||
|
@ -4881,7 +4831,7 @@ int32_t dbChkpGetDelta(SDbChkp* p, int64_t chkpId, SArray* list) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_UNUSED(strncpy(fname, name, len));
|
tstrncpy(fname, name, strlen(name));
|
||||||
if (taosArrayPush(p->pAdd, &fname) == NULL) {
|
if (taosArrayPush(p->pAdd, &fname) == NULL) {
|
||||||
taosMemoryFree(fname);
|
taosMemoryFree(fname);
|
||||||
TAOS_UNUSED(taosThreadRwlockUnlock(&p->rwLock));
|
TAOS_UNUSED(taosThreadRwlockUnlock(&p->rwLock));
|
||||||
|
@ -5356,7 +5306,8 @@ SStreamStateCur* streamStateSeekKeyPrev_rocksdb(SStreamState* pState, const SWin
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t streamStateGetGroupKVByCur_rocksdb(SStreamState* pState, SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen) {
|
int32_t streamStateGetGroupKVByCur_rocksdb(SStreamState* pState, SStreamStateCur* pCur, SWinKey* pKey,
|
||||||
|
const void** pVal, int32_t* pVLen) {
|
||||||
if (!pCur) {
|
if (!pCur) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,7 +99,7 @@ int32_t metaRefMgtInit() {
|
||||||
void metaRefMgtCleanup() {
|
void metaRefMgtCleanup() {
|
||||||
void* pIter = taosHashIterate(gMetaRefMgt.pTable, NULL);
|
void* pIter = taosHashIterate(gMetaRefMgt.pTable, NULL);
|
||||||
while (pIter) {
|
while (pIter) {
|
||||||
int64_t* p = *(int64_t**) pIter;
|
int64_t* p = *(int64_t**)pIter;
|
||||||
taosMemoryFree(p);
|
taosMemoryFree(p);
|
||||||
pIter = taosHashIterate(gMetaRefMgt.pTable, pIter);
|
pIter = taosHashIterate(gMetaRefMgt.pTable, pIter);
|
||||||
}
|
}
|
||||||
|
@ -118,14 +118,14 @@ int32_t metaRefMgtAdd(int64_t vgId, int64_t* rid) {
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
code = taosHashPut(gMetaRefMgt.pTable, &rid, sizeof(rid), &rid, sizeof(void*));
|
code = taosHashPut(gMetaRefMgt.pTable, &rid, sizeof(rid), &rid, sizeof(void*));
|
||||||
if (code) {
|
if (code) {
|
||||||
stError("vgId:%d failed to put into refId mgt, refId:%" PRId64" %p, code:%s", (int32_t)vgId, *rid, rid,
|
stError("vgId:%d failed to put into refId mgt, refId:%" PRId64 " %p, code:%s", (int32_t)vgId, *rid, rid,
|
||||||
tstrerror(code));
|
tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
} else { // not
|
} else { // not
|
||||||
// stInfo("add refId:%"PRId64" vgId:%d, %p", *rid, (int32_t)vgId, rid);
|
// stInfo("add refId:%"PRId64" vgId:%d, %p", *rid, (int32_t)vgId, rid);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
stFatal("try to add refId:%"PRId64" vgId:%d, %p that already added into mgt", *rid, (int32_t) vgId, rid);
|
stFatal("try to add refId:%" PRId64 " vgId:%d, %p that already added into mgt", *rid, (int32_t)vgId, rid);
|
||||||
}
|
}
|
||||||
|
|
||||||
streamMutexUnlock(&gMetaRefMgt.mutex);
|
streamMutexUnlock(&gMetaRefMgt.mutex);
|
||||||
|
@ -292,6 +292,7 @@ int32_t streamTaskSetDb(SStreamMeta* pMeta, SStreamTask* pTask, const char* key)
|
||||||
void* p = taskDbAddRef(*ppBackend);
|
void* p = taskDbAddRef(*ppBackend);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
stError("s-task:0x%x failed to ref backend", pTask->id.taskId);
|
stError("s-task:0x%x failed to ref backend", pTask->id.taskId);
|
||||||
|
streamMutexUnlock(&pMeta->backendMutex);
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -669,7 +670,7 @@ int32_t streamMetaSaveTask(SStreamMeta* pMeta, SStreamTask* pTask) {
|
||||||
int64_t refId = pTask->id.refId;
|
int64_t refId = pTask->id.refId;
|
||||||
int32_t ret = taosRemoveRef(streamTaskRefPool, pTask->id.refId);
|
int32_t ret = taosRemoveRef(streamTaskRefPool, pTask->id.refId);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
stError("s-task:0x%x failed to remove ref, refId:%"PRId64, (int32_t) id[1], refId);
|
stError("s-task:0x%x failed to remove ref, refId:%" PRId64, (int32_t)id[1], refId);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
stDebug("s-task:%s vgId:%d refId:%" PRId64 " task meta save to disk", pTask->id.idStr, vgId, pTask->id.refId);
|
stDebug("s-task:%s vgId:%d refId:%" PRId64 " task meta save to disk", pTask->id.idStr, vgId, pTask->id.refId);
|
||||||
|
@ -727,14 +728,14 @@ int32_t streamMetaRegisterTask(SStreamMeta* pMeta, int64_t ver, SStreamTask* pTa
|
||||||
|
|
||||||
int32_t ret = taosRemoveRef(streamTaskRefPool, refId);
|
int32_t ret = taosRemoveRef(streamTaskRefPool, refId);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
stError("s-task:0x%x failed to remove ref, refId:%"PRId64, (int32_t) id.taskId, refId);
|
stError("s-task:0x%x failed to remove ref, refId:%" PRId64, (int32_t)id.taskId, refId);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((code = streamMetaSaveTask(pMeta, pTask)) != 0) {
|
if ((code = streamMetaSaveTask(pMeta, pTask)) != 0) {
|
||||||
int32_t unused = taosHashRemove(pMeta->pTasksMap, &id, sizeof(id));
|
int32_t unused = taosHashRemove(pMeta->pTasksMap, &id, sizeof(id));
|
||||||
void* pUnused = taosArrayPop(pMeta->pTaskList);
|
void* pUnused = taosArrayPop(pMeta->pTaskList);
|
||||||
|
|
||||||
int32_t ret = taosRemoveRef(streamTaskRefPool, refId);
|
int32_t ret = taosRemoveRef(streamTaskRefPool, refId);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -745,7 +746,7 @@ int32_t streamMetaRegisterTask(SStreamMeta* pMeta, int64_t ver, SStreamTask* pTa
|
||||||
|
|
||||||
if ((code = streamMetaCommit(pMeta)) != 0) {
|
if ((code = streamMetaCommit(pMeta)) != 0) {
|
||||||
int32_t unused = taosHashRemove(pMeta->pTasksMap, &id, sizeof(id));
|
int32_t unused = taosHashRemove(pMeta->pTasksMap, &id, sizeof(id));
|
||||||
void* pUnused = taosArrayPop(pMeta->pTaskList);
|
void* pUnused = taosArrayPop(pMeta->pTaskList);
|
||||||
|
|
||||||
int32_t ret = taosRemoveRef(streamTaskRefPool, refId);
|
int32_t ret = taosRemoveRef(streamTaskRefPool, refId);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -783,7 +784,7 @@ int32_t streamMetaAcquireTaskNoLock(SStreamMeta* pMeta, int64_t streamId, int32_
|
||||||
|
|
||||||
SStreamTask* p = taosAcquireRef(streamTaskRefPool, *pTaskRefId);
|
SStreamTask* p = taosAcquireRef(streamTaskRefPool, *pTaskRefId);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
stDebug("s-task:%x failed to acquire task refId:%"PRId64", may have been destoried", taskId, *pTaskRefId);
|
stDebug("s-task:%x failed to acquire task refId:%" PRId64 ", may have been destoried", taskId, *pTaskRefId);
|
||||||
return TSDB_CODE_STREAM_TASK_NOT_EXIST;
|
return TSDB_CODE_STREAM_TASK_NOT_EXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -946,11 +947,10 @@ int32_t streamMetaUnregisterTask(SStreamMeta* pMeta, int64_t streamId, int32_t t
|
||||||
pTask->info.delaySchedParam = 0;
|
pTask->info.delaySchedParam = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int64_t refId = pTask->id.refId;
|
int64_t refId = pTask->id.refId;
|
||||||
int32_t ret = taosRemoveRef(streamTaskRefPool, refId);
|
int32_t ret = taosRemoveRef(streamTaskRefPool, refId);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
stError("s-task:0x%x failed to remove ref, refId:%"PRId64, (int32_t) id.taskId, refId);
|
stError("s-task:0x%x failed to remove ref, refId:%" PRId64, (int32_t)id.taskId, refId);
|
||||||
}
|
}
|
||||||
|
|
||||||
streamMetaReleaseTask(pMeta, pTask);
|
streamMetaReleaseTask(pMeta, pTask);
|
||||||
|
@ -1115,7 +1115,7 @@ void streamMetaLoadAllTasks(SStreamMeta* pMeta) {
|
||||||
STaskId id = streamTaskGetTaskId(pTask);
|
STaskId id = streamTaskGetTaskId(pTask);
|
||||||
|
|
||||||
tFreeStreamTask(pTask);
|
tFreeStreamTask(pTask);
|
||||||
void* px = taosArrayPush(pRecycleList, &id);
|
void* px = taosArrayPush(pRecycleList, &id);
|
||||||
if (px == NULL) {
|
if (px == NULL) {
|
||||||
stError("s-task:0x%x failed record the task into recycle list due to out of memory", taskId);
|
stError("s-task:0x%x failed record the task into recycle list due to out of memory", taskId);
|
||||||
}
|
}
|
||||||
|
@ -1165,7 +1165,7 @@ void streamMetaLoadAllTasks(SStreamMeta* pMeta) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
stInfo("s-task:0x%x vgId:%d set refId:%"PRId64, (int32_t) id.taskId, vgId, pTask->id.refId);
|
stInfo("s-task:0x%x vgId:%d set refId:%" PRId64, (int32_t)id.taskId, vgId, pTask->id.refId);
|
||||||
if (pTask->info.fillHistory == 0) {
|
if (pTask->info.fillHistory == 0) {
|
||||||
int32_t val = atomic_add_fetch_32(&pMeta->numOfStreamTasks, 1);
|
int32_t val = atomic_add_fetch_32(&pMeta->numOfStreamTasks, 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,7 +120,8 @@ SStreamState* streamStateOpen(const char* path, void* pTask, int64_t streamId, i
|
||||||
SStreamTask* pStreamTask = pTask;
|
SStreamTask* pStreamTask = pTask;
|
||||||
pState->streamId = streamId;
|
pState->streamId = streamId;
|
||||||
pState->taskId = taskId;
|
pState->taskId = taskId;
|
||||||
TAOS_UNUSED(tsnprintf(pState->pTdbState->idstr, sizeof(pState->pTdbState->idstr), "0x%" PRIx64 "-0x%x", pState->streamId, pState->taskId));
|
TAOS_UNUSED(tsnprintf(pState->pTdbState->idstr, sizeof(pState->pTdbState->idstr), "0x%" PRIx64 "-0x%x",
|
||||||
|
pState->streamId, pState->taskId));
|
||||||
|
|
||||||
code = streamTaskSetDb(pStreamTask->pMeta, pTask, pState->pTdbState->idstr);
|
code = streamTaskSetDb(pStreamTask->pMeta, pTask, pState->pTdbState->idstr);
|
||||||
QUERY_CHECK_CODE(code, lino, _end);
|
QUERY_CHECK_CODE(code, lino, _end);
|
||||||
|
@ -539,7 +540,6 @@ int32_t streamStateDeleteParName(SStreamState* pState, int64_t groupId) {
|
||||||
|
|
||||||
void streamStateDestroy(SStreamState* pState, bool remove) {
|
void streamStateDestroy(SStreamState* pState, bool remove) {
|
||||||
streamFileStateDestroy(pState->pFileState);
|
streamFileStateDestroy(pState->pFileState);
|
||||||
// streamStateDestroy_rocksdb(pState, remove);
|
|
||||||
tSimpleHashCleanup(pState->parNameMap);
|
tSimpleHashCleanup(pState->parNameMap);
|
||||||
// do nothong
|
// do nothong
|
||||||
taosMemoryFreeClear(pState->pTdbState);
|
taosMemoryFreeClear(pState->pTdbState);
|
||||||
|
@ -584,7 +584,8 @@ int32_t streamStateCountWinAddIfNotExist(SStreamState* pState, SSessionKey* pKey
|
||||||
return getCountWinResultBuff(pState->pFileState, pKey, winCount, ppVal, pVLen, pWinCode);
|
return getCountWinResultBuff(pState->pFileState, pKey, winCount, ppVal, pVLen, pWinCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t streamStateCountWinAdd(SStreamState* pState, SSessionKey* pKey, COUNT_TYPE winCount, void** pVal, int32_t* pVLen) {
|
int32_t streamStateCountWinAdd(SStreamState* pState, SSessionKey* pKey, COUNT_TYPE winCount, void** pVal,
|
||||||
|
int32_t* pVLen) {
|
||||||
return createCountWinResultBuff(pState->pFileState, pKey, winCount, pVal, pVLen);
|
return createCountWinResultBuff(pState->pFileState, pKey, winCount, pVal, pVLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -605,9 +606,7 @@ SStreamStateCur* streamStateGroupGetCur(SStreamState* pState) {
|
||||||
return pCur;
|
return pCur;
|
||||||
}
|
}
|
||||||
|
|
||||||
void streamStateGroupCurNext(SStreamStateCur* pCur) {
|
void streamStateGroupCurNext(SStreamStateCur* pCur) { streamFileStateGroupCurNext(pCur); }
|
||||||
streamFileStateGroupCurNext(pCur);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t streamStateGroupGetKVByCur(SStreamStateCur* pCur, int64_t* pKey, void** pVal, int32_t* pVLen) {
|
int32_t streamStateGroupGetKVByCur(SStreamStateCur* pCur, int64_t* pKey, void** pVal, int32_t* pVLen) {
|
||||||
if (pVal != NULL) {
|
if (pVal != NULL) {
|
||||||
|
@ -616,13 +615,9 @@ int32_t streamStateGroupGetKVByCur(SStreamStateCur* pCur, int64_t* pKey, void**
|
||||||
return streamFileStateGroupGetKVByCur(pCur, pKey, pVal, pVLen);
|
return streamFileStateGroupGetKVByCur(pCur, pKey, pVal, pVLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
void streamStateClearExpiredState(SStreamState* pState) {
|
void streamStateClearExpiredState(SStreamState* pState) { clearExpiredState(pState->pFileState); }
|
||||||
clearExpiredState(pState->pFileState);
|
|
||||||
}
|
|
||||||
|
|
||||||
void streamStateSetFillInfo(SStreamState* pState) {
|
void streamStateSetFillInfo(SStreamState* pState) { setFillInfo(pState->pFileState); }
|
||||||
setFillInfo(pState->pFileState);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t streamStateGetPrev(SStreamState* pState, const SWinKey* pKey, SWinKey* pResKey, void** pVal, int32_t* pVLen,
|
int32_t streamStateGetPrev(SStreamState* pState, const SWinKey* pKey, SWinKey* pResKey, void** pVal, int32_t* pVLen,
|
||||||
int32_t* pWinCode) {
|
int32_t* pWinCode) {
|
||||||
|
|
|
@ -2933,7 +2933,7 @@ void syncNodeLogConfigInfo(SSyncNode* ths, SSyncCfg* cfg, char* str) {
|
||||||
n += tsnprintf(buf + n, len - n, "%s", "{");
|
n += tsnprintf(buf + n, len - n, "%s", "{");
|
||||||
for (int i = 0; i < ths->peersEpset->numOfEps; i++) {
|
for (int i = 0; i < ths->peersEpset->numOfEps; i++) {
|
||||||
n += tsnprintf(buf + n, len - n, "%s:%d%s", ths->peersEpset->eps[i].fqdn, ths->peersEpset->eps[i].port,
|
n += tsnprintf(buf + n, len - n, "%s:%d%s", ths->peersEpset->eps[i].fqdn, ths->peersEpset->eps[i].port,
|
||||||
(i + 1 < ths->peersEpset->numOfEps ? ", " : ""));
|
(i + 1 < ths->peersEpset->numOfEps ? ", " : ""));
|
||||||
}
|
}
|
||||||
n += tsnprintf(buf + n, len - n, "%s", "}");
|
n += tsnprintf(buf + n, len - n, "%s", "}");
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ int32_t tdbOpen(const char *dbname, int32_t szPage, int32_t pages, TDB **ppDb, i
|
||||||
|
|
||||||
pDb->encryptAlgorithm = encryptAlgorithm;
|
pDb->encryptAlgorithm = encryptAlgorithm;
|
||||||
if (encryptKey != NULL) {
|
if (encryptKey != NULL) {
|
||||||
strncpy(pDb->encryptKey, encryptKey, ENCRYPT_KEY_LEN);
|
tstrncpy(pDb->encryptKey, encryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = tdbPCacheOpen(szPage, pages, &(pDb->pCache));
|
ret = tdbPCacheOpen(szPage, pages, &(pDb->pCache));
|
||||||
|
|
|
@ -459,7 +459,7 @@ static char *tdbEncryptPage(SPager *pPager, char *pPageData, int32_t pageSize, c
|
||||||
opts.source = pPageData + count;
|
opts.source = pPageData + count;
|
||||||
opts.result = packetData;
|
opts.result = packetData;
|
||||||
opts.unitLen = 128;
|
opts.unitLen = 128;
|
||||||
strncpy(opts.key, encryptKey, ENCRYPT_KEY_LEN);
|
tstrncpy(opts.key, encryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
|
|
||||||
int32_t newLen = CBC_Encrypt(&opts);
|
int32_t newLen = CBC_Encrypt(&opts);
|
||||||
|
|
||||||
|
@ -927,7 +927,7 @@ static int tdbPagerInitPage(SPager *pPager, SPage *pPage, int (*initPage)(SPage
|
||||||
opts.source = pPage->pData + count;
|
opts.source = pPage->pData + count;
|
||||||
opts.result = packetData;
|
opts.result = packetData;
|
||||||
opts.unitLen = 128;
|
opts.unitLen = 128;
|
||||||
strncpy(opts.key, encryptKey, ENCRYPT_KEY_LEN);
|
tstrncpy(opts.key, encryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
|
|
||||||
int newLen = CBC_Decrypt(&opts);
|
int newLen = CBC_Decrypt(&opts);
|
||||||
|
|
||||||
|
|
|
@ -332,7 +332,7 @@ _exit:
|
||||||
wError("vgId:%d, %s failed at line %d since %s", pWal->cfg.vgId, __func__, lino, tstrerror(code));
|
wError("vgId:%d, %s failed at line %d since %s", pWal->cfg.vgId, __func__, lino, tstrerror(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t walCheckAndRoll(SWal *pWal) {
|
static FORCE_INLINE int32_t walCheckAndRoll(SWal *pWal) {
|
||||||
|
@ -621,7 +621,7 @@ static FORCE_INLINE int32_t walWriteImpl(SWal *pWal, int64_t index, tmsg_t msgTy
|
||||||
opts.source = newBody;
|
opts.source = newBody;
|
||||||
opts.result = newBodyEncrypted;
|
opts.result = newBodyEncrypted;
|
||||||
opts.unitLen = 16;
|
opts.unitLen = 16;
|
||||||
TAOS_UNUSED(strncpy((char *)opts.key, pWal->cfg.encryptKey, ENCRYPT_KEY_LEN));
|
tstrncpy((char *)opts.key, pWal->cfg.encryptKey, ENCRYPT_KEY_LEN + 1);
|
||||||
|
|
||||||
int32_t count = CBC_Encrypt(&opts);
|
int32_t count = CBC_Encrypt(&opts);
|
||||||
|
|
||||||
|
@ -689,8 +689,13 @@ _exit:
|
||||||
|
|
||||||
static int32_t walInitWriteFile(SWal *pWal) {
|
static int32_t walInitWriteFile(SWal *pWal) {
|
||||||
TdFilePtr pIdxTFile, pLogTFile;
|
TdFilePtr pIdxTFile, pLogTFile;
|
||||||
|
int64_t fileFirstVer = -1;
|
||||||
|
int32_t code = 0;
|
||||||
SWalFileInfo *pRet = taosArrayGetLast(pWal->fileInfoSet);
|
SWalFileInfo *pRet = taosArrayGetLast(pWal->fileInfoSet);
|
||||||
int64_t fileFirstVer = pRet->firstVer;
|
if (pRet == NULL) {
|
||||||
|
fileFirstVer = pWal->vers.lastVer + 1;
|
||||||
|
}
|
||||||
|
fileFirstVer = pRet->firstVer;
|
||||||
|
|
||||||
char fnameStr[WAL_FILE_LEN];
|
char fnameStr[WAL_FILE_LEN];
|
||||||
walBuildIdxName(pWal, fileFirstVer, fnameStr);
|
walBuildIdxName(pWal, fileFirstVer, fnameStr);
|
||||||
|
@ -707,6 +712,13 @@ static int32_t walInitWriteFile(SWal *pWal) {
|
||||||
// switch file
|
// switch file
|
||||||
pWal->pIdxFile = pIdxTFile;
|
pWal->pIdxFile = pIdxTFile;
|
||||||
pWal->pLogFile = pLogTFile;
|
pWal->pLogFile = pLogTFile;
|
||||||
|
if (taosArrayGetSize(pWal->fileInfoSet) == 0) {
|
||||||
|
code = walRollFileInfo(pWal);
|
||||||
|
if (code < 0) {
|
||||||
|
wError("vgId:%d, failed to roll file info while init write file since %s", pWal->cfg.vgId, terrstr());
|
||||||
|
TAOS_RETURN(code);
|
||||||
|
}
|
||||||
|
}
|
||||||
pWal->writeCur = taosArrayGetSize(pWal->fileInfoSet) - 1;
|
pWal->writeCur = taosArrayGetSize(pWal->fileInfoSet) - 1;
|
||||||
|
|
||||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||||
|
|
|
@ -120,33 +120,20 @@ int32_t taosStr2int64(const char *str, int64_t *val) {
|
||||||
if (str == NULL || val == NULL) {
|
if (str == NULL || val == NULL) {
|
||||||
return TSDB_CODE_INVALID_PARA;
|
return TSDB_CODE_INVALID_PARA;
|
||||||
}
|
}
|
||||||
|
errno = 0;
|
||||||
char *endptr = NULL;
|
char *endptr = NULL;
|
||||||
int64_t ret = strtoll(str, &endptr, 10);
|
int64_t ret = strtoll(str, &endptr, 10);
|
||||||
if (errno == ERANGE && (ret == LLONG_MAX || ret == LLONG_MIN)) {
|
if (errno != 0) {
|
||||||
return TAOS_SYSTEM_ERROR(errno);
|
return TAOS_SYSTEM_ERROR(errno);
|
||||||
} else if (errno == EINVAL && ret == 0) {
|
|
||||||
return TSDB_CODE_INVALID_PARA;
|
|
||||||
} else {
|
} else {
|
||||||
|
if (endptr == str) {
|
||||||
|
return TSDB_CODE_INVALID_PARA;
|
||||||
|
}
|
||||||
*val = ret;
|
*val = ret;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosStr2int16(const char *str, int16_t *val) {
|
|
||||||
OS_PARAM_CHECK(str);
|
|
||||||
OS_PARAM_CHECK(val);
|
|
||||||
int64_t tmp = 0;
|
|
||||||
int32_t code = taosStr2int64(str, &tmp);
|
|
||||||
if (code) {
|
|
||||||
return code;
|
|
||||||
} else if (tmp > INT16_MAX || tmp < INT16_MIN) {
|
|
||||||
return TAOS_SYSTEM_ERROR(ERANGE);
|
|
||||||
} else {
|
|
||||||
*val = (int16_t)tmp;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t taosStr2int32(const char *str, int32_t *val) {
|
int32_t taosStr2int32(const char *str, int32_t *val) {
|
||||||
OS_PARAM_CHECK(str);
|
OS_PARAM_CHECK(str);
|
||||||
OS_PARAM_CHECK(val);
|
OS_PARAM_CHECK(val);
|
||||||
|
@ -161,6 +148,20 @@ int32_t taosStr2int32(const char *str, int32_t *val) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
int32_t taosStr2int16(const char *str, int16_t *val) {
|
||||||
|
OS_PARAM_CHECK(str);
|
||||||
|
OS_PARAM_CHECK(val);
|
||||||
|
int64_t tmp = 0;
|
||||||
|
int32_t code = taosStr2int64(str, &tmp);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
} else if (tmp > INT16_MAX || tmp < INT16_MIN) {
|
||||||
|
return TAOS_SYSTEM_ERROR(ERANGE);
|
||||||
|
} else {
|
||||||
|
*val = (int16_t)tmp;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int32_t taosStr2int8(const char *str, int8_t *val) {
|
int32_t taosStr2int8(const char *str, int8_t *val) {
|
||||||
OS_PARAM_CHECK(str);
|
OS_PARAM_CHECK(str);
|
||||||
|
@ -177,6 +178,70 @@ int32_t taosStr2int8(const char *str, int8_t *val) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t taosStr2Uint64(const char *str, uint64_t *val) {
|
||||||
|
if (str == NULL || val == NULL) {
|
||||||
|
return TSDB_CODE_INVALID_PARA;
|
||||||
|
}
|
||||||
|
char *endptr = NULL;
|
||||||
|
errno = 0;
|
||||||
|
uint64_t ret = strtoull(str, &endptr, 10);
|
||||||
|
|
||||||
|
if (errno != 0) {
|
||||||
|
return TAOS_SYSTEM_ERROR(errno);
|
||||||
|
} else {
|
||||||
|
if (endptr == str) {
|
||||||
|
return TSDB_CODE_INVALID_PARA;
|
||||||
|
}
|
||||||
|
*val = ret;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t taosStr2Uint32(const char *str, uint32_t *val) {
|
||||||
|
OS_PARAM_CHECK(str);
|
||||||
|
OS_PARAM_CHECK(val);
|
||||||
|
uint64_t tmp = 0;
|
||||||
|
int32_t code = taosStr2Uint64(str, &tmp);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
} else if (tmp > UINT32_MAX) {
|
||||||
|
return TAOS_SYSTEM_ERROR(ERANGE);
|
||||||
|
} else {
|
||||||
|
*val = (int32_t)tmp;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t taosStr2Uint16(const char *str, uint16_t *val) {
|
||||||
|
OS_PARAM_CHECK(str);
|
||||||
|
OS_PARAM_CHECK(val);
|
||||||
|
uint64_t tmp = 0;
|
||||||
|
int32_t code = taosStr2Uint64(str, &tmp);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
} else if (tmp > UINT16_MAX) {
|
||||||
|
return TAOS_SYSTEM_ERROR(ERANGE);
|
||||||
|
} else {
|
||||||
|
*val = (int16_t)tmp;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t taosStr2Uint8(const char *str, uint8_t *val) {
|
||||||
|
OS_PARAM_CHECK(str);
|
||||||
|
OS_PARAM_CHECK(val);
|
||||||
|
uint64_t tmp = 0;
|
||||||
|
int32_t code = taosStr2Uint64(str, &tmp);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
} else if (tmp > UINT8_MAX) {
|
||||||
|
return TAOS_SYSTEM_ERROR(ERANGE);
|
||||||
|
} else {
|
||||||
|
*val = (int8_t)tmp;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tasoUcs4Compare(TdUcs4 *f1_ucs4, TdUcs4 *f2_ucs4, int32_t bytes) {
|
int32_t tasoUcs4Compare(TdUcs4 *f1_ucs4, TdUcs4 *f2_ucs4, int32_t bytes) {
|
||||||
if ((f1_ucs4 == NULL || f2_ucs4 == NULL)) {
|
if ((f1_ucs4 == NULL || f2_ucs4 == NULL)) {
|
||||||
return TSDB_CODE_INVALID_PARA;
|
return TSDB_CODE_INVALID_PARA;
|
||||||
|
@ -223,7 +288,7 @@ int32_t tasoUcs4Copy(TdUcs4 *target_ucs4, TdUcs4 *source_ucs4, int32_t len_ucs4)
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)memcpy(target_ucs4, source_ucs4, len_ucs4 * sizeof(TdUcs4));
|
(void)memcpy(target_ucs4, source_ucs4, len_ucs4 * sizeof(TdUcs4));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -306,7 +371,7 @@ bool taosMbsToUcs4(const char *mbs, size_t mbsLength, TdUcs4 *ucs4, int32_t ucs4
|
||||||
if (ucs4_max_len == 0) {
|
if (ucs4_max_len == 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(ucs4_max_len < 0 || mbs == NULL || ucs4 == NULL) {
|
if (ucs4_max_len < 0 || mbs == NULL || ucs4 == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -323,8 +388,8 @@ bool taosMbsToUcs4(const char *mbs, size_t mbsLength, TdUcs4 *ucs4, int32_t ucs4
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ucs4_input_len = mbsLength;
|
size_t ucs4_input_len = mbsLength;
|
||||||
size_t outLeft = ucs4_max_len;
|
size_t outLeft = ucs4_max_len;
|
||||||
if (iconv(conv, (char **)&mbs, &ucs4_input_len, (char **)&ucs4, &outLeft) == -1) {
|
if (iconv(conv, (char **)&mbs, &ucs4_input_len, (char **)&ucs4, &outLeft) == -1) {
|
||||||
char buf[512] = {0};
|
char buf[512] = {0};
|
||||||
snprintf(buf, tListLen(buf), " taosMbsToUcs4 error:%s %d %d", strerror(terrno), errno, EILSEQ);
|
snprintf(buf, tListLen(buf), " taosMbsToUcs4 error:%s %d %d", strerror(terrno), errno, EILSEQ);
|
||||||
|
@ -353,7 +418,7 @@ int32_t taosUcs4ToMbs(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs, void* chars
|
||||||
if (ucs4_max_len == 0) {
|
if (ucs4_max_len == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(ucs4_max_len < 0 || ucs4 == NULL || mbs == NULL) {
|
if (ucs4_max_len < 0 || ucs4 == NULL || mbs == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
@ -370,8 +435,8 @@ int32_t taosUcs4ToMbs(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs, void* chars
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ucs4_input_len = ucs4_max_len;
|
size_t ucs4_input_len = ucs4_max_len;
|
||||||
size_t outLen = ucs4_max_len;
|
size_t outLen = ucs4_max_len;
|
||||||
if (iconv(conv, (char **)&ucs4, &ucs4_input_len, &mbs, &outLen) == -1) {
|
if (iconv(conv, (char **)&ucs4, &ucs4_input_len, &mbs, &outLen) == -1) {
|
||||||
code = TAOS_SYSTEM_ERROR(errno);
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
taosReleaseConv(idx, conv, C2M, charsetCxt);
|
taosReleaseConv(idx, conv, C2M, charsetCxt);
|
||||||
|
@ -391,7 +456,7 @@ int32_t taosUcs4ToMbsEx(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs, iconv_t c
|
||||||
if (ucs4_max_len == 0) {
|
if (ucs4_max_len == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(ucs4_max_len < 0 || ucs4 == NULL || mbs == NULL) {
|
if (ucs4_max_len < 0 || ucs4 == NULL || mbs == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
@ -407,13 +472,13 @@ int32_t taosUcs4ToMbsEx(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs, iconv_t c
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (int32_t)(ucs4_max_len - outLen);
|
return (int32_t)(ucs4_max_len - outLen);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosValidateEncodec(const char *encodec) {
|
bool taosValidateEncodec(const char *encodec) {
|
||||||
if(encodec == NULL) {
|
if (encodec == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -465,7 +530,7 @@ int32_t taosHexEncode(const unsigned char *src, char *dst, int32_t len, int32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosHexDecode(const char *src, char *dst, int32_t len) {
|
int32_t taosHexDecode(const char *src, char *dst, int32_t len) {
|
||||||
if(!src || !dst || len <= 0) {
|
if (!src || !dst || len <= 0) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
@ -508,9 +573,10 @@ int32_t taosMbsToWchars(TdWchar *pWchars, const char *pStrs, int32_t size) {
|
||||||
return mbstowcs(pWchars, pStrs, size);
|
return mbstowcs(pWchars, pStrs, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosWcharToMb(char *pStr, TdWchar wchar) {
|
int32_t taosWcharToMb(char *pStr, TdWchar wchar) {
|
||||||
OS_PARAM_CHECK(pStr);
|
OS_PARAM_CHECK(pStr);
|
||||||
return wctomb(pStr, wchar); }
|
return wctomb(pStr, wchar);
|
||||||
|
}
|
||||||
|
|
||||||
char *taosStrCaseStr(const char *str, const char *pattern) {
|
char *taosStrCaseStr(const char *str, const char *pattern) {
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
|
@ -532,7 +598,7 @@ char *taosStrCaseStr(const char *str, const char *pattern) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t taosStr2Int64(const char *str, char **pEnd, int32_t radix) {
|
int64_t taosStr2Int64(const char *str, char **pEnd, int32_t radix) {
|
||||||
if(str == NULL) {
|
if (str == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -544,7 +610,7 @@ int64_t taosStr2Int64(const char *str, char **pEnd, int32_t radix) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t taosStr2UInt64(const char *str, char **pEnd, int32_t radix) {
|
uint64_t taosStr2UInt64(const char *str, char **pEnd, int32_t radix) {
|
||||||
if(str == NULL) {
|
if (str == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -556,7 +622,7 @@ uint64_t taosStr2UInt64(const char *str, char **pEnd, int32_t radix) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosStr2Int32(const char *str, char **pEnd, int32_t radix) {
|
int32_t taosStr2Int32(const char *str, char **pEnd, int32_t radix) {
|
||||||
if(str == NULL) {
|
if (str == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -568,7 +634,7 @@ int32_t taosStr2Int32(const char *str, char **pEnd, int32_t radix) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t taosStr2UInt32(const char *str, char **pEnd, int32_t radix) {
|
uint32_t taosStr2UInt32(const char *str, char **pEnd, int32_t radix) {
|
||||||
if(str == NULL) {
|
if (str == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -580,7 +646,7 @@ uint32_t taosStr2UInt32(const char *str, char **pEnd, int32_t radix) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t taosStr2Int16(const char *str, char **pEnd, int32_t radix) {
|
int16_t taosStr2Int16(const char *str, char **pEnd, int32_t radix) {
|
||||||
if(str == NULL) {
|
if (str == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -592,7 +658,7 @@ int16_t taosStr2Int16(const char *str, char **pEnd, int32_t radix) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t taosStr2UInt16(const char *str, char **pEnd, int32_t radix) {
|
uint16_t taosStr2UInt16(const char *str, char **pEnd, int32_t radix) {
|
||||||
if(str == NULL) {
|
if (str == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -604,7 +670,7 @@ uint16_t taosStr2UInt16(const char *str, char **pEnd, int32_t radix) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t taosStr2Int8(const char *str, char **pEnd, int32_t radix) {
|
int8_t taosStr2Int8(const char *str, char **pEnd, int32_t radix) {
|
||||||
if(str == NULL) {
|
if (str == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -613,7 +679,7 @@ int8_t taosStr2Int8(const char *str, char **pEnd, int32_t radix) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t taosStr2UInt8(const char *str, char **pEnd, int32_t radix) {
|
uint8_t taosStr2UInt8(const char *str, char **pEnd, int32_t radix) {
|
||||||
if(str == NULL) {
|
if (str == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -625,7 +691,7 @@ uint8_t taosStr2UInt8(const char *str, char **pEnd, int32_t radix) {
|
||||||
}
|
}
|
||||||
|
|
||||||
double taosStr2Double(const char *str, char **pEnd) {
|
double taosStr2Double(const char *str, char **pEnd) {
|
||||||
if(str == NULL) {
|
if (str == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -634,7 +700,7 @@ double taosStr2Double(const char *str, char **pEnd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
float taosStr2Float(const char *str, char **pEnd) {
|
float taosStr2Float(const char *str, char **pEnd) {
|
||||||
if(str == NULL) {
|
if (str == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -650,7 +716,7 @@ bool isHex(const char *z, uint32_t n) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValidateHex(const char *z, uint32_t n) {
|
bool isValidateHex(const char *z, uint32_t n) {
|
||||||
if(!z) {
|
if (!z) {
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -676,12 +742,12 @@ int32_t taosHex2Ascii(const char *z, uint32_t n, void **data, uint32_t *size) {
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *tmp = (uint8_t *)taosMemoryCalloc(*size, 1);
|
uint8_t *tmp = (uint8_t *)taosMemoryCalloc(*size, 1);
|
||||||
if (tmp == NULL) {
|
if (tmp == NULL) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t num = 0;
|
int8_t num = 0;
|
||||||
uint8_t *byte = tmp + *size - 1;
|
uint8_t *byte = tmp + *size - 1;
|
||||||
|
|
||||||
|
@ -701,7 +767,7 @@ int32_t taosHex2Ascii(const char *z, uint32_t n, void **data, uint32_t *size) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*data = tmp;
|
*data = tmp;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -777,7 +843,7 @@ int32_t taosAscii2Hex(const char *z, uint32_t n, void **data, uint32_t *size) {
|
||||||
if (tmp == NULL) {
|
if (tmp == NULL) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
*data = tmp;
|
*data = tmp;
|
||||||
*(tmp++) = '\\';
|
*(tmp++) = '\\';
|
||||||
*(tmp++) = 'x';
|
*(tmp++) = 'x';
|
||||||
|
@ -786,7 +852,7 @@ int32_t taosAscii2Hex(const char *z, uint32_t n, void **data, uint32_t *size) {
|
||||||
tmp[i * 2] = valueOf(val >> 4);
|
tmp[i * 2] = valueOf(val >> 4);
|
||||||
tmp[i * 2 + 1] = valueOf(val & 0x0F);
|
tmp[i * 2 + 1] = valueOf(val & 0x0F);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,3 +154,483 @@ TEST(osStringTests, ostsnprintfTests) {
|
||||||
EXPECT_EQ(ret, 11);
|
EXPECT_EQ(ret, 11);
|
||||||
EXPECT_STREQ(buffer, "Float: 3.14");
|
EXPECT_STREQ(buffer, "Float: 3.14");
|
||||||
}
|
}
|
||||||
|
TEST(osStringTests, osStr2Int64) {
|
||||||
|
int64_t val;
|
||||||
|
int32_t result;
|
||||||
|
|
||||||
|
// 测试空指针输入
|
||||||
|
result = taosStr2int64(NULL, &val);
|
||||||
|
assert(result == TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
result = taosStr2int64("123", NULL);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
// 测试无效输入
|
||||||
|
result = taosStr2int64("abc", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
result = taosStr2int64("", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
char large_num[50];
|
||||||
|
snprintf(large_num, sizeof(large_num), "%lld", LLONG_MAX);
|
||||||
|
result = taosStr2int64(large_num, &val);
|
||||||
|
assert(result == 0);
|
||||||
|
assert(val == LLONG_MAX);
|
||||||
|
|
||||||
|
snprintf(large_num, sizeof(large_num), "%lld", LLONG_MIN);
|
||||||
|
result = taosStr2int64(large_num, &val);
|
||||||
|
assert(result == 0);
|
||||||
|
assert(val == LLONG_MIN);
|
||||||
|
|
||||||
|
result = taosStr2int64("123abc", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
|
||||||
|
result = taosStr2int64("abc123", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
// 测试有效的整数字符串
|
||||||
|
result = taosStr2int64("12345", &val);
|
||||||
|
assert(result == 0);
|
||||||
|
assert(val == 12345);
|
||||||
|
|
||||||
|
result = taosStr2int64("-12345", &val);
|
||||||
|
assert(result == 0);
|
||||||
|
assert(val == -12345);
|
||||||
|
|
||||||
|
result = taosStr2int64("0", &val);
|
||||||
|
assert(result == 0);
|
||||||
|
assert(val == 0);
|
||||||
|
|
||||||
|
// 测试带空格的字符串
|
||||||
|
result = taosStr2int64(" 12345", &val);
|
||||||
|
assert(result == 0);
|
||||||
|
assert(val == 12345);
|
||||||
|
|
||||||
|
result = taosStr2int64("12345 ", &val);
|
||||||
|
assert(result == 0);
|
||||||
|
assert(val == 12345);
|
||||||
|
}
|
||||||
|
TEST(osStringTests, osStr2int32) {
|
||||||
|
int32_t val;
|
||||||
|
int32_t result;
|
||||||
|
|
||||||
|
// 测试空指针输入
|
||||||
|
result = taosStr2int32(NULL, &val);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
result = taosStr2int32("123", NULL);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
// 测试无效输入
|
||||||
|
result = taosStr2int32("abc", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
result = taosStr2int32("", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
// 测试超出范围的值
|
||||||
|
char large_num[50];
|
||||||
|
snprintf(large_num, sizeof(large_num), "%d", INT_MAX);
|
||||||
|
result = taosStr2int32(large_num, &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, INT_MAX);
|
||||||
|
|
||||||
|
snprintf(large_num, sizeof(large_num), "%d", INT_MIN);
|
||||||
|
result = taosStr2int32(large_num, &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, INT_MIN);
|
||||||
|
|
||||||
|
// 测试大于 INT32 范围的值
|
||||||
|
snprintf(large_num, sizeof(large_num), "%lld", (long long)INT_MAX + 1);
|
||||||
|
result = taosStr2int32(large_num, &val);
|
||||||
|
ASSERT_EQ(result, TAOS_SYSTEM_ERROR(ERANGE));
|
||||||
|
|
||||||
|
snprintf(large_num, sizeof(large_num), "%lld", (long long)INT_MIN - 1);
|
||||||
|
result = taosStr2int32(large_num, &val);
|
||||||
|
ASSERT_EQ(result, TAOS_SYSTEM_ERROR(ERANGE));
|
||||||
|
|
||||||
|
|
||||||
|
result = taosStr2int32("123abc", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
|
||||||
|
result = taosStr2int32("abc123", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
// 测试有效的整数字符串
|
||||||
|
result = taosStr2int32("12345", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
|
||||||
|
result = taosStr2int32("-12345", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, -12345);
|
||||||
|
|
||||||
|
result = taosStr2int32("0", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 0);
|
||||||
|
|
||||||
|
// 测试带空格的字符串
|
||||||
|
result = taosStr2int32(" 12345", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
|
||||||
|
result = taosStr2int32("12345 ", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osStringTests, taosStr2int16) {
|
||||||
|
int16_t val;
|
||||||
|
int32_t result;
|
||||||
|
|
||||||
|
// 测试空指针输入
|
||||||
|
result = taosStr2int16(NULL, &val);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
result = taosStr2int16("123", NULL);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
// 测试无效输入
|
||||||
|
result = taosStr2int16("abc", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
result = taosStr2int16("", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
// 测试超出范围的值
|
||||||
|
char large_num[50];
|
||||||
|
snprintf(large_num, sizeof(large_num), "%d", INT16_MAX);
|
||||||
|
result = taosStr2int16(large_num, &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, INT16_MAX);
|
||||||
|
|
||||||
|
snprintf(large_num, sizeof(large_num), "%d", INT16_MIN);
|
||||||
|
result = taosStr2int16(large_num, &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, INT16_MIN);
|
||||||
|
|
||||||
|
// 测试大于 INT16 范围的值
|
||||||
|
snprintf(large_num, sizeof(large_num), "%lld", (long long)INT16_MAX + 1);
|
||||||
|
result = taosStr2int16(large_num, &val);
|
||||||
|
ASSERT_EQ(result, TAOS_SYSTEM_ERROR(ERANGE));
|
||||||
|
|
||||||
|
snprintf(large_num, sizeof(large_num), "%lld", (long long)INT16_MIN - 1);
|
||||||
|
result = taosStr2int16(large_num, &val);
|
||||||
|
ASSERT_EQ(result, TAOS_SYSTEM_ERROR(ERANGE));
|
||||||
|
|
||||||
|
result = taosStr2int16("123abc", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
|
||||||
|
result = taosStr2int16("abc123", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
// 测试有效的整数字符串
|
||||||
|
result = taosStr2int16("12345", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
|
||||||
|
result = taosStr2int16("-12345", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, -12345);
|
||||||
|
|
||||||
|
result = taosStr2int16("0", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 0);
|
||||||
|
|
||||||
|
// 测试带空格的字符串
|
||||||
|
result = taosStr2int16(" 12345", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
|
||||||
|
result = taosStr2int16("12345 ", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST(osStringTests, taosStr2int8) {
|
||||||
|
int8_t val;
|
||||||
|
int32_t result;
|
||||||
|
|
||||||
|
// 测试空指针输入
|
||||||
|
result = taosStr2int8(NULL, &val);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
result = taosStr2int8("123", NULL);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
// 测试无效输入
|
||||||
|
result = taosStr2int8("abc", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
result = taosStr2int8("", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
// 测试超出范围的值
|
||||||
|
char large_num[50];
|
||||||
|
snprintf(large_num, sizeof(large_num), "%d", INT8_MAX);
|
||||||
|
result = taosStr2int8(large_num, &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, INT8_MAX);
|
||||||
|
|
||||||
|
snprintf(large_num, sizeof(large_num), "%d", INT8_MIN);
|
||||||
|
result = taosStr2int8(large_num, &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, INT8_MIN);
|
||||||
|
|
||||||
|
// 测试大于 INT8 范围的值
|
||||||
|
snprintf(large_num, sizeof(large_num), "%lld", (long long)INT8_MAX + 1);
|
||||||
|
result = taosStr2int8(large_num, &val);
|
||||||
|
ASSERT_EQ(result, TAOS_SYSTEM_ERROR(ERANGE));
|
||||||
|
|
||||||
|
snprintf(large_num, sizeof(large_num), "%lld", (long long)INT8_MIN - 1);
|
||||||
|
result = taosStr2int8(large_num, &val);
|
||||||
|
ASSERT_EQ(result, TAOS_SYSTEM_ERROR(ERANGE));
|
||||||
|
|
||||||
|
result = taosStr2int8("123abc", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
|
||||||
|
result = taosStr2int8("abc123", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
// 测试有效的整数字符串
|
||||||
|
result = taosStr2int8("123", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
|
||||||
|
result = taosStr2int8("-123", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, -123);
|
||||||
|
|
||||||
|
result = taosStr2int8("0", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 0);
|
||||||
|
|
||||||
|
// 测试带空格的字符串
|
||||||
|
result = taosStr2int8(" 123", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
|
||||||
|
result = taosStr2int8("123 ", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osStringTests, osStr2Uint64) {
|
||||||
|
uint64_t val;
|
||||||
|
int32_t result;
|
||||||
|
|
||||||
|
// 测试空指针输入
|
||||||
|
result = taosStr2Uint64(NULL, &val);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
result = taosStr2Uint64("123", NULL);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
// 测试无效输入
|
||||||
|
result = taosStr2Uint64("abc", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
result = taosStr2Uint64("", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
char large_num[50];
|
||||||
|
snprintf(large_num, sizeof(large_num), "%llu", ULLONG_MAX);
|
||||||
|
result = taosStr2Uint64(large_num, &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, ULLONG_MAX);
|
||||||
|
|
||||||
|
result = taosStr2Uint64("123abc", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
|
||||||
|
result = taosStr2Uint64("abc123", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
// 测试有效的整数字符串
|
||||||
|
result = taosStr2Uint64("12345", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
|
||||||
|
result = taosStr2Uint64("0", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 0);
|
||||||
|
|
||||||
|
// 测试带空格的字符串
|
||||||
|
result = taosStr2Uint64(" 12345", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
|
||||||
|
result = taosStr2Uint64("12345 ", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osStringTests, taosStr2Uint32) {
|
||||||
|
uint32_t val;
|
||||||
|
int32_t result;
|
||||||
|
|
||||||
|
// 测试空指针输入
|
||||||
|
result = taosStr2Uint32(NULL, &val);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
result = taosStr2Uint32("123", NULL);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
// 测试无效输入
|
||||||
|
result = taosStr2Uint32("abc", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
result = taosStr2Uint32("", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
// 测试超出范围的值
|
||||||
|
char large_num[50];
|
||||||
|
snprintf(large_num, sizeof(large_num), "%u", UINT32_MAX);
|
||||||
|
result = taosStr2Uint32(large_num, &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, UINT32_MAX);
|
||||||
|
|
||||||
|
// 测试大于 UINT32 范围的值
|
||||||
|
snprintf(large_num, sizeof(large_num), "%llu", (unsigned long long)UINT32_MAX + 1);
|
||||||
|
result = taosStr2Uint32(large_num, &val);
|
||||||
|
ASSERT_EQ(result, TAOS_SYSTEM_ERROR(ERANGE));
|
||||||
|
|
||||||
|
result = taosStr2Uint32("123abc", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
|
||||||
|
result = taosStr2Uint32("abc123", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
// 测试有效的整数字符串
|
||||||
|
result = taosStr2Uint32("12345", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
|
||||||
|
result = taosStr2Uint32("0", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 0);
|
||||||
|
|
||||||
|
// 测试带空格的字符串
|
||||||
|
result = taosStr2Uint32(" 12345", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
|
||||||
|
result = taosStr2Uint32("12345 ", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osStringTests, taosStr2Uint16) {
|
||||||
|
uint16_t val;
|
||||||
|
int32_t result;
|
||||||
|
|
||||||
|
// 测试空指针输入
|
||||||
|
result = taosStr2Uint16(NULL, &val);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
result = taosStr2Uint16("123", NULL);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
// 测试无效输入
|
||||||
|
result = taosStr2Uint16("abc", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
result = taosStr2Uint16("", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
// 测试超出范围的值
|
||||||
|
char large_num[50];
|
||||||
|
snprintf(large_num, sizeof(large_num), "%u", UINT16_MAX);
|
||||||
|
result = taosStr2Uint16(large_num, &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, UINT16_MAX);
|
||||||
|
|
||||||
|
// 测试大于 UINT16 范围的值
|
||||||
|
snprintf(large_num, sizeof(large_num), "%llu", (unsigned long long)UINT16_MAX + 1);
|
||||||
|
result = taosStr2Uint16(large_num, &val);
|
||||||
|
ASSERT_EQ(result, TAOS_SYSTEM_ERROR(ERANGE));
|
||||||
|
|
||||||
|
result = taosStr2Uint16("123abc", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
|
||||||
|
result = taosStr2Uint16("abc123", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
// 测试有效的整数字符串
|
||||||
|
result = taosStr2Uint16("12345", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
|
||||||
|
result = taosStr2Uint16("0", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 0);
|
||||||
|
|
||||||
|
// 测试带空格的字符串
|
||||||
|
result = taosStr2Uint16(" 12345", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
|
||||||
|
result = taosStr2Uint16("12345 ", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 12345);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osStringTests, taosStr2Uint8) {
|
||||||
|
uint8_t val;
|
||||||
|
int32_t result;
|
||||||
|
|
||||||
|
// 测试空指针输入
|
||||||
|
result = taosStr2Uint8(NULL, &val);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
result = taosStr2Uint8("123", NULL);
|
||||||
|
ASSERT_EQ(result, TSDB_CODE_INVALID_PARA);
|
||||||
|
|
||||||
|
// 测试无效输入
|
||||||
|
result = taosStr2Uint8("abc", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
result = taosStr2Uint8("", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
|
||||||
|
// 测试超出范围的值
|
||||||
|
char large_num[50];
|
||||||
|
snprintf(large_num, sizeof(large_num), "%u", UINT8_MAX);
|
||||||
|
result = taosStr2Uint8(large_num, &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, UINT8_MAX);
|
||||||
|
|
||||||
|
// 测试大于 UINT8 范围的值
|
||||||
|
snprintf(large_num, sizeof(large_num), "%llu", (unsigned long long)UINT8_MAX + 1);
|
||||||
|
result = taosStr2Uint8(large_num, &val);
|
||||||
|
ASSERT_EQ(result, TAOS_SYSTEM_ERROR(ERANGE));
|
||||||
|
|
||||||
|
result = taosStr2Uint8("123abc", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
|
||||||
|
result = taosStr2Uint8("abc123", &val);
|
||||||
|
ASSERT_NE(result, 0);
|
||||||
|
// 测试有效的整数字符串
|
||||||
|
result = taosStr2Uint8("123", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
|
||||||
|
result = taosStr2Uint8("0", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 0);
|
||||||
|
|
||||||
|
// 测试带空格的字符串
|
||||||
|
result = taosStr2Uint8(" 123", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
|
||||||
|
result = taosStr2Uint8("123 ", &val);
|
||||||
|
ASSERT_EQ(result, 0);
|
||||||
|
ASSERT_EQ(val, 123);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -152,11 +152,13 @@ static int32_t cfgCheckAndSetDir(SConfigItem *pItem, const char *inputDir) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t cfgSetBool(SConfigItem *pItem, const char *value, ECfgSrcType stype) {
|
static int32_t cfgSetBool(SConfigItem *pItem, const char *value, ECfgSrcType stype) {
|
||||||
bool tmp = false;
|
int32_t code = 0;
|
||||||
|
bool tmp = false;
|
||||||
if (strcasecmp(value, "true") == 0) {
|
if (strcasecmp(value, "true") == 0) {
|
||||||
tmp = true;
|
tmp = true;
|
||||||
}
|
}
|
||||||
if (atoi(value) > 0) {
|
int32_t val = 0;
|
||||||
|
if ((code = taosStr2int32(value, &val)) == 0 && val > 0) {
|
||||||
tmp = true;
|
tmp = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -308,6 +310,7 @@ static int32_t cfgSetLocale(SConfigItem *pItem, const char *value, ECfgSrcType s
|
||||||
|
|
||||||
static int32_t cfgSetTfsItem(SConfig *pCfg, const char *name, const char *value, const char *level, const char *primary,
|
static int32_t cfgSetTfsItem(SConfig *pCfg, const char *name, const char *value, const char *level, const char *primary,
|
||||||
const char *disable, ECfgSrcType stype) {
|
const char *disable, ECfgSrcType stype) {
|
||||||
|
int32_t code = 0;
|
||||||
(void)taosThreadMutexLock(&pCfg->lock);
|
(void)taosThreadMutexLock(&pCfg->lock);
|
||||||
|
|
||||||
SConfigItem *pItem = cfgGetItem(pCfg, name);
|
SConfigItem *pItem = cfgGetItem(pCfg, name);
|
||||||
|
@ -328,20 +331,40 @@ static int32_t cfgSetTfsItem(SConfig *pCfg, const char *name, const char *value,
|
||||||
|
|
||||||
SDiskCfg cfg = {0};
|
SDiskCfg cfg = {0};
|
||||||
tstrncpy(cfg.dir, pItem->str, sizeof(cfg.dir));
|
tstrncpy(cfg.dir, pItem->str, sizeof(cfg.dir));
|
||||||
cfg.level = level ? atoi(level) : 0;
|
|
||||||
cfg.primary = primary ? atoi(primary) : 1;
|
if (level == NULL || strlen(level) == 0) {
|
||||||
cfg.disable = disable ? atoi(disable) : 0;
|
cfg.level = 0;
|
||||||
|
} else {
|
||||||
|
code = taosStr2int32(level, &cfg.level);
|
||||||
|
TAOS_CHECK_GOTO(code, NULL, _err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (primary == NULL || strlen(primary) == 0) {
|
||||||
|
cfg.primary = 1;
|
||||||
|
} else {
|
||||||
|
code = taosStr2int32(primary, &cfg.primary);
|
||||||
|
TAOS_CHECK_GOTO(code, NULL, _err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (disable == NULL || strlen(disable) == 0) {
|
||||||
|
cfg.disable = 0;
|
||||||
|
} else {
|
||||||
|
code = taosStr2int8(disable, &cfg.disable);
|
||||||
|
TAOS_CHECK_GOTO(code, NULL, _err);
|
||||||
|
}
|
||||||
void *ret = taosArrayPush(pItem->array, &cfg);
|
void *ret = taosArrayPush(pItem->array, &cfg);
|
||||||
if (ret == NULL) {
|
if (ret == NULL) {
|
||||||
(void)taosThreadMutexUnlock(&pCfg->lock);
|
code = terrno;
|
||||||
|
TAOS_CHECK_GOTO(code, NULL, _err);
|
||||||
TAOS_RETURN(terrno);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pItem->stype = stype;
|
pItem->stype = stype;
|
||||||
(void)taosThreadMutexUnlock(&pCfg->lock);
|
(void)taosThreadMutexUnlock(&pCfg->lock);
|
||||||
|
|
||||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||||
|
_err:
|
||||||
|
(void)taosThreadMutexUnlock(&pCfg->lock);
|
||||||
|
TAOS_RETURN(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t cfgUpdateDebugFlagItem(SConfig *pCfg, const char *name, bool resetArray) {
|
static int32_t cfgUpdateDebugFlagItem(SConfig *pCfg, const char *name, bool resetArray) {
|
||||||
|
@ -365,7 +388,7 @@ static int32_t cfgUpdateDebugFlagItem(SConfig *pCfg, const char *name, bool rese
|
||||||
if (pDebugFlagItem == NULL) return -1;
|
if (pDebugFlagItem == NULL) return -1;
|
||||||
if (pDebugFlagItem->array != NULL) {
|
if (pDebugFlagItem->array != NULL) {
|
||||||
SLogVar logVar = {0};
|
SLogVar logVar = {0};
|
||||||
(void)strncpy(logVar.name, name, TSDB_LOG_VAR_LEN - 1);
|
tstrncpy(logVar.name, name, TSDB_LOG_VAR_LEN);
|
||||||
if (NULL == taosArrayPush(pDebugFlagItem->array, &logVar)) {
|
if (NULL == taosArrayPush(pDebugFlagItem->array, &logVar)) {
|
||||||
TAOS_RETURN(terrno);
|
TAOS_RETURN(terrno);
|
||||||
}
|
}
|
||||||
|
@ -462,6 +485,7 @@ void cfgLock(SConfig *pCfg) {
|
||||||
void cfgUnLock(SConfig *pCfg) { (void)taosThreadMutexUnlock(&pCfg->lock); }
|
void cfgUnLock(SConfig *pCfg) { (void)taosThreadMutexUnlock(&pCfg->lock); }
|
||||||
|
|
||||||
int32_t cfgCheckRangeForDynUpdate(SConfig *pCfg, const char *name, const char *pVal, bool isServer) {
|
int32_t cfgCheckRangeForDynUpdate(SConfig *pCfg, const char *name, const char *pVal, bool isServer) {
|
||||||
|
int32_t code = 0;
|
||||||
ECfgDynType dynType = isServer ? CFG_DYN_SERVER : CFG_DYN_CLIENT;
|
ECfgDynType dynType = isServer ? CFG_DYN_SERVER : CFG_DYN_CLIENT;
|
||||||
|
|
||||||
cfgLock(pCfg);
|
cfgLock(pCfg);
|
||||||
|
@ -493,8 +517,9 @@ int32_t cfgCheckRangeForDynUpdate(SConfig *pCfg, const char *name, const char *p
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case CFG_DTYPE_BOOL: {
|
case CFG_DTYPE_BOOL: {
|
||||||
int32_t ival = (int32_t)atoi(pVal);
|
int32_t ival = 0;
|
||||||
if (ival != 0 && ival != 1) {
|
code = taosStr2int32(pVal, &ival);
|
||||||
|
if (code != 0 || (ival != 0 && ival != 1)) {
|
||||||
uError("cfg:%s, type:%s value:%d out of range[0, 1]", pItem->name, cfgDtypeStr(pItem->dtype), ival);
|
uError("cfg:%s, type:%s value:%d out of range[0, 1]", pItem->name, cfgDtypeStr(pItem->dtype), ival);
|
||||||
cfgUnLock(pCfg);
|
cfgUnLock(pCfg);
|
||||||
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
|
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
|
||||||
|
@ -949,9 +974,10 @@ void cfgDumpCfg(SConfig *pCfg, bool tsc, bool dump) {
|
||||||
for (size_t j = 0; j < sz; ++j) {
|
for (size_t j = 0; j < sz; ++j) {
|
||||||
SDiskCfg *pCfg = taosArrayGet(pItem->array, j);
|
SDiskCfg *pCfg = taosArrayGet(pItem->array, j);
|
||||||
if (dump) {
|
if (dump) {
|
||||||
(void)printf("%s %s %s l:%d p:%d d:%"PRIi8"\n", src, name, pCfg->dir, pCfg->level, pCfg->primary, pCfg->disable);
|
(void)printf("%s %s %s l:%d p:%d d:%" PRIi8 "\n", src, name, pCfg->dir, pCfg->level, pCfg->primary,
|
||||||
|
pCfg->disable);
|
||||||
} else {
|
} else {
|
||||||
uInfo("%s %s %s l:%d p:%d d:%"PRIi8, src, name, pCfg->dir, pCfg->level, pCfg->primary, pCfg->disable);
|
uInfo("%s %s %s l:%d p:%d d:%" PRIi8, src, name, pCfg->dir, pCfg->level, pCfg->primary, pCfg->disable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -986,7 +1012,7 @@ int32_t cfgLoadFromEnvVar(SConfig *pConfig) {
|
||||||
name = value = value2 = value3 = value4 = NULL;
|
name = value = value2 = value3 = value4 = NULL;
|
||||||
olen = vlen = vlen2 = vlen3 = vlen4 = 0;
|
olen = vlen = vlen2 = vlen3 = vlen4 = 0;
|
||||||
|
|
||||||
strncpy(line, *pEnv, sizeof(line) - 1);
|
tstrncpy(line, *pEnv, sizeof(line));
|
||||||
pEnv++;
|
pEnv++;
|
||||||
if (taosEnvToCfg(line, line) < 0) {
|
if (taosEnvToCfg(line, line) < 0) {
|
||||||
uTrace("failed to convert env to cfg:%s", line);
|
uTrace("failed to convert env to cfg:%s", line);
|
||||||
|
@ -1031,7 +1057,7 @@ int32_t cfgLoadFromEnvCmd(SConfig *pConfig, const char **envCmd) {
|
||||||
int32_t index = 0;
|
int32_t index = 0;
|
||||||
if (envCmd == NULL) TAOS_RETURN(TSDB_CODE_SUCCESS);
|
if (envCmd == NULL) TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||||
while (envCmd[index] != NULL) {
|
while (envCmd[index] != NULL) {
|
||||||
strncpy(buf, envCmd[index], sizeof(buf) - 1);
|
tstrncpy(buf, envCmd[index], sizeof(buf));
|
||||||
buf[sizeof(buf) - 1] = 0;
|
buf[sizeof(buf) - 1] = 0;
|
||||||
if (taosEnvToCfg(buf, buf) < 0) {
|
if (taosEnvToCfg(buf, buf) < 0) {
|
||||||
uTrace("failed to convert env to cfg:%s", buf);
|
uTrace("failed to convert env to cfg:%s", buf);
|
||||||
|
@ -1482,7 +1508,7 @@ int32_t cfgGetApollUrl(const char **envCmd, const char *envFile, char *apolloUrl
|
||||||
char **pEnv = environ;
|
char **pEnv = environ;
|
||||||
line[1023] = 0;
|
line[1023] = 0;
|
||||||
while (*pEnv != NULL) {
|
while (*pEnv != NULL) {
|
||||||
strncpy(line, *pEnv, sizeof(line) - 1);
|
tstrncpy(line, *pEnv, sizeof(line));
|
||||||
pEnv++;
|
pEnv++;
|
||||||
if (strncmp(line, "TAOS_APOLLO_URL", 14) == 0) {
|
if (strncmp(line, "TAOS_APOLLO_URL", 14) == 0) {
|
||||||
char *p = strchr(line, '=');
|
char *p = strchr(line, '=');
|
||||||
|
|
|
@ -443,6 +443,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_VND_ARB_NOT_SYNCED, "Vgroup peer is not sy
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_VND_WRITE_DISABLED, "Vnode write is disabled for snapshot")
|
TAOS_DEFINE_ERROR(TSDB_CODE_VND_WRITE_DISABLED, "Vnode write is disabled for snapshot")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_VND_COLUMN_COMPRESS_ALREADY_EXIST,"Same with old param")
|
TAOS_DEFINE_ERROR(TSDB_CODE_VND_COLUMN_COMPRESS_ALREADY_EXIST,"Same with old param")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_VND_TTL_FLUSH_INCOMPLETION, "Failed to flush all ttl modification to tdb")
|
TAOS_DEFINE_ERROR(TSDB_CODE_VND_TTL_FLUSH_INCOMPLETION, "Failed to flush all ttl modification to tdb")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_VND_ALREADY_EXIST_BUT_NOT_MATCH, "Vnode already exist but Dbid not match")
|
||||||
|
|
||||||
|
|
||||||
// tsdb
|
// tsdb
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue