Merge branch 'refact/submit_req_marks' of https://github.com/taosdata/TDengine into refact/submit_req_marks
This commit is contained in:
commit
b3e6cfdca7
|
@ -2,7 +2,7 @@
|
||||||
IF (DEFINED VERNUMBER)
|
IF (DEFINED VERNUMBER)
|
||||||
SET(TD_VER_NUMBER ${VERNUMBER})
|
SET(TD_VER_NUMBER ${VERNUMBER})
|
||||||
ELSE ()
|
ELSE ()
|
||||||
SET(TD_VER_NUMBER "3.0.1.8")
|
SET(TD_VER_NUMBER "3.0.2.0")
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
IF (DEFINED VERCOMPATIBLE)
|
IF (DEFINED VERCOMPATIBLE)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# taosadapter
|
# taosadapter
|
||||||
ExternalProject_Add(taosadapter
|
ExternalProject_Add(taosadapter
|
||||||
GIT_REPOSITORY https://github.com/taosdata/taosadapter.git
|
GIT_REPOSITORY https://github.com/taosdata/taosadapter.git
|
||||||
GIT_TAG 0dfad5b
|
GIT_TAG 566540d
|
||||||
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter"
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# taos-tools
|
# taos-tools
|
||||||
ExternalProject_Add(taos-tools
|
ExternalProject_Add(taos-tools
|
||||||
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
||||||
GIT_TAG sml/json
|
GIT_TAG 121c8a3
|
||||||
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
|
|
@ -27,7 +27,6 @@ database_option: {
|
||||||
| PRECISION {'ms' | 'us' | 'ns'}
|
| PRECISION {'ms' | 'us' | 'ns'}
|
||||||
| REPLICA value
|
| REPLICA value
|
||||||
| RETENTIONS ingestion_duration:keep_duration ...
|
| RETENTIONS ingestion_duration:keep_duration ...
|
||||||
| STRICT {'off' | 'on'}
|
|
||||||
| WAL_LEVEL {1 | 2}
|
| WAL_LEVEL {1 | 2}
|
||||||
| VGROUPS value
|
| VGROUPS value
|
||||||
| SINGLE_STABLE {0 | 1}
|
| SINGLE_STABLE {0 | 1}
|
||||||
|
@ -61,9 +60,6 @@ database_option: {
|
||||||
- PRECISION: specifies the precision at which a database records timestamps. Enter ms for milliseconds, us for microseconds, or ns for nanoseconds. The default value is ms.
|
- PRECISION: specifies the precision at which a database records timestamps. Enter ms for milliseconds, us for microseconds, or ns for nanoseconds. The default value is ms.
|
||||||
- REPLICA: specifies the number of replicas that are made of the database. Enter 1 or 3. The default value is 1. The value of the REPLICA parameter cannot exceed the number of dnodes in the cluster.
|
- REPLICA: specifies the number of replicas that are made of the database. Enter 1 or 3. The default value is 1. The value of the REPLICA parameter cannot exceed the number of dnodes in the cluster.
|
||||||
- RETENTIONS: specifies the retention period for data aggregated at various intervals. For example, RETENTIONS 15s:7d,1m:21d,15m:50d indicates that data aggregated every 15 seconds is retained for 7 days, data aggregated every 1 minute is retained for 21 days, and data aggregated every 15 minutes is retained for 50 days. You must enter three aggregation intervals and corresponding retention periods.
|
- RETENTIONS: specifies the retention period for data aggregated at various intervals. For example, RETENTIONS 15s:7d,1m:21d,15m:50d indicates that data aggregated every 15 seconds is retained for 7 days, data aggregated every 1 minute is retained for 21 days, and data aggregated every 15 minutes is retained for 50 days. You must enter three aggregation intervals and corresponding retention periods.
|
||||||
- STRICT: specifies whether strong data consistency is enabled. The default value is off.
|
|
||||||
- on: Strong consistency is enabled and implemented through the Raft consensus algorithm. In this mode, an operation is considered successful once it is confirmed by half of the nodes in the cluster.
|
|
||||||
- off: Strong consistency is disabled. In this mode, an operation is considered successful when it is initiated by the local node.
|
|
||||||
- WAL_LEVEL: specifies whether fsync is enabled. The default value is 1.
|
- WAL_LEVEL: specifies whether fsync is enabled. The default value is 1.
|
||||||
- 1: WAL is enabled but fsync is disabled.
|
- 1: WAL is enabled but fsync is disabled.
|
||||||
- 2: WAL and fsync are both enabled.
|
- 2: WAL and fsync are both enabled.
|
||||||
|
|
|
@ -878,8 +878,10 @@ The source code of the sample application is under `TDengine/examples/JDBC`:
|
||||||
|
|
||||||
| taos-jdbcdriver version | major changes |
|
| taos-jdbcdriver version | major changes |
|
||||||
| :---------------------: | :--------------------------------------------: |
|
| :---------------------: | :--------------------------------------------: |
|
||||||
|
| 3.0.3 | fix timestamp resolution error for REST connection in jdk17+ version |
|
||||||
| 3.0.1 - 3.0.2 | fix the resultSet data is parsed incorrectly sometimes. 3.0.1 is compiled on JDK 11, you are advised to use 3.0.2 in the JDK 8 environment |
|
| 3.0.1 - 3.0.2 | fix the resultSet data is parsed incorrectly sometimes. 3.0.1 is compiled on JDK 11, you are advised to use 3.0.2 in the JDK 8 environment |
|
||||||
| 3.0.0 | Support for TDengine 3.0 |
|
| 3.0.0 | Support for TDengine 3.0 |
|
||||||
|
| 2.0.42 | fix wasNull interface return value in WebSocket connection |
|
||||||
| 2.0.41 | fix decode method of username and password in REST connection |
|
| 2.0.41 | fix decode method of username and password in REST connection |
|
||||||
| 2.0.39 - 2.0.40 | Add REST connection/request timeout parameters |
|
| 2.0.39 - 2.0.40 | Add REST connection/request timeout parameters |
|
||||||
| 2.0.38 | JDBC REST connections add bulk pull function |
|
| 2.0.38 | JDBC REST connections add bulk pull function |
|
||||||
|
|
|
@ -59,6 +59,7 @@ Usage of taosAdapter:
|
||||||
--collectd.port int collectd server port. Env "TAOS_ADAPTER_COLLECTD_PORT" (default 6045)
|
--collectd.port int collectd server port. Env "TAOS_ADAPTER_COLLECTD_PORT" (default 6045)
|
||||||
--collectd.user string collectd user. Env "TAOS_ADAPTER_COLLECTD_USER" (default "root")
|
--collectd.user string collectd user. Env "TAOS_ADAPTER_COLLECTD_USER" (default "root")
|
||||||
--collectd.worker int collectd write worker. Env "TAOS_ADAPTER_COLLECTD_WORKER" (default 10)
|
--collectd.worker int collectd write worker. Env "TAOS_ADAPTER_COLLECTD_WORKER" (default 10)
|
||||||
|
--collectd.ttl int collectd data ttl. Env "TAOS_ADAPTER_COLLECTD_TTL" (default 0, means no ttl)
|
||||||
-c, --config string config path default /etc/taos/taosadapter.toml
|
-c, --config string config path default /etc/taos/taosadapter.toml
|
||||||
--cors.allowAllOrigins cors allow all origins. Env "TAOS_ADAPTER_CORS_ALLOW_ALL_ORIGINS" (default true)
|
--cors.allowAllOrigins cors allow all origins. Env "TAOS_ADAPTER_CORS_ALLOW_ALL_ORIGINS" (default true)
|
||||||
--cors.allowCredentials cors allow credentials. Env "TAOS_ADAPTER_CORS_ALLOW_Credentials"
|
--cors.allowCredentials cors allow credentials. Env "TAOS_ADAPTER_CORS_ALLOW_Credentials"
|
||||||
|
@ -100,6 +101,7 @@ Usage of taosAdapter:
|
||||||
--node_exporter.responseTimeout duration node_exporter response timeout. Env "TAOS_ADAPTER_NODE_EXPORTER_RESPONSE_TIMEOUT" (default 5s)
|
--node_exporter.responseTimeout duration node_exporter response timeout. Env "TAOS_ADAPTER_NODE_EXPORTER_RESPONSE_TIMEOUT" (default 5s)
|
||||||
--node_exporter.urls strings node_exporter urls. Env "TAOS_ADAPTER_NODE_EXPORTER_URLS" (default [http://localhost:9100])
|
--node_exporter.urls strings node_exporter urls. Env "TAOS_ADAPTER_NODE_EXPORTER_URLS" (default [http://localhost:9100])
|
||||||
--node_exporter.user string node_exporter user. Env "TAOS_ADAPTER_NODE_EXPORTER_USER" (default "root")
|
--node_exporter.user string node_exporter user. Env "TAOS_ADAPTER_NODE_EXPORTER_USER" (default "root")
|
||||||
|
--node_exporter.ttl int node_exporter data ttl. Env "TAOS_ADAPTER_NODE_EXPORTER_TTL"(default 0, means no ttl)
|
||||||
--opentsdb.enable enable opentsdb. Env "TAOS_ADAPTER_OPENTSDB_ENABLE" (default true)
|
--opentsdb.enable enable opentsdb. Env "TAOS_ADAPTER_OPENTSDB_ENABLE" (default true)
|
||||||
--opentsdb_telnet.batchSize int opentsdb_telnet batch size. Env "TAOS_ADAPTER_OPENTSDB_TELNET_BATCH_SIZE" (default 1)
|
--opentsdb_telnet.batchSize int opentsdb_telnet batch size. Env "TAOS_ADAPTER_OPENTSDB_TELNET_BATCH_SIZE" (default 1)
|
||||||
--opentsdb_telnet.dbs strings opentsdb_telnet db names. Env "TAOS_ADAPTER_OPENTSDB_TELNET_DBS" (default [opentsdb_telnet,collectd_tsdb,icinga2_tsdb,tcollector_tsdb])
|
--opentsdb_telnet.dbs strings opentsdb_telnet db names. Env "TAOS_ADAPTER_OPENTSDB_TELNET_DBS" (default [opentsdb_telnet,collectd_tsdb,icinga2_tsdb,tcollector_tsdb])
|
||||||
|
@ -110,6 +112,7 @@ Usage of taosAdapter:
|
||||||
--opentsdb_telnet.ports ints opentsdb telnet tcp port. Env "TAOS_ADAPTER_OPENTSDB_TELNET_PORTS" (default [6046,6047,6048,6049])
|
--opentsdb_telnet.ports ints opentsdb telnet tcp port. Env "TAOS_ADAPTER_OPENTSDB_TELNET_PORTS" (default [6046,6047,6048,6049])
|
||||||
--opentsdb_telnet.tcpKeepAlive enable tcp keep alive. Env "TAOS_ADAPTER_OPENTSDB_TELNET_TCP_KEEP_ALIVE"
|
--opentsdb_telnet.tcpKeepAlive enable tcp keep alive. Env "TAOS_ADAPTER_OPENTSDB_TELNET_TCP_KEEP_ALIVE"
|
||||||
--opentsdb_telnet.user string opentsdb_telnet user. Env "TAOS_ADAPTER_OPENTSDB_TELNET_USER" (default "root")
|
--opentsdb_telnet.user string opentsdb_telnet user. Env "TAOS_ADAPTER_OPENTSDB_TELNET_USER" (default "root")
|
||||||
|
--opentsdb_telnet.ttl int opentsdb_telnet data ttl. Env "TAOS_ADAPTER_OPENTSDB_TELNET_TTL"(default 0, means no ttl)
|
||||||
--pool.idleTimeout duration Set idle connection timeout. Env "TAOS_ADAPTER_POOL_IDLE_TIMEOUT" (default 1h0m0s)
|
--pool.idleTimeout duration Set idle connection timeout. Env "TAOS_ADAPTER_POOL_IDLE_TIMEOUT" (default 1h0m0s)
|
||||||
--pool.maxConnect int max connections to taosd. Env "TAOS_ADAPTER_POOL_MAX_CONNECT" (default 4000)
|
--pool.maxConnect int max connections to taosd. Env "TAOS_ADAPTER_POOL_MAX_CONNECT" (default 4000)
|
||||||
--pool.maxIdle int max idle connections to taosd. Env "TAOS_ADAPTER_POOL_MAX_IDLE" (default 4000)
|
--pool.maxIdle int max idle connections to taosd. Env "TAOS_ADAPTER_POOL_MAX_IDLE" (default 4000)
|
||||||
|
@ -131,6 +134,7 @@ Usage of taosAdapter:
|
||||||
--statsd.tcpKeepAlive enable tcp keep alive. Env "TAOS_ADAPTER_STATSD_TCP_KEEP_ALIVE"
|
--statsd.tcpKeepAlive enable tcp keep alive. Env "TAOS_ADAPTER_STATSD_TCP_KEEP_ALIVE"
|
||||||
--statsd.user string statsd user. Env "TAOS_ADAPTER_STATSD_USER" (default "root")
|
--statsd.user string statsd user. Env "TAOS_ADAPTER_STATSD_USER" (default "root")
|
||||||
--statsd.worker int statsd write worker. Env "TAOS_ADAPTER_STATSD_WORKER" (default 10)
|
--statsd.worker int statsd write worker. Env "TAOS_ADAPTER_STATSD_WORKER" (default 10)
|
||||||
|
--statsd.ttl int statsd data ttl. Env "TAOS_ADAPTER_STATSD_TTL" (default 0, means no ttl)
|
||||||
--taosConfigDir string load taos client config path. Env "TAOS_ADAPTER_TAOS_CONFIG_FILE"
|
--taosConfigDir string load taos client config path. Env "TAOS_ADAPTER_TAOS_CONFIG_FILE"
|
||||||
--version Print the version and exit
|
--version Print the version and exit
|
||||||
```
|
```
|
||||||
|
@ -195,6 +199,7 @@ Support InfluxDB query parameters as follows.
|
||||||
- `precision` The time precision used by TDengine
|
- `precision` The time precision used by TDengine
|
||||||
- `u` TDengine user name
|
- `u` TDengine user name
|
||||||
- `p` TDengine password
|
- `p` TDengine password
|
||||||
|
- `ttl` The time to live of automatically created sub-table. This value cannot be updated. TDengine will use the ttl value of the frist data of sub-table to create sub-table. For more information, please refer [Create Table](/taos-sql/table/#create-table)
|
||||||
|
|
||||||
Note: InfluxDB token authorization is not supported at present. Only Basic authorization and query parameter validation are supported.
|
Note: InfluxDB token authorization is not supported at present. Only Basic authorization and query parameter validation are supported.
|
||||||
Example: curl --request POST http://127.0.0.1:6041/influxdb/v1/write?db=test --user "root:taosdata" --data-binary "measurement,host=host1 field1=2i,field2=2.0 1577836800000000000"
|
Example: curl --request POST http://127.0.0.1:6041/influxdb/v1/write?db=test --user "root:taosdata" --data-binary "measurement,host=host1 field1=2i,field2=2.0 1577836800000000000"
|
||||||
|
|
|
@ -153,11 +153,11 @@ The parameters described in this document by the effect that they have on the sy
|
||||||
| Meaning | Execution policy for query statements |
|
| Meaning | Execution policy for query statements |
|
||||||
| Unit | None |
|
| Unit | None |
|
||||||
| Default | 1 |
|
| Default | 1 |
|
||||||
| Notes | 1: Run queries on vnodes and not on qnodes |
|
| Value Range | 1: Run queries on vnodes and not on qnodes
|
||||||
|
|
||||||
2: Run subtasks without scan operators on qnodes and subtasks with scan operators on vnodes.
|
2: Run subtasks without scan operators on qnodes and subtasks with scan operators on vnodes.
|
||||||
|
|
||||||
3: Only run scan operators on vnodes; run all other operators on qnodes.
|
3: Only run scan operators on vnodes; run all other operators on qnodes. |
|
||||||
|
|
||||||
### querySmaOptimize
|
### querySmaOptimize
|
||||||
|
|
||||||
|
@ -173,6 +173,14 @@ The parameters described in this document by the effect that they have on the sy
|
||||||
|
|
||||||
1: Enable SMA indexing and perform queries from suitable statements on precomputation results.|
|
1: Enable SMA indexing and perform queries from suitable statements on precomputation results.|
|
||||||
|
|
||||||
|
### countAlwaysReturnValue
|
||||||
|
|
||||||
|
| Attribute | Description |
|
||||||
|
| -------- | -------------------------------- |
|
||||||
|
| Applicable | Server only |
|
||||||
|
| Meaning | count()/hyperloglog() return value or not if the result data is NULL |
|
||||||
|
| Vlue Range | 0:Return empty line,1:Return 0 |
|
||||||
|
| Default | 1 |
|
||||||
|
|
||||||
### maxNumOfDistinctRes
|
### maxNumOfDistinctRes
|
||||||
|
|
||||||
|
@ -307,6 +315,14 @@ The charset that takes effect is UTF-8.
|
||||||
| Meaning | All data files are stored in this directory |
|
| Meaning | All data files are stored in this directory |
|
||||||
| Default Value | /var/lib/taos |
|
| Default Value | /var/lib/taos |
|
||||||
|
|
||||||
|
### tempDir
|
||||||
|
|
||||||
|
| Attribute | Description |
|
||||||
|
| -------- | ------------------------------------------ |
|
||||||
|
| Applicable | Server only |
|
||||||
|
| Meaning | The directory where to put all the temporary files generated during system running |
|
||||||
|
| Default | /tmp |
|
||||||
|
|
||||||
### minimalTmpDirGB
|
### minimalTmpDirGB
|
||||||
|
|
||||||
| Attribute | Description |
|
| Attribute | Description |
|
||||||
|
@ -336,89 +352,6 @@ The charset that takes effect is UTF-8.
|
||||||
| Value Range | 0-4096 |
|
| Value Range | 0-4096 |
|
||||||
| Default Value | 2x the CPU cores |
|
| Default Value | 2x the CPU cores |
|
||||||
|
|
||||||
## Time Parameters
|
|
||||||
|
|
||||||
### statusInterval
|
|
||||||
|
|
||||||
| Attribute | Description |
|
|
||||||
| -------- | --------------------------- |
|
|
||||||
| Applicable | Server Only |
|
|
||||||
| Meaning | the interval of dnode reporting status to mnode |
|
|
||||||
| Unit | second |
|
|
||||||
| Value Range | 1-10 |
|
|
||||||
| Default Value | 1 |
|
|
||||||
|
|
||||||
### shellActivityTimer
|
|
||||||
|
|
||||||
| Attribute | Description |
|
|
||||||
| -------- | --------------------------------- |
|
|
||||||
| Applicable | Server and Client |
|
|
||||||
| Meaning | The interval for TDengine CLI to send heartbeat to mnode |
|
|
||||||
| Unit | second |
|
|
||||||
| Value Range | 1-120 |
|
|
||||||
| Default Value | 3 |
|
|
||||||
|
|
||||||
## Performance Optimization Parameters
|
|
||||||
|
|
||||||
### numOfCommitThreads
|
|
||||||
|
|
||||||
| Attribute | Description |
|
|
||||||
| -------- | ---------------------- |
|
|
||||||
| Applicable | Server Only |
|
|
||||||
| Meaning | Maximum of threads for committing to disk |
|
|
||||||
| Default Value | |
|
|
||||||
|
|
||||||
## Compression Parameters
|
|
||||||
|
|
||||||
### compressMsgSize
|
|
||||||
|
|
||||||
| Attribute | Description |
|
|
||||||
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| Applicable | Server Only |
|
|
||||||
| Meaning | The threshold for message size to compress the message. | Set the value to 64330 bytes for good message compression. |
|
|
||||||
| Unit | bytes |
|
|
||||||
| Value Range | 0: already compress; >0: compress when message exceeds it; -1: always uncompress |
|
|
||||||
| Default Value | -1 |
|
|
||||||
|
|
||||||
### compressColData
|
|
||||||
|
|
||||||
| Attribute | Description |
|
|
||||||
| -------- | --------------------------------------------------------------------------------------- |
|
|
||||||
| Applicable | Server Only |
|
|
||||||
| Meaning | The threshold for size of column data to trigger compression for the query result |
|
|
||||||
| Unit | bytes |
|
|
||||||
| Value Range | 0: always compress; >0: only compress when the size of any column data exceeds the threshold; -1: always uncompress |
|
|
||||||
| Default Value | -1 |
|
|
||||||
| Default Value | -1 |
|
|
||||||
| Note | available from version 2.3.0.0 | |
|
|
||||||
|
|
||||||
## Continuous Query Parameters |
|
|
||||||
|
|
||||||
### minSlidingTime
|
|
||||||
|
|
||||||
| Attribute | Description |
|
|
||||||
| ------------- | -------------------------------------------------------- |
|
|
||||||
| Applicable | Server Only |
|
|
||||||
| Meaning | Minimum sliding time of time window |
|
|
||||||
| Unit | millisecond or microsecond , depending on time precision |
|
|
||||||
| Value Range | 10-1000000 |
|
|
||||||
| Default Value | 10 |
|
|
||||||
|
|
||||||
### minIntervalTime
|
|
||||||
|
|
||||||
| Attribute | Description |
|
|
||||||
| ------------- | --------------------------- |
|
|
||||||
| Applicable | Server Only |
|
|
||||||
| Meaning | Minimum size of time window |
|
|
||||||
| Unit | millisecond |
|
|
||||||
| Value Range | 1-1000000 |
|
|
||||||
| Default Value | 10 |
|
|
||||||
|
|
||||||
:::info
|
|
||||||
To prevent system resource from being exhausted by multiple concurrent streams, a random delay is applied on each stream automatically. `maxFirstStreamCompDelay` is the maximum delay time before a continuous query is started the first time. `streamCompDelayRatio` is the ratio for calculating delay time, with the size of the time window as base. `maxStreamCompDelay` is the maximum delay time. The actual delay time is a random time not bigger than `maxStreamCompDelay`. If a continuous query fails, `retryStreamComDelay` is the delay time before retrying it, also not bigger than `maxStreamCompDelay`.
|
|
||||||
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Log Parameters
|
## Log Parameters
|
||||||
|
|
||||||
### logDir
|
### logDir
|
||||||
|
@ -665,6 +598,18 @@ To prevent system resource from being exhausted by multiple concurrent streams,
|
||||||
| Value Range | 0: not consistent; 1: consistent. |
|
| Value Range | 0: not consistent; 1: consistent. |
|
||||||
| Default | 1 |
|
| Default | 1 |
|
||||||
|
|
||||||
|
## Compress Parameters
|
||||||
|
|
||||||
|
### compressMsgSize
|
||||||
|
|
||||||
|
| Attribute | Description |
|
||||||
|
| -------- | ----------------------------- |
|
||||||
|
| Applicable | Both Client and Server side |
|
||||||
|
| Meaning | Whether RPC message is compressed |
|
||||||
|
| Value Range | -1: none message is compressed; 0: all messages are compressed; N (N>0): messages exceeding N bytes are compressed |
|
||||||
|
| Default | -1 |
|
||||||
|
|
||||||
|
|
||||||
## Other Parameters
|
## Other Parameters
|
||||||
|
|
||||||
### enableCoreFile
|
### enableCoreFile
|
||||||
|
@ -686,172 +631,60 @@ To prevent system resource from being exhausted by multiple concurrent streams,
|
||||||
| Value Range | 0: disable UDF; 1: enabled UDF |
|
| Value Range | 0: disable UDF; 1: enabled UDF |
|
||||||
| Default Value | 1 |
|
| Default Value | 1 |
|
||||||
|
|
||||||
## Parameter Comparison of TDengine 2.x and 3.0
|
|
||||||
| # | **Parameter** | **In 2.x** | **In 3.0** |
|
## 3.0 Parameters
|
||||||
| --- | :-----------------: | --------------- | --------------- |
|
|
||||||
| 1 | firstEp | Yes | Yes |
|
| # | **参数** | **Applicable to 2.x ** | **Applicable to 3.0 ** | Current behavior in 3.0 |
|
||||||
| 2 | secondEp | Yes | Yes |
|
| --- | :---------------------: | --------------- | --------------- | ------------------------------------------------- |
|
||||||
| 3 | fqdn | Yes | Yes |
|
| 1 | firstEp | Yes | Yes | |
|
||||||
| 4 | serverPort | Yes | Yes |
|
| 2 | secondEp | Yes | Yes | |
|
||||||
| 5 | maxShellConns | Yes | Yes |
|
| 3 | fqdn | Yes | Yes | |
|
||||||
| 6 | monitor | Yes | Yes |
|
| 4 | serverPort | Yes | Yes | |
|
||||||
| 7 | monitorFqdn | No | Yes |
|
| 5 | maxShellConns | Yes | Yes | |
|
||||||
| 8 | monitorPort | No | Yes |
|
| 6 | monitor | Yes | Yes | |
|
||||||
| 9 | monitorInterval | Yes | Yes |
|
| 7 | monitorFqdn | No | Yes | |
|
||||||
| 10 | monitorMaxLogs | No | Yes |
|
| 8 | monitorPort | No | Yes | |
|
||||||
| 11 | monitorComp | No | Yes |
|
| 9 | monitorInterval | Yes | Yes | |
|
||||||
| 12 | telemetryReporting | Yes | Yes |
|
| 10 | queryPolicy | No | Yes | |
|
||||||
| 13 | telemetryInterval | No | Yes |
|
| 11 | querySmaOptimize | No | Yes | |
|
||||||
| 14 | telemetryServer | No | Yes |
|
| 12 | maxNumOfDistinctRes | Yes | Yes | |
|
||||||
| 15 | telemetryPort | No | Yes |
|
| 15 | countAlwaysReturnValue | Yes | Yes | |
|
||||||
| 16 | queryPolicy | No | Yes |
|
| 16 | dataDir | Yes | Yes | |
|
||||||
| 17 | querySmaOptimize | No | Yes |
|
| 17 | minimalDataDirGB | Yes | Yes | |
|
||||||
| 18 | queryRsmaTolerance | No | Yes |
|
| 18 | supportVnodes | No | Yes | |
|
||||||
| 19 | queryBufferSize | Yes | Yes |
|
| 19 | tempDir | Yes | Yes | |
|
||||||
| 20 | maxNumOfDistinctRes | Yes | Yes |
|
| 20 | minimalTmpDirGB | Yes | Yes | |
|
||||||
| 21 | minSlidingTime | Yes | Yes |
|
| 21 | smlChildTableName | Yes | Yes | |
|
||||||
| 22 | minIntervalTime | Yes | Yes |
|
| 22 | smlTagName | Yes | Yes | |
|
||||||
| 23 | countAlwaysReturnValue | Yes | Yes |
|
| 23 | smlDataFormat | No | Yes | |
|
||||||
| 24 | dataDir | Yes | Yes |
|
| 24 | statusInterval | Yes | Yes | |
|
||||||
| 25 | minimalDataDirGB | Yes | Yes |
|
| 25 | logDir | Yes | Yes | |
|
||||||
| 26 | supportVnodes | No | Yes |
|
| 26 | minimalLogDirGB | Yes | Yes | |
|
||||||
| 27 | tempDir | Yes | Yes |
|
| 27 | numOfLogLines | Yes | Yes | |
|
||||||
| 28 | minimalTmpDirGB | Yes | Yes |
|
| 28 | asyncLog | Yes | Yes | |
|
||||||
| 29 | compressMsgSize | Yes | Yes |
|
| 29 | logKeepDays | Yes | Yes | |
|
||||||
| 30 | compressColData | Yes | Yes |
|
| 30 | debugFlag | Yes | Yes | |
|
||||||
| 31 | smlChildTableName | Yes | Yes |
|
| 31 | tmrDebugFlag | Yes | Yes | |
|
||||||
| 32 | smlTagName | Yes | Yes |
|
| 32 | uDebugFlag | Yes | Yes | |
|
||||||
| 33 | smlDataFormat | No | Yes |
|
| 33 | rpcDebugFlag | Yes | Yes | |
|
||||||
| 34 | statusInterval | Yes | Yes |
|
| 34 | jniDebugFlag | Yes | Yes | |
|
||||||
| 35 | shellActivityTimer | Yes | Yes |
|
| 35 | qDebugFlag | Yes | Yes | |
|
||||||
| 36 | transPullupInterval | No | Yes |
|
| 36 | cDebugFlag | Yes | Yes | |
|
||||||
| 37 | mqRebalanceInterval | No | Yes |
|
| 37 | dDebugFlag | Yes | Yes | |
|
||||||
| 38 | ttlUnit | No | Yes |
|
| 38 | vDebugFlag | Yes | Yes | |
|
||||||
| 39 | ttlPushInterval | No | Yes |
|
| 39 | mDebugFlag | Yes | Yes | |
|
||||||
| 40 | numOfTaskQueueThreads | No | Yes |
|
| 40 | wDebugFlag | Yes | Yes | |
|
||||||
| 41 | numOfRpcThreads | No | Yes |
|
| 41 | sDebugFlag | Yes | Yes | |
|
||||||
| 42 | numOfCommitThreads | Yes | Yes |
|
| 42 | tsdbDebugFlag | Yes | Yes | |
|
||||||
| 43 | numOfMnodeReadThreads | No | Yes |
|
| 43 | tqDebugFlag | No | Yes | |
|
||||||
| 44 | numOfVnodeQueryThreads | No | Yes |
|
| 44 | fsDebugFlag | Yes | Yes | |
|
||||||
| 45 | numOfVnodeStreamThreads | No | Yes |
|
| 45 | udfDebugFlag | No | Yes | |
|
||||||
| 46 | numOfVnodeFetchThreads | No | Yes |
|
| 46 | smaDebugFlag | No | Yes | |
|
||||||
| 47 | numOfVnodeRsmaThreads | No | Yes |
|
| 47 | idxDebugFlag | No | Yes | |
|
||||||
| 48 | numOfQnodeQueryThreads | No | Yes |
|
| 48 | tdbDebugFlag | No | Yes | |
|
||||||
| 49 | numOfQnodeFetchThreads | No | Yes |
|
| 49 | metaDebugFlag | No | Yes | |
|
||||||
| 50 | numOfSnodeSharedThreads | No | Yes |
|
| 50 | timezone | Yes | Yes | |
|
||||||
| 51 | numOfSnodeUniqueThreads | No | Yes |
|
| 51 | locale | Yes | Yes | |
|
||||||
| 52 | rpcQueueMemoryAllowed | No | Yes |
|
| 52 | charset | Yes | Yes | |
|
||||||
| 53 | logDir | Yes | Yes |
|
| 53 | udf | Yes | Yes | |
|
||||||
| 54 | minimalLogDirGB | Yes | Yes |
|
| 54 | enableCoreFile | Yes | Yes | |
|
||||||
| 55 | numOfLogLines | Yes | Yes |
|
|
||||||
| 56 | asyncLog | Yes | Yes |
|
|
||||||
| 57 | logKeepDays | Yes | Yes |
|
|
||||||
| 60 | debugFlag | Yes | Yes |
|
|
||||||
| 61 | tmrDebugFlag | Yes | Yes |
|
|
||||||
| 62 | uDebugFlag | Yes | Yes |
|
|
||||||
| 63 | rpcDebugFlag | Yes | Yes |
|
|
||||||
| 64 | jniDebugFlag | Yes | Yes |
|
|
||||||
| 65 | qDebugFlag | Yes | Yes |
|
|
||||||
| 66 | cDebugFlag | Yes | Yes |
|
|
||||||
| 67 | dDebugFlag | Yes | Yes |
|
|
||||||
| 68 | vDebugFlag | Yes | Yes |
|
|
||||||
| 69 | mDebugFlag | Yes | Yes |
|
|
||||||
| 70 | wDebugFlag | Yes | Yes |
|
|
||||||
| 71 | sDebugFlag | Yes | Yes |
|
|
||||||
| 72 | tsdbDebugFlag | Yes | Yes |
|
|
||||||
| 73 | tqDebugFlag | No | Yes |
|
|
||||||
| 74 | fsDebugFlag | Yes | Yes |
|
|
||||||
| 75 | udfDebugFlag | No | Yes |
|
|
||||||
| 76 | smaDebugFlag | No | Yes |
|
|
||||||
| 77 | idxDebugFlag | No | Yes |
|
|
||||||
| 78 | tdbDebugFlag | No | Yes |
|
|
||||||
| 79 | metaDebugFlag | No | Yes |
|
|
||||||
| 80 | timezone | Yes | Yes |
|
|
||||||
| 81 | locale | Yes | Yes |
|
|
||||||
| 82 | charset | Yes | Yes |
|
|
||||||
| 83 | udf | Yes | Yes |
|
|
||||||
| 84 | enableCoreFile | Yes | Yes |
|
|
||||||
| 85 | arbitrator | Yes | No |
|
|
||||||
| 86 | numOfThreadsPerCore | Yes | No |
|
|
||||||
| 87 | numOfMnodes | Yes | No |
|
|
||||||
| 88 | vnodeBak | Yes | No |
|
|
||||||
| 89 | balance | Yes | No |
|
|
||||||
| 90 | balanceInterval | Yes | No |
|
|
||||||
| 91 | offlineThreshold | Yes | No |
|
|
||||||
| 92 | role | Yes | No |
|
|
||||||
| 93 | dnodeNopLoop | Yes | No |
|
|
||||||
| 94 | keepTimeOffset | Yes | No |
|
|
||||||
| 95 | rpcTimer | Yes | No |
|
|
||||||
| 96 | rpcMaxTime | Yes | No |
|
|
||||||
| 97 | rpcForceTcp | Yes | No |
|
|
||||||
| 98 | tcpConnTimeout | Yes | No |
|
|
||||||
| 99 | syncCheckInterval | Yes | No |
|
|
||||||
| 100 | maxTmrCtrl | Yes | No |
|
|
||||||
| 101 | monitorReplica | Yes | No |
|
|
||||||
| 102 | smlTagNullName | Yes | No |
|
|
||||||
| 103 | keepColumnName | Yes | No |
|
|
||||||
| 104 | ratioOfQueryCores | Yes | No |
|
|
||||||
| 105 | maxStreamCompDelay | Yes | No |
|
|
||||||
| 106 | maxFirstStreamCompDelay | Yes | No |
|
|
||||||
| 107 | retryStreamCompDelay | Yes | No |
|
|
||||||
| 108 | streamCompDelayRatio | Yes | No |
|
|
||||||
| 109 | maxVgroupsPerDb | Yes | No |
|
|
||||||
| 110 | maxTablesPerVnode | Yes | No |
|
|
||||||
| 111 | minTablesPerVnode | Yes | No |
|
|
||||||
| 112 | tableIncStepPerVnode | Yes | No |
|
|
||||||
| 113 | cache | Yes | No |
|
|
||||||
| 114 | blocks | Yes | No |
|
|
||||||
| 115 | days | Yes | No |
|
|
||||||
| 116 | keep | Yes | No |
|
|
||||||
| 117 | minRows | Yes | No |
|
|
||||||
| 118 | maxRows | Yes | No |
|
|
||||||
| 119 | quorum | Yes | No |
|
|
||||||
| 120 | comp | Yes | No |
|
|
||||||
| 121 | walLevel | Yes | No |
|
|
||||||
| 122 | fsync | Yes | No |
|
|
||||||
| 123 | replica | Yes | No |
|
|
||||||
| 124 | partitions | Yes | No |
|
|
||||||
| 125 | quorum | Yes | No |
|
|
||||||
| 126 | update | Yes | No |
|
|
||||||
| 127 | cachelast | Yes | No |
|
|
||||||
| 128 | maxSQLLength | Yes | No |
|
|
||||||
| 129 | maxWildCardsLength | Yes | No |
|
|
||||||
| 130 | maxRegexStringLen | Yes | No |
|
|
||||||
| 131 | maxNumOfOrderedRes | Yes | No |
|
|
||||||
| 132 | maxConnections | Yes | No |
|
|
||||||
| 133 | mnodeEqualVnodeNum | Yes | No |
|
|
||||||
| 134 | http | Yes | No |
|
|
||||||
| 135 | httpEnableRecordSql | Yes | No |
|
|
||||||
| 136 | httpMaxThreads | Yes | No |
|
|
||||||
| 137 | restfulRowLimit | Yes | No |
|
|
||||||
| 138 | httpDbNameMandatory | Yes | No |
|
|
||||||
| 139 | httpKeepAlive | Yes | No |
|
|
||||||
| 140 | enableRecordSql | Yes | No |
|
|
||||||
| 141 | maxBinaryDisplayWidth | Yes | No |
|
|
||||||
| 142 | stream | Yes | No |
|
|
||||||
| 143 | retrieveBlockingModel | Yes | No |
|
|
||||||
| 144 | tsdbMetaCompactRatio | Yes | No |
|
|
||||||
| 145 | defaultJSONStrType | Yes | No |
|
|
||||||
| 146 | walFlushSize | Yes | No |
|
|
||||||
| 147 | keepTimeOffset | Yes | No |
|
|
||||||
| 148 | flowctrl | Yes | No |
|
|
||||||
| 149 | slaveQuery | Yes | No |
|
|
||||||
| 150 | adjustMaster | Yes | No |
|
|
||||||
| 151 | topicBinaryLen | Yes | No |
|
|
||||||
| 152 | telegrafUseFieldNum | Yes | No |
|
|
||||||
| 153 | deadLockKillQuery | Yes | No |
|
|
||||||
| 154 | clientMerge | Yes | No |
|
|
||||||
| 155 | sdbDebugFlag | Yes | No |
|
|
||||||
| 156 | odbcDebugFlag | Yes | No |
|
|
||||||
| 157 | httpDebugFlag | Yes | No |
|
|
||||||
| 158 | monDebugFlag | Yes | No |
|
|
||||||
| 159 | cqDebugFlag | Yes | No |
|
|
||||||
| 160 | shortcutFlag | Yes | No |
|
|
||||||
| 161 | probeSeconds | Yes | No |
|
|
||||||
| 162 | probeKillSeconds | Yes | No |
|
|
||||||
| 163 | probeInterval | Yes | No |
|
|
||||||
| 164 | lossyColumns | Yes | No |
|
|
||||||
| 165 | fPrecision | Yes | No |
|
|
||||||
| 166 | dPrecision | Yes | No |
|
|
||||||
| 167 | maxRange | Yes | No |
|
|
||||||
| 168 | range | Yes | No |
|
|
||||||
|
|
|
@ -10,6 +10,10 @@ For TDengine 2.x installation packages by version, please visit [here](https://w
|
||||||
|
|
||||||
import Release from "/components/ReleaseV3";
|
import Release from "/components/ReleaseV3";
|
||||||
|
|
||||||
|
## 3.0.2.0
|
||||||
|
|
||||||
|
<Release type="tdengine" version="3.0.2.0" />
|
||||||
|
|
||||||
## 3.0.1.8
|
## 3.0.1.8
|
||||||
|
|
||||||
<Release type="tdengine" version="3.0.1.8" />
|
<Release type="tdengine" version="3.0.1.8" />
|
||||||
|
|
|
@ -10,6 +10,10 @@ For other historical version installers, please visit [here](https://www.taosdat
|
||||||
|
|
||||||
import Release from "/components/ReleaseV3";
|
import Release from "/components/ReleaseV3";
|
||||||
|
|
||||||
|
## 2.3.2
|
||||||
|
|
||||||
|
<Release type="tools" version="2.3.2" />
|
||||||
|
|
||||||
## 2.3.0
|
## 2.3.0
|
||||||
|
|
||||||
<Release type="tools" version="2.3.0" />
|
<Release type="tools" version="2.3.0" />
|
||||||
|
|
|
@ -68,39 +68,38 @@ TDengine 目前支持时间戳、数字、字符、布尔类型,与 Java 对
|
||||||
### 安装连接器
|
### 安装连接器
|
||||||
|
|
||||||
<Tabs defaultValue="maven">
|
<Tabs defaultValue="maven">
|
||||||
<TabItem value="maven" label="使用 Maven 安装">
|
<TabItem value="maven" label="使用 Maven 安装">
|
||||||
|
|
||||||
目前 taos-jdbcdriver 已经发布到 [Sonatype Repository](https://search.maven.org/artifact/com.taosdata.jdbc/taos-jdbcdriver)
|
目前 taos-jdbcdriver 已经发布到 [Sonatype Repository](https://search.maven.org/artifact/com.taosdata.jdbc/taos-jdbcdriver) 仓库,且各大仓库都已同步。
|
||||||
仓库,且各大仓库都已同步。
|
|
||||||
|
|
||||||
- [sonatype](https://search.maven.org/artifact/com.taosdata.jdbc/taos-jdbcdriver)
|
- [sonatype](https://search.maven.org/artifact/com.taosdata.jdbc/taos-jdbcdriver)
|
||||||
- [mvnrepository](https://mvnrepository.com/artifact/com.taosdata.jdbc/taos-jdbcdriver)
|
- [mvnrepository](https://mvnrepository.com/artifact/com.taosdata.jdbc/taos-jdbcdriver)
|
||||||
- [maven.aliyun](https://maven.aliyun.com/mvn/search)
|
- [maven.aliyun](https://maven.aliyun.com/mvn/search)
|
||||||
|
|
||||||
Maven 项目中,在 pom.xml 中添加以下依赖:
|
Maven 项目中,在 pom.xml 中添加以下依赖:
|
||||||
|
|
||||||
```xml-dtd
|
```xml-dtd
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.taosdata.jdbc</groupId>
|
<groupId>com.taosdata.jdbc</groupId>
|
||||||
<artifactId>taos-jdbcdriver</artifactId>
|
<artifactId>taos-jdbcdriver</artifactId>
|
||||||
<version>3.0.0</version>
|
<version>3.0.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem value="source" label="使用源码编译安装">
|
<TabItem value="source" label="使用源码编译安装">
|
||||||
|
|
||||||
可以通过下载 TDengine 的源码,自己编译最新版本的 Java connector
|
可以通过下载 TDengine 的源码,自己编译最新版本的 Java connector
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git clone https://github.com/taosdata/taos-connector-jdbc.git
|
git clone https://github.com/taosdata/taos-connector-jdbc.git
|
||||||
cd taos-connector-jdbc
|
cd taos-connector-jdbc
|
||||||
mvn clean install -Dmaven.test.skip=true
|
mvn clean install -Dmaven.test.skip=true
|
||||||
```
|
```
|
||||||
|
|
||||||
编译后,在 target 目录下会产生 taos-jdbcdriver-3.0.*-dist.jar 的 jar 包,并自动将编译的 jar 文件放在本地的 Maven 仓库中。
|
编译后,在 target 目录下会产生 taos-jdbcdriver-3.0.*-dist.jar 的 jar 包,并自动将编译的 jar 文件放在本地的 Maven 仓库中。
|
||||||
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
|
|
||||||
## 建立连接
|
## 建立连接
|
||||||
|
@ -111,125 +110,117 @@ TDengine 的 JDBC URL 规范格式为:
|
||||||
对于建立连接,原生连接与 REST 连接有细微不同。
|
对于建立连接,原生连接与 REST 连接有细微不同。
|
||||||
|
|
||||||
<Tabs defaultValue="rest">
|
<Tabs defaultValue="rest">
|
||||||
<TabItem value="native" label="原生连接">
|
<TabItem value="native" label="原生连接">
|
||||||
|
|
||||||
```java
|
```java
|
||||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||||
String jdbcUrl = "jdbc:TAOS://taosdemo.com:6030/test?user=root&password=taosdata";
|
String jdbcUrl = "jdbc:TAOS://taosdemo.com:6030/test?user=root&password=taosdata";
|
||||||
Connection conn = DriverManager.getConnection(jdbcUrl);
|
Connection conn = DriverManager.getConnection(jdbcUrl);
|
||||||
```
|
```
|
||||||
|
|
||||||
以上示例,使用了 JDBC 原生连接的 TSDBDriver,建立了到 hostname 为 taosdemo.com,端口为 6030(TDengine 的默认端口),数据库名为 test 的连接。这个 URL
|
以上示例,使用了 JDBC 原生连接的 TSDBDriver,建立了到 hostname 为 taosdemo.com,端口为 6030(TDengine 的默认端口),数据库名为 test 的连接。这个 URL
|
||||||
中指定用户名(user)为 root,密码(password)为 taosdata。
|
中指定用户名(user)为 root,密码(password)为 taosdata。
|
||||||
|
|
||||||
**注意**:使用 JDBC 原生连接,taos-jdbcdriver 需要依赖客户端驱动(Linux 下是 libtaos.so;Windows 下是 taos.dll;macOS 下是 libtaos.dylib)。
|
**注意**:使用 JDBC 原生连接,taos-jdbcdriver 需要依赖客户端驱动(Linux 下是 libtaos.so;Windows 下是 taos.dll;macOS 下是 libtaos.dylib)。
|
||||||
|
|
||||||
url 中的配置参数如下:
|
url 中的配置参数如下:
|
||||||
|
|
||||||
- user:登录 TDengine 用户名,默认值 'root'。
|
- user:登录 TDengine 用户名,默认值 'root'。
|
||||||
- password:用户登录密码,默认值 'taosdata'。
|
- password:用户登录密码,默认值 'taosdata'。
|
||||||
- cfgdir:客户端配置文件目录路径,Linux OS 上默认值 `/etc/taos`,Windows OS 上默认值 `C:/TDengine/cfg`。
|
- cfgdir:客户端配置文件目录路径,Linux OS 上默认值 `/etc/taos`,Windows OS 上默认值 `C:/TDengine/cfg`。
|
||||||
- charset:客户端使用的字符集,默认值为系统字符集。
|
- charset:客户端使用的字符集,默认值为系统字符集。
|
||||||
- locale:客户端语言环境,默认值系统当前 locale。
|
- locale:客户端语言环境,默认值系统当前 locale。
|
||||||
- timezone:客户端使用的时区,默认值为系统当前时区。
|
- timezone:客户端使用的时区,默认值为系统当前时区。
|
||||||
- batchfetch: true:在执行查询时批量拉取结果集;false:逐行拉取结果集。默认值为:true。开启批量拉取同时获取一批数据在查询数据量较大时批量拉取可以有效的提升查询性能。
|
- batchfetch: true:在执行查询时批量拉取结果集;false:逐行拉取结果集。默认值为:true。开启批量拉取同时获取一批数据在查询数据量较大时批量拉取可以有效的提升查询性能。
|
||||||
- batchErrorIgnore:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败将继续执行下面的 SQL。false:不再执行失败 SQL
|
- batchErrorIgnore:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败将继续执行下面的 SQL。false:不再执行失败 SQL 后的任何语句。默认值为:false。
|
||||||
后的任何语句。默认值为:false。
|
|
||||||
|
|
||||||
JDBC 原生连接的使用请参见[视频教程](https://www.taosdata.com/blog/2020/11/11/1955.html)。
|
JDBC 原生连接的使用请参见[视频教程](https://www.taosdata.com/blog/2020/11/11/1955.html)。
|
||||||
|
|
||||||
**使用 TDengine 客户端驱动配置文件建立连接 **
|
**使用 TDengine 客户端驱动配置文件建立连接 **
|
||||||
|
|
||||||
当使用 JDBC 原生连接连接 TDengine 集群时,可以使用 TDengine 客户端驱动配置文件,在配置文件中指定集群的 firstEp、secondEp 等参数。如下所示:
|
当使用 JDBC 原生连接连接 TDengine 集群时,可以使用 TDengine 客户端驱动配置文件,在配置文件中指定集群的 firstEp、secondEp 等参数。如下所示:
|
||||||
|
|
||||||
1. 在 Java 应用中不指定 hostname 和 port
|
1. 在 Java 应用中不指定 hostname 和 port
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public Connection getConn() throws Exception{
|
public Connection getConn() throws Exception{
|
||||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||||
String jdbcUrl = "jdbc:TAOS://:/test?user=root&password=taosdata";
|
String jdbcUrl = "jdbc:TAOS://:/test?user=root&password=taosdata";
|
||||||
Properties connProps = new Properties();
|
Properties connProps = new Properties();
|
||||||
connProps.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
connProps.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||||
connProps.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
connProps.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||||
connProps.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
connProps.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
||||||
Connection conn = DriverManager.getConnection(jdbcUrl, connProps);
|
Connection conn = DriverManager.getConnection(jdbcUrl, connProps);
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
2. 在配置文件中指定 firstEp 和 secondEp
|
2. 在配置文件中指定 firstEp 和 secondEp
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# first fully qualified domain name (FQDN) for TDengine system
|
# first fully qualified domain name (FQDN) for TDengine system
|
||||||
firstEp cluster_node1:6030
|
firstEp cluster_node1:6030
|
||||||
|
|
||||||
# second fully qualified domain name (FQDN) for TDengine system, for cluster only
|
# second fully qualified domain name (FQDN) for TDengine system, for cluster only
|
||||||
secondEp cluster_node2:6030
|
secondEp cluster_node2:6030
|
||||||
|
|
||||||
# default system charset
|
# default system charset
|
||||||
# charset UTF-8
|
# charset UTF-8
|
||||||
|
|
||||||
# system locale
|
# system locale
|
||||||
# locale en_US.UTF-8
|
# locale en_US.UTF-8
|
||||||
```
|
```
|
||||||
|
|
||||||
以上示例,jdbc 会使用客户端的配置文件,建立到 hostname 为 cluster_node1、端口为 6030、数据库名为 test 的连接。当集群中 firstEp 节点失效时,JDBC 会尝试使用 secondEp
|
以上示例,jdbc 会使用客户端的配置文件,建立到 hostname 为 cluster_node1、端口为 6030、数据库名为 test 的连接。当集群中 firstEp 节点失效时,JDBC 会尝试使用 secondEp 连接集群。
|
||||||
连接集群。
|
|
||||||
|
|
||||||
TDengine 中,只要保证 firstEp 和 secondEp 中一个节点有效,就可以正常建立到集群的连接。
|
TDengine 中,只要保证 firstEp 和 secondEp 中一个节点有效,就可以正常建立到集群的连接。
|
||||||
|
|
||||||
> **注意**:这里的配置文件指的是调用 JDBC Connector 的应用程序所在机器上的配置文件,Linux OS 上默认值 /etc/taos/taos.cfg ,Windows OS 上默认值
|
> **注意**:这里的配置文件指的是调用 JDBC Connector 的应用程序所在机器上的配置文件,Linux OS 上默认值 /etc/taos/taos.cfg ,Windows OS 上默认值 C://TDengine/cfg/taos.cfg。
|
||||||
C://TDengine/cfg/taos.cfg。
|
|
||||||
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem value="rest" label="REST 连接">
|
<TabItem value="rest" label="REST 连接">
|
||||||
|
|
||||||
```java
|
```java
|
||||||
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
||||||
String jdbcUrl = "jdbc:TAOS-RS://taosdemo.com:6041/test?user=root&password=taosdata";
|
String jdbcUrl = "jdbc:TAOS-RS://taosdemo.com:6041/test?user=root&password=taosdata";
|
||||||
Connection conn = DriverManager.getConnection(jdbcUrl);
|
Connection conn = DriverManager.getConnection(jdbcUrl);
|
||||||
```
|
```
|
||||||
|
|
||||||
以上示例,使用了 JDBC REST 连接的 RestfulDriver,建立了到 hostname 为 taosdemo.com,端口为 6041,数据库名为 test 的连接。这个 URL 中指定用户名(user)为
|
以上示例,使用了 JDBC REST 连接的 RestfulDriver,建立了到 hostname 为 taosdemo.com,端口为 6041,数据库名为 test 的连接。这个 URL 中指定用户名(user)为 root,密码(password)为 taosdata。
|
||||||
root,密码(password)为 taosdata。
|
|
||||||
|
|
||||||
使用 JDBC REST 连接,不需要依赖客户端驱动。与 JDBC 原生连接相比,仅需要:
|
使用 JDBC REST 连接,不需要依赖客户端驱动。与 JDBC 原生连接相比,仅需要:
|
||||||
|
|
||||||
1. driverClass 指定为“com.taosdata.jdbc.rs.RestfulDriver”;
|
1. driverClass 指定为“com.taosdata.jdbc.rs.RestfulDriver”;
|
||||||
2. jdbcUrl 以“jdbc:TAOS-RS://”开头;
|
2. jdbcUrl 以“jdbc:TAOS-RS://”开头;
|
||||||
3. 使用 6041 作为连接端口。
|
3. 使用 6041 作为连接端口。
|
||||||
|
|
||||||
url 中的配置参数如下:
|
url 中的配置参数如下:
|
||||||
|
|
||||||
- user:登录 TDengine 用户名,默认值 'root'。
|
- user:登录 TDengine 用户名,默认值 'root'。
|
||||||
- password:用户登录密码,默认值 'taosdata'。
|
- password:用户登录密码,默认值 'taosdata'。
|
||||||
- batchfetch: true:在执行查询时批量拉取结果集;false:逐行拉取结果集。默认值为:false。逐行拉取结果集使用 HTTP 方式进行数据传输。JDBC REST
|
- batchfetch: true:在执行查询时批量拉取结果集;false:逐行拉取结果集。默认值为:false。逐行拉取结果集使用 HTTP 方式进行数据传输。JDBC REST 连接支持批量拉取数据功能。taos-jdbcdriver 与 TDengine 之间通过 WebSocket 连接进行数据传输。相较于 HTTP,WebSocket 可以使 JDBC REST 连接支持大数据量查询,并提升查询性能。
|
||||||
连接支持批量拉取数据功能。taos-jdbcdriver 与 TDengine 之间通过 WebSocket 连接进行数据传输。相较于 HTTP,WebSocket 可以使 JDBC REST 连接支持大数据量查询,并提升查询性能。
|
- charset: 当开启批量拉取数据时,指定解析字符串数据的字符集。
|
||||||
- charset: 当开启批量拉取数据时,指定解析字符串数据的字符集。
|
- batchErrorIgnore:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败,继续执行下面的 SQL 了。false:不再执行失败 SQL 后的任何语句。默认值为:false。
|
||||||
- batchErrorIgnore:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败,继续执行下面的 SQL 了。false:不再执行失败 SQL
|
- httpConnectTimeout: 连接超时时间,单位 ms, 默认值为 5000。
|
||||||
后的任何语句。默认值为:false。
|
- httpSocketTimeout: socket 超时时间,单位 ms,默认值为 5000。仅在 batchfetch 设置为 false 时生效。
|
||||||
- httpConnectTimeout: 连接超时时间,单位 ms, 默认值为 5000。
|
- messageWaitTimeout: 消息超时时间, 单位 ms, 默认值为 3000。 仅在 batchfetch 设置为 true 时生效。
|
||||||
- httpSocketTimeout: socket 超时时间,单位 ms,默认值为 5000。仅在 batchfetch 设置为 false 时生效。
|
- useSSL: 连接中是否使用 SSL。
|
||||||
- messageWaitTimeout: 消息超时时间, 单位 ms, 默认值为 3000。 仅在 batchfetch 设置为 true 时生效。
|
|
||||||
- useSSL: 连接中是否使用 SSL。
|
|
||||||
|
|
||||||
**注意**:部分配置项(比如:locale、timezone)在 REST 连接中不生效。
|
**注意**:部分配置项(比如:locale、timezone)在 REST 连接中不生效。
|
||||||
|
|
||||||
:::note
|
:::note
|
||||||
|
|
||||||
- 与原生连接方式不同,REST 接口是无状态的。在使用 JDBC REST 连接时,需要在 SQL 中指定表、超级表的数据库名称。例如:
|
- 与原生连接方式不同,REST 接口是无状态的。在使用 JDBC REST 连接时,需要在 SQL 中指定表、超级表的数据库名称。例如:
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
INSERT INTO test.t1 USING test.weather (ts, temperature) TAGS('California.SanFrancisco') VALUES(now, 24.6);
|
INSERT INTO test.t1 USING test.weather (ts, temperature) TAGS('California.SanFrancisco') VALUES(now, 24.6);
|
||||||
```
|
```
|
||||||
|
|
||||||
- 如果在 url 中指定了 dbname,那么,JDBC REST 连接会默认使用/rest/sql/dbname 作为 restful 请求的 url,在 SQL 中不需要指定 dbname。例如:url 为
|
- 如果在 url 中指定了 dbname,那么,JDBC REST 连接会默认使用/rest/sql/dbname 作为 restful 请求的 url,在 SQL 中不需要指定 dbname。例如:url 为 jdbc:TAOS-RS://127.0.0.1:6041/test,那么,可以执行 sql:insert into t1 using weather(ts, temperature) tags('California.SanFrancisco') values(now, 24.6);
|
||||||
jdbc:TAOS-RS://127.0.0.1:6041/test,那么,可以执行 sql:insert into t1 using weather(ts, temperature)
|
|
||||||
tags('California.SanFrancisco') values(now, 24.6);
|
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
|
|
||||||
### 指定 URL 和 Properties 获取连接
|
### 指定 URL 和 Properties 获取连接
|
||||||
|
@ -890,8 +881,10 @@ public static void main(String[] args) throws Exception {
|
||||||
|
|
||||||
| taos-jdbcdriver 版本 | 主要变化 |
|
| taos-jdbcdriver 版本 | 主要变化 |
|
||||||
| :------------------: | :----------------------------: |
|
| :------------------: | :----------------------------: |
|
||||||
|
| 3.0.3 | 修复 REST 连接在 jdk17+ 版本时间戳解析错误问题 |
|
||||||
| 3.0.1 - 3.0.2 | 修复一些情况下结果集数据解析错误的问题。3.0.1 在 JDK 11 环境编译,JDK 8 环境下建议使用 3.0.2 版本 |
|
| 3.0.1 - 3.0.2 | 修复一些情况下结果集数据解析错误的问题。3.0.1 在 JDK 11 环境编译,JDK 8 环境下建议使用 3.0.2 版本 |
|
||||||
| 3.0.0 | 支持 TDengine 3.0 |
|
| 3.0.0 | 支持 TDengine 3.0 |
|
||||||
|
| 2.0.42 | 修在 WebSocket 连接中 wasNull 接口返回值 |
|
||||||
| 2.0.41 | 修正 REST 连接中用户名和密码转码方式 |
|
| 2.0.41 | 修正 REST 连接中用户名和密码转码方式 |
|
||||||
| 2.0.39 - 2.0.40 | 增加 REST 连接/请求 超时设置 |
|
| 2.0.39 - 2.0.40 | 增加 REST 连接/请求 超时设置 |
|
||||||
| 2.0.38 | JDBC REST 连接增加批量拉取功能 |
|
| 2.0.38 | JDBC REST 连接增加批量拉取功能 |
|
||||||
|
@ -928,7 +921,7 @@ public static void main(String[] args) throws Exception {
|
||||||
|
|
||||||
**原因**:taos-jdbcdriver 3.0.1 版本需要在 JDK 11+ 环境使用。
|
**原因**:taos-jdbcdriver 3.0.1 版本需要在 JDK 11+ 环境使用。
|
||||||
|
|
||||||
**解决方法**: 更换 taos-jdbcdriver 3.0.2 版本。
|
**解决方法**: 更换 taos-jdbcdriver 3.0.2+ 版本。
|
||||||
|
|
||||||
其它问题请参考 [FAQ](../../../train-faq/faq)
|
其它问题请参考 [FAQ](../../../train-faq/faq)
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@ database_option: {
|
||||||
| PRECISION {'ms' | 'us' | 'ns'}
|
| PRECISION {'ms' | 'us' | 'ns'}
|
||||||
| REPLICA value
|
| REPLICA value
|
||||||
| RETENTIONS ingestion_duration:keep_duration ...
|
| RETENTIONS ingestion_duration:keep_duration ...
|
||||||
| STRICT {'off' | 'on'}
|
|
||||||
| WAL_LEVEL {1 | 2}
|
| WAL_LEVEL {1 | 2}
|
||||||
| VGROUPS value
|
| VGROUPS value
|
||||||
| SINGLE_STABLE {0 | 1}
|
| SINGLE_STABLE {0 | 1}
|
||||||
|
@ -61,9 +60,6 @@ database_option: {
|
||||||
- PRECISION:数据库的时间戳精度。ms 表示毫秒,us 表示微秒,ns 表示纳秒,默认 ms 毫秒。
|
- PRECISION:数据库的时间戳精度。ms 表示毫秒,us 表示微秒,ns 表示纳秒,默认 ms 毫秒。
|
||||||
- REPLICA:表示数据库副本数,取值为 1 或 3,默认为 1。在集群中使用,副本数必须小于或等于 DNODE 的数目。
|
- REPLICA:表示数据库副本数,取值为 1 或 3,默认为 1。在集群中使用,副本数必须小于或等于 DNODE 的数目。
|
||||||
- RETENTIONS:表示数据的聚合周期和保存时长,如 RETENTIONS 15s:7d,1m:21d,15m:50d 表示数据原始采集周期为 15 秒,原始数据保存 7 天;按 1 分钟聚合的数据保存 21 天;按 15 分钟聚合的数据保存 50 天。目前支持且只支持三级存储周期。
|
- RETENTIONS:表示数据的聚合周期和保存时长,如 RETENTIONS 15s:7d,1m:21d,15m:50d 表示数据原始采集周期为 15 秒,原始数据保存 7 天;按 1 分钟聚合的数据保存 21 天;按 15 分钟聚合的数据保存 50 天。目前支持且只支持三级存储周期。
|
||||||
- STRICT:表示数据同步的一致性要求,默认为 off。
|
|
||||||
- on 表示强一致,即运行标准的 raft 协议,半数提交返回成功。
|
|
||||||
- off 表示弱一致,本地提交即返回成功。
|
|
||||||
- WAL_LEVEL:WAL 级别,默认为 1。
|
- WAL_LEVEL:WAL 级别,默认为 1。
|
||||||
- 1:写 WAL,但不执行 fsync。
|
- 1:写 WAL,但不执行 fsync。
|
||||||
- 2:写 WAL,而且执行 fsync。
|
- 2:写 WAL,而且执行 fsync。
|
||||||
|
|
|
@ -59,6 +59,7 @@ Usage of taosAdapter:
|
||||||
--collectd.port int collectd server port. Env "TAOS_ADAPTER_COLLECTD_PORT" (default 6045)
|
--collectd.port int collectd server port. Env "TAOS_ADAPTER_COLLECTD_PORT" (default 6045)
|
||||||
--collectd.user string collectd user. Env "TAOS_ADAPTER_COLLECTD_USER" (default "root")
|
--collectd.user string collectd user. Env "TAOS_ADAPTER_COLLECTD_USER" (default "root")
|
||||||
--collectd.worker int collectd write worker. Env "TAOS_ADAPTER_COLLECTD_WORKER" (default 10)
|
--collectd.worker int collectd write worker. Env "TAOS_ADAPTER_COLLECTD_WORKER" (default 10)
|
||||||
|
--collectd.ttl int collectd data ttl. Env "TAOS_ADAPTER_COLLECTD_TTL" (default 0, means no ttl)
|
||||||
-c, --config string config path default /etc/taos/taosadapter.toml
|
-c, --config string config path default /etc/taos/taosadapter.toml
|
||||||
--cors.allowAllOrigins cors allow all origins. Env "TAOS_ADAPTER_CORS_ALLOW_ALL_ORIGINS" (default true)
|
--cors.allowAllOrigins cors allow all origins. Env "TAOS_ADAPTER_CORS_ALLOW_ALL_ORIGINS" (default true)
|
||||||
--cors.allowCredentials cors allow credentials. Env "TAOS_ADAPTER_CORS_ALLOW_Credentials"
|
--cors.allowCredentials cors allow credentials. Env "TAOS_ADAPTER_CORS_ALLOW_Credentials"
|
||||||
|
@ -100,6 +101,7 @@ Usage of taosAdapter:
|
||||||
--node_exporter.responseTimeout duration node_exporter response timeout. Env "TAOS_ADAPTER_NODE_EXPORTER_RESPONSE_TIMEOUT" (default 5s)
|
--node_exporter.responseTimeout duration node_exporter response timeout. Env "TAOS_ADAPTER_NODE_EXPORTER_RESPONSE_TIMEOUT" (default 5s)
|
||||||
--node_exporter.urls strings node_exporter urls. Env "TAOS_ADAPTER_NODE_EXPORTER_URLS" (default [http://localhost:9100])
|
--node_exporter.urls strings node_exporter urls. Env "TAOS_ADAPTER_NODE_EXPORTER_URLS" (default [http://localhost:9100])
|
||||||
--node_exporter.user string node_exporter user. Env "TAOS_ADAPTER_NODE_EXPORTER_USER" (default "root")
|
--node_exporter.user string node_exporter user. Env "TAOS_ADAPTER_NODE_EXPORTER_USER" (default "root")
|
||||||
|
--node_exporter.ttl int node_exporter data ttl. Env "TAOS_ADAPTER_NODE_EXPORTER_TTL"(default 0, means no ttl)
|
||||||
--opentsdb.enable enable opentsdb. Env "TAOS_ADAPTER_OPENTSDB_ENABLE" (default true)
|
--opentsdb.enable enable opentsdb. Env "TAOS_ADAPTER_OPENTSDB_ENABLE" (default true)
|
||||||
--opentsdb_telnet.batchSize int opentsdb_telnet batch size. Env "TAOS_ADAPTER_OPENTSDB_TELNET_BATCH_SIZE" (default 1)
|
--opentsdb_telnet.batchSize int opentsdb_telnet batch size. Env "TAOS_ADAPTER_OPENTSDB_TELNET_BATCH_SIZE" (default 1)
|
||||||
--opentsdb_telnet.dbs strings opentsdb_telnet db names. Env "TAOS_ADAPTER_OPENTSDB_TELNET_DBS" (default [opentsdb_telnet,collectd_tsdb,icinga2_tsdb,tcollector_tsdb])
|
--opentsdb_telnet.dbs strings opentsdb_telnet db names. Env "TAOS_ADAPTER_OPENTSDB_TELNET_DBS" (default [opentsdb_telnet,collectd_tsdb,icinga2_tsdb,tcollector_tsdb])
|
||||||
|
@ -110,6 +112,7 @@ Usage of taosAdapter:
|
||||||
--opentsdb_telnet.ports ints opentsdb telnet tcp port. Env "TAOS_ADAPTER_OPENTSDB_TELNET_PORTS" (default [6046,6047,6048,6049])
|
--opentsdb_telnet.ports ints opentsdb telnet tcp port. Env "TAOS_ADAPTER_OPENTSDB_TELNET_PORTS" (default [6046,6047,6048,6049])
|
||||||
--opentsdb_telnet.tcpKeepAlive enable tcp keep alive. Env "TAOS_ADAPTER_OPENTSDB_TELNET_TCP_KEEP_ALIVE"
|
--opentsdb_telnet.tcpKeepAlive enable tcp keep alive. Env "TAOS_ADAPTER_OPENTSDB_TELNET_TCP_KEEP_ALIVE"
|
||||||
--opentsdb_telnet.user string opentsdb_telnet user. Env "TAOS_ADAPTER_OPENTSDB_TELNET_USER" (default "root")
|
--opentsdb_telnet.user string opentsdb_telnet user. Env "TAOS_ADAPTER_OPENTSDB_TELNET_USER" (default "root")
|
||||||
|
--opentsdb_telnet.ttl int opentsdb_telnet data ttl. Env "TAOS_ADAPTER_OPENTSDB_TELNET_TTL"(default 0, means no ttl)
|
||||||
--pool.idleTimeout duration Set idle connection timeout. Env "TAOS_ADAPTER_POOL_IDLE_TIMEOUT" (default 1h0m0s)
|
--pool.idleTimeout duration Set idle connection timeout. Env "TAOS_ADAPTER_POOL_IDLE_TIMEOUT" (default 1h0m0s)
|
||||||
--pool.maxConnect int max connections to taosd. Env "TAOS_ADAPTER_POOL_MAX_CONNECT" (default 4000)
|
--pool.maxConnect int max connections to taosd. Env "TAOS_ADAPTER_POOL_MAX_CONNECT" (default 4000)
|
||||||
--pool.maxIdle int max idle connections to taosd. Env "TAOS_ADAPTER_POOL_MAX_IDLE" (default 4000)
|
--pool.maxIdle int max idle connections to taosd. Env "TAOS_ADAPTER_POOL_MAX_IDLE" (default 4000)
|
||||||
|
@ -131,6 +134,7 @@ Usage of taosAdapter:
|
||||||
--statsd.tcpKeepAlive enable tcp keep alive. Env "TAOS_ADAPTER_STATSD_TCP_KEEP_ALIVE"
|
--statsd.tcpKeepAlive enable tcp keep alive. Env "TAOS_ADAPTER_STATSD_TCP_KEEP_ALIVE"
|
||||||
--statsd.user string statsd user. Env "TAOS_ADAPTER_STATSD_USER" (default "root")
|
--statsd.user string statsd user. Env "TAOS_ADAPTER_STATSD_USER" (default "root")
|
||||||
--statsd.worker int statsd write worker. Env "TAOS_ADAPTER_STATSD_WORKER" (default 10)
|
--statsd.worker int statsd write worker. Env "TAOS_ADAPTER_STATSD_WORKER" (default 10)
|
||||||
|
--statsd.ttl int statsd data ttl. Env "TAOS_ADAPTER_STATSD_TTL" (default 0, means no ttl)
|
||||||
--taosConfigDir string load taos client config path. Env "TAOS_ADAPTER_TAOS_CONFIG_FILE"
|
--taosConfigDir string load taos client config path. Env "TAOS_ADAPTER_TAOS_CONFIG_FILE"
|
||||||
--version Print the version and exit
|
--version Print the version and exit
|
||||||
```
|
```
|
||||||
|
@ -195,6 +199,7 @@ AllowWebSockets
|
||||||
- `precision` TDengine 使用的时间精度
|
- `precision` TDengine 使用的时间精度
|
||||||
- `u` TDengine 用户名
|
- `u` TDengine 用户名
|
||||||
- `p` TDengine 密码
|
- `p` TDengine 密码
|
||||||
|
- `ttl` 自动创建的子表生命周期,以子表的第一条数据的 TTL 参数为准,不可更新。更多信息请参考[创建表文档](taos-sql/table/#创建表)的 TTL 参数。
|
||||||
|
|
||||||
注意: 目前不支持 InfluxDB 的 token 验证方式,仅支持 Basic 验证和查询参数验证。
|
注意: 目前不支持 InfluxDB 的 token 验证方式,仅支持 Basic 验证和查询参数验证。
|
||||||
示例: curl --request POST http://127.0.0.1:6041/influxdb/v1/write?db=test --user "root:taosdata" --data-binary "measurement,host=host1 field1=2i,field2=2.0 1577836800000000000"
|
示例: curl --request POST http://127.0.0.1:6041/influxdb/v1/write?db=test --user "root:taosdata" --data-binary "measurement,host=host1 field1=2i,field2=2.0 1577836800000000000"
|
||||||
|
|
|
@ -134,15 +134,6 @@ taos --dump-config
|
||||||
| 取值范围 | 1-200000 |
|
| 取值范围 | 1-200000 |
|
||||||
| 缺省值 | 30 |
|
| 缺省值 | 30 |
|
||||||
|
|
||||||
### telemetryReporting
|
|
||||||
|
|
||||||
| 属性 | 说明 |
|
|
||||||
| -------- | ---------------------------------------- |
|
|
||||||
| 适用范围 | 仅服务端适用 |
|
|
||||||
| 含义 | 是否允许 TDengine 采集和上报基本使用信息 |
|
|
||||||
| 取值范围 | 0:不允许 1:允许 |
|
|
||||||
| 缺省值 | 1 |
|
|
||||||
|
|
||||||
## 查询相关
|
## 查询相关
|
||||||
|
|
||||||
### queryPolicy
|
### queryPolicy
|
||||||
|
@ -191,6 +182,15 @@ taos --dump-config
|
||||||
| 取值范围 | 0 表示包含函数名,1 表示不包含函数名。 |
|
| 取值范围 | 0 表示包含函数名,1 表示不包含函数名。 |
|
||||||
| 缺省值 | 0 |
|
| 缺省值 | 0 |
|
||||||
|
|
||||||
|
### countAlwaysReturnValue
|
||||||
|
|
||||||
|
| 属性 | 说明 |
|
||||||
|
| -------- | -------------------------------- |
|
||||||
|
| 适用范围 | 仅服务端适用 |
|
||||||
|
| 含义 | count/hyperloglog函数在数据为空或者NULL的情况下是否返回值 |
|
||||||
|
| 取值范围 | 0:返回空行,1:返回 0 |
|
||||||
|
| 缺省值 | 1 |
|
||||||
|
|
||||||
## 区域相关
|
## 区域相关
|
||||||
|
|
||||||
### timezone
|
### timezone
|
||||||
|
@ -306,12 +306,20 @@ charset 的有效值是 UTF-8。
|
||||||
| 含义 | 数据文件目录,所有的数据文件都将写入该目录 |
|
| 含义 | 数据文件目录,所有的数据文件都将写入该目录 |
|
||||||
| 缺省值 | /var/lib/taos |
|
| 缺省值 | /var/lib/taos |
|
||||||
|
|
||||||
|
### tempDir
|
||||||
|
|
||||||
|
| 属性 | 说明 |
|
||||||
|
| -------- | ------------------------------------------ |
|
||||||
|
| 适用范围 | 仅服务端适用 |
|
||||||
|
| 含义 | 该参数指定所有系统运行过程中的临时文件生成的目录 |
|
||||||
|
| 缺省值 | /tmp |
|
||||||
|
|
||||||
### minimalTmpDirGB
|
### minimalTmpDirGB
|
||||||
|
|
||||||
| 属性 | 说明 |
|
| 属性 | 说明 |
|
||||||
| -------- | ------------------------------------------------ |
|
| -------- | ------------------------------------------------ |
|
||||||
| 适用范围 | 服务端和客户端均适用 |
|
| 适用范围 | 服务端和客户端均适用 |
|
||||||
| 含义 | 当日志文件夹的磁盘大小小于该值时,停止写临时文件 |
|
| 含义 | tempDir 所指定的临时文件目录所需要保留的最小空间 |
|
||||||
| 单位 | GB |
|
| 单位 | GB |
|
||||||
| 缺省值 | 1.0 |
|
| 缺省值 | 1.0 |
|
||||||
|
|
||||||
|
@ -320,7 +328,7 @@ charset 的有效值是 UTF-8。
|
||||||
| 属性 | 说明 |
|
| 属性 | 说明 |
|
||||||
| -------- | ------------------------------------------------ |
|
| -------- | ------------------------------------------------ |
|
||||||
| 适用范围 | 仅服务端适用 |
|
| 适用范围 | 仅服务端适用 |
|
||||||
| 含义 | 当日志文件夹的磁盘大小小于该值时,停止写时序数据 |
|
| 含义 | dataDir 指定的时序数据存储目录所需要保留的最小 |
|
||||||
| 单位 | GB |
|
| 单位 | GB |
|
||||||
| 缺省值 | 2.0 |
|
| 缺省值 | 2.0 |
|
||||||
|
|
||||||
|
@ -335,27 +343,7 @@ charset 的有效值是 UTF-8。
|
||||||
| 取值范围 | 0-4096 |
|
| 取值范围 | 0-4096 |
|
||||||
| 缺省值 | CPU 核数的 2 倍 |
|
| 缺省值 | CPU 核数的 2 倍 |
|
||||||
|
|
||||||
## 时间相关
|
## 时间相关 |
|
||||||
|
|
||||||
### statusInterval
|
|
||||||
|
|
||||||
| 属性 | 说明 |
|
|
||||||
| -------- | --------------------------- |
|
|
||||||
| 适用范围 | 仅服务端适用 |
|
|
||||||
| 含义 | dnode 向 mnode 报告状态间隔 |
|
|
||||||
| 单位 | 秒 |
|
|
||||||
| 取值范围 | 1-10 |
|
|
||||||
| 缺省值 | 1 |
|
|
||||||
|
|
||||||
### shellActivityTimer
|
|
||||||
|
|
||||||
| 属性 | 说明 |
|
|
||||||
| -------- | --------------------------------- |
|
|
||||||
| 适用范围 | 服务端和客户端均适用 |
|
|
||||||
| 含义 | shell 客户端向 mnode 发送心跳间隔 |
|
|
||||||
| 单位 | 秒 |
|
|
||||||
| 取值范围 | 1-120 |
|
|
||||||
| 缺省值 | 3 |
|
|
||||||
|
|
||||||
## 性能调优
|
## 性能调优
|
||||||
|
|
||||||
|
@ -367,28 +355,6 @@ charset 的有效值是 UTF-8。
|
||||||
| 含义 | 设置写入线程的最大数量 |
|
| 含义 | 设置写入线程的最大数量 |
|
||||||
| 缺省值 | |
|
| 缺省值 | |
|
||||||
|
|
||||||
## 压缩相关
|
|
||||||
|
|
||||||
### compressMsgSize
|
|
||||||
|
|
||||||
| 属性 | 说明 |
|
|
||||||
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| 适用范围 | 仅服务端适用 |
|
|
||||||
| 含义 | 客户端与服务器之间进行消息通讯过程中,对通讯的消息进行压缩的阈值。如果要压缩消息,建议设置为 64330 字节,即大于 64330 字节的消息体才进行压缩。 |
|
|
||||||
| 单位 | bytes |
|
|
||||||
| 取值范围 | `0 `表示对所有的消息均进行压缩 >0: 超过该值的消息才进行压缩 -1: 不压缩 |
|
|
||||||
| 缺省值 | -1 |
|
|
||||||
|
|
||||||
### compressColData
|
|
||||||
|
|
||||||
| 属性 | 说明 |
|
|
||||||
| -------- | --------------------------------------------------------------------------------------- |
|
|
||||||
| 适用范围 | 仅服务端适用 |
|
|
||||||
| 含义 | 客户端与服务器之间进行消息通讯过程中,对服务器端查询结果进行列压缩的阈值。 |
|
|
||||||
| 单位 | bytes |
|
|
||||||
| 取值范围 | 0: 对所有查询结果均进行压缩 >0: 查询结果中任意列大小超过该值的消息才进行压缩 -1: 不压缩 |
|
|
||||||
| 缺省值 | -1 |
|
|
||||||
|
|
||||||
## 日志相关
|
## 日志相关
|
||||||
|
|
||||||
### logDir
|
### logDir
|
||||||
|
@ -613,7 +579,7 @@ charset 的有效值是 UTF-8。
|
||||||
| 属性 | 说明 |
|
| 属性 | 说明 |
|
||||||
| -------- | ------------------------- |
|
| -------- | ------------------------- |
|
||||||
| 适用范围 | 仅客户端适用 |
|
| 适用范围 | 仅客户端适用 |
|
||||||
| 含义 | schemaless 自定义的子表名 |
|
| 含义 | schemaless 自定义的子表名的 key |
|
||||||
| 类型 | 字符串 |
|
| 类型 | 字符串 |
|
||||||
| 缺省值 | 无 |
|
| 缺省值 | 无 |
|
||||||
|
|
||||||
|
@ -656,12 +622,18 @@ charset 的有效值是 UTF-8。
|
||||||
| 取值范围 | 0: 不启动;1:启动 |
|
| 取值范围 | 0: 不启动;1:启动 |
|
||||||
| 缺省值 | 1 |
|
| 缺省值 | 1 |
|
||||||
|
|
||||||
## 2.X 与 3.0 配置参数对比
|
## 压缩参数
|
||||||
|
|
||||||
:::note
|
### compressMsgSize
|
||||||
对于 2.x 版本中适用但在 3.0 版本中废弃的参数,其当前行为会有特别说明
|
|
||||||
|
|
||||||
:::
|
| 属性 | 说明 |
|
||||||
|
| -------- | ----------------------------- |
|
||||||
|
| 适用于 | 服务端和客户端均适用 |
|
||||||
|
| 含义 | 是否对 RPC 消息进行压缩 |
|
||||||
|
| 取值范围 | -1: 所有消息都不压缩; 0: 所有消息都压缩; N (N>0): 只有大于 N 个字节的消息才压缩 |
|
||||||
|
| 缺省值 | -1 |
|
||||||
|
|
||||||
|
## 3.0 中有效的配置参数列表
|
||||||
|
|
||||||
| # | **参数** | **适用于 2.X ** | **适用于 3.0 ** | 3.0 版本的当前行为 |
|
| # | **参数** | **适用于 2.X ** | **适用于 3.0 ** | 3.0 版本的当前行为 |
|
||||||
| --- | :---------------------: | --------------- | --------------- | ------------------------------------------------- |
|
| --- | :---------------------: | --------------- | --------------- | ------------------------------------------------- |
|
||||||
|
@ -674,159 +646,134 @@ charset 的有效值是 UTF-8。
|
||||||
| 7 | monitorFqdn | 否 | 是 | |
|
| 7 | monitorFqdn | 否 | 是 | |
|
||||||
| 8 | monitorPort | 否 | 是 | |
|
| 8 | monitorPort | 否 | 是 | |
|
||||||
| 9 | monitorInterval | 是 | 是 | |
|
| 9 | monitorInterval | 是 | 是 | |
|
||||||
| 10 | monitorMaxLogs | 否 | 是 | |
|
| 10 | queryPolicy | 否 | 是 | |
|
||||||
| 11 | monitorComp | 否 | 是 | |
|
| 11 | querySmaOptimize | 否 | 是 | |
|
||||||
| 12 | telemetryReporting | 是 | 是 | |
|
| 12 | maxNumOfDistinctRes | 是 | 是 | |
|
||||||
| 13 | telemetryInterval | 否 | 是 | |
|
| 15 | countAlwaysReturnValue | 是 | 是 | |
|
||||||
| 14 | telemetryServer | 否 | 是 | |
|
| 16 | dataDir | 是 | 是 | |
|
||||||
| 15 | telemetryPort | 否 | 是 | |
|
| 17 | minimalDataDirGB | 是 | 是 | |
|
||||||
| 16 | queryPolicy | 否 | 是 | |
|
| 18 | supportVnodes | 否 | 是 | |
|
||||||
| 17 | querySmaOptimize | 否 | 是 | |
|
| 19 | tempDir | 是 | 是 | |
|
||||||
| 18 | queryRsmaTolerance | 否 | 是 | |
|
| 20 | minimalTmpDirGB | 是 | 是 | |
|
||||||
| 19 | queryBufferSize | 是 | 是 | |
|
| 21 | smlChildTableName | 是 | 是 | |
|
||||||
| 20 | maxNumOfDistinctRes | 是 | 是 | |
|
| 22 | smlTagName | 是 | 是 | |
|
||||||
| 21 | minSlidingTime | 是 | 是 | |
|
| 23 | smlDataFormat | 否 | 是 | |
|
||||||
| 22 | minIntervalTime | 是 | 是 | |
|
| 24 | statusInterval | 是 | 是 | |
|
||||||
| 23 | countAlwaysReturnValue | 是 | 是 | |
|
| 25 | logDir | 是 | 是 | |
|
||||||
| 24 | dataDir | 是 | 是 | |
|
| 26 | minimalLogDirGB | 是 | 是 | |
|
||||||
| 25 | minimalDataDirGB | 是 | 是 | |
|
| 27 | numOfLogLines | 是 | 是 | |
|
||||||
| 26 | supportVnodes | 否 | 是 | |
|
| 28 | asyncLog | 是 | 是 | |
|
||||||
| 27 | tempDir | 是 | 是 | |
|
| 29 | logKeepDays | 是 | 是 | |
|
||||||
| 28 | minimalTmpDirGB | 是 | 是 | |
|
| 30 | debugFlag | 是 | 是 | |
|
||||||
| 29 | compressMsgSize | 是 | 是 | |
|
| 31 | tmrDebugFlag | 是 | 是 | |
|
||||||
| 30 | compressColData | 是 | 是 | |
|
| 32 | uDebugFlag | 是 | 是 | |
|
||||||
| 31 | smlChildTableName | 是 | 是 | |
|
| 33 | rpcDebugFlag | 是 | 是 | |
|
||||||
| 32 | smlTagName | 是 | 是 | |
|
| 34 | jniDebugFlag | 是 | 是 | |
|
||||||
| 33 | smlDataFormat | 否 | 是 | |
|
| 35 | qDebugFlag | 是 | 是 | |
|
||||||
| 34 | statusInterval | 是 | 是 | |
|
| 36 | cDebugFlag | 是 | 是 | |
|
||||||
| 35 | shellActivityTimer | 是 | 是 | |
|
| 37 | dDebugFlag | 是 | 是 | |
|
||||||
| 36 | transPullupInterval | 否 | 是 | |
|
| 38 | vDebugFlag | 是 | 是 | |
|
||||||
| 37 | mqRebalanceInterval | 否 | 是 | |
|
| 39 | mDebugFlag | 是 | 是 | |
|
||||||
| 38 | ttlUnit | 否 | 是 | |
|
| 40 | wDebugFlag | 是 | 是 | |
|
||||||
| 39 | ttlPushInterval | 否 | 是 | |
|
| 41 | sDebugFlag | 是 | 是 | |
|
||||||
| 40 | numOfTaskQueueThreads | 否 | 是 | |
|
| 42 | tsdbDebugFlag | 是 | 是 | |
|
||||||
| 41 | numOfRpcThreads | 否 | 是 | |
|
| 43 | tqDebugFlag | 否 | 是 | |
|
||||||
| 42 | numOfCommitThreads | 是 | 是 | |
|
| 44 | fsDebugFlag | 是 | 是 | |
|
||||||
| 43 | numOfMnodeReadThreads | 否 | 是 | |
|
| 45 | udfDebugFlag | 否 | 是 | |
|
||||||
| 44 | numOfVnodeQueryThreads | 否 | 是 | |
|
| 46 | smaDebugFlag | 否 | 是 | |
|
||||||
| 45 | numOfVnodeStreamThreads | 否 | 是 | |
|
| 47 | idxDebugFlag | 否 | 是 | |
|
||||||
| 46 | numOfVnodeFetchThreads | 否 | 是 | |
|
| 48 | tdbDebugFlag | 否 | 是 | |
|
||||||
| 47 | numOfVnodeRsmaThreads | 否 | 是 | |
|
| 49 | metaDebugFlag | 否 | 是 | |
|
||||||
| 48 | numOfQnodeQueryThreads | 否 | 是 | |
|
| 50 | timezone | 是 | 是 | |
|
||||||
| 49 | numOfQnodeFetchThreads | 否 | 是 | |
|
| 51 | locale | 是 | 是 | |
|
||||||
| 50 | numOfSnodeSharedThreads | 否 | 是 | |
|
| 52 | charset | 是 | 是 | |
|
||||||
| 51 | numOfSnodeUniqueThreads | 否 | 是 | |
|
| 53 | udf | 是 | 是 | |
|
||||||
| 52 | rpcQueueMemoryAllowed | 否 | 是 | |
|
| 54 | enableCoreFile | 是 | 是 | |
|
||||||
| 53 | logDir | 是 | 是 | |
|
|
||||||
| 54 | minimalLogDirGB | 是 | 是 | |
|
## 2.x->3.0 的废弃参数
|
||||||
| 55 | numOfLogLines | 是 | 是 | |
|
|
||||||
| 56 | asyncLog | 是 | 是 | |
|
| # | **参数** | **适用于 2.X ** | **适用于 3.0 ** | 3.0 版本的当前行为 |
|
||||||
| 57 | logKeepDays | 是 | 是 | |
|
| --- | :---------------------: | --------------- | --------------- | ------------------------------------------------- |
|
||||||
| 60 | debugFlag | 是 | 是 | |
|
| 1 | arbitrator | 是 | 否 | 通过 RAFT 协议选主 |
|
||||||
| 61 | tmrDebugFlag | 是 | 是 | |
|
| 2 | numOfThreadsPerCore | 是 | 否 | 有其它参数设置多种线程池的大小 |
|
||||||
| 62 | uDebugFlag | 是 | 是 | |
|
| 3 | numOfMnodes | 是 | 否 | 通过 create mnode 命令动态创建 mnode |
|
||||||
| 63 | rpcDebugFlag | 是 | 是 | |
|
| 4 | vnodeBak | 是 | 否 | 3.0 行为未知 |
|
||||||
| 64 | jniDebugFlag | 是 | 是 | |
|
| 5 | balance | 是 | 否 | 负载均衡功能由 split/merge vgroups 实现 |
|
||||||
| 65 | qDebugFlag | 是 | 是 | |
|
| 6 | balanceInterval | 是 | 否 | 随着 balance 参数失效 |
|
||||||
| 66 | cDebugFlag | 是 | 是 | |
|
| 7 | offlineThreshold | 是 | 否 | 3.0 行为未知 |
|
||||||
| 67 | dDebugFlag | 是 | 是 | |
|
| 8 | role | 是 | 否 | 由 supportVnode 决定是否能够创建 |
|
||||||
| 68 | vDebugFlag | 是 | 是 | |
|
| 9 | dnodeNopLoop | 是 | 否 | 2.6 文档中未找到此参数 |
|
||||||
| 69 | mDebugFlag | 是 | 是 | |
|
| 10 | keepTimeOffset | 是 | 否 | 2.6 文档中未找到此参数 |
|
||||||
| 70 | wDebugFlag | 是 | 是 | |
|
| 11 | rpcTimer | 是 | 否 | 3.0 行为未知 |
|
||||||
| 71 | sDebugFlag | 是 | 是 | |
|
| 12 | rpcMaxTime | 是 | 否 | 3.0 行为未知 |
|
||||||
| 72 | tsdbDebugFlag | 是 | 是 | |
|
| 13 | rpcForceTcp | 是 | 否 | 默认为 TCP |
|
||||||
| 73 | tqDebugFlag | 否 | 是 | |
|
| 14 | tcpConnTimeout | 是 | 否 | 3.0 行为未知 |
|
||||||
| 74 | fsDebugFlag | 是 | 是 | |
|
| 15 | syncCheckInterval | 是 | 否 | 3.0 行为未知 |
|
||||||
| 75 | udfDebugFlag | 否 | 是 | |
|
| 16 | maxTmrCtrl | 是 | 否 | 3.0 行为未知 |
|
||||||
| 76 | smaDebugFlag | 否 | 是 | |
|
| 17 | monitorReplica | 是 | 否 | 由 RAFT 协议管理多副本 |
|
||||||
| 77 | idxDebugFlag | 否 | 是 | |
|
| 18 | smlTagNullName | 是 | 否 | 3.0 行为未知 |
|
||||||
| 78 | tdbDebugFlag | 否 | 是 | |
|
| 19 | keepColumnName | 是 | 否 | 3.0 行为未知 |
|
||||||
| 79 | metaDebugFlag | 否 | 是 | |
|
| 20 | ratioOfQueryCores | 是 | 否 | 由 线程池 相关配置参数决定 |
|
||||||
| 80 | timezone | 是 | 是 | |
|
| 21 | maxStreamCompDelay | 是 | 否 | 3.0 行为未知 |
|
||||||
| 81 | locale | 是 | 是 | |
|
| 22 | maxFirstStreamCompDelay | 是 | 否 | 3.0 行为未知 |
|
||||||
| 82 | charset | 是 | 是 | |
|
| 23 | retryStreamCompDelay | 是 | 否 | 3.0 行为未知 |
|
||||||
| 83 | udf | 是 | 是 | |
|
| 24 | streamCompDelayRatio | 是 | 否 | 3.0 行为未知 |
|
||||||
| 84 | enableCoreFile | 是 | 是 | |
|
| 25 | maxVgroupsPerDb | 是 | 否 | 由 create db 的参数 vgroups 指定实际 vgroups 数量 |
|
||||||
| 85 | arbitrator | 是 | 否 | 通过 RAFT 协议选主 |
|
| 26 | maxTablesPerVnode | 是 | 否 | DB 中的所有表近似平均分配到各个 vgroup |
|
||||||
| 86 | numOfThreadsPerCore | 是 | 否 | 有其它参数设置多种线程池的大小 |
|
| 27 | minTablesPerVnode | 是 | 否 | DB 中的所有表近似平均分配到各个 vgroup |
|
||||||
| 87 | numOfMnodes | 是 | 否 | 通过 create mnode 命令动态创建 mnode |
|
| 28 | tableIncStepPerVnode | 是 | 否 | DB 中的所有表近似平均分配到各个 vgroup |
|
||||||
| 88 | vnodeBak | 是 | 否 | 3.0 行为未知 |
|
| 29 | cache | 是 | 否 | 由 buffer 代替 cache\*blocks |
|
||||||
| 89 | balance | 是 | 否 | 负载均衡功能由 split/merge vgroups 实现 |
|
| 30 | blocks | 是 | 否 | 由 buffer 代替 cache\*blocks |
|
||||||
| 90 | balanceInterval | 是 | 否 | 随着 balance 参数失效 |
|
| 31 | days | 是 | 否 | 由 create db 的参数 duration 取代 |
|
||||||
| 91 | offlineThreshold | 是 | 否 | 3.0 行为未知 |
|
| 32 | keep | 是 | 否 | 由 create db 的参数 keep 取代 |
|
||||||
| 92 | role | 是 | 否 | 由 supportVnode 决定是否能够创建 |
|
| 33 | minRows | 是 | 否 | 由 create db 的参数 minRows 取代 |
|
||||||
| 93 | dnodeNopLoop | 是 | 否 | 2.6 文档中未找到此参数 |
|
| 34 | maxRows | 是 | 否 | 由 create db 的参数 maxRows 取代 |
|
||||||
| 94 | keepTimeOffset | 是 | 否 | 2.6 文档中未找到此参数 |
|
| 35 | quorum | 是 | 否 | 由 RAFT 协议决定 |
|
||||||
| 95 | rpcTimer | 是 | 否 | 3.0 行为未知 |
|
| 36 | comp | 是 | 否 | 由 create db 的参数 comp 取代 |
|
||||||
| 96 | rpcMaxTime | 是 | 否 | 3.0 行为未知 |
|
| 37 | walLevel | 是 | 否 | 由 create db 的参数 wal_level 取代 |
|
||||||
| 97 | rpcForceTcp | 是 | 否 | 默认为 TCP |
|
| 38 | fsync | 是 | 否 | 由 create db 的参数 wal_fsync_period 取代 |
|
||||||
| 98 | tcpConnTimeout | 是 | 否 | 3.0 行为未知 |
|
| 39 | replica | 是 | 否 | 由 create db 的参数 replica 取代 |
|
||||||
| 99 | syncCheckInterval | 是 | 否 | 3.0 行为未知 |
|
| 40 | partitions | 是 | 否 | 3.0 行为未知 |
|
||||||
| 100 | maxTmrCtrl | 是 | 否 | 3.0 行为未知 |
|
| 41 | update | 是 | 否 | 允许更新部分列 |
|
||||||
| 101 | monitorReplica | 是 | 否 | 由 RAFT 协议管理多副本 |
|
| 42 | cachelast | 是 | 否 | 由 create db 的参数 cacheModel 取代 |
|
||||||
| 102 | smlTagNullName | 是 | 否 | 3.0 行为未知 |
|
| 43 | maxSQLLength | 是 | 否 | SQL 上限为 1MB,无需参数控制 |
|
||||||
| 103 | keepColumnName | 是 | 否 | 3.0 行为未知 |
|
| 44 | maxWildCardsLength | 是 | 否 | 3.0 行为未知 |
|
||||||
| 104 | ratioOfQueryCores | 是 | 否 | 由 线程池 相关配置参数决定 |
|
| 45 | maxRegexStringLen | 是 | 否 | 3.0 行为未知 |
|
||||||
| 105 | maxStreamCompDelay | 是 | 否 | 3.0 行为未知 |
|
| 46 | maxNumOfOrderedRes | 是 | 否 | 3.0 行为未知 |
|
||||||
| 106 | maxFirstStreamCompDelay | 是 | 否 | 3.0 行为未知 |
|
| 47 | maxConnections | 是 | 否 | 取决于系统配置和系统处理能力,详见后面的 Note |
|
||||||
| 107 | retryStreamCompDelay | 是 | 否 | 3.0 行为未知 |
|
| 48 | mnodeEqualVnodeNum | 是 | 否 | 3.0 行为未知 |
|
||||||
| 108 | streamCompDelayRatio | 是 | 否 | 3.0 行为未知 |
|
| 49 | http | 是 | 否 | http 服务由 taosAdapter 提供 |
|
||||||
| 109 | maxVgroupsPerDb | 是 | 否 | 由 create db 的参数 vgroups 指定实际 vgroups 数量 |
|
| 50 | httpEnableRecordSql | 是 | 否 | taosd 不提供 http 服务 |
|
||||||
| 110 | maxTablesPerVnode | 是 | 否 | DB 中的所有表近似平均分配到各个 vgroup |
|
| 51 | httpMaxThreads | 是 | 否 | taosd 不提供 http 服务 |
|
||||||
| 111 | minTablesPerVnode | 是 | 否 | DB 中的所有表近似平均分配到各个 vgroup |
|
| 52 | restfulRowLimit | 是 | 否 | taosd 不提供 http 服务 |
|
||||||
| 112 | tableIncStepPerVnode | 是 | 否 | DB 中的所有表近似平均分配到各个 vgroup |
|
| 53 | httpDbNameMandatory | 是 | 否 | taosd 不提供 http 服务 |
|
||||||
| 113 | cache | 是 | 否 | 由 buffer 代替 cache\*blocks |
|
| 54 | httpKeepAlive | 是 | 否 | taosd 不提供 http 服务 |
|
||||||
| 114 | blocks | 是 | 否 | 由 buffer 代替 cache\*blocks |
|
| 55 | enableRecordSql | 是 | 否 | 3.0 行为未知 |
|
||||||
| 115 | days | 是 | 否 | 由 create db 的参数 duration 取代 |
|
| 56 | maxBinaryDisplayWidth | 是 | 否 | 3.0 行为未知 |
|
||||||
| 116 | keep | 是 | 否 | 由 create db 的参数 keep 取代 |
|
| 57 | stream | 是 | 否 | 默认启用连续查询 |
|
||||||
| 117 | minRows | 是 | 否 | 由 create db 的参数 minRows 取代 |
|
| 58 | retrieveBlockingModel | 是 | 否 | 3.0 行为未知 |
|
||||||
| 118 | maxRows | 是 | 否 | 由 create db 的参数 maxRows 取代 |
|
| 59 | tsdbMetaCompactRatio | 是 | 否 | 3.0 行为未知 |
|
||||||
| 119 | quorum | 是 | 否 | 由 RAFT 协议决定 |
|
| 60 | defaultJSONStrType | 是 | 否 | 3.0 行为未知 |
|
||||||
| 120 | comp | 是 | 否 | 由 create db 的参数 comp 取代 |
|
| 61 | walFlushSize | 是 | 否 | 3.0 行为未知 |
|
||||||
| 121 | walLevel | 是 | 否 | 由 create db 的参数 wal_level 取代 |
|
| 62 | keepTimeOffset | 是 | 否 | 3.0 行为未知 |
|
||||||
| 122 | fsync | 是 | 否 | 由 create db 的参数 wal_fsync_period 取代 |
|
| 63 | flowctrl | 是 | 否 | 3.0 行为未知 |
|
||||||
| 123 | replica | 是 | 否 | 由 create db 的参数 replica 取代 |
|
| 64 | slaveQuery | 是 | 否 | 3.0 行为未知: slave vnode 是否能够处理查询? |
|
||||||
| 124 | partitions | 是 | 否 | 3.0 行为未知 |
|
| 65 | adjustMaster | 是 | 否 | 3.0 行为未知 |
|
||||||
| 125 | update | 是 | 否 | 允许更新部分列 |
|
| 66 | topicBinaryLen | 是 | 否 | 3.0 行为未知 |
|
||||||
| 126 | cachelast | 是 | 否 | 由 create db 的参数 cacheModel 取代 |
|
| 67 | telegrafUseFieldNum | 是 | 否 | 3.0 行为未知 |
|
||||||
| 127 | maxSQLLength | 是 | 否 | SQL 上限为 1MB,无需参数控制 |
|
| 68 | deadLockKillQuery | 是 | 否 | 3.0 行为未知 |
|
||||||
| 128 | maxWildCardsLength | 是 | 否 | 3.0 行为未知 |
|
| 69 | clientMerge | 是 | 否 | 3.0 行为未知 |
|
||||||
| 129 | maxRegexStringLen | 是 | 否 | 3.0 行为未知 |
|
| 70 | sdbDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
|
||||||
| 130 | maxNumOfOrderedRes | 是 | 否 | 3.0 行为未知 |
|
| 71 | odbcDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
|
||||||
| 131 | maxConnections | 是 | 否 | 取决于系统配置和系统处理能力,详见后面的 Note |
|
| 72 | httpDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
|
||||||
| 132 | mnodeEqualVnodeNum | 是 | 否 | 3.0 行为未知 |
|
| 73 | monDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
|
||||||
| 133 | http | 是 | 否 | http 服务由 taosAdapter 提供 |
|
| 74 | cqDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
|
||||||
| 134 | httpEnableRecordSql | 是 | 否 | taosd 不提供 http 服务 |
|
| 75 | shortcutFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
|
||||||
| 135 | httpMaxThreads | 是 | 否 | taosd 不提供 http 服务 |
|
| 76 | probeSeconds | 是 | 否 | 3.0 行为未知 |
|
||||||
| 136 | restfulRowLimit | 是 | 否 | taosd 不提供 http 服务 |
|
| 77 | probeKillSeconds | 是 | 否 | 3.0 行为未知 |
|
||||||
| 137 | httpDbNameMandatory | 是 | 否 | taosd 不提供 http 服务 |
|
| 78 | probeInterval | 是 | 否 | 3.0 行为未知 |
|
||||||
| 138 | httpKeepAlive | 是 | 否 | taosd 不提供 http 服务 |
|
| 79 | lossyColumns | 是 | 否 | 3.0 行为未知 |
|
||||||
| 139 | enableRecordSql | 是 | 否 | 3.0 行为未知 |
|
| 80 | fPrecision | 是 | 否 | 3.0 行为未知 |
|
||||||
| 140 | maxBinaryDisplayWidth | 是 | 否 | 3.0 行为未知 |
|
| 81 | dPrecision | 是 | 否 | 3.0 行为未知 |
|
||||||
| 141 | stream | 是 | 否 | 默认启用连续查询 |
|
| 82 | maxRange | 是 | 否 | 3.0 行为未知 |
|
||||||
| 142 | retrieveBlockingModel | 是 | 否 | 3.0 行为未知 |
|
| 83 | range | 是 | 否 | 3.0 行为未知 |
|
||||||
| 143 | tsdbMetaCompactRatio | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 144 | defaultJSONStrType | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 145 | walFlushSize | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 146 | keepTimeOffset | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 147 | flowctrl | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 148 | slaveQuery | 是 | 否 | 3.0 行为未知: slave vnode 是否能够处理查询? |
|
|
||||||
| 149 | adjustMaster | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 150 | topicBinaryLen | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 151 | telegrafUseFieldNum | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 152 | deadLockKillQuery | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 153 | clientMerge | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 154 | sdbDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
|
|
||||||
| 155 | odbcDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
|
|
||||||
| 156 | httpDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
|
|
||||||
| 157 | monDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
|
|
||||||
| 158 | cqDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
|
|
||||||
| 159 | shortcutFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
|
|
||||||
| 160 | probeSeconds | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 161 | probeKillSeconds | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 162 | probeInterval | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 163 | lossyColumns | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 164 | fPrecision | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 165 | dPrecision | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 166 | maxRange | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 167 | range | 是 | 否 | 3.0 行为未知 |
|
|
||||||
|
|
|
@ -10,11 +10,14 @@ TDengine 2.x 各版本安装包请访问[这里](https://www.taosdata.com/all-do
|
||||||
|
|
||||||
import Release from "/components/ReleaseV3";
|
import Release from "/components/ReleaseV3";
|
||||||
|
|
||||||
|
## 3.0.2.0
|
||||||
|
|
||||||
|
<Release type="tdengine" version="3.0.2.0" />
|
||||||
|
|
||||||
## 3.0.1.8
|
## 3.0.1.8
|
||||||
|
|
||||||
<Release type="tdengine" version="3.0.1.8" />
|
<Release type="tdengine" version="3.0.1.8" />
|
||||||
|
|
||||||
|
|
||||||
## 3.0.1.7
|
## 3.0.1.7
|
||||||
|
|
||||||
<Release type="tdengine" version="3.0.1.7" />
|
<Release type="tdengine" version="3.0.1.7" />
|
||||||
|
|
|
@ -10,6 +10,10 @@ taosTools 各版本安装包下载链接如下:
|
||||||
|
|
||||||
import Release from "/components/ReleaseV3";
|
import Release from "/components/ReleaseV3";
|
||||||
|
|
||||||
|
## 2.3.2
|
||||||
|
|
||||||
|
<Release type="tools" version="2.3.2" />
|
||||||
|
|
||||||
## 2.3.0
|
## 2.3.0
|
||||||
|
|
||||||
<Release type="tools" version="2.3.0" />
|
<Release type="tools" version="2.3.0" />
|
||||||
|
|
|
@ -211,6 +211,8 @@ int32_t catalogGetCachedSTableMeta(SCatalog* pCtg, const SName* pTableName, STab
|
||||||
|
|
||||||
int32_t catalogGetCachedTableHashVgroup(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, bool* exists);
|
int32_t catalogGetCachedTableHashVgroup(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, bool* exists);
|
||||||
|
|
||||||
|
int32_t catalogGetCachedTableVgMeta(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, STableMeta** pTableMeta);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Force refresh DB's local cached vgroup info.
|
* Force refresh DB's local cached vgroup info.
|
||||||
* @param pCtg (input, got with catalogGetHandle)
|
* @param pCtg (input, got with catalogGetHandle)
|
||||||
|
|
|
@ -33,16 +33,16 @@ extern "C" {
|
||||||
#define wTrace(...) { if (wDebugFlag & DEBUG_TRACE) { taosPrintLog("WAL ", DEBUG_TRACE, wDebugFlag, __VA_ARGS__); }}
|
#define wTrace(...) { if (wDebugFlag & DEBUG_TRACE) { taosPrintLog("WAL ", DEBUG_TRACE, wDebugFlag, __VA_ARGS__); }}
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
#define WAL_PROTO_VER 0
|
#define WAL_PROTO_VER 0
|
||||||
#define WAL_NOSUFFIX_LEN 20
|
#define WAL_NOSUFFIX_LEN 20
|
||||||
#define WAL_SUFFIX_AT (WAL_NOSUFFIX_LEN + 1)
|
#define WAL_SUFFIX_AT (WAL_NOSUFFIX_LEN + 1)
|
||||||
#define WAL_LOG_SUFFIX "log"
|
#define WAL_LOG_SUFFIX "log"
|
||||||
#define WAL_INDEX_SUFFIX "idx"
|
#define WAL_INDEX_SUFFIX "idx"
|
||||||
#define WAL_REFRESH_MS 1000
|
#define WAL_REFRESH_MS 1000
|
||||||
#define WAL_PATH_LEN (TSDB_FILENAME_LEN + 12)
|
#define WAL_PATH_LEN (TSDB_FILENAME_LEN + 12)
|
||||||
#define WAL_FILE_LEN (WAL_PATH_LEN + 32)
|
#define WAL_FILE_LEN (WAL_PATH_LEN + 32)
|
||||||
#define WAL_MAGIC 0xFAFBFCFDF4F3F2F1ULL
|
#define WAL_MAGIC 0xFAFBFCFDF4F3F2F1ULL
|
||||||
#define WAL_SCAN_BUF_SIZE (1024 * 1024 * 3)
|
#define WAL_SCAN_BUF_SIZE (1024 * 1024 * 3)
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TAOS_WAL_WRITE = 1,
|
TAOS_WAL_WRITE = 1,
|
||||||
|
|
|
@ -65,6 +65,7 @@ typedef struct STaosQnode {
|
||||||
STaosQnode *next;
|
STaosQnode *next;
|
||||||
STaosQueue *queue;
|
STaosQueue *queue;
|
||||||
int64_t timestamp;
|
int64_t timestamp;
|
||||||
|
int64_t dataSize;
|
||||||
int32_t size;
|
int32_t size;
|
||||||
int8_t itype;
|
int8_t itype;
|
||||||
int8_t reserved[3];
|
int8_t reserved[3];
|
||||||
|
@ -103,7 +104,7 @@ typedef struct STaosQall {
|
||||||
STaosQueue *taosOpenQueue();
|
STaosQueue *taosOpenQueue();
|
||||||
void taosCloseQueue(STaosQueue *queue);
|
void taosCloseQueue(STaosQueue *queue);
|
||||||
void taosSetQueueFp(STaosQueue *queue, FItem itemFp, FItems itemsFp);
|
void taosSetQueueFp(STaosQueue *queue, FItem itemFp, FItems itemsFp);
|
||||||
void *taosAllocateQitem(int32_t size, EQItype itype);
|
void *taosAllocateQitem(int32_t size, EQItype itype, int64_t dataSize);
|
||||||
void taosFreeQitem(void *pItem);
|
void taosFreeQitem(void *pItem);
|
||||||
void taosWriteQitem(STaosQueue *queue, void *pItem);
|
void taosWriteQitem(STaosQueue *queue, void *pItem);
|
||||||
int32_t taosReadQitem(STaosQueue *queue, void **ppItem);
|
int32_t taosReadQitem(STaosQueue *queue, void **ppItem);
|
||||||
|
|
|
@ -497,27 +497,27 @@ function install_service_on_systemd() {
|
||||||
|
|
||||||
taosd_service_config="${service_config_dir}/${serverName}.service"
|
taosd_service_config="${service_config_dir}/${serverName}.service"
|
||||||
|
|
||||||
${csudo}bash -c "echo [Unit] >> ${taosd_service_config}"
|
${csudo}bash -c "echo '[Unit]' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo Description=${productName} server service >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'Description=${productName} server service' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo After=network-online.target >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'After=network-online.target' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo Wants=network-online.target >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'Wants=network-online.target' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo >> ${taosd_service_config}"
|
${csudo}bash -c "echo >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo [Service] >> ${taosd_service_config}"
|
${csudo}bash -c "echo '[Service]' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo Type=simple >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'Type=simple' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo ExecStart=/usr/bin/${serverName} >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'ExecStart=/usr/bin/${serverName}' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo ExecStartPre=${installDir}/bin/startPre.sh >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'ExecStartPre=${installDir}/bin/startPre.sh' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo TimeoutStopSec=1000000s >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'TimeoutStopSec=1000000s' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo LimitNOFILE=infinity >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'LimitNOFILE=infinity' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo LimitNPROC=infinity >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'LimitNPROC=infinity' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo LimitCORE=infinity >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'LimitCORE=infinity' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo TimeoutStartSec=0 >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'TimeoutStartSec=0' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo StandardOutput=null >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'StandardOutput=null' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo Restart=always >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'Restart=always' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo StartLimitBurst=3 >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'StartLimitBurst=3' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo StartLimitInterval=60s >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'StartLimitInterval=60s' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo >> ${taosd_service_config}"
|
${csudo}bash -c "echo >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo [Install] >> ${taosd_service_config}"
|
${csudo}bash -c "echo '[Install]' >> ${taosd_service_config}"
|
||||||
${csudo}bash -c "echo WantedBy=multi-user.target >> ${taosd_service_config}"
|
${csudo}bash -c "echo 'WantedBy=multi-user.target' >> ${taosd_service_config}"
|
||||||
${csudo}systemctl enable ${serverName}
|
${csudo}systemctl enable ${serverName}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -187,7 +187,7 @@ if [[ $productName == "TDengine" ]]; then
|
||||||
git clone --depth 1 https://github.com/taosdata/taos-connector-dotnet ${install_dir}/connector/dotnet
|
git clone --depth 1 https://github.com/taosdata/taos-connector-dotnet ${install_dir}/connector/dotnet
|
||||||
rm -rf ${install_dir}/connector/dotnet/.git ||:
|
rm -rf ${install_dir}/connector/dotnet/.git ||:
|
||||||
# cp -r ${connector_dir}/nodejs ${install_dir}/connector
|
# cp -r ${connector_dir}/nodejs ${install_dir}/connector
|
||||||
git clone --depth 1 https://github.com/taosdata/libtaos-rs ${install_dir}/connector/rust
|
git clone --depth 1 https://github.com/taosdata/taos-connector-rust ${install_dir}/connector/rust
|
||||||
rm -rf ${install_dir}/connector/rust/.git ||:
|
rm -rf ${install_dir}/connector/rust/.git ||:
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -318,7 +318,7 @@ if [ "$verMode" == "cluster" ] || [ "$verMode" == "cloud" ]; then
|
||||||
git clone --depth 1 https://github.com/taosdata/taos-connector-dotnet ${install_dir}/connector/dotnet
|
git clone --depth 1 https://github.com/taosdata/taos-connector-dotnet ${install_dir}/connector/dotnet
|
||||||
rm -rf ${install_dir}/connector/dotnet/.git ||:
|
rm -rf ${install_dir}/connector/dotnet/.git ||:
|
||||||
|
|
||||||
git clone --depth 1 https://github.com/taosdata/libtaos-rs ${install_dir}/connector/rust
|
git clone --depth 1 https://github.com/taosdata/taos-connector-rust ${install_dir}/connector/rust
|
||||||
rm -rf ${install_dir}/connector/rust/.git ||:
|
rm -rf ${install_dir}/connector/rust/.git ||:
|
||||||
|
|
||||||
# cp -r ${connector_dir}/python ${install_dir}/connector
|
# cp -r ${connector_dir}/python ${install_dir}/connector
|
||||||
|
@ -379,4 +379,4 @@ if [ -n "${taostools_bin_files}" ]; then
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd ${curr_dir}
|
cd ${curr_dir}
|
||||||
|
|
|
@ -190,8 +190,9 @@ int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param,
|
||||||
(*pRequest)->body.param = param;
|
(*pRequest)->body.param = param;
|
||||||
|
|
||||||
STscObj* pTscObj = (*pRequest)->pTscObj;
|
STscObj* pTscObj = (*pRequest)->pTscObj;
|
||||||
if (taosHashPut(pTscObj->pRequests, &(*pRequest)->self, sizeof((*pRequest)->self), &(*pRequest)->self,
|
int32_t err = taosHashPut(pTscObj->pRequests, &(*pRequest)->self, sizeof((*pRequest)->self), &(*pRequest)->self,
|
||||||
sizeof((*pRequest)->self))) {
|
sizeof((*pRequest)->self));
|
||||||
|
if (err) {
|
||||||
tscError("%" PRId64 " failed to add to request container, reqId:0x%" PRIx64 ", conn:%" PRId64 ", %s",
|
tscError("%" PRId64 " failed to add to request container, reqId:0x%" PRIx64 ", conn:%" PRId64 ", %s",
|
||||||
(*pRequest)->self, (*pRequest)->requestId, pTscObj->id, sql);
|
(*pRequest)->self, (*pRequest)->requestId, pTscObj->id, sql);
|
||||||
|
|
||||||
|
|
|
@ -21,12 +21,12 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "query.h"
|
#include "query.h"
|
||||||
#include "scheduler.h"
|
#include "scheduler.h"
|
||||||
|
#include "tdatablock.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
#include "tref.h"
|
#include "tref.h"
|
||||||
#include "trpc.h"
|
#include "trpc.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "tdatablock.h"
|
|
||||||
|
|
||||||
#define TSC_VAR_NOT_RELEASE 1
|
#define TSC_VAR_NOT_RELEASE 1
|
||||||
#define TSC_VAR_RELEASED 0
|
#define TSC_VAR_RELEASED 0
|
||||||
|
@ -178,16 +178,18 @@ void taos_free_result(TAOS_RES *res) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tscDebug("taos free res %p", res);
|
||||||
|
|
||||||
if (TD_RES_QUERY(res)) {
|
if (TD_RES_QUERY(res)) {
|
||||||
SRequestObj *pRequest = (SRequestObj *)res;
|
SRequestObj *pRequest = (SRequestObj *)res;
|
||||||
tscDebug("0x%" PRIx64 " taos_free_result start to free query", pRequest->requestId);
|
tscDebug("0x%" PRIx64 " taos_free_result start to free query", pRequest->requestId);
|
||||||
destroyRequest(pRequest);
|
destroyRequest(pRequest);
|
||||||
} else if (TD_RES_TMQ_METADATA(res)) {
|
} else if (TD_RES_TMQ_METADATA(res)) {
|
||||||
SMqTaosxRspObj *pRsp = (SMqTaosxRspObj *)res;
|
SMqTaosxRspObj *pRsp = (SMqTaosxRspObj *)res;
|
||||||
if (pRsp->rsp.blockData) taosArrayDestroyP(pRsp->rsp.blockData, taosMemoryFree);
|
taosArrayDestroyP(pRsp->rsp.blockData, taosMemoryFree);
|
||||||
if (pRsp->rsp.blockDataLen) taosArrayDestroy(pRsp->rsp.blockDataLen);
|
taosArrayDestroy(pRsp->rsp.blockDataLen);
|
||||||
if (pRsp->rsp.withTbName) taosArrayDestroyP(pRsp->rsp.blockTbName, taosMemoryFree);
|
taosArrayDestroyP(pRsp->rsp.blockTbName, taosMemoryFree);
|
||||||
if (pRsp->rsp.withSchema) taosArrayDestroyP(pRsp->rsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
|
taosArrayDestroyP(pRsp->rsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
|
||||||
// taosx
|
// taosx
|
||||||
taosArrayDestroy(pRsp->rsp.createTableLen);
|
taosArrayDestroy(pRsp->rsp.createTableLen);
|
||||||
taosArrayDestroyP(pRsp->rsp.createTableReq, taosMemoryFree);
|
taosArrayDestroyP(pRsp->rsp.createTableReq, taosMemoryFree);
|
||||||
|
@ -197,10 +199,10 @@ void taos_free_result(TAOS_RES *res) {
|
||||||
taosMemoryFree(pRsp);
|
taosMemoryFree(pRsp);
|
||||||
} else if (TD_RES_TMQ(res)) {
|
} else if (TD_RES_TMQ(res)) {
|
||||||
SMqRspObj *pRsp = (SMqRspObj *)res;
|
SMqRspObj *pRsp = (SMqRspObj *)res;
|
||||||
if (pRsp->rsp.blockData) taosArrayDestroyP(pRsp->rsp.blockData, taosMemoryFree);
|
taosArrayDestroyP(pRsp->rsp.blockData, taosMemoryFree);
|
||||||
if (pRsp->rsp.blockDataLen) taosArrayDestroy(pRsp->rsp.blockDataLen);
|
taosArrayDestroy(pRsp->rsp.blockDataLen);
|
||||||
if (pRsp->rsp.withTbName) taosArrayDestroyP(pRsp->rsp.blockTbName, taosMemoryFree);
|
taosArrayDestroyP(pRsp->rsp.blockTbName, taosMemoryFree);
|
||||||
if (pRsp->rsp.withSchema) taosArrayDestroyP(pRsp->rsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
|
taosArrayDestroyP(pRsp->rsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
|
||||||
pRsp->resInfo.pRspMsg = NULL;
|
pRsp->resInfo.pRspMsg = NULL;
|
||||||
doFreeReqResultInfo(&pRsp->resInfo);
|
doFreeReqResultInfo(&pRsp->resInfo);
|
||||||
taosMemoryFree(pRsp);
|
taosMemoryFree(pRsp);
|
||||||
|
@ -796,10 +798,11 @@ static void doAsyncQueryFromParse(SMetaData *pResultMeta, void *param, int32_t c
|
||||||
SQuery *pQuery = pRequest->pQuery;
|
SQuery *pQuery = pRequest->pQuery;
|
||||||
|
|
||||||
pRequest->metric.ctgEnd = taosGetTimestampUs();
|
pRequest->metric.ctgEnd = taosGetTimestampUs();
|
||||||
qDebug("0x%" PRIx64 " start to continue parse, reqId:0x%" PRIx64 ", code:%s", pRequest->self, pRequest->requestId, tstrerror(code));
|
qDebug("0x%" PRIx64 " start to continue parse, reqId:0x%" PRIx64 ", code:%s", pRequest->self, pRequest->requestId,
|
||||||
|
tstrerror(code));
|
||||||
|
|
||||||
if (code == TSDB_CODE_SUCCESS) {
|
if (code == TSDB_CODE_SUCCESS) {
|
||||||
pWrapper->pCatalogReq->forceUpdate = false;
|
//pWrapper->pCatalogReq->forceUpdate = false;
|
||||||
code = qContinueParseSql(pWrapper->pParseCtx, pWrapper->pCatalogReq, pResultMeta, pQuery);
|
code = qContinueParseSql(pWrapper->pParseCtx, pWrapper->pCatalogReq, pResultMeta, pQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -879,6 +882,11 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) {
|
||||||
|
|
||||||
if (pRequest->retry++ > REQUEST_TOTAL_EXEC_TIMES) {
|
if (pRequest->retry++ > REQUEST_TOTAL_EXEC_TIMES) {
|
||||||
code = pRequest->prevCode;
|
code = pRequest->prevCode;
|
||||||
|
terrno = code;
|
||||||
|
pRequest->code = code;
|
||||||
|
tscDebug("call sync query cb with code: %s", tstrerror(code));
|
||||||
|
pRequest->body.queryFp(pRequest->body.param, pRequest, code);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
@ -929,6 +937,17 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) {
|
||||||
tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pRequest->self, code, tstrerror(code),
|
tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pRequest->self, code, tstrerror(code),
|
||||||
pRequest->requestId);
|
pRequest->requestId);
|
||||||
destorySqlCallbackWrapper(pWrapper);
|
destorySqlCallbackWrapper(pWrapper);
|
||||||
|
qDestroyQuery(pRequest->pQuery);
|
||||||
|
pRequest->pQuery = NULL;
|
||||||
|
|
||||||
|
if (NEED_CLIENT_HANDLE_ERROR(code)) {
|
||||||
|
tscDebug("0x%" PRIx64 " client retry to handle the error, code:%d - %s, tryCount:%d, reqId:0x%" PRIx64,
|
||||||
|
pRequest->self, code, tstrerror(code), pRequest->retry, pRequest->requestId);
|
||||||
|
pRequest->prevCode = code;
|
||||||
|
doAsyncQuery(pRequest, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
terrno = code;
|
terrno = code;
|
||||||
pRequest->code = code;
|
pRequest->code = code;
|
||||||
pRequest->body.queryFp(pRequest->body.param, pRequest, code);
|
pRequest->body.queryFp(pRequest->body.param, pRequest, code);
|
||||||
|
|
|
@ -691,7 +691,7 @@ void tmqAssignAskEpTask(void* param, void* tmrId) {
|
||||||
int64_t refId = *(int64_t*)param;
|
int64_t refId = *(int64_t*)param;
|
||||||
tmq_t* tmq = taosAcquireRef(tmqMgmt.rsetId, refId);
|
tmq_t* tmq = taosAcquireRef(tmqMgmt.rsetId, refId);
|
||||||
if (tmq != NULL) {
|
if (tmq != NULL) {
|
||||||
int8_t* pTaskType = taosAllocateQitem(sizeof(int8_t), DEF_QITEM);
|
int8_t* pTaskType = taosAllocateQitem(sizeof(int8_t), DEF_QITEM, 0);
|
||||||
*pTaskType = TMQ_DELAYED_TASK__ASK_EP;
|
*pTaskType = TMQ_DELAYED_TASK__ASK_EP;
|
||||||
taosWriteQitem(tmq->delayedTask, pTaskType);
|
taosWriteQitem(tmq->delayedTask, pTaskType);
|
||||||
tsem_post(&tmq->rspSem);
|
tsem_post(&tmq->rspSem);
|
||||||
|
@ -703,7 +703,7 @@ void tmqAssignDelayedCommitTask(void* param, void* tmrId) {
|
||||||
int64_t refId = *(int64_t*)param;
|
int64_t refId = *(int64_t*)param;
|
||||||
tmq_t* tmq = taosAcquireRef(tmqMgmt.rsetId, refId);
|
tmq_t* tmq = taosAcquireRef(tmqMgmt.rsetId, refId);
|
||||||
if (tmq != NULL) {
|
if (tmq != NULL) {
|
||||||
int8_t* pTaskType = taosAllocateQitem(sizeof(int8_t), DEF_QITEM);
|
int8_t* pTaskType = taosAllocateQitem(sizeof(int8_t), DEF_QITEM, 0);
|
||||||
*pTaskType = TMQ_DELAYED_TASK__COMMIT;
|
*pTaskType = TMQ_DELAYED_TASK__COMMIT;
|
||||||
taosWriteQitem(tmq->delayedTask, pTaskType);
|
taosWriteQitem(tmq->delayedTask, pTaskType);
|
||||||
tsem_post(&tmq->rspSem);
|
tsem_post(&tmq->rspSem);
|
||||||
|
@ -715,7 +715,7 @@ void tmqAssignDelayedReportTask(void* param, void* tmrId) {
|
||||||
int64_t refId = *(int64_t*)param;
|
int64_t refId = *(int64_t*)param;
|
||||||
tmq_t* tmq = taosAcquireRef(tmqMgmt.rsetId, refId);
|
tmq_t* tmq = taosAcquireRef(tmqMgmt.rsetId, refId);
|
||||||
if (tmq != NULL) {
|
if (tmq != NULL) {
|
||||||
int8_t* pTaskType = taosAllocateQitem(sizeof(int8_t), DEF_QITEM);
|
int8_t* pTaskType = taosAllocateQitem(sizeof(int8_t), DEF_QITEM, 0);
|
||||||
*pTaskType = TMQ_DELAYED_TASK__REPORT;
|
*pTaskType = TMQ_DELAYED_TASK__REPORT;
|
||||||
taosWriteQitem(tmq->delayedTask, pTaskType);
|
taosWriteQitem(tmq->delayedTask, pTaskType);
|
||||||
tsem_post(&tmq->rspSem);
|
tsem_post(&tmq->rspSem);
|
||||||
|
@ -814,24 +814,55 @@ int32_t tmqHandleAllDelayedTask(tmq_t* tmq) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tmqFreeRspWrapper(SMqRspWrapper* rspWrapper) {
|
||||||
|
if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__END_RSP) {
|
||||||
|
// do nothing
|
||||||
|
} else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__EP_RSP) {
|
||||||
|
SMqAskEpRspWrapper* pEpRspWrapper = (SMqAskEpRspWrapper*)rspWrapper;
|
||||||
|
tDeleteSMqAskEpRsp(&pEpRspWrapper->msg);
|
||||||
|
} else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__POLL_RSP) {
|
||||||
|
SMqPollRspWrapper* pRsp = (SMqPollRspWrapper*)rspWrapper;
|
||||||
|
taosArrayDestroyP(pRsp->dataRsp.blockData, taosMemoryFree);
|
||||||
|
taosArrayDestroy(pRsp->dataRsp.blockDataLen);
|
||||||
|
taosArrayDestroyP(pRsp->dataRsp.blockTbName, taosMemoryFree);
|
||||||
|
taosArrayDestroyP(pRsp->dataRsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
|
||||||
|
} else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__POLL_META_RSP) {
|
||||||
|
SMqPollRspWrapper* pRsp = (SMqPollRspWrapper*)rspWrapper;
|
||||||
|
taosMemoryFree(pRsp->metaRsp.metaRsp);
|
||||||
|
} else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__TAOSX_RSP) {
|
||||||
|
SMqPollRspWrapper* pRsp = (SMqPollRspWrapper*)rspWrapper;
|
||||||
|
taosArrayDestroyP(pRsp->taosxRsp.blockData, taosMemoryFree);
|
||||||
|
taosArrayDestroy(pRsp->taosxRsp.blockDataLen);
|
||||||
|
taosArrayDestroyP(pRsp->taosxRsp.blockTbName, taosMemoryFree);
|
||||||
|
taosArrayDestroyP(pRsp->taosxRsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
|
||||||
|
// taosx
|
||||||
|
taosArrayDestroy(pRsp->taosxRsp.createTableLen);
|
||||||
|
taosArrayDestroyP(pRsp->taosxRsp.createTableReq, taosMemoryFree);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void tmqClearUnhandleMsg(tmq_t* tmq) {
|
void tmqClearUnhandleMsg(tmq_t* tmq) {
|
||||||
SMqRspWrapper* msg = NULL;
|
SMqRspWrapper* rspWrapper = NULL;
|
||||||
while (1) {
|
while (1) {
|
||||||
taosGetQitem(tmq->qall, (void**)&msg);
|
taosGetQitem(tmq->qall, (void**)&rspWrapper);
|
||||||
if (msg)
|
if (rspWrapper) {
|
||||||
taosFreeQitem(msg);
|
tmqFreeRspWrapper(rspWrapper);
|
||||||
else
|
taosFreeQitem(rspWrapper);
|
||||||
|
} else {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
msg = NULL;
|
rspWrapper = NULL;
|
||||||
taosReadAllQitems(tmq->mqueue, tmq->qall);
|
taosReadAllQitems(tmq->mqueue, tmq->qall);
|
||||||
while (1) {
|
while (1) {
|
||||||
taosGetQitem(tmq->qall, (void**)&msg);
|
taosGetQitem(tmq->qall, (void**)&rspWrapper);
|
||||||
if (msg)
|
if (rspWrapper) {
|
||||||
taosFreeQitem(msg);
|
tmqFreeRspWrapper(rspWrapper);
|
||||||
else
|
taosFreeQitem(rspWrapper);
|
||||||
|
} else {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1140,7 +1171,7 @@ int32_t tmqPollCb(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
goto CREATE_MSG_FAIL;
|
goto CREATE_MSG_FAIL;
|
||||||
}
|
}
|
||||||
if (code == TSDB_CODE_TQ_NO_COMMITTED_OFFSET) {
|
if (code == TSDB_CODE_TQ_NO_COMMITTED_OFFSET) {
|
||||||
SMqPollRspWrapper* pRspWrapper = taosAllocateQitem(sizeof(SMqPollRspWrapper), DEF_QITEM);
|
SMqPollRspWrapper* pRspWrapper = taosAllocateQitem(sizeof(SMqPollRspWrapper), DEF_QITEM, 0);
|
||||||
if (pRspWrapper == NULL) {
|
if (pRspWrapper == NULL) {
|
||||||
tscWarn("msg discard from vgId:%d, epoch %d since out of memory", vgId, epoch);
|
tscWarn("msg discard from vgId:%d, epoch %d since out of memory", vgId, epoch);
|
||||||
goto CREATE_MSG_FAIL;
|
goto CREATE_MSG_FAIL;
|
||||||
|
@ -1173,7 +1204,7 @@ int32_t tmqPollCb(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
// handle meta rsp
|
// handle meta rsp
|
||||||
int8_t rspType = ((SMqRspHead*)pMsg->pData)->mqMsgType;
|
int8_t rspType = ((SMqRspHead*)pMsg->pData)->mqMsgType;
|
||||||
|
|
||||||
SMqPollRspWrapper* pRspWrapper = taosAllocateQitem(sizeof(SMqPollRspWrapper), DEF_QITEM);
|
SMqPollRspWrapper* pRspWrapper = taosAllocateQitem(sizeof(SMqPollRspWrapper), DEF_QITEM, 0);
|
||||||
if (pRspWrapper == NULL) {
|
if (pRspWrapper == NULL) {
|
||||||
taosMemoryFree(pMsg->pData);
|
taosMemoryFree(pMsg->pData);
|
||||||
taosMemoryFree(pMsg->pEpSet);
|
taosMemoryFree(pMsg->pEpSet);
|
||||||
|
@ -1215,6 +1246,8 @@ int32_t tmqPollCb(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
taosMemoryFree(pMsg->pData);
|
taosMemoryFree(pMsg->pData);
|
||||||
taosMemoryFree(pMsg->pEpSet);
|
taosMemoryFree(pMsg->pEpSet);
|
||||||
|
|
||||||
|
tscDebug("consumer:%" PRId64 ", put poll res into mqueue %p", tmq->consumerId, pRspWrapper);
|
||||||
|
|
||||||
taosWriteQitem(tmq->mqueue, pRspWrapper);
|
taosWriteQitem(tmq->mqueue, pRspWrapper);
|
||||||
tsem_post(&tmq->rspSem);
|
tsem_post(&tmq->rspSem);
|
||||||
|
|
||||||
|
@ -1361,7 +1394,7 @@ int32_t tmqAskEpCb(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
tmqUpdateEp(tmq, head->epoch, &rsp);
|
tmqUpdateEp(tmq, head->epoch, &rsp);
|
||||||
tDeleteSMqAskEpRsp(&rsp);
|
tDeleteSMqAskEpRsp(&rsp);
|
||||||
} else {
|
} else {
|
||||||
SMqAskEpRspWrapper* pWrapper = taosAllocateQitem(sizeof(SMqAskEpRspWrapper), DEF_QITEM);
|
SMqAskEpRspWrapper* pWrapper = taosAllocateQitem(sizeof(SMqAskEpRspWrapper), DEF_QITEM, 0);
|
||||||
if (pWrapper == NULL) {
|
if (pWrapper == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
code = -1;
|
code = -1;
|
||||||
|
@ -1642,6 +1675,7 @@ int32_t tmqHandleNoPollRsp(tmq_t* tmq, SMqRspWrapper* rspWrapper, bool* pReset)
|
||||||
tDeleteSMqAskEpRsp(rspMsg);
|
tDeleteSMqAskEpRsp(rspMsg);
|
||||||
*pReset = true;
|
*pReset = true;
|
||||||
} else {
|
} else {
|
||||||
|
tmqFreeRspWrapper(rspWrapper);
|
||||||
*pReset = false;
|
*pReset = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1664,6 +1698,8 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tscDebug("consumer:%" PRId64 " handle rsp %p", tmq->consumerId, rspWrapper);
|
||||||
|
|
||||||
if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__END_RSP) {
|
if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__END_RSP) {
|
||||||
taosFreeQitem(rspWrapper);
|
taosFreeQitem(rspWrapper);
|
||||||
terrno = TSDB_CODE_TQ_NO_COMMITTED_OFFSET;
|
terrno = TSDB_CODE_TQ_NO_COMMITTED_OFFSET;
|
||||||
|
@ -1691,6 +1727,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
} else {
|
} else {
|
||||||
tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d",
|
tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d",
|
||||||
pollRspWrapper->dataRsp.head.epoch, consumerEpoch);
|
pollRspWrapper->dataRsp.head.epoch, consumerEpoch);
|
||||||
|
tmqFreeRspWrapper(rspWrapper);
|
||||||
taosFreeQitem(pollRspWrapper);
|
taosFreeQitem(pollRspWrapper);
|
||||||
}
|
}
|
||||||
} else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__POLL_META_RSP) {
|
} else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__POLL_META_RSP) {
|
||||||
|
@ -1709,6 +1746,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
} else {
|
} else {
|
||||||
tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d",
|
tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d",
|
||||||
pollRspWrapper->metaRsp.head.epoch, consumerEpoch);
|
pollRspWrapper->metaRsp.head.epoch, consumerEpoch);
|
||||||
|
tmqFreeRspWrapper(rspWrapper);
|
||||||
taosFreeQitem(pollRspWrapper);
|
taosFreeQitem(pollRspWrapper);
|
||||||
}
|
}
|
||||||
} else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__TAOSX_RSP) {
|
} else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__TAOSX_RSP) {
|
||||||
|
@ -1739,6 +1777,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
} else {
|
} else {
|
||||||
tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d",
|
tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d",
|
||||||
pollRspWrapper->taosxRsp.head.epoch, consumerEpoch);
|
pollRspWrapper->taosxRsp.head.epoch, consumerEpoch);
|
||||||
|
tmqFreeRspWrapper(rspWrapper);
|
||||||
taosFreeQitem(pollRspWrapper);
|
taosFreeQitem(pollRspWrapper);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1790,7 +1829,7 @@ TAOS_RES* tmq_consumer_poll(tmq_t* tmq, int64_t timeout) {
|
||||||
while (1) {
|
while (1) {
|
||||||
tmqHandleAllDelayedTask(tmq);
|
tmqHandleAllDelayedTask(tmq);
|
||||||
if (tmqPollImpl(tmq, timeout) < 0) {
|
if (tmqPollImpl(tmq, timeout) < 0) {
|
||||||
tscDebug("return since poll err");
|
tscDebug("consumer:%" PRId64 " return since poll err", tmq->consumerId);
|
||||||
/*return NULL;*/
|
/*return NULL;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1948,9 +1948,9 @@ char* dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** pDataBuf)
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
len += snprintf(dumpBuf + len, size - len,
|
len += snprintf(dumpBuf + len, size - len,
|
||||||
"===stream===%s|block type %d|child id %d|group id:%" PRIu64 "|uid:%" PRId64
|
"===stream===%s|block type %d|child id %d|group id:%" PRIu64 "|uid:%" PRId64
|
||||||
"|rows:%d|version:%" PRIu64 "\n",
|
"|rows:%d|version:%" PRIu64 "|cal start:%" PRIu64 "|cal end:%" PRIu64 "\n",
|
||||||
flag, (int32_t)pDataBlock->info.type, pDataBlock->info.childId, pDataBlock->info.id.groupId,
|
flag, (int32_t)pDataBlock->info.type, pDataBlock->info.childId, pDataBlock->info.id.groupId,
|
||||||
pDataBlock->info.id.uid, pDataBlock->info.rows, pDataBlock->info.version);
|
pDataBlock->info.id.uid, pDataBlock->info.rows, pDataBlock->info.version, pDataBlock->info.calWin.skey, pDataBlock->info.calWin.ekey);
|
||||||
if (len >= size - 1) return dumpBuf;
|
if (len >= size - 1) return dumpBuf;
|
||||||
|
|
||||||
for (int32_t j = 0; j < rows; j++) {
|
for (int32_t j = 0; j < rows; j++) {
|
||||||
|
@ -2246,6 +2246,9 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq2** ppReq, const SSDataBlock* pDat
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the rsma result should has the same column number with schema.
|
||||||
|
ASSERT(colNum == pTSchema->numOfCols);
|
||||||
|
|
||||||
SSubmitTbData tbData = {0};
|
SSubmitTbData tbData = {0};
|
||||||
|
|
||||||
if (!(tbData.aRowP = taosArrayInit(rows, sizeof(SRow*)))) {
|
if (!(tbData.aRowP = taosArrayInit(rows, sizeof(SRow*)))) {
|
||||||
|
|
|
@ -159,12 +159,12 @@ int32_t mmPutMsgToQueue(SMnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pWorker == NULL) return -1;
|
if (pWorker == NULL) return -1;
|
||||||
SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM);
|
SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM, pRpc->contLen);
|
||||||
if (pMsg == NULL) return -1;
|
if (pMsg == NULL) return -1;
|
||||||
memcpy(pMsg, pRpc, sizeof(SRpcMsg));
|
memcpy(pMsg, pRpc, sizeof(SRpcMsg));
|
||||||
pRpc->pCont = NULL;
|
pRpc->pCont = NULL;
|
||||||
|
|
||||||
dTrace("msg:%p, is created and will put into %s queue, type:%s", pMsg, pWorker->name, TMSG_INFO(pRpc->msgType));
|
dTrace("msg:%p, is created and will put into %s queue, type:%s len:%d", pMsg, pWorker->name, TMSG_INFO(pRpc->msgType), pRpc->contLen);
|
||||||
int32_t code = mmPutMsgToWorker(pMgmt, pWorker, pMsg);
|
int32_t code = mmPutMsgToWorker(pMgmt, pWorker, pMsg);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
dTrace("msg:%p, is freed", pMsg);
|
dTrace("msg:%p, is freed", pMsg);
|
||||||
|
|
|
@ -58,19 +58,19 @@ int32_t qmPutNodeMsgToFetchQueue(SQnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qmPutRpcMsgToQueue(SQnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
|
int32_t qmPutRpcMsgToQueue(SQnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
|
||||||
SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM);
|
SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM, pRpc->contLen);
|
||||||
if (pMsg == NULL) return -1;
|
if (pMsg == NULL) return -1;
|
||||||
memcpy(pMsg, pRpc, sizeof(SRpcMsg));
|
memcpy(pMsg, pRpc, sizeof(SRpcMsg));
|
||||||
pRpc->pCont = NULL;
|
pRpc->pCont = NULL;
|
||||||
|
|
||||||
switch (qtype) {
|
switch (qtype) {
|
||||||
case QUERY_QUEUE:
|
case QUERY_QUEUE:
|
||||||
dTrace("msg:%p, is created and will put into qnode-query queue", pMsg);
|
dTrace("msg:%p, is created and will put into qnode-query queue, len:%d", pMsg, pRpc->contLen);
|
||||||
taosWriteQitem(pMgmt->queryWorker.queue, pMsg);
|
taosWriteQitem(pMgmt->queryWorker.queue, pMsg);
|
||||||
return 0;
|
return 0;
|
||||||
case READ_QUEUE:
|
case READ_QUEUE:
|
||||||
case FETCH_QUEUE:
|
case FETCH_QUEUE:
|
||||||
dTrace("msg:%p, is created and will put into qnode-fetch queue", pMsg);
|
dTrace("msg:%p, is created and will put into qnode-fetch queue, len:%d", pMsg, pRpc->contLen);
|
||||||
taosWriteQitem(pMgmt->fetchWorker.queue, pMsg);
|
taosWriteQitem(pMgmt->fetchWorker.queue, pMsg);
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -130,7 +130,7 @@ void smStopWorker(SSnodeMgmt *pMgmt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t smPutMsgToQueue(SSnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
|
int32_t smPutMsgToQueue(SSnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
|
||||||
SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM);
|
SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM, pRpc->contLen);
|
||||||
if (pMsg == NULL) {
|
if (pMsg == NULL) {
|
||||||
rpcFreeCont(pRpc->pCont);
|
rpcFreeCont(pRpc->pCont);
|
||||||
pRpc->pCont = NULL;
|
pRpc->pCont = NULL;
|
||||||
|
@ -139,8 +139,8 @@ int32_t smPutMsgToQueue(SSnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
|
||||||
|
|
||||||
SSnode *pSnode = pMgmt->pSnode;
|
SSnode *pSnode = pMgmt->pSnode;
|
||||||
if (pSnode == NULL) {
|
if (pSnode == NULL) {
|
||||||
dError("msg:%p failed to put into snode queue since %s, type:%s qtype:%d", pMsg, terrstr(),
|
dError("msg:%p failed to put into snode queue since %s, type:%s qtype:%d len:%d", pMsg, terrstr(),
|
||||||
TMSG_INFO(pMsg->msgType), qtype);
|
TMSG_INFO(pMsg->msgType), qtype, pRpc->contLen);
|
||||||
taosFreeQitem(pMsg);
|
taosFreeQitem(pMsg);
|
||||||
rpcFreeCont(pRpc->pCont);
|
rpcFreeCont(pRpc->pCont);
|
||||||
pRpc->pCont = NULL;
|
pRpc->pCont = NULL;
|
||||||
|
|
|
@ -233,7 +233,7 @@ int32_t vmPutMsgToMgmtQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t vmPutRpcMsgToQueue(SVnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
|
int32_t vmPutRpcMsgToQueue(SVnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
|
||||||
SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM);
|
SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM, pRpc->contLen);
|
||||||
if (pMsg == NULL) {
|
if (pMsg == NULL) {
|
||||||
rpcFreeCont(pRpc->pCont);
|
rpcFreeCont(pRpc->pCont);
|
||||||
pRpc->pCont = NULL;
|
pRpc->pCont = NULL;
|
||||||
|
@ -241,7 +241,7 @@ int32_t vmPutRpcMsgToQueue(SVnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SMsgHead *pHead = pRpc->pCont;
|
SMsgHead *pHead = pRpc->pCont;
|
||||||
dTrace("vgId:%d, msg:%p is created, type:%s", pHead->vgId, pMsg, TMSG_INFO(pRpc->msgType));
|
dTrace("vgId:%d, msg:%p is created, type:%s len:%d", pHead->vgId, pMsg, TMSG_INFO(pRpc->msgType), pRpc->contLen);
|
||||||
|
|
||||||
pHead->contLen = htonl(pHead->contLen);
|
pHead->contLen = htonl(pHead->contLen);
|
||||||
pHead->vgId = htonl(pHead->vgId);
|
pHead->vgId = htonl(pHead->vgId);
|
||||||
|
|
|
@ -141,11 +141,11 @@ static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pRpc->info.wrapper = pWrapper;
|
pRpc->info.wrapper = pWrapper;
|
||||||
pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM);
|
pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM, pRpc->contLen);
|
||||||
if (pMsg == NULL) goto _OVER;
|
if (pMsg == NULL) goto _OVER;
|
||||||
|
|
||||||
memcpy(pMsg, pRpc, sizeof(SRpcMsg));
|
memcpy(pMsg, pRpc, sizeof(SRpcMsg));
|
||||||
dGTrace("msg:%p, is created, type:%s handle:%p", pMsg, TMSG_INFO(pRpc->msgType), pMsg->info.handle);
|
dGTrace("msg:%p, is created, type:%s handle:%p len:%d", pMsg, TMSG_INFO(pRpc->msgType), pMsg->info.handle, pRpc->contLen);
|
||||||
|
|
||||||
code = dmProcessNodeMsg(pWrapper, pMsg);
|
code = dmProcessNodeMsg(pWrapper, pMsg);
|
||||||
|
|
||||||
|
|
|
@ -554,10 +554,13 @@ static int32_t mndProcessSubscribeReq(SRpcMsg *pMsg) {
|
||||||
goto SUBSCRIBE_OVER;
|
goto SUBSCRIBE_OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check topic only
|
||||||
|
#if 0
|
||||||
if (mndCheckDbPrivilegeByName(pMnode, pMsg->info.conn.user, MND_OPER_READ_DB, pTopic->db) != 0) {
|
if (mndCheckDbPrivilegeByName(pMnode, pMsg->info.conn.user, MND_OPER_READ_DB, pTopic->db) != 0) {
|
||||||
mndReleaseTopic(pMnode, pTopic);
|
mndReleaseTopic(pMnode, pTopic);
|
||||||
goto SUBSCRIBE_OVER;
|
goto SUBSCRIBE_OVER;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (mndCheckTopicPrivilege(pMnode, pMsg->info.conn.user, MND_OPER_SUBSCRIBE, pTopic) != 0) {
|
if (mndCheckTopicPrivilege(pMnode, pMsg->info.conn.user, MND_OPER_SUBSCRIBE, pTopic) != 0) {
|
||||||
mndReleaseTopic(pMnode, pTopic);
|
mndReleaseTopic(pMnode, pTopic);
|
||||||
|
|
|
@ -769,7 +769,7 @@ static int32_t mndRetrieveQueries(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfQueries = taosArrayGetSize(pConn->pQueries);
|
int32_t numOfQueries = taosArrayGetSize(pConn->pQueries);
|
||||||
for (int32_t i = 0; i < numOfQueries; ++i) {
|
for (int32_t i = 0; i < numOfQueries && numOfRows < rows; ++i) {
|
||||||
SQueryDesc *pQuery = taosArrayGet(pConn->pQueries, i);
|
SQueryDesc *pQuery = taosArrayGet(pConn->pQueries, i);
|
||||||
cols = 0;
|
cols = 0;
|
||||||
|
|
||||||
|
|
|
@ -507,7 +507,7 @@ static int32_t mndGetAvailableDnode(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup
|
||||||
for (int32_t v = 0; v < pVgroup->replica; ++v) {
|
for (int32_t v = 0; v < pVgroup->replica; ++v) {
|
||||||
SVnodeGid *pVgid = &pVgroup->vnodeGid[v];
|
SVnodeGid *pVgid = &pVgroup->vnodeGid[v];
|
||||||
SDnodeObj *pDnode = taosArrayGet(pArray, v);
|
SDnodeObj *pDnode = taosArrayGet(pArray, v);
|
||||||
if (pDnode == NULL || pDnode->numOfVnodes > pDnode->numOfSupportVnodes) {
|
if (pDnode == NULL || pDnode->numOfVnodes >= pDnode->numOfSupportVnodes) {
|
||||||
terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -891,7 +891,7 @@ static int32_t mndAddVnodeToVgroup(SMnode *pMnode, STrans *pTrans, SVgObj *pVgro
|
||||||
}
|
}
|
||||||
if (used) continue;
|
if (used) continue;
|
||||||
|
|
||||||
if (pDnode == NULL || pDnode->numOfVnodes > pDnode->numOfSupportVnodes) {
|
if (pDnode == NULL || pDnode->numOfVnodes >= pDnode->numOfSupportVnodes) {
|
||||||
terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,9 +32,9 @@ typedef struct SMetaStbStatsEntry {
|
||||||
} SMetaStbStatsEntry;
|
} SMetaStbStatsEntry;
|
||||||
|
|
||||||
typedef struct STagFilterResEntry {
|
typedef struct STagFilterResEntry {
|
||||||
uint64_t suid; // uid for super table
|
uint64_t suid; // uid for super table
|
||||||
SList list; // the linked list of md5 digest, extracted from the serialized tag query condition
|
SList list; // the linked list of md5 digest, extracted from the serialized tag query condition
|
||||||
uint32_t qTimes;// queried times for current super table
|
uint32_t qTimes; // queried times for current super table
|
||||||
} STagFilterResEntry;
|
} STagFilterResEntry;
|
||||||
|
|
||||||
struct SMetaCache {
|
struct SMetaCache {
|
||||||
|
@ -126,13 +126,14 @@ int32_t metaCacheOpen(SMeta* pMeta) {
|
||||||
goto _err2;
|
goto _err2;
|
||||||
}
|
}
|
||||||
|
|
||||||
pCache->sTagFilterResCache.pUidResCache = taosLRUCacheInit(5*1024*1024, -1, 0.5);
|
pCache->sTagFilterResCache.pUidResCache = taosLRUCacheInit(5 * 1024 * 1024, -1, 0.5);
|
||||||
if (pCache->sTagFilterResCache.pUidResCache == NULL) {
|
if (pCache->sTagFilterResCache.pUidResCache == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err2;
|
goto _err2;
|
||||||
}
|
}
|
||||||
|
|
||||||
pCache->sTagFilterResCache.pTableEntry = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), false, HASH_NO_LOCK);
|
pCache->sTagFilterResCache.pTableEntry =
|
||||||
|
taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), false, HASH_NO_LOCK);
|
||||||
if (pCache->sTagFilterResCache.pTableEntry == NULL) {
|
if (pCache->sTagFilterResCache.pTableEntry == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err2;
|
goto _err2;
|
||||||
|
@ -419,7 +420,8 @@ int32_t metaStatsCacheGet(SMeta* pMeta, int64_t uid, SMetaStbStats* pInfo) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t metaGetCachedTableUidList(SMeta* pMeta, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray* pList1, bool* acquireRes) {
|
int32_t metaGetCachedTableUidList(SMeta* pMeta, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray* pList1,
|
||||||
|
bool* acquireRes) {
|
||||||
uint64_t* pBuf = pMeta->pCache->sTagFilterResCache.keyBuf;
|
uint64_t* pBuf = pMeta->pCache->sTagFilterResCache.keyBuf;
|
||||||
|
|
||||||
// generate the composed key for LRU cache
|
// generate the composed key for LRU cache
|
||||||
|
@ -428,8 +430,8 @@ int32_t metaGetCachedTableUidList(SMeta* pMeta, tb_uid_t suid, const uint8_t* pK
|
||||||
pBuf[0] = suid;
|
pBuf[0] = suid;
|
||||||
memcpy(&pBuf[1], pKey, keyLen);
|
memcpy(&pBuf[1], pKey, keyLen);
|
||||||
|
|
||||||
int32_t len = keyLen + sizeof(uint64_t);
|
int32_t len = keyLen + sizeof(uint64_t);
|
||||||
LRUHandle *pHandle = taosLRUCacheLookup(pCache, pBuf, len);
|
LRUHandle* pHandle = taosLRUCacheLookup(pCache, pBuf, len);
|
||||||
if (pHandle == NULL) {
|
if (pHandle == NULL) {
|
||||||
*acquireRes = 0;
|
*acquireRes = 0;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -439,7 +441,7 @@ int32_t metaGetCachedTableUidList(SMeta* pMeta, tb_uid_t suid, const uint8_t* pK
|
||||||
*acquireRes = 1;
|
*acquireRes = 1;
|
||||||
|
|
||||||
const char* p = taosLRUCacheValue(pMeta->pCache->sTagFilterResCache.pUidResCache, pHandle);
|
const char* p = taosLRUCacheValue(pMeta->pCache->sTagFilterResCache.pUidResCache, pHandle);
|
||||||
int32_t size = *(int32_t*) p;
|
int32_t size = *(int32_t*)p;
|
||||||
taosArrayAddBatch(pList1, p + sizeof(int32_t), size);
|
taosArrayAddBatch(pList1, p + sizeof(int32_t), size);
|
||||||
|
|
||||||
(*pEntry)->qTimes += 1;
|
(*pEntry)->qTimes += 1;
|
||||||
|
@ -467,12 +469,15 @@ int32_t metaGetCachedTableUidList(SMeta* pMeta, tb_uid_t suid, const uint8_t* pK
|
||||||
|
|
||||||
// remove the keys, of which query uid lists have been replaced already.
|
// remove the keys, of which query uid lists have been replaced already.
|
||||||
size_t s = taosArrayGetSize(pList);
|
size_t s = taosArrayGetSize(pList);
|
||||||
for(int32_t i = 0; i < s; ++i) {
|
for (int32_t i = 0; i < s; ++i) {
|
||||||
SListNode** p1 = taosArrayGet(pList, i);
|
SListNode** p1 = taosArrayGet(pList, i);
|
||||||
tdListPopNode(&(*pEntry)->list, *p1);
|
tdListPopNode(&(*pEntry)->list, *p1);
|
||||||
|
taosMemoryFree(*p1);
|
||||||
}
|
}
|
||||||
|
|
||||||
(*pEntry)->qTimes = 0; // reset the query times
|
(*pEntry)->qTimes = 0; // reset the query times
|
||||||
|
|
||||||
|
taosArrayDestroy(pList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -487,7 +492,8 @@ static void freePayload(const void* key, size_t keyLen, void* value) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// check both the payload size and selectivity ratio
|
// check both the payload size and selectivity ratio
|
||||||
int32_t metaUidFilterCachePut(SMeta* pMeta, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload, int32_t payloadLen, double selectivityRatio) {
|
int32_t metaUidFilterCachePut(SMeta* pMeta, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
||||||
|
int32_t payloadLen, double selectivityRatio) {
|
||||||
if (selectivityRatio > tsSelectivityRatio) {
|
if (selectivityRatio > tsSelectivityRatio) {
|
||||||
metaDebug("vgId:%d, suid:%" PRIu64
|
metaDebug("vgId:%d, suid:%" PRIu64
|
||||||
" failed to add to uid list cache, due to selectivity ratio %.2f less than threshold %.2f",
|
" failed to add to uid list cache, due to selectivity ratio %.2f less than threshold %.2f",
|
||||||
|
@ -525,9 +531,10 @@ int32_t metaUidFilterCachePut(SMeta* pMeta, uint64_t suid, const void* pKey, int
|
||||||
ASSERT(sizeof(uint64_t) + keyLen == 24);
|
ASSERT(sizeof(uint64_t) + keyLen == 24);
|
||||||
|
|
||||||
// add to cache.
|
// add to cache.
|
||||||
taosLRUCacheInsert(pCache, pBuf, sizeof(uint64_t) + keyLen, pPayload, payloadLen, freePayload, NULL, TAOS_LRU_PRIORITY_LOW);
|
taosLRUCacheInsert(pCache, pBuf, sizeof(uint64_t) + keyLen, pPayload, payloadLen, freePayload, NULL,
|
||||||
metaDebug("vgId:%d, suid:%"PRIu64" list cache added into cache, total:%d, tables:%d", TD_VID(pMeta->pVnode),
|
TAOS_LRU_PRIORITY_LOW);
|
||||||
suid, (int32_t) taosLRUCacheGetUsage(pCache), taosHashGetSize(pTableEntry));
|
metaDebug("vgId:%d, suid:%" PRIu64 " list cache added into cache, total:%d, tables:%d", TD_VID(pMeta->pVnode), suid,
|
||||||
|
(int32_t)taosLRUCacheGetUsage(pCache), taosHashGetSize(pTableEntry));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -539,7 +546,7 @@ int32_t metaUidCacheClear(SMeta* pMeta, uint64_t suid) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t keyLen = sizeof(uint64_t) * 3;
|
int32_t keyLen = sizeof(uint64_t) * 3;
|
||||||
uint64_t p[3] = {0};
|
uint64_t p[3] = {0};
|
||||||
p[0] = suid;
|
p[0] = suid;
|
||||||
|
|
||||||
|
|
|
@ -756,7 +756,8 @@ _err:
|
||||||
static int32_t tdExecuteRSmaImplAsync(SSma *pSma, int64_t version, const void *pMsg, int32_t len, int32_t inputType,
|
static int32_t tdExecuteRSmaImplAsync(SSma *pSma, int64_t version, const void *pMsg, int32_t len, int32_t inputType,
|
||||||
SRSmaInfo *pInfo, tb_uid_t suid) {
|
SRSmaInfo *pInfo, tb_uid_t suid) {
|
||||||
int32_t size = sizeof(int32_t) + sizeof(int64_t) + len;
|
int32_t size = sizeof(int32_t) + sizeof(int64_t) + len;
|
||||||
void *qItem = taosAllocateQitem(size, DEF_QITEM);
|
void *qItem = taosAllocateQitem(size, DEF_QITEM, 0);
|
||||||
|
|
||||||
if (!qItem) {
|
if (!qItem) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -730,7 +730,10 @@ int32_t tqProcessDeleteSubReq(STQ* pTq, int64_t version, char* msg, int32_t msgL
|
||||||
|
|
||||||
STqHandle* pHandle = taosHashGet(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
|
STqHandle* pHandle = taosHashGet(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
|
||||||
if (pHandle) {
|
if (pHandle) {
|
||||||
walCloseRef(pHandle->pWalReader->pWal, pHandle->pRef->refId);
|
//walCloseRef(pHandle->pWalReader->pWal, pHandle->pRef->refId);
|
||||||
|
if (pHandle->pRef) {
|
||||||
|
walCloseRef(pTq->pVnode->pWal, pHandle->pRef->refId);
|
||||||
|
}
|
||||||
code = taosHashRemove(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
|
code = taosHashRemove(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
tqError("cannot process tq delete req %s, since no such handle", pReq->subKey);
|
tqError("cannot process tq delete req %s, since no such handle", pReq->subKey);
|
||||||
|
@ -743,7 +746,7 @@ int32_t tqProcessDeleteSubReq(STQ* pTq, int64_t version, char* msg, int32_t msgL
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tqMetaDeleteHandle(pTq, pReq->subKey) < 0) {
|
if (tqMetaDeleteHandle(pTq, pReq->subKey) < 0) {
|
||||||
ASSERT(0);
|
tqError("cannot process tq delete req %s, since no such offset in tdb", pReq->subKey);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1272,7 +1275,7 @@ int32_t tqProcessDelReq(STQ* pTq, void* pReq, int32_t len, int64_t ver) {
|
||||||
qDebug("delete req enqueue stream task: %d, ver: %" PRId64, pTask->taskId, ver);
|
qDebug("delete req enqueue stream task: %d, ver: %" PRId64, pTask->taskId, ver);
|
||||||
|
|
||||||
if (!failed) {
|
if (!failed) {
|
||||||
SStreamRefDataBlock* pRefBlock = taosAllocateQitem(sizeof(SStreamRefDataBlock), DEF_QITEM);
|
SStreamRefDataBlock* pRefBlock = taosAllocateQitem(sizeof(SStreamRefDataBlock), DEF_QITEM, 0);
|
||||||
pRefBlock->type = STREAM_INPUT__REF_DATA_BLOCK;
|
pRefBlock->type = STREAM_INPUT__REF_DATA_BLOCK;
|
||||||
pRefBlock->pBlock = pDelBlock;
|
pRefBlock->pBlock = pDelBlock;
|
||||||
pRefBlock->dataRef = pRef;
|
pRefBlock->dataRef = pRef;
|
||||||
|
@ -1304,7 +1307,7 @@ int32_t tqProcessDelReq(STQ* pTq, void* pReq, int32_t len, int64_t ver) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
SStreamDataBlock* pStreamBlock = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM);
|
SStreamDataBlock* pStreamBlock = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM, 0);
|
||||||
pStreamBlock->type = STREAM_INPUT__DATA_BLOCK;
|
pStreamBlock->type = STREAM_INPUT__DATA_BLOCK;
|
||||||
pStreamBlock->blocks = taosArrayInit(0, sizeof(SSDataBlock));
|
pStreamBlock->blocks = taosArrayInit(0, sizeof(SSDataBlock));
|
||||||
SSDataBlock block = {0};
|
SSDataBlock block = {0};
|
||||||
|
|
|
@ -1026,6 +1026,7 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
|
||||||
|
|
||||||
code = tsdbReadDelIdx(pDelFReader, pDelIdxArray);
|
code = tsdbReadDelIdx(pDelFReader, pDelIdxArray);
|
||||||
if (code) {
|
if (code) {
|
||||||
|
taosArrayDestroy(pDelIdxArray);
|
||||||
tsdbDelFReaderClose(&pDelFReader);
|
tsdbDelFReaderClose(&pDelFReader);
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
@ -1034,6 +1035,7 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
|
||||||
|
|
||||||
code = getTableDelSkyline(pMem, pIMem, pDelFReader, delIdx, pIter->pSkyline);
|
code = getTableDelSkyline(pMem, pIMem, pDelFReader, delIdx, pIter->pSkyline);
|
||||||
if (code) {
|
if (code) {
|
||||||
|
taosArrayDestroy(pDelIdxArray);
|
||||||
tsdbDelFReaderClose(&pDelFReader);
|
tsdbDelFReaderClose(&pDelFReader);
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,7 +121,7 @@ static SBlockData *loadLastBlock(SLDataIter *pIter, const char *idStr) {
|
||||||
return &pInfo->blockData[1];
|
return &pInfo->blockData[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pIter->pSttBlk == NULL) {
|
if (pIter->pSttBlk == NULL || pInfo->pSchema == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1157,6 +1157,8 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
|
||||||
setBlockAllDumped(pDumpInfo, ts, pReader->order);
|
setBlockAllDumped(pDumpInfo, ts, pReader->order);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pBlockScanInfo->lastKey = pDumpInfo->lastKey;
|
||||||
|
|
||||||
double elapsedTime = (taosGetTimestampUs() - st) / 1000.0;
|
double elapsedTime = (taosGetTimestampUs() - st) / 1000.0;
|
||||||
pReader->cost.blockLoadTime += elapsedTime;
|
pReader->cost.blockLoadTime += elapsedTime;
|
||||||
|
|
||||||
|
@ -2468,7 +2470,7 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
|
||||||
while (1) {
|
while (1) {
|
||||||
bool hasBlockData = false;
|
bool hasBlockData = false;
|
||||||
{
|
{
|
||||||
while (pBlockData->nRow > 0) { // find the first qualified row in data block
|
while (pBlockData->nRow > 0 && pBlockData->uid == pBlockScanInfo->uid) { // find the first qualified row in data block
|
||||||
if (isValidFileBlockRow(pBlockData, pDumpInfo, pBlockScanInfo, pReader)) {
|
if (isValidFileBlockRow(pBlockData, pDumpInfo, pBlockScanInfo, pReader)) {
|
||||||
hasBlockData = true;
|
hasBlockData = true;
|
||||||
break;
|
break;
|
||||||
|
@ -2478,10 +2480,13 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
|
||||||
|
|
||||||
SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
|
SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
|
||||||
if (pDumpInfo->rowIndex >= pBlock->nRow || pDumpInfo->rowIndex < 0) {
|
if (pDumpInfo->rowIndex >= pBlock->nRow || pDumpInfo->rowIndex < 0) {
|
||||||
int32_t nextIndex = -1;
|
|
||||||
SBlockIndex bIndex = {0};
|
SBlockIndex bIndex = {0};
|
||||||
bool hasNeighbor =
|
int32_t nextIndex = -1;
|
||||||
getNeighborBlockOfSameTable(pBlockInfo, pBlockScanInfo, &nextIndex, pReader->order, &bIndex);
|
bool hasNeighbor = false;
|
||||||
|
if (pBlockInfo != NULL) {
|
||||||
|
hasNeighbor = getNeighborBlockOfSameTable(pBlockInfo, pBlockScanInfo, &nextIndex, pReader->order, &bIndex);
|
||||||
|
}
|
||||||
|
|
||||||
if (!hasNeighbor) { // do nothing
|
if (!hasNeighbor) { // do nothing
|
||||||
setBlockAllDumped(pDumpInfo, pBlock->maxKey.ts, pReader->order);
|
setBlockAllDumped(pDumpInfo, pBlock->maxKey.ts, pReader->order);
|
||||||
break;
|
break;
|
||||||
|
@ -2789,7 +2794,8 @@ static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) {
|
||||||
while (1) {
|
while (1) {
|
||||||
// load the last data block of current table
|
// load the last data block of current table
|
||||||
STableBlockScanInfo* pScanInfo = *(STableBlockScanInfo**)pStatus->pTableIter;
|
STableBlockScanInfo* pScanInfo = *(STableBlockScanInfo**)pStatus->pTableIter;
|
||||||
bool hasVal = initLastBlockReader(pLastBlockReader, pScanInfo, pReader);
|
|
||||||
|
bool hasVal = initLastBlockReader(pLastBlockReader, pScanInfo, pReader);
|
||||||
if (!hasVal) {
|
if (!hasVal) {
|
||||||
bool hasNexTable = moveToNextTable(pOrderedCheckInfo, pStatus);
|
bool hasNexTable = moveToNextTable(pOrderedCheckInfo, pStatus);
|
||||||
if (!hasNexTable) {
|
if (!hasNexTable) {
|
||||||
|
@ -3020,7 +3026,12 @@ static int32_t buildBlockFromFiles(STsdbReader* pReader) {
|
||||||
} else {
|
} else {
|
||||||
if (pReader->status.pCurrentFileset->nSttF > 0) {
|
if (pReader->status.pCurrentFileset->nSttF > 0) {
|
||||||
// data blocks in current file are exhausted, let's try the next file now
|
// data blocks in current file are exhausted, let's try the next file now
|
||||||
tBlockDataReset(&pReader->status.fileBlockData);
|
SBlockData* pBlockData = &pReader->status.fileBlockData;
|
||||||
|
if (pBlockData->uid != 0) {
|
||||||
|
tBlockDataClear(pBlockData);
|
||||||
|
}
|
||||||
|
|
||||||
|
tBlockDataReset(pBlockData);
|
||||||
resetDataBlockIterator(pBlockIter, pReader->order);
|
resetDataBlockIterator(pBlockIter, pReader->order);
|
||||||
goto _begin;
|
goto _begin;
|
||||||
} else {
|
} else {
|
||||||
|
@ -3377,6 +3388,11 @@ int32_t doMergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pSc
|
||||||
|
|
||||||
SFileDataBlockInfo* pFileBlockInfo = getCurrentBlockInfo(&pReader->status.blockIter);
|
SFileDataBlockInfo* pFileBlockInfo = getCurrentBlockInfo(&pReader->status.blockIter);
|
||||||
SDataBlk* pCurrentBlock = getCurrentBlock(&pReader->status.blockIter);
|
SDataBlk* pCurrentBlock = getCurrentBlock(&pReader->status.blockIter);
|
||||||
|
if (pFileBlockInfo == NULL) {
|
||||||
|
st = CHECK_FILEBLOCK_QUIT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
checkForNeighborFileBlock(pReader, pScanInfo, pCurrentBlock, pFileBlockInfo, pMerger, key, &st);
|
checkForNeighborFileBlock(pReader, pScanInfo, pCurrentBlock, pFileBlockInfo, pMerger, key, &st);
|
||||||
if (st == CHECK_FILEBLOCK_QUIT) {
|
if (st == CHECK_FILEBLOCK_QUIT) {
|
||||||
break;
|
break;
|
||||||
|
@ -3847,6 +3863,8 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: the endVersion in pCond is the data version not schema version, so pCond->endVersion is not correct here.
|
// NOTE: the endVersion in pCond is the data version not schema version, so pCond->endVersion is not correct here.
|
||||||
|
// no valid error code set in metaGetTbTSchema, so let's set the error code here.
|
||||||
|
// we should proceed in case of tmq processing.
|
||||||
if (pCond->suid != 0) {
|
if (pCond->suid != 0) {
|
||||||
pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pReader->suid, -1, 1);
|
pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pReader->suid, -1, 1);
|
||||||
if (pReader->pSchema == NULL) {
|
if (pReader->pSchema == NULL) {
|
||||||
|
@ -3914,6 +3932,7 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
tsdbError("failed to create data reader, code:%s %s", tstrerror(code), idstr);
|
tsdbError("failed to create data reader, code:%s %s", tstrerror(code), idstr);
|
||||||
|
tsdbReaderClose(pReader);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -798,6 +798,9 @@ SName* ctgGetFetchName(SArray* pNames, SCtgFetch* pFetch);
|
||||||
int32_t ctgdGetOneHandle(SCatalog **pHandle);
|
int32_t ctgdGetOneHandle(SCatalog **pHandle);
|
||||||
int ctgVgInfoComp(const void* lp, const void* rp);
|
int ctgVgInfoComp(const void* lp, const void* rp);
|
||||||
int32_t ctgMakeVgArray(SDBVgInfo* dbInfo);
|
int32_t ctgMakeVgArray(SDBVgInfo* dbInfo);
|
||||||
|
int32_t ctgAcquireVgMetaFromCache(SCatalog *pCtg, const char *dbFName, const char *tbName, SCtgDBCache **pDb, SCtgTbCache **pTb);
|
||||||
|
int32_t ctgCopyTbMeta(SCatalog *pCtg, SCtgTbMetaCtx *ctx, SCtgDBCache **pDb, SCtgTbCache **pTb, STableMeta **pTableMeta, char* dbFName);
|
||||||
|
void ctgReleaseVgMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, SCtgTbCache *pCache);
|
||||||
|
|
||||||
extern SCatalogMgmt gCtgMgmt;
|
extern SCatalogMgmt gCtgMgmt;
|
||||||
extern SCtgDebug gCTGDebug;
|
extern SCtgDebug gCTGDebug;
|
||||||
|
|
|
@ -551,6 +551,35 @@ _return:
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgGetCachedTbVgMeta(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, STableMeta** pTableMeta) {
|
||||||
|
int32_t code = 0;
|
||||||
|
char db[TSDB_DB_FNAME_LEN] = {0};
|
||||||
|
tNameGetFullDbName(pTableName, db);
|
||||||
|
SCtgDBCache *dbCache = NULL;
|
||||||
|
SCtgTbCache *tbCache = NULL;
|
||||||
|
|
||||||
|
CTG_ERR_RET(ctgAcquireVgMetaFromCache(pCtg, db, pTableName->tname, &dbCache, &tbCache));
|
||||||
|
|
||||||
|
if (NULL == dbCache || NULL == tbCache) {
|
||||||
|
*pTableMeta = NULL;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, dbCache->vgCache.vgInfo, pTableName, pVgroup));
|
||||||
|
|
||||||
|
SCtgTbMetaCtx ctx = {0};
|
||||||
|
ctx.pName = (SName*)pTableName;
|
||||||
|
ctx.flag = CTG_FLAG_UNKNOWN_STB;
|
||||||
|
CTG_ERR_JRET(ctgCopyTbMeta(pCtg, &ctx, &dbCache, &tbCache, pTableMeta, db));
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
ctgReleaseVgMetaToCache(pCtg, dbCache, tbCache);
|
||||||
|
|
||||||
|
CTG_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgRemoveTbMeta(SCatalog* pCtg, SName* pTableName) {
|
int32_t ctgRemoveTbMeta(SCatalog* pCtg, SName* pTableName) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
@ -1118,6 +1147,13 @@ int32_t catalogGetCachedTableHashVgroup(SCatalog* pCtg, const SName* pTableName,
|
||||||
CTG_API_LEAVE(ctgGetTbHashVgroup(pCtg, NULL, pTableName, pVgroup, exists));
|
CTG_API_LEAVE(ctgGetTbHashVgroup(pCtg, NULL, pTableName, pVgroup, exists));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t catalogGetCachedTableVgMeta(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, STableMeta** pTableMeta) {
|
||||||
|
CTG_API_ENTER();
|
||||||
|
|
||||||
|
CTG_API_LEAVE(ctgGetCachedTbVgMeta(pCtg, pTableName, pVgroup, pTableMeta));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
int32_t catalogGetAllMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SCatalogReq* pReq, SMetaData* pRsp) {
|
int32_t catalogGetAllMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SCatalogReq* pReq, SMetaData* pRsp) {
|
||||||
CTG_API_ENTER();
|
CTG_API_ENTER();
|
||||||
|
|
|
@ -130,7 +130,7 @@ void ctgReleaseVgInfoToCache(SCatalog *pCtg, SCtgDBCache *dbCache) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctgReleaseTbMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, SCtgTbCache *pCache) {
|
void ctgReleaseTbMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, SCtgTbCache *pCache) {
|
||||||
if (pCache) {
|
if (pCache && dbCache) {
|
||||||
CTG_UNLOCK(CTG_READ, &pCache->metaLock);
|
CTG_UNLOCK(CTG_READ, &pCache->metaLock);
|
||||||
taosHashRelease(dbCache->tbCache, pCache);
|
taosHashRelease(dbCache->tbCache, pCache);
|
||||||
}
|
}
|
||||||
|
@ -151,6 +151,18 @@ void ctgReleaseTbIndexToCache(SCatalog *pCtg, SCtgDBCache *dbCache, SCtgTbCache
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ctgReleaseVgMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, SCtgTbCache *pCache) {
|
||||||
|
if (pCache && dbCache) {
|
||||||
|
CTG_UNLOCK(CTG_READ, &pCache->metaLock);
|
||||||
|
taosHashRelease(dbCache->tbCache, pCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dbCache) {
|
||||||
|
ctgRUnlockVgInfo(dbCache);
|
||||||
|
ctgReleaseDBCache(pCtg, dbCache);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int32_t ctgAcquireVgInfoFromCache(SCatalog *pCtg, const char *dbFName, SCtgDBCache **pCache) {
|
int32_t ctgAcquireVgInfoFromCache(SCatalog *pCtg, const char *dbFName, SCtgDBCache **pCache) {
|
||||||
SCtgDBCache *dbCache = NULL;
|
SCtgDBCache *dbCache = NULL;
|
||||||
ctgAcquireDBCache(pCtg, dbFName, &dbCache);
|
ctgAcquireDBCache(pCtg, dbFName, &dbCache);
|
||||||
|
@ -226,6 +238,75 @@ _return:
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgAcquireVgMetaFromCache(SCatalog *pCtg, const char *dbFName, const char *tbName, SCtgDBCache **pDb, SCtgTbCache **pTb) {
|
||||||
|
SCtgDBCache *dbCache = NULL;
|
||||||
|
SCtgTbCache *tbCache = NULL;
|
||||||
|
bool vgInCache = false;
|
||||||
|
|
||||||
|
ctgAcquireDBCache(pCtg, dbFName, &dbCache);
|
||||||
|
if (NULL == dbCache) {
|
||||||
|
ctgDebug("db %s not in cache", dbFName);
|
||||||
|
CTG_CACHE_STAT_INC(numOfVgMiss, 1);
|
||||||
|
goto _return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctgRLockVgInfo(pCtg, dbCache, &vgInCache);
|
||||||
|
if (!vgInCache) {
|
||||||
|
ctgDebug("vgInfo of db %s not in cache", dbFName);
|
||||||
|
CTG_CACHE_STAT_INC(numOfVgMiss, 1);
|
||||||
|
goto _return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pDb = dbCache;
|
||||||
|
|
||||||
|
CTG_CACHE_STAT_INC(numOfVgHit, 1);
|
||||||
|
|
||||||
|
ctgDebug("Got db vgInfo from cache, dbFName:%s", dbFName);
|
||||||
|
|
||||||
|
tbCache = taosHashAcquire(dbCache->tbCache, tbName, strlen(tbName));
|
||||||
|
if (NULL == tbCache) {
|
||||||
|
ctgDebug("tb %s not in cache, dbFName:%s", tbName, dbFName);
|
||||||
|
CTG_CACHE_STAT_INC(numOfMetaMiss, 1);
|
||||||
|
goto _return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_LOCK(CTG_READ, &tbCache->metaLock);
|
||||||
|
if (NULL == tbCache->pMeta) {
|
||||||
|
ctgDebug("tb %s meta not in cache, dbFName:%s", tbName, dbFName);
|
||||||
|
CTG_CACHE_STAT_INC(numOfMetaMiss, 1);
|
||||||
|
goto _return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pTb = tbCache;
|
||||||
|
|
||||||
|
ctgDebug("tb %s meta got in cache, dbFName:%s", tbName, dbFName);
|
||||||
|
|
||||||
|
CTG_CACHE_STAT_INC(numOfMetaHit, 1);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
if (tbCache) {
|
||||||
|
CTG_UNLOCK(CTG_READ, &tbCache->metaLock);
|
||||||
|
taosHashRelease(dbCache->tbCache, tbCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vgInCache) {
|
||||||
|
ctgRUnlockVgInfo(dbCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dbCache) {
|
||||||
|
ctgReleaseDBCache(pCtg, dbCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
*pDb = NULL;
|
||||||
|
*pTb = NULL;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
int32_t ctgAcquireStbMetaFromCache(SCatalog *pCtg, char *dbFName, uint64_t suid, SCtgDBCache **pDb, SCtgTbCache **pTb) {
|
int32_t ctgAcquireStbMetaFromCache(SCatalog *pCtg, char *dbFName, uint64_t suid, SCtgDBCache **pDb, SCtgTbCache **pTb) {
|
||||||
SCtgDBCache *dbCache = NULL;
|
SCtgDBCache *dbCache = NULL;
|
||||||
|
@ -378,6 +459,78 @@ int32_t ctgTbMetaExistInCache(SCatalog *pCtg, char *dbFName, char *tbName, int32
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgCopyTbMeta(SCatalog *pCtg, SCtgTbMetaCtx *ctx, SCtgDBCache **pDb, SCtgTbCache **pTb, STableMeta **pTableMeta, char* dbFName) {
|
||||||
|
SCtgDBCache *dbCache = *pDb;
|
||||||
|
SCtgTbCache *tbCache = *pTb;
|
||||||
|
STableMeta *tbMeta = tbCache->pMeta;
|
||||||
|
ctx->tbInfo.inCache = true;
|
||||||
|
ctx->tbInfo.dbId = dbCache->dbId;
|
||||||
|
ctx->tbInfo.suid = tbMeta->suid;
|
||||||
|
ctx->tbInfo.tbType = tbMeta->tableType;
|
||||||
|
|
||||||
|
if (tbMeta->tableType != TSDB_CHILD_TABLE) {
|
||||||
|
int32_t metaSize = CTG_META_SIZE(tbMeta);
|
||||||
|
*pTableMeta = taosMemoryCalloc(1, metaSize);
|
||||||
|
if (NULL == *pTableMeta) {
|
||||||
|
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(*pTableMeta, tbMeta, metaSize);
|
||||||
|
|
||||||
|
ctgDebug("Got tb %s meta from cache, type:%d, dbFName:%s", ctx->pName->tname, tbMeta->tableType, dbFName);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PROCESS FOR CHILD TABLE
|
||||||
|
|
||||||
|
int32_t metaSize = sizeof(SCTableMeta);
|
||||||
|
*pTableMeta = taosMemoryCalloc(1, metaSize);
|
||||||
|
if (NULL == *pTableMeta) {
|
||||||
|
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(*pTableMeta, tbMeta, metaSize);
|
||||||
|
|
||||||
|
//ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
|
||||||
|
|
||||||
|
if (tbCache) {
|
||||||
|
CTG_UNLOCK(CTG_READ, &tbCache->metaLock);
|
||||||
|
taosHashRelease(dbCache->tbCache, tbCache);
|
||||||
|
*pTb = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctgDebug("Got ctb %s meta from cache, will continue to get its stb meta, type:%d, dbFName:%s", ctx->pName->tname,
|
||||||
|
ctx->tbInfo.tbType, dbFName);
|
||||||
|
|
||||||
|
ctgAcquireStbMetaFromCache(dbCache, pCtg, dbFName, ctx->tbInfo.suid, &tbCache);
|
||||||
|
if (NULL == tbCache) {
|
||||||
|
taosMemoryFreeClear(*pTableMeta);
|
||||||
|
*pDb = NULL;
|
||||||
|
ctgDebug("stb 0x%" PRIx64 " meta not in cache", ctx->tbInfo.suid);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pTb = tbCache;
|
||||||
|
|
||||||
|
STableMeta *stbMeta = tbCache->pMeta;
|
||||||
|
if (stbMeta->suid != ctx->tbInfo.suid) {
|
||||||
|
ctgError("stb suid 0x%" PRIx64 " in stbCache mis-match, expected suid 0x%" PRIx64, stbMeta->suid, ctx->tbInfo.suid);
|
||||||
|
taosMemoryFreeClear(*pTableMeta);
|
||||||
|
CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
metaSize = CTG_META_SIZE(stbMeta);
|
||||||
|
*pTableMeta = taosMemoryRealloc(*pTableMeta, metaSize);
|
||||||
|
if (NULL == *pTableMeta) {
|
||||||
|
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(&(*pTableMeta)->sversion, &stbMeta->sversion, metaSize - sizeof(SCTableMeta));
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgReadTbMetaFromCache(SCatalog *pCtg, SCtgTbMetaCtx *ctx, STableMeta **pTableMeta) {
|
int32_t ctgReadTbMetaFromCache(SCatalog *pCtg, SCtgTbMetaCtx *ctx, STableMeta **pTableMeta) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SCtgDBCache *dbCache = NULL;
|
SCtgDBCache *dbCache = NULL;
|
||||||
|
@ -397,70 +550,7 @@ int32_t ctgReadTbMetaFromCache(SCatalog *pCtg, SCtgTbMetaCtx *ctx, STableMeta **
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
STableMeta *tbMeta = tbCache->pMeta;
|
CTG_ERR_JRET(ctgCopyTbMeta(pCtg, ctx, &dbCache, &tbCache, pTableMeta, dbFName));
|
||||||
ctx->tbInfo.inCache = true;
|
|
||||||
ctx->tbInfo.dbId = dbCache->dbId;
|
|
||||||
ctx->tbInfo.suid = tbMeta->suid;
|
|
||||||
ctx->tbInfo.tbType = tbMeta->tableType;
|
|
||||||
|
|
||||||
if (tbMeta->tableType != TSDB_CHILD_TABLE) {
|
|
||||||
int32_t metaSize = CTG_META_SIZE(tbMeta);
|
|
||||||
*pTableMeta = taosMemoryCalloc(1, metaSize);
|
|
||||||
if (NULL == *pTableMeta) {
|
|
||||||
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
|
|
||||||
CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(*pTableMeta, tbMeta, metaSize);
|
|
||||||
|
|
||||||
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
|
|
||||||
ctgDebug("Got tb %s meta from cache, type:%d, dbFName:%s", ctx->pName->tname, tbMeta->tableType, dbFName);
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
// PROCESS FOR CHILD TABLE
|
|
||||||
|
|
||||||
int32_t metaSize = sizeof(SCTableMeta);
|
|
||||||
*pTableMeta = taosMemoryCalloc(1, metaSize);
|
|
||||||
if (NULL == *pTableMeta) {
|
|
||||||
CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(*pTableMeta, tbMeta, metaSize);
|
|
||||||
|
|
||||||
//ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
|
|
||||||
|
|
||||||
if (tbCache) {
|
|
||||||
CTG_UNLOCK(CTG_READ, &tbCache->metaLock);
|
|
||||||
taosHashRelease(dbCache->tbCache, tbCache);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctgDebug("Got ctb %s meta from cache, will continue to get its stb meta, type:%d, dbFName:%s", ctx->pName->tname,
|
|
||||||
ctx->tbInfo.tbType, dbFName);
|
|
||||||
|
|
||||||
ctgAcquireStbMetaFromCache(dbCache, pCtg, dbFName, ctx->tbInfo.suid, &tbCache);
|
|
||||||
if (NULL == tbCache) {
|
|
||||||
//ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
|
|
||||||
taosMemoryFreeClear(*pTableMeta);
|
|
||||||
ctgDebug("stb 0x%" PRIx64 " meta not in cache", ctx->tbInfo.suid);
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
STableMeta *stbMeta = tbCache->pMeta;
|
|
||||||
if (stbMeta->suid != ctx->tbInfo.suid) {
|
|
||||||
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
|
|
||||||
ctgError("stb suid 0x%" PRIx64 " in stbCache mis-match, expected suid 0x%" PRIx64, stbMeta->suid, ctx->tbInfo.suid);
|
|
||||||
CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
metaSize = CTG_META_SIZE(stbMeta);
|
|
||||||
*pTableMeta = taosMemoryRealloc(*pTableMeta, metaSize);
|
|
||||||
if (NULL == *pTableMeta) {
|
|
||||||
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
|
|
||||||
CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(&(*pTableMeta)->sversion, &stbMeta->sversion, metaSize - sizeof(SCTableMeta));
|
|
||||||
|
|
||||||
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
|
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
|
||||||
|
|
||||||
|
|
|
@ -133,7 +133,7 @@ static int32_t getStatus(SDataDeleterHandle* pDeleter) {
|
||||||
|
|
||||||
static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue) {
|
static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue) {
|
||||||
SDataDeleterHandle* pDeleter = (SDataDeleterHandle*)pHandle;
|
SDataDeleterHandle* pDeleter = (SDataDeleterHandle*)pHandle;
|
||||||
SDataDeleterBuf* pBuf = taosAllocateQitem(sizeof(SDataDeleterBuf), DEF_QITEM);
|
SDataDeleterBuf* pBuf = taosAllocateQitem(sizeof(SDataDeleterBuf), DEF_QITEM, 0);
|
||||||
if (NULL == pBuf) {
|
if (NULL == pBuf) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,7 +126,7 @@ static int32_t getStatus(SDataDispatchHandle* pDispatcher) {
|
||||||
|
|
||||||
static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue) {
|
static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue) {
|
||||||
SDataDispatchHandle* pDispatcher = (SDataDispatchHandle*)pHandle;
|
SDataDispatchHandle* pDispatcher = (SDataDispatchHandle*)pHandle;
|
||||||
SDataDispatchBuf* pBuf = taosAllocateQitem(sizeof(SDataDispatchBuf), DEF_QITEM);
|
SDataDispatchBuf* pBuf = taosAllocateQitem(sizeof(SDataDispatchBuf), DEF_QITEM, 0);
|
||||||
if (NULL == pBuf) {
|
if (NULL == pBuf) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ extern SDataSinkStat gDataSinkStat;
|
||||||
typedef struct SSubmitRes {
|
typedef struct SSubmitRes {
|
||||||
int64_t affectedRows;
|
int64_t affectedRows;
|
||||||
int32_t code;
|
int32_t code;
|
||||||
SSubmitRsp* pRsp;
|
SSubmitRsp2* pRsp;
|
||||||
} SSubmitRes;
|
} SSubmitRes;
|
||||||
|
|
||||||
typedef struct SDataInserterHandle {
|
typedef struct SDataInserterHandle {
|
||||||
|
@ -61,38 +61,39 @@ int32_t inserterCallback(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
pInserter->submitRes.pRsp = taosMemoryCalloc(1, sizeof(SSubmitRsp));
|
pInserter->submitRes.pRsp = taosMemoryCalloc(1, sizeof(SSubmitRsp));
|
||||||
SDecoder coder = {0};
|
SDecoder coder = {0};
|
||||||
tDecoderInit(&coder, pMsg->pData, pMsg->len);
|
tDecoderInit(&coder, pMsg->pData, pMsg->len);
|
||||||
code = tDecodeSSubmitRsp(&coder, pInserter->submitRes.pRsp);
|
code = tDecodeSSubmitRsp2(&coder, pInserter->submitRes.pRsp);
|
||||||
if (code) {
|
if (code) {
|
||||||
tFreeSSubmitRsp(pInserter->submitRes.pRsp);
|
// tFreeSSubmitRsp(pInserter->submitRes.pRsp);
|
||||||
pInserter->submitRes.code = code;
|
pInserter->submitRes.code = code;
|
||||||
goto _return;
|
goto _return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pInserter->submitRes.pRsp->nBlocks > 0) {
|
if (pInserter->submitRes.pRsp->affectedRows > 0) {
|
||||||
for (int32_t i = 0; i < pInserter->submitRes.pRsp->nBlocks; ++i) {
|
SArray* pCreateTbList = pInserter->submitRes.pRsp->aCreateTbRsp;
|
||||||
SSubmitBlkRsp* blk = pInserter->submitRes.pRsp->pBlocks + i;
|
int32_t numOfTables = taosArrayGetSize(pCreateTbList);
|
||||||
if (TSDB_CODE_SUCCESS != blk->code) {
|
|
||||||
code = blk->code;
|
for (int32_t i = 0; i < numOfTables; ++i) {
|
||||||
tFreeSSubmitRsp(pInserter->submitRes.pRsp);
|
SVCreateTbRsp* pRsp = taosArrayGet(pCreateTbList, i);
|
||||||
|
if (TSDB_CODE_SUCCESS != pRsp->code) {
|
||||||
|
code = pRsp->code;
|
||||||
|
// tFreeSSubmitRsp(pInserter->submitRes.pRsp);
|
||||||
pInserter->submitRes.code = code;
|
pInserter->submitRes.code = code;
|
||||||
goto _return;
|
goto _return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pInserter->submitRes.affectedRows += pInserter->submitRes.pRsp->affectedRows;
|
// pInserter->submitRes.affectedRows += pInserter->submitRes.pRsp->affectedRows;
|
||||||
|
// pInserter->submitRes.affectedRows += pInserter->submitRes.
|
||||||
qDebug("submit rsp received, affectedRows:%d, total:%"PRId64, pInserter->submitRes.pRsp->affectedRows,
|
qDebug("submit rsp received, affectedRows:%d, total:%"PRId64, pInserter->submitRes.pRsp->affectedRows,
|
||||||
pInserter->submitRes.affectedRows);
|
pInserter->submitRes.affectedRows);
|
||||||
|
|
||||||
tFreeSSubmitRsp(pInserter->submitRes.pRsp);
|
// tFreeSSubmitRsp(pInserter->submitRes.pRsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
tsem_post(&pInserter->ready);
|
tsem_post(&pInserter->ready);
|
||||||
|
|
||||||
taosMemoryFree(pMsg->pData);
|
taosMemoryFree(pMsg->pData);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -314,7 +314,8 @@ static void doHashGroupbyAgg(SOperatorInfo* pOperator, SSDataBlock* pBlock) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t rowIndex = j - num;
|
int32_t rowIndex = j - num;
|
||||||
applyAggFunctionOnPartialTuples(pTaskInfo, pCtx, NULL, rowIndex, num, pBlock->info.rows, pOperator->exprSupp.numOfExprs);
|
applyAggFunctionOnPartialTuples(pTaskInfo, pCtx, NULL, rowIndex, num, pBlock->info.rows,
|
||||||
|
pOperator->exprSupp.numOfExprs);
|
||||||
|
|
||||||
// assign the group keys or user input constant values if required
|
// assign the group keys or user input constant values if required
|
||||||
doAssignGroupKeys(pCtx, pOperator->exprSupp.numOfExprs, pBlock->info.rows, rowIndex);
|
doAssignGroupKeys(pCtx, pOperator->exprSupp.numOfExprs, pBlock->info.rows, rowIndex);
|
||||||
|
@ -331,7 +332,8 @@ static void doHashGroupbyAgg(SOperatorInfo* pOperator, SSDataBlock* pBlock) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t rowIndex = pBlock->info.rows - num;
|
int32_t rowIndex = pBlock->info.rows - num;
|
||||||
applyAggFunctionOnPartialTuples(pTaskInfo, pCtx, NULL, rowIndex, num, pBlock->info.rows, pOperator->exprSupp.numOfExprs);
|
applyAggFunctionOnPartialTuples(pTaskInfo, pCtx, NULL, rowIndex, num, pBlock->info.rows,
|
||||||
|
pOperator->exprSupp.numOfExprs);
|
||||||
doAssignGroupKeys(pCtx, pOperator->exprSupp.numOfExprs, pBlock->info.rows, rowIndex);
|
doAssignGroupKeys(pCtx, pOperator->exprSupp.numOfExprs, pBlock->info.rows, rowIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -469,8 +471,8 @@ SOperatorInfo* createGroupOperatorInfo(SOperatorInfo* downstream, SAggPhysiNode*
|
||||||
initResultRowInfo(&pInfo->binfo.resultRowInfo);
|
initResultRowInfo(&pInfo->binfo.resultRowInfo);
|
||||||
setOperatorInfo(pOperator, "GroupbyAggOperator", 0, true, OP_NOT_OPENED, pInfo, pTaskInfo);
|
setOperatorInfo(pOperator, "GroupbyAggOperator", 0, true, OP_NOT_OPENED, pInfo, pTaskInfo);
|
||||||
|
|
||||||
pOperator->fpSet =
|
pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, hashGroupbyAggregate, NULL, destroyGroupOperatorInfo,
|
||||||
createOperatorFpSet(optrDummyOpenFn, hashGroupbyAggregate, NULL, destroyGroupOperatorInfo, optrDefaultBufFn, NULL);
|
optrDefaultBufFn, NULL);
|
||||||
code = appendDownstream(pOperator, &downstream, 1);
|
code = appendDownstream(pOperator, &downstream, 1);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _error;
|
goto _error;
|
||||||
|
@ -776,6 +778,12 @@ static void destroyPartitionOperatorInfo(void* param) {
|
||||||
|
|
||||||
taosArrayDestroy(pInfo->pGroupColVals);
|
taosArrayDestroy(pInfo->pGroupColVals);
|
||||||
taosMemoryFree(pInfo->keyBuf);
|
taosMemoryFree(pInfo->keyBuf);
|
||||||
|
|
||||||
|
int32_t size = taosArrayGetSize(pInfo->sortedGroupArray);
|
||||||
|
for (int32_t i = 0; i < size; i++) {
|
||||||
|
SDataGroupInfo* pGp = taosArrayGet(pInfo->sortedGroupArray, i);
|
||||||
|
taosArrayDestroy(pGp->pPageList);
|
||||||
|
}
|
||||||
taosArrayDestroy(pInfo->sortedGroupArray);
|
taosArrayDestroy(pInfo->sortedGroupArray);
|
||||||
|
|
||||||
void* pGroupIter = taosHashIterate(pInfo->pGroupSet, NULL);
|
void* pGroupIter = taosHashIterate(pInfo->pGroupSet, NULL);
|
||||||
|
@ -850,7 +858,8 @@ SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartition
|
||||||
pOperator->exprSupp.numOfExprs = numOfCols;
|
pOperator->exprSupp.numOfExprs = numOfCols;
|
||||||
pOperator->exprSupp.pExprInfo = pExprInfo;
|
pOperator->exprSupp.pExprInfo = pExprInfo;
|
||||||
|
|
||||||
pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, hashPartition, NULL, destroyPartitionOperatorInfo, optrDefaultBufFn, NULL);
|
pOperator->fpSet =
|
||||||
|
createOperatorFpSet(optrDummyOpenFn, hashPartition, NULL, destroyPartitionOperatorInfo, optrDefaultBufFn, NULL);
|
||||||
|
|
||||||
code = appendDownstream(pOperator, &downstream, 1);
|
code = appendDownstream(pOperator, &downstream, 1);
|
||||||
return pOperator;
|
return pOperator;
|
||||||
|
@ -1141,8 +1150,8 @@ SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStr
|
||||||
pInfo, pTaskInfo);
|
pInfo, pTaskInfo);
|
||||||
pOperator->exprSupp.numOfExprs = numOfCols;
|
pOperator->exprSupp.numOfExprs = numOfCols;
|
||||||
pOperator->exprSupp.pExprInfo = pExprInfo;
|
pOperator->exprSupp.pExprInfo = pExprInfo;
|
||||||
pOperator->fpSet =
|
pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doStreamHashPartition, NULL,
|
||||||
createOperatorFpSet(optrDummyOpenFn, doStreamHashPartition, NULL, destroyStreamPartitionOperatorInfo, optrDefaultBufFn, NULL);
|
destroyStreamPartitionOperatorInfo, optrDefaultBufFn, NULL);
|
||||||
|
|
||||||
initParDownStream(downstream, &pInfo->partitionSup, &pInfo->scalarSup);
|
initParDownStream(downstream, &pInfo->partitionSup, &pInfo->scalarSup);
|
||||||
code = appendDownstream(pOperator, &downstream, 1);
|
code = appendDownstream(pOperator, &downstream, 1);
|
||||||
|
|
|
@ -49,10 +49,10 @@ static void doKeepPrevRows(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock
|
||||||
if (!colDataIsNull_s(pColInfoData, rowIndex)) {
|
if (!colDataIsNull_s(pColInfoData, rowIndex)) {
|
||||||
pkey->isNull = false;
|
pkey->isNull = false;
|
||||||
char* val = colDataGetData(pColInfoData, rowIndex);
|
char* val = colDataGetData(pColInfoData, rowIndex);
|
||||||
if (!IS_VAR_DATA_TYPE(pkey->type)) {
|
if (IS_VAR_DATA_TYPE(pkey->type)) {
|
||||||
memcpy(pkey->pData, val, pkey->bytes);
|
|
||||||
} else {
|
|
||||||
memcpy(pkey->pData, val, varDataLen(val));
|
memcpy(pkey->pData, val, varDataLen(val));
|
||||||
|
} else {
|
||||||
|
memcpy(pkey->pData, val, pkey->bytes);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pkey->isNull = true;
|
pkey->isNull = true;
|
||||||
|
@ -98,13 +98,26 @@ static void doKeepLinearInfo(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlo
|
||||||
ASSERT(IS_MATHABLE_TYPE(pColInfoData->info.type));
|
ASSERT(IS_MATHABLE_TYPE(pColInfoData->info.type));
|
||||||
|
|
||||||
pLinearInfo->start.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
|
pLinearInfo->start.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
|
||||||
memcpy(pLinearInfo->start.val, colDataGetData(pColInfoData, rowIndex), pLinearInfo->bytes);
|
char* p = colDataGetData(pColInfoData, rowIndex);
|
||||||
|
if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
|
||||||
|
ASSERT(varDataTLen(p) <= pColInfoData->info.bytes);
|
||||||
|
memcpy(pLinearInfo->start.val, p, varDataTLen(p));
|
||||||
|
} else {
|
||||||
|
memcpy(pLinearInfo->start.val, p, pLinearInfo->bytes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pLinearInfo->isStartSet = true;
|
pLinearInfo->isStartSet = true;
|
||||||
} else if (!pLinearInfo->isEndSet) {
|
} else if (!pLinearInfo->isEndSet) {
|
||||||
if (!colDataIsNull_s(pColInfoData, rowIndex)) {
|
if (!colDataIsNull_s(pColInfoData, rowIndex)) {
|
||||||
pLinearInfo->end.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
|
pLinearInfo->end.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
|
||||||
memcpy(pLinearInfo->end.val, colDataGetData(pColInfoData, rowIndex), pLinearInfo->bytes);
|
|
||||||
|
char* p = colDataGetData(pColInfoData, rowIndex);
|
||||||
|
if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
|
||||||
|
ASSERT(varDataTLen(p) <= pColInfoData->info.bytes);
|
||||||
|
memcpy(pLinearInfo->end.val, p, varDataTLen(p));
|
||||||
|
} else {
|
||||||
|
memcpy(pLinearInfo->end.val, p, pLinearInfo->bytes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pLinearInfo->isEndSet = true;
|
pLinearInfo->isEndSet = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -113,7 +126,15 @@ static void doKeepLinearInfo(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlo
|
||||||
|
|
||||||
if (!colDataIsNull_s(pColInfoData, rowIndex)) {
|
if (!colDataIsNull_s(pColInfoData, rowIndex)) {
|
||||||
pLinearInfo->end.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
|
pLinearInfo->end.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
|
||||||
memcpy(pLinearInfo->end.val, colDataGetData(pColInfoData, rowIndex), pLinearInfo->bytes);
|
|
||||||
|
char* p = colDataGetData(pColInfoData, rowIndex);
|
||||||
|
if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
|
||||||
|
ASSERT(varDataTLen(p) <= pColInfoData->info.bytes);
|
||||||
|
memcpy(pLinearInfo->end.val, p, varDataTLen(p));
|
||||||
|
} else {
|
||||||
|
memcpy(pLinearInfo->end.val, p, pLinearInfo->bytes);
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
pLinearInfo->end.key = INT64_MIN;
|
pLinearInfo->end.key = INT64_MIN;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "ttime.h"
|
#include "ttime.h"
|
||||||
|
|
||||||
#define IS_FINAL_OP(op) ((op)->isFinal)
|
#define IS_FINAL_OP(op) ((op)->isFinal)
|
||||||
|
#define DEAULT_DELETE_MARK (1000LL * 60LL * 60LL * 24LL * 365LL * 10LL);
|
||||||
|
|
||||||
typedef struct SSessionAggOperatorInfo {
|
typedef struct SSessionAggOperatorInfo {
|
||||||
SOptrBasicInfo binfo;
|
SOptrBasicInfo binfo;
|
||||||
|
@ -56,6 +57,7 @@ typedef enum SResultTsInterpType {
|
||||||
typedef struct SPullWindowInfo {
|
typedef struct SPullWindowInfo {
|
||||||
STimeWindow window;
|
STimeWindow window;
|
||||||
uint64_t groupId;
|
uint64_t groupId;
|
||||||
|
STimeWindow calWin;
|
||||||
} SPullWindowInfo;
|
} SPullWindowInfo;
|
||||||
|
|
||||||
typedef struct SOpenWindowInfo {
|
typedef struct SOpenWindowInfo {
|
||||||
|
@ -793,17 +795,18 @@ int32_t comparePullWinKey(void* pKey, void* data, int32_t index) {
|
||||||
SArray* res = (SArray*)data;
|
SArray* res = (SArray*)data;
|
||||||
SPullWindowInfo* pos = taosArrayGet(res, index);
|
SPullWindowInfo* pos = taosArrayGet(res, index);
|
||||||
SPullWindowInfo* pData = (SPullWindowInfo*)pKey;
|
SPullWindowInfo* pData = (SPullWindowInfo*)pKey;
|
||||||
if (pData->window.skey == pos->window.skey) {
|
if (pData->groupId > pos->groupId) {
|
||||||
if (pData->groupId > pos->groupId) {
|
|
||||||
return 1;
|
|
||||||
} else if (pData->groupId < pos->groupId) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
} else if (pData->window.skey > pos->window.skey) {
|
|
||||||
return 1;
|
return 1;
|
||||||
|
} else if (pData->groupId < pos->groupId) {
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
return -1;
|
|
||||||
|
if (pData->window.skey > pos->window.ekey) {
|
||||||
|
return 1;
|
||||||
|
} else if (pData->window.ekey < pos->window.skey) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t savePullWindow(SPullWindowInfo* pPullInfo, SArray* pPullWins) {
|
static int32_t savePullWindow(SPullWindowInfo* pPullInfo, SArray* pPullWins) {
|
||||||
|
@ -812,10 +815,16 @@ static int32_t savePullWindow(SPullWindowInfo* pPullInfo, SArray* pPullWins) {
|
||||||
if (index == -1) {
|
if (index == -1) {
|
||||||
index = 0;
|
index = 0;
|
||||||
} else {
|
} else {
|
||||||
if (comparePullWinKey(pPullInfo, pPullWins, index) > 0) {
|
int32_t code = comparePullWinKey(pPullInfo, pPullWins, index);
|
||||||
index++;
|
if (code == 0) {
|
||||||
} else {
|
SPullWindowInfo* pos = taosArrayGet(pPullWins ,index);
|
||||||
|
pos->window.skey = TMIN(pos->window.skey, pPullInfo->window.skey);
|
||||||
|
pos->window.ekey = TMAX(pos->window.ekey, pPullInfo->window.ekey);
|
||||||
|
pos->calWin.skey = TMIN(pos->calWin.skey, pPullInfo->calWin.skey);
|
||||||
|
pos->calWin.ekey = TMAX(pos->calWin.ekey, pPullInfo->calWin.ekey);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
} else if (code > 0 ){
|
||||||
|
index++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (taosArrayInsert(pPullWins, index, pPullInfo) == NULL) {
|
if (taosArrayInsert(pPullWins, index, pPullInfo) == NULL) {
|
||||||
|
@ -2255,8 +2264,8 @@ static void doBuildPullDataBlock(SArray* array, int32_t* pIndex, SSDataBlock* pB
|
||||||
colDataAppend(pStartTs, pBlock->info.rows, (const char*)&pWin->window.skey, false);
|
colDataAppend(pStartTs, pBlock->info.rows, (const char*)&pWin->window.skey, false);
|
||||||
colDataAppend(pEndTs, pBlock->info.rows, (const char*)&pWin->window.ekey, false);
|
colDataAppend(pEndTs, pBlock->info.rows, (const char*)&pWin->window.ekey, false);
|
||||||
colDataAppend(pGroupId, pBlock->info.rows, (const char*)&pWin->groupId, false);
|
colDataAppend(pGroupId, pBlock->info.rows, (const char*)&pWin->groupId, false);
|
||||||
colDataAppend(pCalStartTs, pBlock->info.rows, (const char*)&pWin->window.skey, false);
|
colDataAppend(pCalStartTs, pBlock->info.rows, (const char*)&pWin->calWin.skey, false);
|
||||||
colDataAppend(pCalEndTs, pBlock->info.rows, (const char*)&pWin->window.ekey, false);
|
colDataAppend(pCalEndTs, pBlock->info.rows, (const char*)&pWin->calWin.ekey, false);
|
||||||
pBlock->info.rows++;
|
pBlock->info.rows++;
|
||||||
}
|
}
|
||||||
if ((*pIndex) == size) {
|
if ((*pIndex) == size) {
|
||||||
|
@ -2266,27 +2275,33 @@ static void doBuildPullDataBlock(SArray* array, int32_t* pIndex, SSDataBlock* pB
|
||||||
blockDataUpdateTsWindow(pBlock, 0);
|
blockDataUpdateTsWindow(pBlock, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void processPullOver(SSDataBlock* pBlock, SHashObj* pMap) {
|
void processPullOver(SSDataBlock* pBlock, SHashObj* pMap, SInterval* pInterval) {
|
||||||
SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX);
|
SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX);
|
||||||
TSKEY* tsData = (TSKEY*)pStartCol->pData;
|
TSKEY* tsData = (TSKEY*)pStartCol->pData;
|
||||||
|
SColumnInfoData* pEndCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX);
|
||||||
|
TSKEY* tsEndData = (TSKEY*)pEndCol->pData;
|
||||||
SColumnInfoData* pGroupCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX);
|
SColumnInfoData* pGroupCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX);
|
||||||
uint64_t* groupIdData = (uint64_t*)pGroupCol->pData;
|
uint64_t* groupIdData = (uint64_t*)pGroupCol->pData;
|
||||||
int32_t chId = getChildIndex(pBlock);
|
int32_t chId = getChildIndex(pBlock);
|
||||||
for (int32_t i = 0; i < pBlock->info.rows; i++) {
|
for (int32_t i = 0; i < pBlock->info.rows; i++) {
|
||||||
SWinKey winRes = {.ts = tsData[i], .groupId = groupIdData[i]};
|
TSKEY winTs = tsData[i];
|
||||||
void* chIds = taosHashGet(pMap, &winRes, sizeof(SWinKey));
|
while (winTs < tsEndData[i]) {
|
||||||
if (chIds) {
|
SWinKey winRes = {.ts = winTs, .groupId = groupIdData[i]};
|
||||||
SArray* chArray = *(SArray**)chIds;
|
void* chIds = taosHashGet(pMap, &winRes, sizeof(SWinKey));
|
||||||
int32_t index = taosArraySearchIdx(chArray, &chId, compareInt32Val, TD_EQ);
|
if (chIds) {
|
||||||
if (index != -1) {
|
SArray* chArray = *(SArray**)chIds;
|
||||||
qDebug("===stream===window %" PRId64 " delete child id %d", winRes.ts, chId);
|
int32_t index = taosArraySearchIdx(chArray, &chId, compareInt32Val, TD_EQ);
|
||||||
taosArrayRemove(chArray, index);
|
if (index != -1) {
|
||||||
if (taosArrayGetSize(chArray) == 0) {
|
qDebug("===stream===window %" PRId64 " delete child id %d", winRes.ts, chId);
|
||||||
// pull data is over
|
taosArrayRemove(chArray, index);
|
||||||
taosArrayDestroy(chArray);
|
if (taosArrayGetSize(chArray) == 0) {
|
||||||
taosHashRemove(pMap, &winRes, sizeof(SWinKey));
|
// pull data is over
|
||||||
|
taosArrayDestroy(chArray);
|
||||||
|
taosHashRemove(pMap, &winRes, sizeof(SWinKey));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
winTs = taosTimeAdd(winTs, pInterval->sliding, pInterval->slidingUnit, pInterval->precision);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2299,12 +2314,13 @@ static void addRetriveWindow(SArray* wins, SStreamIntervalOperatorInfo* pInfo) {
|
||||||
if (needDeleteWindowBuf(&nextWin, &pInfo->twAggSup) && !pInfo->ignoreExpiredData) {
|
if (needDeleteWindowBuf(&nextWin, &pInfo->twAggSup) && !pInfo->ignoreExpiredData) {
|
||||||
void* chIds = taosHashGet(pInfo->pPullDataMap, winKey, sizeof(SWinKey));
|
void* chIds = taosHashGet(pInfo->pPullDataMap, winKey, sizeof(SWinKey));
|
||||||
if (!chIds) {
|
if (!chIds) {
|
||||||
SPullWindowInfo pull = {.window = nextWin, .groupId = winKey->groupId};
|
SPullWindowInfo pull = {.window = nextWin, .groupId = winKey->groupId, .calWin.skey = nextWin.skey, .calWin.ekey = nextWin.skey};
|
||||||
// add pull data request
|
// add pull data request
|
||||||
savePullWindow(&pull, pInfo->pPullWins);
|
if (savePullWindow(&pull, pInfo->pPullWins) == TSDB_CODE_SUCCESS) {
|
||||||
int32_t size1 = taosArrayGetSize(pInfo->pChildren);
|
int32_t size1 = taosArrayGetSize(pInfo->pChildren);
|
||||||
addPullWindow(pInfo->pPullDataMap, winKey, size1);
|
addPullWindow(pInfo->pPullDataMap, winKey, size1);
|
||||||
qDebug("===stream===prepare retrive for delete %" PRId64 ", size:%d", winKey->ts, size1);
|
qDebug("===stream===prepare retrive for delete %" PRId64 ", size:%d", winKey->ts, size1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2374,12 +2390,13 @@ static void doStreamIntervalAggImpl(SOperatorInfo* pOperatorInfo, SSDataBlock* p
|
||||||
};
|
};
|
||||||
void* chIds = taosHashGet(pInfo->pPullDataMap, &winRes, sizeof(SWinKey));
|
void* chIds = taosHashGet(pInfo->pPullDataMap, &winRes, sizeof(SWinKey));
|
||||||
if (isDeletedStreamWindow(&nextWin, groupId, pInfo->pState, &pInfo->twAggSup) && !chIds) {
|
if (isDeletedStreamWindow(&nextWin, groupId, pInfo->pState, &pInfo->twAggSup) && !chIds) {
|
||||||
SPullWindowInfo pull = {.window = nextWin, .groupId = groupId};
|
SPullWindowInfo pull = {.window = nextWin, .groupId = groupId, .calWin.skey = nextWin.skey, .calWin.ekey = nextWin.skey};
|
||||||
// add pull data request
|
// add pull data request
|
||||||
savePullWindow(&pull, pInfo->pPullWins);
|
if (savePullWindow(&pull, pInfo->pPullWins) == TSDB_CODE_SUCCESS) {
|
||||||
int32_t size = taosArrayGetSize(pInfo->pChildren);
|
int32_t size = taosArrayGetSize(pInfo->pChildren);
|
||||||
addPullWindow(pInfo->pPullDataMap, &winRes, size);
|
addPullWindow(pInfo->pPullDataMap, &winRes, size);
|
||||||
qDebug("===stream===prepare retrive %" PRId64 ", size:%d", winRes.ts, size);
|
qDebug("===stream===prepare retrive %" PRId64 ", size:%d", winRes.ts, size);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
int32_t index = -1;
|
int32_t index = -1;
|
||||||
SArray* chArray = NULL;
|
SArray* chArray = NULL;
|
||||||
|
@ -2560,7 +2577,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
} else if (pBlock->info.type == STREAM_PULL_OVER && IS_FINAL_OP(pInfo)) {
|
} else if (pBlock->info.type == STREAM_PULL_OVER && IS_FINAL_OP(pInfo)) {
|
||||||
processPullOver(pBlock, pInfo->pPullDataMap);
|
processPullOver(pBlock, pInfo->pPullDataMap, &pInfo->interval);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2638,6 +2655,15 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t getDeleteMark(SIntervalPhysiNode* pIntervalPhyNode) {
|
||||||
|
if (pIntervalPhyNode->window.deleteMark <= 0) {
|
||||||
|
return DEAULT_DELETE_MARK;
|
||||||
|
}
|
||||||
|
int64_t deleteMark = TMAX(pIntervalPhyNode->window.deleteMark,pIntervalPhyNode->window.watermark);
|
||||||
|
deleteMark = TMAX(deleteMark, pIntervalPhyNode->interval);
|
||||||
|
return deleteMark;
|
||||||
|
}
|
||||||
|
|
||||||
SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
|
SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
|
||||||
SExecTaskInfo* pTaskInfo, int32_t numOfChild) {
|
SExecTaskInfo* pTaskInfo, int32_t numOfChild) {
|
||||||
SIntervalPhysiNode* pIntervalPhyNode = (SIntervalPhysiNode*)pPhyNode;
|
SIntervalPhysiNode* pIntervalPhyNode = (SIntervalPhysiNode*)pPhyNode;
|
||||||
|
@ -2659,9 +2685,7 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
|
||||||
.calTrigger = pIntervalPhyNode->window.triggerType,
|
.calTrigger = pIntervalPhyNode->window.triggerType,
|
||||||
.maxTs = INT64_MIN,
|
.maxTs = INT64_MIN,
|
||||||
.minTs = INT64_MAX,
|
.minTs = INT64_MAX,
|
||||||
// for test 315360000000
|
.deleteMark = getDeleteMark(pIntervalPhyNode),
|
||||||
.deleteMark = 1000LL * 60LL * 60LL * 24LL * 365LL * 10LL,
|
|
||||||
// .deleteMark = INT64_MAX,
|
|
||||||
.deleteMarkSaved = 0,
|
.deleteMarkSaved = 0,
|
||||||
.calTriggerSaved = 0,
|
.calTriggerSaved = 0,
|
||||||
};
|
};
|
||||||
|
@ -4805,7 +4829,7 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
.calTrigger = pIntervalPhyNode->window.triggerType,
|
.calTrigger = pIntervalPhyNode->window.triggerType,
|
||||||
.maxTs = INT64_MIN,
|
.maxTs = INT64_MIN,
|
||||||
.minTs = INT64_MAX,
|
.minTs = INT64_MAX,
|
||||||
.deleteMark = INT64_MAX,
|
.deleteMark = getDeleteMark(pIntervalPhyNode),
|
||||||
};
|
};
|
||||||
|
|
||||||
ASSERT(twAggSupp.calTrigger != STREAM_TRIGGER_MAX_DELAY);
|
ASSERT(twAggSupp.calTrigger != STREAM_TRIGGER_MAX_DELAY);
|
||||||
|
|
|
@ -798,6 +798,44 @@ static int32_t getTableVgroup(SParseContext* pCxt, SVnodeModifOpStmt* pStmt, boo
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t getTableMetaAndVgroupImpl(SParseContext* pCxt, SVnodeModifOpStmt* pStmt, bool* pMissCache) {
|
||||||
|
SVgroupInfo vg;
|
||||||
|
int32_t code = catalogGetCachedTableVgMeta(pCxt->pCatalog, &pStmt->targetTableName, &vg, &pStmt->pTableMeta);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
if (NULL != pStmt->pTableMeta) {
|
||||||
|
code = taosHashPut(pStmt->pVgroupsHashObj, (const char*)&vg.vgId, sizeof(vg.vgId), (char*)&vg, sizeof(vg));
|
||||||
|
}
|
||||||
|
*pMissCache = (NULL == pStmt->pTableMeta);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t getTableMetaAndVgroup(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, bool* pMissCache) {
|
||||||
|
SParseContext* pComCxt = pCxt->pComCxt;
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
if (pComCxt->async) {
|
||||||
|
code = getTableMetaAndVgroupImpl(pComCxt, pStmt, pMissCache);
|
||||||
|
} else {
|
||||||
|
code = getTableMeta(pCxt, &pStmt->targetTableName, false, &pStmt->pTableMeta, pMissCache);
|
||||||
|
if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
|
||||||
|
code = getTableVgroup(pCxt->pComCxt, pStmt, false, &pCxt->missCache);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t collectUseTable(const SName* pName, SHashObj* pTable) {
|
||||||
|
char fullName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
tNameExtractFullName(pName, fullName);
|
||||||
|
return taosHashPut(pTable, fullName, strlen(fullName), pName, sizeof(SName));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t collectUseDatabase(const SName* pName, SHashObj* pDbs) {
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN] = {0};
|
||||||
|
tNameGetFullDbName(pName, dbFName);
|
||||||
|
return taosHashPut(pDbs, dbFName, strlen(dbFName), dbFName, sizeof(dbFName));
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t getTargetTableSchema(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
|
static int32_t getTargetTableSchema(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
|
||||||
if (pCxt->forceUpdate) {
|
if (pCxt->forceUpdate) {
|
||||||
pCxt->missCache = true;
|
pCxt->missCache = true;
|
||||||
|
@ -805,12 +843,24 @@ static int32_t getTargetTableSchema(SInsertParseContext* pCxt, SVnodeModifOpStmt
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = checkAuth(pCxt->pComCxt, &pStmt->targetTableName, &pCxt->missCache);
|
int32_t code = checkAuth(pCxt->pComCxt, &pStmt->targetTableName, &pCxt->missCache);
|
||||||
|
#if 0
|
||||||
if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
|
if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
|
||||||
code = getTableMeta(pCxt, &pStmt->targetTableName, false, &pStmt->pTableMeta, &pCxt->missCache);
|
code = getTableMeta(pCxt, &pStmt->targetTableName, false, &pStmt->pTableMeta, &pCxt->missCache);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
|
if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
|
||||||
code = getTableVgroup(pCxt->pComCxt, pStmt, false, &pCxt->missCache);
|
code = getTableVgroup(pCxt->pComCxt, pStmt, false, &pCxt->missCache);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
|
||||||
|
code = getTableMetaAndVgroup(pCxt, pStmt, &pCxt->missCache);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (TSDB_CODE_SUCCESS == code && !pCxt->pComCxt->async) {
|
||||||
|
code = collectUseDatabase(&pStmt->targetTableName, pStmt->pDbFNameHashObj);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = collectUseTable(&pStmt->targetTableName, pStmt->pTableNameHashObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -831,6 +881,12 @@ static int32_t getUsingTableSchema(SInsertParseContext* pCxt, SVnodeModifOpStmt*
|
||||||
if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
|
if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
|
||||||
code = getTableVgroup(pCxt->pComCxt, pStmt, true, &pCxt->missCache);
|
code = getTableVgroup(pCxt->pComCxt, pStmt, true, &pCxt->missCache);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code && !pCxt->pComCxt->async) {
|
||||||
|
code = collectUseDatabase(&pStmt->usingTableName, pStmt->pDbFNameHashObj);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = collectUseTable(&pStmt->usingTableName, pStmt->pTableNameHashObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1707,16 +1763,25 @@ static int32_t initInsertQuery(SInsertParseContext* pCxt, SCatalogReq* pCatalogR
|
||||||
|
|
||||||
static int32_t setRefreshMate(SQuery* pQuery) {
|
static int32_t setRefreshMate(SQuery* pQuery) {
|
||||||
SVnodeModifOpStmt* pStmt = (SVnodeModifOpStmt*)pQuery->pRoot;
|
SVnodeModifOpStmt* pStmt = (SVnodeModifOpStmt*)pQuery->pRoot;
|
||||||
SName* pTable = taosHashIterate(pStmt->pTableNameHashObj, NULL);
|
|
||||||
while (NULL != pTable) {
|
if (taosHashGetSize(pStmt->pTableNameHashObj) > 0) {
|
||||||
taosArrayPush(pQuery->pTableList, pTable);
|
taosArrayDestroy(pQuery->pTableList);
|
||||||
pTable = taosHashIterate(pStmt->pTableNameHashObj, pTable);
|
pQuery->pTableList = taosArrayInit(taosHashGetSize(pStmt->pTableNameHashObj), sizeof(SName));
|
||||||
|
SName* pTable = taosHashIterate(pStmt->pTableNameHashObj, NULL);
|
||||||
|
while (NULL != pTable) {
|
||||||
|
taosArrayPush(pQuery->pTableList, pTable);
|
||||||
|
pTable = taosHashIterate(pStmt->pTableNameHashObj, pTable);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char* pDb = taosHashIterate(pStmt->pDbFNameHashObj, NULL);
|
if (taosHashGetSize(pStmt->pDbFNameHashObj) > 0) {
|
||||||
while (NULL != pDb) {
|
taosArrayDestroy(pQuery->pDbList);
|
||||||
taosArrayPush(pQuery->pDbList, pDb);
|
pQuery->pDbList = taosArrayInit(taosHashGetSize(pStmt->pDbFNameHashObj), TSDB_DB_FNAME_LEN);
|
||||||
pDb = taosHashIterate(pStmt->pDbFNameHashObj, pDb);
|
char* pDb = taosHashIterate(pStmt->pDbFNameHashObj, NULL);
|
||||||
|
while (NULL != pDb) {
|
||||||
|
taosArrayPush(pQuery->pDbList, pDb);
|
||||||
|
pDb = taosHashIterate(pStmt->pDbFNameHashObj, pDb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -1830,16 +1895,17 @@ static int32_t buildInsertCatalogReq(SInsertParseContext* pCxt, SVnodeModifOpStm
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t setNextStageInfo(SInsertParseContext* pCxt, SQuery* pQuery, SCatalogReq* pCatalogReq) {
|
static int32_t setNextStageInfo(SInsertParseContext* pCxt, SQuery* pQuery, SCatalogReq* pCatalogReq) {
|
||||||
|
SVnodeModifOpStmt* pStmt = (SVnodeModifOpStmt*)pQuery->pRoot;
|
||||||
if (pCxt->missCache) {
|
if (pCxt->missCache) {
|
||||||
parserDebug("0x%" PRIx64 " %d rows have been inserted before cache miss", pCxt->pComCxt->requestId,
|
parserDebug("0x%" PRIx64 " %d rows of %d tables have been inserted before cache miss", pCxt->pComCxt->requestId,
|
||||||
((SVnodeModifOpStmt*)pQuery->pRoot)->totalRowsNum);
|
pStmt->totalRowsNum, pStmt->totalTbNum);
|
||||||
|
|
||||||
pQuery->execStage = QUERY_EXEC_STAGE_PARSE;
|
pQuery->execStage = QUERY_EXEC_STAGE_PARSE;
|
||||||
return buildInsertCatalogReq(pCxt, (SVnodeModifOpStmt*)pQuery->pRoot, pCatalogReq);
|
return buildInsertCatalogReq(pCxt, pStmt, pCatalogReq);
|
||||||
}
|
}
|
||||||
|
|
||||||
parserDebug("0x%" PRIx64 " %d rows have been inserted", pCxt->pComCxt->requestId,
|
parserDebug("0x%" PRIx64 " %d rows of %d tables have been inserted", pCxt->pComCxt->requestId, pStmt->totalRowsNum,
|
||||||
((SVnodeModifOpStmt*)pQuery->pRoot)->totalRowsNum);
|
pStmt->totalTbNum);
|
||||||
|
|
||||||
pQuery->execStage = QUERY_EXEC_STAGE_SCHEDULE;
|
pQuery->execStage = QUERY_EXEC_STAGE_SCHEDULE;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
|
@ -248,6 +248,13 @@ int32_t __catalogGetCachedTableHashVgroup(SCatalog* pCtg, const SName* pTableNam
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t __catalogGetCachedTableVgMeta(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, STableMeta** pTableMeta) {
|
||||||
|
int32_t code = g_mockCatalogService->catalogGetTableMeta(pTableName, pTableMeta, true);
|
||||||
|
if (code) return code;
|
||||||
|
code = g_mockCatalogService->catalogGetTableHashVgroup(pTableName, pVgroup, true);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t __catalogGetTableDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
|
int32_t __catalogGetTableDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
|
||||||
SArray** pVgList) {
|
SArray** pVgList) {
|
||||||
return g_mockCatalogService->catalogGetTableDistVgInfo(pTableName, pVgList);
|
return g_mockCatalogService->catalogGetTableDistVgInfo(pTableName, pVgList);
|
||||||
|
@ -316,6 +323,7 @@ void initMetaDataEnv() {
|
||||||
stub.set(catalogGetCachedSTableMeta, __catalogGetCachedTableMeta);
|
stub.set(catalogGetCachedSTableMeta, __catalogGetCachedTableMeta);
|
||||||
stub.set(catalogGetTableHashVgroup, __catalogGetTableHashVgroup);
|
stub.set(catalogGetTableHashVgroup, __catalogGetTableHashVgroup);
|
||||||
stub.set(catalogGetCachedTableHashVgroup, __catalogGetCachedTableHashVgroup);
|
stub.set(catalogGetCachedTableHashVgroup, __catalogGetCachedTableHashVgroup);
|
||||||
|
stub.set(catalogGetCachedTableVgMeta, __catalogGetCachedTableVgMeta);
|
||||||
stub.set(catalogGetTableDistVgInfo, __catalogGetTableDistVgInfo);
|
stub.set(catalogGetTableDistVgInfo, __catalogGetTableDistVgInfo);
|
||||||
stub.set(catalogGetDBVgVersion, __catalogGetDBVgVersion);
|
stub.set(catalogGetDBVgVersion, __catalogGetDBVgVersion);
|
||||||
stub.set(catalogGetDBVgList, __catalogGetDBVgList);
|
stub.set(catalogGetDBVgList, __catalogGetDBVgList);
|
||||||
|
|
|
@ -31,7 +31,7 @@ extern "C" {
|
||||||
|
|
||||||
#define QW_DEFAULT_SCHEDULER_NUMBER 100
|
#define QW_DEFAULT_SCHEDULER_NUMBER 100
|
||||||
#define QW_DEFAULT_TASK_NUMBER 10000
|
#define QW_DEFAULT_TASK_NUMBER 10000
|
||||||
#define QW_DEFAULT_SCH_TASK_NUMBER 10000
|
#define QW_DEFAULT_SCH_TASK_NUMBER 3000
|
||||||
#define QW_DEFAULT_SHORT_RUN_TIMES 2
|
#define QW_DEFAULT_SHORT_RUN_TIMES 2
|
||||||
#define QW_DEFAULT_HEARTBEAT_MSEC 5000
|
#define QW_DEFAULT_HEARTBEAT_MSEC 5000
|
||||||
#define QW_SCH_TIMEOUT_MSEC 180000
|
#define QW_SCH_TIMEOUT_MSEC 180000
|
||||||
|
@ -247,7 +247,7 @@ typedef struct SQWorkerMgmt {
|
||||||
|
|
||||||
#define QW_ERR_RET(c) \
|
#define QW_ERR_RET(c) \
|
||||||
do { \
|
do { \
|
||||||
int32_t _code = (c); \
|
int32_t _code = (c); \
|
||||||
if (_code != TSDB_CODE_SUCCESS) { \
|
if (_code != TSDB_CODE_SUCCESS) { \
|
||||||
terrno = _code; \
|
terrno = _code; \
|
||||||
return _code; \
|
return _code; \
|
||||||
|
@ -255,7 +255,7 @@ typedef struct SQWorkerMgmt {
|
||||||
} while (0)
|
} while (0)
|
||||||
#define QW_RET(c) \
|
#define QW_RET(c) \
|
||||||
do { \
|
do { \
|
||||||
int32_t _code = (c); \
|
int32_t _code = (c); \
|
||||||
if (_code != TSDB_CODE_SUCCESS) { \
|
if (_code != TSDB_CODE_SUCCESS) { \
|
||||||
terrno = _code; \
|
terrno = _code; \
|
||||||
} \
|
} \
|
||||||
|
@ -263,7 +263,7 @@ typedef struct SQWorkerMgmt {
|
||||||
} while (0)
|
} while (0)
|
||||||
#define QW_ERR_JRET(c) \
|
#define QW_ERR_JRET(c) \
|
||||||
do { \
|
do { \
|
||||||
code = (c); \
|
code = (c); \
|
||||||
if (code != TSDB_CODE_SUCCESS) { \
|
if (code != TSDB_CODE_SUCCESS) { \
|
||||||
terrno = code; \
|
terrno = code; \
|
||||||
goto _return; \
|
goto _return; \
|
||||||
|
|
|
@ -281,7 +281,7 @@ void qwFreeTaskHandle(qTaskInfo_t *taskHandle) {
|
||||||
|
|
||||||
int32_t qwKillTaskHandle(SQWTaskCtx *ctx, int32_t rspCode) {
|
int32_t qwKillTaskHandle(SQWTaskCtx *ctx, int32_t rspCode) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
// Note: free/kill may in RC
|
// Note: free/kill may in RC
|
||||||
qTaskInfo_t taskHandle = atomic_load_ptr(&ctx->taskHandle);
|
qTaskInfo_t taskHandle = atomic_load_ptr(&ctx->taskHandle);
|
||||||
if (taskHandle && atomic_val_compare_exchange_ptr(&ctx->taskHandle, taskHandle, NULL)) {
|
if (taskHandle && atomic_val_compare_exchange_ptr(&ctx->taskHandle, taskHandle, NULL)) {
|
||||||
|
@ -463,6 +463,8 @@ void qwDestroyImpl(void *pMgmt) {
|
||||||
int8_t nodeType = mgmt->nodeType;
|
int8_t nodeType = mgmt->nodeType;
|
||||||
int32_t nodeId = mgmt->nodeId;
|
int32_t nodeId = mgmt->nodeId;
|
||||||
|
|
||||||
|
int32_t taskCount = 0;
|
||||||
|
int32_t schStatusCount = 0;
|
||||||
qDebug("start to destroy qworker, type:%d, id:%d, handle:%p", nodeType, nodeId, mgmt);
|
qDebug("start to destroy qworker, type:%d, id:%d, handle:%p", nodeType, nodeId, mgmt);
|
||||||
|
|
||||||
taosTmrStop(mgmt->hbTimer);
|
taosTmrStop(mgmt->hbTimer);
|
||||||
|
@ -472,6 +474,7 @@ void qwDestroyImpl(void *pMgmt) {
|
||||||
uint64_t qId, tId;
|
uint64_t qId, tId;
|
||||||
int32_t eId;
|
int32_t eId;
|
||||||
void *pIter = taosHashIterate(mgmt->ctxHash, NULL);
|
void *pIter = taosHashIterate(mgmt->ctxHash, NULL);
|
||||||
|
|
||||||
while (pIter) {
|
while (pIter) {
|
||||||
SQWTaskCtx *ctx = (SQWTaskCtx *)pIter;
|
SQWTaskCtx *ctx = (SQWTaskCtx *)pIter;
|
||||||
void *key = taosHashGetKey(pIter, NULL);
|
void *key = taosHashGetKey(pIter, NULL);
|
||||||
|
@ -480,6 +483,7 @@ void qwDestroyImpl(void *pMgmt) {
|
||||||
qwFreeTaskCtx(ctx);
|
qwFreeTaskCtx(ctx);
|
||||||
QW_TASK_DLOG_E("task ctx freed");
|
QW_TASK_DLOG_E("task ctx freed");
|
||||||
pIter = taosHashIterate(mgmt->ctxHash, pIter);
|
pIter = taosHashIterate(mgmt->ctxHash, pIter);
|
||||||
|
taskCount++;
|
||||||
}
|
}
|
||||||
taosHashCleanup(mgmt->ctxHash);
|
taosHashCleanup(mgmt->ctxHash);
|
||||||
|
|
||||||
|
@ -487,7 +491,9 @@ void qwDestroyImpl(void *pMgmt) {
|
||||||
while (pIter) {
|
while (pIter) {
|
||||||
SQWSchStatus *sch = (SQWSchStatus *)pIter;
|
SQWSchStatus *sch = (SQWSchStatus *)pIter;
|
||||||
qwDestroySchStatus(sch);
|
qwDestroySchStatus(sch);
|
||||||
|
|
||||||
pIter = taosHashIterate(mgmt->schHash, pIter);
|
pIter = taosHashIterate(mgmt->schHash, pIter);
|
||||||
|
schStatusCount++;
|
||||||
}
|
}
|
||||||
taosHashCleanup(mgmt->schHash);
|
taosHashCleanup(mgmt->schHash);
|
||||||
|
|
||||||
|
@ -499,7 +505,8 @@ void qwDestroyImpl(void *pMgmt) {
|
||||||
|
|
||||||
qwCloseRef();
|
qwCloseRef();
|
||||||
|
|
||||||
qDebug("qworker destroyed, type:%d, id:%d, handle:%p", nodeType, nodeId, mgmt);
|
qDebug("qworker destroyed, type:%d, id:%d, handle:%p, taskCount:%d, schStatusCount: %d", nodeType, nodeId, mgmt,
|
||||||
|
taskCount, schStatusCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qwOpenRef(void) {
|
int32_t qwOpenRef(void) {
|
||||||
|
|
|
@ -8,9 +8,9 @@
|
||||||
#include "qwMsg.h"
|
#include "qwMsg.h"
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
|
#include "tglobal.h"
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
#include "tname.h"
|
#include "tname.h"
|
||||||
#include "tglobal.h"
|
|
||||||
|
|
||||||
SQWorkerMgmt gQwMgmt = {
|
SQWorkerMgmt gQwMgmt = {
|
||||||
.lock = 0,
|
.lock = 0,
|
||||||
|
@ -117,7 +117,7 @@ int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx, bool *queryStop) {
|
||||||
if (queryStop) {
|
if (queryStop) {
|
||||||
*queryStop = true;
|
*queryStop = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -275,7 +275,7 @@ int32_t qwGetQueryResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen,
|
||||||
QW_ERR_RET(code);
|
QW_ERR_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
QW_TASK_DLOG("no more data in sink and query end, fetched blocks %d rows %"PRId64, pOutput->numOfBlocks,
|
QW_TASK_DLOG("no more data in sink and query end, fetched blocks %d rows %" PRId64, pOutput->numOfBlocks,
|
||||||
pOutput->numOfRows);
|
pOutput->numOfRows);
|
||||||
|
|
||||||
qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_SUCC);
|
qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_SUCC);
|
||||||
|
@ -327,12 +327,14 @@ int32_t qwGetQueryResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 == ctx->level) {
|
if (0 == ctx->level) {
|
||||||
QW_TASK_DLOG("task fetched blocks %d rows %"PRId64", level %d", pOutput->numOfBlocks, pOutput->numOfRows, ctx->level);
|
QW_TASK_DLOG("task fetched blocks %d rows %" PRId64 ", level %d", pOutput->numOfBlocks, pOutput->numOfRows,
|
||||||
|
ctx->level);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pOutput->numOfRows >= QW_MIN_RES_ROWS) {
|
if (pOutput->numOfRows >= QW_MIN_RES_ROWS) {
|
||||||
QW_TASK_DLOG("task fetched blocks %d rows %" PRId64 " reaches the min rows", pOutput->numOfBlocks, pOutput->numOfRows);
|
QW_TASK_DLOG("task fetched blocks %d rows %" PRId64 " reaches the min rows", pOutput->numOfBlocks,
|
||||||
|
pOutput->numOfRows);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -538,7 +540,7 @@ _return:
|
||||||
SQWMsg qwMsg = {.msgType = ctx->msgType, .connInfo = ctx->ctrlConnInfo};
|
SQWMsg qwMsg = {.msgType = ctx->msgType, .connInfo = ctx->ctrlConnInfo};
|
||||||
qwDbgSimulateRedirect(&qwMsg, ctx, &rsped);
|
qwDbgSimulateRedirect(&qwMsg, ctx, &rsped);
|
||||||
qwDbgSimulateDead(QW_FPARAMS(), ctx, &rsped);
|
qwDbgSimulateDead(QW_FPARAMS(), ctx, &rsped);
|
||||||
if (!rsped) {
|
if (!rsped) {
|
||||||
qwSendQueryRsp(QW_FPARAMS(), input->msgType + 1, ctx, code, false);
|
qwSendQueryRsp(QW_FPARAMS(), input->msgType + 1, ctx, code, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -650,8 +652,8 @@ _return:
|
||||||
code = qwHandlePostPhaseEvents(QW_FPARAMS(), QW_PHASE_POST_QUERY, &input, NULL);
|
code = qwHandlePostPhaseEvents(QW_FPARAMS(), QW_PHASE_POST_QUERY, &input, NULL);
|
||||||
|
|
||||||
if (QUERY_RSP_POLICY_QUICK == tsQueryRspPolicy && ctx != NULL && QW_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) {
|
if (QUERY_RSP_POLICY_QUICK == tsQueryRspPolicy && ctx != NULL && QW_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) {
|
||||||
void *rsp = NULL;
|
void *rsp = NULL;
|
||||||
int32_t dataLen = 0;
|
int32_t dataLen = 0;
|
||||||
SOutputData sOutput = {0};
|
SOutputData sOutput = {0};
|
||||||
if (qwGetQueryResFromSink(QW_FPARAMS(), ctx, &dataLen, &rsp, &sOutput)) {
|
if (qwGetQueryResFromSink(QW_FPARAMS(), ctx, &dataLen, &rsp, &sOutput)) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -671,8 +673,8 @@ _return:
|
||||||
qwBuildAndSendFetchRsp(ctx->fetchType, &qwMsg->connInfo, rsp, dataLen, code);
|
qwBuildAndSendFetchRsp(ctx->fetchType, &qwMsg->connInfo, rsp, dataLen, code);
|
||||||
rsp = NULL;
|
rsp = NULL;
|
||||||
|
|
||||||
QW_TASK_DLOG("fetch rsp send, handle:%p, code:%x - %s, dataLen:%d", qwMsg->connInfo.handle, code,
|
QW_TASK_DLOG("fetch rsp send, handle:%p, code:%x - %s, dataLen:%d", qwMsg->connInfo.handle, code, tstrerror(code),
|
||||||
tstrerror(code), dataLen);
|
dataLen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -689,7 +691,7 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
|
||||||
|
|
||||||
do {
|
do {
|
||||||
ctx = NULL;
|
ctx = NULL;
|
||||||
|
|
||||||
QW_ERR_JRET(qwHandlePrePhaseEvents(QW_FPARAMS(), QW_PHASE_PRE_CQUERY, &input, NULL));
|
QW_ERR_JRET(qwHandlePrePhaseEvents(QW_FPARAMS(), QW_PHASE_PRE_CQUERY, &input, NULL));
|
||||||
|
|
||||||
QW_ERR_JRET(qwGetTaskCtx(QW_FPARAMS(), &ctx));
|
QW_ERR_JRET(qwGetTaskCtx(QW_FPARAMS(), &ctx));
|
||||||
|
@ -748,7 +750,8 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
QW_LOCK(QW_WRITE, &ctx->lock);
|
QW_LOCK(QW_WRITE, &ctx->lock);
|
||||||
if ((queryStop && (0 == atomic_load_8((int8_t *)&ctx->queryContinue))) || code || 0 == atomic_load_8((int8_t *)&ctx->queryContinue)) {
|
if ((queryStop && (0 == atomic_load_8((int8_t *)&ctx->queryContinue))) || code ||
|
||||||
|
0 == atomic_load_8((int8_t *)&ctx->queryContinue)) {
|
||||||
// Note: query is not running anymore
|
// Note: query is not running anymore
|
||||||
QW_SET_PHASE(ctx, 0);
|
QW_SET_PHASE(ctx, 0);
|
||||||
QW_UNLOCK(QW_WRITE, &ctx->lock);
|
QW_UNLOCK(QW_WRITE, &ctx->lock);
|
||||||
|
@ -1176,7 +1179,7 @@ void qWorkerStopAllTasks(void *qWorkerMgmt) {
|
||||||
QW_DLOG("start to stop all tasks, taskNum:%d", taosHashGetSize(mgmt->ctxHash));
|
QW_DLOG("start to stop all tasks, taskNum:%d", taosHashGetSize(mgmt->ctxHash));
|
||||||
|
|
||||||
uint64_t qId, tId;
|
uint64_t qId, tId;
|
||||||
int32_t eId;
|
int32_t eId;
|
||||||
void *pIter = taosHashIterate(mgmt->ctxHash, NULL);
|
void *pIter = taosHashIterate(mgmt->ctxHash, NULL);
|
||||||
while (pIter) {
|
while (pIter) {
|
||||||
SQWTaskCtx *ctx = (SQWTaskCtx *)pIter;
|
SQWTaskCtx *ctx = (SQWTaskCtx *)pIter;
|
||||||
|
@ -1186,7 +1189,7 @@ void qWorkerStopAllTasks(void *qWorkerMgmt) {
|
||||||
QW_LOCK(QW_WRITE, &ctx->lock);
|
QW_LOCK(QW_WRITE, &ctx->lock);
|
||||||
|
|
||||||
QW_TASK_DLOG_E("start to force stop task");
|
QW_TASK_DLOG_E("start to force stop task");
|
||||||
|
|
||||||
if (QW_EVENT_RECEIVED(ctx, QW_EVENT_DROP) || QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) {
|
if (QW_EVENT_RECEIVED(ctx, QW_EVENT_DROP) || QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) {
|
||||||
QW_TASK_WLOG_E("task already dropping");
|
QW_TASK_WLOG_E("task already dropping");
|
||||||
QW_UNLOCK(QW_WRITE, &ctx->lock);
|
QW_UNLOCK(QW_WRITE, &ctx->lock);
|
||||||
|
@ -1194,7 +1197,7 @@ void qWorkerStopAllTasks(void *qWorkerMgmt) {
|
||||||
pIter = taosHashIterate(mgmt->ctxHash, pIter);
|
pIter = taosHashIterate(mgmt->ctxHash, pIter);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (QW_QUERY_RUNNING(ctx)) {
|
if (QW_QUERY_RUNNING(ctx)) {
|
||||||
qwKillTaskHandle(ctx, TSDB_CODE_VND_STOPPED);
|
qwKillTaskHandle(ctx, TSDB_CODE_VND_STOPPED);
|
||||||
} else if (!QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) {
|
} else if (!QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) {
|
||||||
|
|
|
@ -56,7 +56,7 @@ void streamSchedByTimer(void* param, void* tmrId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (atomic_load_8(&pTask->triggerStatus) == TASK_TRIGGER_STATUS__ACTIVE) {
|
if (atomic_load_8(&pTask->triggerStatus) == TASK_TRIGGER_STATUS__ACTIVE) {
|
||||||
SStreamTrigger* trigger = taosAllocateQitem(sizeof(SStreamTrigger), DEF_QITEM);
|
SStreamTrigger* trigger = taosAllocateQitem(sizeof(SStreamTrigger), DEF_QITEM, 0);
|
||||||
if (trigger == NULL) return;
|
if (trigger == NULL) return;
|
||||||
trigger->type = STREAM_INPUT__GET_RES;
|
trigger->type = STREAM_INPUT__GET_RES;
|
||||||
trigger->pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock));
|
trigger->pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock));
|
||||||
|
@ -112,7 +112,7 @@ int32_t streamSchedExec(SStreamTask* pTask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t streamTaskEnqueue(SStreamTask* pTask, const SStreamDispatchReq* pReq, SRpcMsg* pRsp) {
|
int32_t streamTaskEnqueue(SStreamTask* pTask, const SStreamDispatchReq* pReq, SRpcMsg* pRsp) {
|
||||||
SStreamDataBlock* pData = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM);
|
SStreamDataBlock* pData = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM, 0);
|
||||||
int8_t status;
|
int8_t status;
|
||||||
|
|
||||||
// enqueue
|
// enqueue
|
||||||
|
@ -150,7 +150,7 @@ int32_t streamTaskEnqueue(SStreamTask* pTask, const SStreamDispatchReq* pReq, SR
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t streamTaskEnqueueRetrieve(SStreamTask* pTask, SStreamRetrieveReq* pReq, SRpcMsg* pRsp) {
|
int32_t streamTaskEnqueueRetrieve(SStreamTask* pTask, SStreamRetrieveReq* pReq, SRpcMsg* pRsp) {
|
||||||
SStreamDataBlock* pData = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM);
|
SStreamDataBlock* pData = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM, 0);
|
||||||
int8_t status = TASK_INPUT_STATUS__NORMAL;
|
int8_t status = TASK_INPUT_STATUS__NORMAL;
|
||||||
|
|
||||||
// enqueue
|
// enqueue
|
||||||
|
|
|
@ -67,7 +67,8 @@ int32_t streamRetrieveReqToData(const SStreamRetrieveReq* pReq, SStreamDataBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
SStreamDataSubmit2* streamDataSubmitNew(SPackedData submit) {
|
SStreamDataSubmit2* streamDataSubmitNew(SPackedData submit) {
|
||||||
SStreamDataSubmit2* pDataSubmit = (SStreamDataSubmit2*)taosAllocateQitem(sizeof(SStreamDataSubmit2), DEF_QITEM);
|
SStreamDataSubmit2* pDataSubmit = (SStreamDataSubmit2*)taosAllocateQitem(sizeof(SStreamDataSubmit2), DEF_QITEM, 0);
|
||||||
|
|
||||||
if (pDataSubmit == NULL) return NULL;
|
if (pDataSubmit == NULL) return NULL;
|
||||||
pDataSubmit->dataRef = (int32_t*)taosMemoryMalloc(sizeof(int32_t));
|
pDataSubmit->dataRef = (int32_t*)taosMemoryMalloc(sizeof(int32_t));
|
||||||
if (pDataSubmit->dataRef == NULL) goto FAIL;
|
if (pDataSubmit->dataRef == NULL) goto FAIL;
|
||||||
|
@ -81,7 +82,8 @@ FAIL:
|
||||||
}
|
}
|
||||||
|
|
||||||
SStreamMergedSubmit2* streamMergedSubmitNew() {
|
SStreamMergedSubmit2* streamMergedSubmitNew() {
|
||||||
SStreamMergedSubmit2* pMerged = (SStreamMergedSubmit2*)taosAllocateQitem(sizeof(SStreamMergedSubmit2), DEF_QITEM);
|
SStreamMergedSubmit2* pMerged = (SStreamMergedSubmit2*)taosAllocateQitem(sizeof(SStreamMergedSubmit2), DEF_QITEM, 0);
|
||||||
|
|
||||||
if (pMerged == NULL) return NULL;
|
if (pMerged == NULL) return NULL;
|
||||||
pMerged->submits = taosArrayInit(0, sizeof(SPackedData));
|
pMerged->submits = taosArrayInit(0, sizeof(SPackedData));
|
||||||
pMerged->dataRefs = taosArrayInit(0, sizeof(void*));
|
pMerged->dataRefs = taosArrayInit(0, sizeof(void*));
|
||||||
|
@ -107,7 +109,8 @@ static FORCE_INLINE void streamDataSubmitRefInc(SStreamDataSubmit2* pDataSubmit)
|
||||||
}
|
}
|
||||||
|
|
||||||
SStreamDataSubmit2* streamSubmitRefClone(SStreamDataSubmit2* pSubmit) {
|
SStreamDataSubmit2* streamSubmitRefClone(SStreamDataSubmit2* pSubmit) {
|
||||||
SStreamDataSubmit2* pSubmitClone = taosAllocateQitem(sizeof(SStreamDataSubmit2), DEF_QITEM);
|
SStreamDataSubmit2* pSubmitClone = taosAllocateQitem(sizeof(SStreamDataSubmit2), DEF_QITEM, 0);
|
||||||
|
|
||||||
if (pSubmitClone == NULL) {
|
if (pSubmitClone == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,6 +55,7 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, const void* data, SArray*
|
||||||
/*ASSERT(false);*/
|
/*ASSERT(false);*/
|
||||||
qError("unexpected stream execution, stream %" PRId64 " task: %d, since %s", pTask->streamId, pTask->taskId,
|
qError("unexpected stream execution, stream %" PRId64 " task: %d, since %s", pTask->streamId, pTask->taskId,
|
||||||
terrstr());
|
terrstr());
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (output == NULL) {
|
if (output == NULL) {
|
||||||
if (pItem->type == STREAM_INPUT__DATA_RETRIEVE) {
|
if (pItem->type == STREAM_INPUT__DATA_RETRIEVE) {
|
||||||
|
@ -127,7 +128,7 @@ int32_t streamScanExec(SStreamTask* pTask, int32_t batchSz) {
|
||||||
taosArrayDestroy(pRes);
|
taosArrayDestroy(pRes);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
SStreamDataBlock* qRes = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM);
|
SStreamDataBlock* qRes = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM, 0);
|
||||||
if (qRes == NULL) {
|
if (qRes == NULL) {
|
||||||
taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes);
|
taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes);
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -235,7 +236,7 @@ int32_t streamExecForAll(SStreamTask* pTask) {
|
||||||
qDebug("stream task %d exec end", pTask->taskId);
|
qDebug("stream task %d exec end", pTask->taskId);
|
||||||
|
|
||||||
if (taosArrayGetSize(pRes) != 0) {
|
if (taosArrayGetSize(pRes) != 0) {
|
||||||
SStreamDataBlock* qRes = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM);
|
SStreamDataBlock* qRes = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM, 0);
|
||||||
if (qRes == NULL) {
|
if (qRes == NULL) {
|
||||||
taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes);
|
taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes);
|
||||||
streamFreeQitem(input);
|
streamFreeQitem(input);
|
||||||
|
|
|
@ -97,7 +97,7 @@ int32_t syncIOEqMsg(const SMsgCb *msgcb, SRpcMsg *pMsg) {
|
||||||
syncRpcMsgLog2(logBuf, pMsg);
|
syncRpcMsgLog2(logBuf, pMsg);
|
||||||
|
|
||||||
SRpcMsg *pTemp;
|
SRpcMsg *pTemp;
|
||||||
pTemp = taosAllocateQitem(sizeof(SRpcMsg), DEF_QITEM);
|
pTemp = taosAllocateQitem(sizeof(SRpcMsg), DEF_QITEM, 0);
|
||||||
memcpy(pTemp, pMsg, sizeof(SRpcMsg));
|
memcpy(pTemp, pMsg, sizeof(SRpcMsg));
|
||||||
|
|
||||||
STaosQueue *pMsgQ = gSyncIO->pMsgQ;
|
STaosQueue *pMsgQ = gSyncIO->pMsgQ;
|
||||||
|
@ -381,7 +381,7 @@ static void syncIOProcessRequest(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||||
syncRpcMsgLog2((char *)"==syncIOProcessRequest==", pMsg);
|
syncRpcMsgLog2((char *)"==syncIOProcessRequest==", pMsg);
|
||||||
SSyncIO *io = pParent;
|
SSyncIO *io = pParent;
|
||||||
SRpcMsg *pTemp;
|
SRpcMsg *pTemp;
|
||||||
pTemp = taosAllocateQitem(sizeof(SRpcMsg), DEF_QITEM);
|
pTemp = taosAllocateQitem(sizeof(SRpcMsg), DEF_QITEM, 0);
|
||||||
memcpy(pTemp, pMsg, sizeof(SRpcMsg));
|
memcpy(pTemp, pMsg, sizeof(SRpcMsg));
|
||||||
taosWriteQitem(io->pMsgQ, pTemp);
|
taosWriteQitem(io->pMsgQ, pTemp);
|
||||||
}
|
}
|
||||||
|
@ -441,7 +441,7 @@ static void syncIOTickQ(void *param, void *tmrId) {
|
||||||
SRpcMsg rpcMsg;
|
SRpcMsg rpcMsg;
|
||||||
syncPingReply2RpcMsg(pMsg, &rpcMsg);
|
syncPingReply2RpcMsg(pMsg, &rpcMsg);
|
||||||
SRpcMsg *pTemp;
|
SRpcMsg *pTemp;
|
||||||
pTemp = taosAllocateQitem(sizeof(SRpcMsg), DEF_QITEM);
|
pTemp = taosAllocateQitem(sizeof(SRpcMsg), DEF_QITEM, 0);
|
||||||
memcpy(pTemp, &rpcMsg, sizeof(SRpcMsg));
|
memcpy(pTemp, &rpcMsg, sizeof(SRpcMsg));
|
||||||
syncRpcMsgLog2((char *)"==syncIOTickQ==", &rpcMsg);
|
syncRpcMsgLog2((char *)"==syncIOTickQ==", &rpcMsg);
|
||||||
taosWriteQitem(io->pMsgQ, pTemp);
|
taosWriteQitem(io->pMsgQ, pTemp);
|
||||||
|
|
|
@ -720,14 +720,16 @@ static int tdbPagerInitPage(SPager *pPager, SPage *pPage, int (*initPage)(SPage
|
||||||
|
|
||||||
pgno = TDB_PAGE_PGNO(pPage);
|
pgno = TDB_PAGE_PGNO(pPage);
|
||||||
|
|
||||||
tdbTrace("tdbttl init pager:%p, pgno:%d, loadPage:%d, size:%d", pPager, pgno, loadPage, pPager->dbOrigSize);
|
tdbTrace("tdb/pager:%p, pgno:%d, loadPage:%d, size:%d", pPager, pgno, loadPage, pPager->dbOrigSize);
|
||||||
if (loadPage && pgno <= pPager->dbOrigSize) {
|
if (loadPage && pgno <= pPager->dbOrigSize) {
|
||||||
init = 1;
|
init = 1;
|
||||||
|
|
||||||
nRead = tdbOsPRead(pPager->fd, pPage->pData, pPage->pageSize, ((i64)pPage->pageSize) * (pgno - 1));
|
nRead = tdbOsPRead(pPager->fd, pPage->pData, pPage->pageSize, ((i64)pPage->pageSize) * (pgno - 1));
|
||||||
tdbTrace("tdbttl pager:%p, pgno:%d, nRead:%" PRId64, pPager, pgno, nRead);
|
tdbTrace("tdb/pager:%p, pgno:%d, nRead:%" PRId64, pPager, pgno, nRead);
|
||||||
if (nRead < pPage->pageSize) {
|
if (nRead < pPage->pageSize) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
|
tdbError("tdb/pager:%p, pgno:%d, nRead:%" PRId64 "pgSize:%" PRId32, pPager, pgno, nRead, pPage->pageSize);
|
||||||
|
TDB_UNLOCK_PAGE(pPage);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -285,6 +285,7 @@ static void cliReleaseUnfinishedMsg(SCliConn* conn) {
|
||||||
}
|
}
|
||||||
destroyCmsg(msg);
|
destroyCmsg(msg);
|
||||||
}
|
}
|
||||||
|
memset(&conn->ctx, 0, sizeof(conn->ctx));
|
||||||
}
|
}
|
||||||
bool cliMaySendCachedMsg(SCliConn* conn) {
|
bool cliMaySendCachedMsg(SCliConn* conn) {
|
||||||
if (!transQueueEmpty(&conn->cliMsgs)) {
|
if (!transQueueEmpty(&conn->cliMsgs)) {
|
||||||
|
@ -589,6 +590,7 @@ static void addConnToPool(void* pool, SCliConn* conn) {
|
||||||
}
|
}
|
||||||
static int32_t allocConnRef(SCliConn* conn, bool update) {
|
static int32_t allocConnRef(SCliConn* conn, bool update) {
|
||||||
if (update) {
|
if (update) {
|
||||||
|
transReleaseExHandle(transGetRefMgt(), conn->refId);
|
||||||
transRemoveExHandle(transGetRefMgt(), conn->refId);
|
transRemoveExHandle(transGetRefMgt(), conn->refId);
|
||||||
conn->refId = -1;
|
conn->refId = -1;
|
||||||
}
|
}
|
||||||
|
@ -697,6 +699,7 @@ static void cliDestroyConn(SCliConn* conn, bool clear) {
|
||||||
tTrace("%s conn %p remove from conn pool", CONN_GET_INST_LABEL(conn), conn);
|
tTrace("%s conn %p remove from conn pool", CONN_GET_INST_LABEL(conn), conn);
|
||||||
QUEUE_REMOVE(&conn->q);
|
QUEUE_REMOVE(&conn->q);
|
||||||
QUEUE_INIT(&conn->q);
|
QUEUE_INIT(&conn->q);
|
||||||
|
transReleaseExHandle(transGetRefMgt(), conn->refId);
|
||||||
transRemoveExHandle(transGetRefMgt(), conn->refId);
|
transRemoveExHandle(transGetRefMgt(), conn->refId);
|
||||||
conn->refId = -1;
|
conn->refId = -1;
|
||||||
|
|
||||||
|
@ -731,6 +734,7 @@ static void cliDestroy(uv_handle_t* handle) {
|
||||||
conn->timer = NULL;
|
conn->timer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
transReleaseExHandle(transGetRefMgt(), conn->refId);
|
||||||
transRemoveExHandle(transGetRefMgt(), conn->refId);
|
transRemoveExHandle(transGetRefMgt(), conn->refId);
|
||||||
taosMemoryFree(conn->ip);
|
taosMemoryFree(conn->ip);
|
||||||
taosMemoryFree(conn->stream);
|
taosMemoryFree(conn->stream);
|
||||||
|
@ -1622,9 +1626,9 @@ bool cliGenRetryRule(SCliConn* pConn, STransMsg* pResp, SCliMsg* pMsg) {
|
||||||
pCtx->retryNextInterval = pCtx->retryMaxInterval;
|
pCtx->retryNextInterval = pCtx->retryMaxInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (-1 != pCtx->retryMaxTimeout && taosGetTimestampMs() - pCtx->retryInitTimestamp >= pCtx->retryMaxTimeout) {
|
// if (-1 != pCtx->retryMaxTimeout && taosGetTimestampMs() - pCtx->retryInitTimestamp >= pCtx->retryMaxTimeout) {
|
||||||
return false;
|
// return false;
|
||||||
}
|
// }
|
||||||
} else {
|
} else {
|
||||||
pCtx->retryNextInterval = 0;
|
pCtx->retryNextInterval = 0;
|
||||||
pCtx->epsetRetryCnt++;
|
pCtx->epsetRetryCnt++;
|
||||||
|
|
|
@ -282,6 +282,9 @@ void transCtxCleanup(STransCtx* ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void transCtxMerge(STransCtx* dst, STransCtx* src) {
|
void transCtxMerge(STransCtx* dst, STransCtx* src) {
|
||||||
|
if (src->args == NULL || src->freeFunc == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (dst->args == NULL) {
|
if (dst->args == NULL) {
|
||||||
dst->args = src->args;
|
dst->args = src->args;
|
||||||
dst->brokenVal = src->brokenVal;
|
dst->brokenVal = src->brokenVal;
|
||||||
|
|
|
@ -128,7 +128,7 @@ void *processShellMsg(void *arg) {
|
||||||
void processRequestMsg(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
void processRequestMsg(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||||
SRpcMsg *pTemp;
|
SRpcMsg *pTemp;
|
||||||
|
|
||||||
pTemp = taosAllocateQitem(sizeof(SRpcMsg), DEF_QITEM);
|
pTemp = taosAllocateQitem(sizeof(SRpcMsg), DEF_QITEM, 0);
|
||||||
memcpy(pTemp, pMsg, sizeof(SRpcMsg));
|
memcpy(pTemp, pMsg, sizeof(SRpcMsg));
|
||||||
|
|
||||||
int32_t idx = balance % multiQ->numOfThread;
|
int32_t idx = balance % multiQ->numOfThread;
|
||||||
|
|
|
@ -223,6 +223,7 @@ void walClose(SWal *pWal) {
|
||||||
taosMemoryFree(pRef);
|
taosMemoryFree(pRef);
|
||||||
}
|
}
|
||||||
taosHashCleanup(pWal->pRefHash);
|
taosHashCleanup(pWal->pRefHash);
|
||||||
|
pWal->pRefHash = NULL;
|
||||||
taosThreadMutexUnlock(&pWal->mutex);
|
taosThreadMutexUnlock(&pWal->mutex);
|
||||||
|
|
||||||
taosRemoveRef(tsWal.refSetId, pWal->refId);
|
taosRemoveRef(tsWal.refSetId, pWal->refId);
|
||||||
|
|
|
@ -32,15 +32,18 @@ SWalRef *walOpenRef(SWal *pWal) {
|
||||||
return pRef;
|
return pRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
|
||||||
void walCloseRef(SWal *pWal, int64_t refId) {
|
void walCloseRef(SWal *pWal, int64_t refId) {
|
||||||
SWalRef **ppRef = taosHashGet(pWal->pRefHash, &refId, sizeof(int64_t));
|
SWalRef **ppRef = taosHashGet(pWal->pRefHash, &refId, sizeof(int64_t));
|
||||||
if (ppRef == NULL) return;
|
if (ppRef == NULL) return;
|
||||||
SWalRef *pRef = *ppRef;
|
SWalRef *pRef = *ppRef;
|
||||||
|
if (pRef) {
|
||||||
|
wDebug("vgId:%d, wal close ref %" PRId64 ", refId %" PRId64, pWal->cfg.vgId, pRef->refVer, pRef->refId);
|
||||||
|
} else {
|
||||||
|
wDebug("vgId:%d, wal close ref null, refId %" PRId64, pWal->cfg.vgId, refId);
|
||||||
|
}
|
||||||
taosHashRemove(pWal->pRefHash, &refId, sizeof(int64_t));
|
taosHashRemove(pWal->pRefHash, &refId, sizeof(int64_t));
|
||||||
taosMemoryFree(pRef);
|
taosMemoryFree(pRef);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
int32_t walRefVer(SWalRef *pRef, int64_t ver) {
|
int32_t walRefVer(SWalRef *pRef, int64_t ver) {
|
||||||
SWal *pWal = pRef->pWal;
|
SWal *pWal = pRef->pWal;
|
||||||
|
|
|
@ -394,8 +394,8 @@ char *taosDirEntryBaseName(char *name) {
|
||||||
char *pPoint = strrchr(name, '/');
|
char *pPoint = strrchr(name, '/');
|
||||||
if (pPoint != NULL) {
|
if (pPoint != NULL) {
|
||||||
if (*(pPoint + 1) == '\0') {
|
if (*(pPoint + 1) == '\0') {
|
||||||
*pPoint = '\0';
|
*pPoint = '\0';
|
||||||
return taosDirEntryBaseName(name);
|
return taosDirEntryBaseName(name);
|
||||||
}
|
}
|
||||||
return pPoint + 1;
|
return pPoint + 1;
|
||||||
}
|
}
|
||||||
|
@ -500,8 +500,9 @@ int32_t taosCloseDir(TdDirPtr *ppDir) {
|
||||||
|
|
||||||
void taosGetCwd(char *buf, int32_t len) {
|
void taosGetCwd(char *buf, int32_t len) {
|
||||||
#if !defined(WINDOWS)
|
#if !defined(WINDOWS)
|
||||||
(void)getcwd(buf, len - 1);
|
char *unused __attribute__((unused));
|
||||||
|
unused = getcwd(buf, len - 1);
|
||||||
#else
|
#else
|
||||||
strncpy(buf, "not implemented on windows", len -1);
|
strncpy(buf, "not implemented on windows", len - 1);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -801,7 +801,7 @@ bool taosAssert(bool condition, const char *file, int32_t line, const char *form
|
||||||
taosPrintTrace(flags, level, dflag);
|
taosPrintTrace(flags, level, dflag);
|
||||||
|
|
||||||
if (tsAssert) {
|
if (tsAssert) {
|
||||||
taosCloseLog();
|
// taosCloseLog();
|
||||||
taosMsleep(300);
|
taosMsleep(300);
|
||||||
|
|
||||||
#ifdef NDEBUG
|
#ifdef NDEBUG
|
||||||
|
|
|
@ -109,20 +109,24 @@ int64_t taosQueueMemorySize(STaosQueue *queue) {
|
||||||
return memOfItems;
|
return memOfItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *taosAllocateQitem(int32_t size, EQItype itype) {
|
void *taosAllocateQitem(int32_t size, EQItype itype, int64_t dataSize) {
|
||||||
STaosQnode *pNode = taosMemoryCalloc(1, sizeof(STaosQnode) + size);
|
STaosQnode *pNode = taosMemoryCalloc(1, sizeof(STaosQnode) + size);
|
||||||
if (pNode == NULL) {
|
if (pNode == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pNode->dataSize = dataSize;
|
||||||
pNode->size = size;
|
pNode->size = size;
|
||||||
pNode->itype = itype;
|
pNode->itype = itype;
|
||||||
pNode->timestamp = taosGetTimestampUs();
|
pNode->timestamp = taosGetTimestampUs();
|
||||||
|
|
||||||
if (itype == RPC_QITEM) {
|
if (itype == RPC_QITEM) {
|
||||||
int64_t alloced = atomic_add_fetch_64(&tsRpcQueueMemoryUsed, size);
|
int64_t alloced = atomic_add_fetch_64(&tsRpcQueueMemoryUsed, size + dataSize);
|
||||||
if (alloced > tsRpcQueueMemoryAllowed) {
|
if (alloced > tsRpcQueueMemoryAllowed) {
|
||||||
|
uError("failed to alloc qitem, size:%" PRId64 " alloc:%" PRId64 " allowed:%" PRId64, size + dataSize, alloced,
|
||||||
|
tsRpcQueueMemoryUsed);
|
||||||
|
atomic_sub_fetch_64(&tsRpcQueueMemoryUsed, size + dataSize);
|
||||||
taosMemoryFree(pNode);
|
taosMemoryFree(pNode);
|
||||||
terrno = TSDB_CODE_OUT_OF_RPC_MEMORY_QUEUE;
|
terrno = TSDB_CODE_OUT_OF_RPC_MEMORY_QUEUE;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -139,8 +143,8 @@ void taosFreeQitem(void *pItem) {
|
||||||
if (pItem == NULL) return;
|
if (pItem == NULL) return;
|
||||||
|
|
||||||
STaosQnode *pNode = (STaosQnode *)((char *)pItem - sizeof(STaosQnode));
|
STaosQnode *pNode = (STaosQnode *)((char *)pItem - sizeof(STaosQnode));
|
||||||
if (pNode->itype > 0) {
|
if (pNode->itype == RPC_QITEM) {
|
||||||
int64_t alloced = atomic_sub_fetch_64(&tsRpcQueueMemoryUsed, pNode->size);
|
int64_t alloced = atomic_sub_fetch_64(&tsRpcQueueMemoryUsed, pNode->size + pNode->dataSize);
|
||||||
uTrace("item:%p, node:%p is freed, alloc:%" PRId64, pItem, pNode, alloced);
|
uTrace("item:%p, node:%p is freed, alloc:%" PRId64, pItem, pNode, alloced);
|
||||||
} else {
|
} else {
|
||||||
uTrace("item:%p, node:%p is freed", pItem, pNode);
|
uTrace("item:%p, node:%p is freed", pItem, pNode);
|
||||||
|
|
|
@ -1037,4 +1037,4 @@
|
||||||
,,n,docs-examples-test,bash node.sh
|
,,n,docs-examples-test,bash node.sh
|
||||||
,,n,docs-examples-test,bash csharp.sh
|
,,n,docs-examples-test,bash csharp.sh
|
||||||
,,n,docs-examples-test,bash jdbc.sh
|
,,n,docs-examples-test,bash jdbc.sh
|
||||||
,,n,docs-examples-test,bash go.sh
|
#,,n,docs-examples-test,bash go.sh
|
||||||
|
|
|
@ -4,11 +4,11 @@ system sh/deploy.sh -n dnode2 -i 2
|
||||||
system sh/deploy.sh -n dnode3 -i 3
|
system sh/deploy.sh -n dnode3 -i 3
|
||||||
system sh/deploy.sh -n dnode4 -i 4
|
system sh/deploy.sh -n dnode4 -i 4
|
||||||
system sh/deploy.sh -n dnode5 -i 5
|
system sh/deploy.sh -n dnode5 -i 5
|
||||||
system sh/cfg.sh -n dnode1 -c supportVnodes -v 4
|
system sh/cfg.sh -n dnode1 -c supportVnodes -v 5
|
||||||
system sh/cfg.sh -n dnode2 -c supportVnodes -v 4
|
system sh/cfg.sh -n dnode2 -c supportVnodes -v 5
|
||||||
system sh/cfg.sh -n dnode3 -c supportVnodes -v 4
|
system sh/cfg.sh -n dnode3 -c supportVnodes -v 5
|
||||||
system sh/cfg.sh -n dnode4 -c supportVnodes -v 4
|
system sh/cfg.sh -n dnode4 -c supportVnodes -v 5
|
||||||
system sh/cfg.sh -n dnode5 -c supportVnodes -v 4
|
system sh/cfg.sh -n dnode5 -c supportVnodes -v 5
|
||||||
|
|
||||||
print ========== step1
|
print ========== step1
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
|
|
@ -461,7 +461,7 @@ sql insert into t2 values(1648791213004,4,10,10,4.1);
|
||||||
$loop_count = 0
|
$loop_count = 0
|
||||||
|
|
||||||
loop2:
|
loop2:
|
||||||
sleep 100
|
sleep 200
|
||||||
|
|
||||||
$loop_count = $loop_count + 1
|
$loop_count = $loop_count + 1
|
||||||
if $loop_count == 10 then
|
if $loop_count == 10 then
|
||||||
|
@ -519,7 +519,7 @@ print step 6
|
||||||
$loop_count = 0
|
$loop_count = 0
|
||||||
|
|
||||||
loop3:
|
loop3:
|
||||||
# sleep 300
|
sleep 300
|
||||||
|
|
||||||
$loop_count = $loop_count + 1
|
$loop_count = $loop_count + 1
|
||||||
if $loop_count == 10 then
|
if $loop_count == 10 then
|
||||||
|
@ -618,6 +618,60 @@ if $data41 != 2 then
|
||||||
goto loop4
|
goto loop4
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
sql insert into t1 values(1648791343003,4,4,4,3.1);
|
||||||
|
sql insert into t1 values(1648791213004,4,5,5,4.1);
|
||||||
|
|
||||||
|
loop5:
|
||||||
|
sleep 200
|
||||||
|
|
||||||
|
$loop_count = $loop_count + 1
|
||||||
|
if $loop_count == 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select * from streamt3;
|
||||||
|
|
||||||
|
# row 0
|
||||||
|
if $rows != 7 then
|
||||||
|
print =====rows=$rows
|
||||||
|
goto loop5
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 4 then
|
||||||
|
print =====data01=$data01
|
||||||
|
goto loop5
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data11 != 6 then
|
||||||
|
print =====data11=$data11
|
||||||
|
goto loop5
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data21 != 4 then
|
||||||
|
print =====data21=$data21
|
||||||
|
goto loop5
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data31 != 4 then
|
||||||
|
print =====data31=$data31
|
||||||
|
goto loop5
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data41 != 2 then
|
||||||
|
print =====data41=$data41
|
||||||
|
goto loop5
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data51 != 1 then
|
||||||
|
print =====data51=$data51
|
||||||
|
goto loop5
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data61 != 1 then
|
||||||
|
print =====data61=$data61
|
||||||
|
goto loop5
|
||||||
|
endi
|
||||||
|
|
||||||
$loop_all = $loop_all + 1
|
$loop_all = $loop_all + 1
|
||||||
print ============loop_all=$loop_all
|
print ============loop_all=$loop_all
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,10 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/deploy.sh -n dnode2 -i 2
|
system sh/deploy.sh -n dnode2 -i 2
|
||||||
system sh/deploy.sh -n dnode3 -i 3
|
system sh/deploy.sh -n dnode3 -i 3
|
||||||
system sh/deploy.sh -n dnode4 -i 4
|
system sh/deploy.sh -n dnode4 -i 4
|
||||||
system sh/cfg.sh -n dnode1 -c supportVnodes -v 4
|
system sh/cfg.sh -n dnode1 -c supportVnodes -v 5
|
||||||
system sh/cfg.sh -n dnode2 -c supportVnodes -v 4
|
system sh/cfg.sh -n dnode2 -c supportVnodes -v 5
|
||||||
system sh/cfg.sh -n dnode3 -c supportVnodes -v 4
|
system sh/cfg.sh -n dnode3 -c supportVnodes -v 5
|
||||||
system sh/cfg.sh -n dnode4 -c supportVnodes -v 4
|
system sh/cfg.sh -n dnode4 -c supportVnodes -v 5
|
||||||
|
|
||||||
$dbPrefix = br1_db
|
$dbPrefix = br1_db
|
||||||
$tbPrefix = br1_tb
|
$tbPrefix = br1_tb
|
||||||
|
|
Loading…
Reference in New Issue