未验证 提交 2cfdd234 编写于 作者: W wade zhang 提交者: GitHub

Merge pull request #22034 from taosdata/feat/TS-3239

feat/TS-3239/TS-3596: port 'keepTimeOffset' from 2.6 to 3.0
...@@ -722,6 +722,16 @@ The charset that takes effect is UTF-8. ...@@ -722,6 +722,16 @@ The charset that takes effect is UTF-8.
| Value Range | 0: not change; 1: change by modification | | Value Range | 0: not change; 1: change by modification |
| Default Value | 0 | | Default Value | 0 |
### keepTimeOffset
| Attribute | Description |
| ------------- | ------------------------- |
| Applicable | Server Only |
| Meaning | Latency of data migration |
| Unit | hour |
| Value Range | 0-23 |
| Default Value | 0 |
## 3.0 Parameters ## 3.0 Parameters
| # | **Parameter** | **Applicable to 2.x ** | **Applicable to 3.0 ** | Current behavior in 3.0 | | # | **Parameter** | **Applicable to 2.x ** | **Applicable to 3.0 ** | Current behavior in 3.0 |
...@@ -779,3 +789,4 @@ The charset that takes effect is UTF-8. ...@@ -779,3 +789,4 @@ The charset that takes effect is UTF-8.
| 53 | udf | Yes | Yes | | | 53 | udf | Yes | Yes | |
| 54 | enableCoreFile | Yes | Yes | | | 54 | enableCoreFile | Yes | Yes | |
| 55 | ttlChangeOnWrite | No | Yes | | | 55 | ttlChangeOnWrite | No | Yes | |
| 56 | keepTimeOffset | Yes | Yes | |
...@@ -726,6 +726,16 @@ charset 的有效值是 UTF-8。 ...@@ -726,6 +726,16 @@ charset 的有效值是 UTF-8。
| 取值范围 | 0: 不改变;1:改变 | | 取值范围 | 0: 不改变;1:改变 |
| 缺省值 | 0 | | 缺省值 | 0 |
### keepTimeOffset
| 属性 | 说明 |
| -------- | ------------------ |
| 适用范围 | 仅服务端适用 |
| 含义 | 迁移操作的延时 |
| 单位 | 小时 |
| 取值范围 | 0-23 |
| 缺省值 | 0 |
## 压缩参数 ## 压缩参数
### compressMsgSize ### compressMsgSize
...@@ -794,6 +804,7 @@ charset 的有效值是 UTF-8。 ...@@ -794,6 +804,7 @@ charset 的有效值是 UTF-8。
| 53 | udf | 是 | 是 | | | 53 | udf | 是 | 是 | |
| 54 | enableCoreFile | 是 | 是 | | | 54 | enableCoreFile | 是 | 是 | |
| 55 | ttlChangeOnWrite | 否 | 是 | | | 55 | ttlChangeOnWrite | 否 | 是 | |
| 56 | keepTimeOffset | 是 | 是 | |
## 2.x->3.0 的废弃参数 ## 2.x->3.0 的废弃参数
...@@ -808,76 +819,74 @@ charset 的有效值是 UTF-8。 ...@@ -808,76 +819,74 @@ charset 的有效值是 UTF-8。
| 7 | offlineThreshold | 是 | 否 | 3.0 行为未知 | | 7 | offlineThreshold | 是 | 否 | 3.0 行为未知 |
| 8 | role | 是 | 否 | 由 supportVnode 决定是否能够创建 | | 8 | role | 是 | 否 | 由 supportVnode 决定是否能够创建 |
| 9 | dnodeNopLoop | 是 | 否 | 2.6 文档中未找到此参数 | | 9 | dnodeNopLoop | 是 | 否 | 2.6 文档中未找到此参数 |
| 10 | keepTimeOffset | 是 | 否 | 2.6 文档中未找到此参数 | | 10 | rpcTimer | 是 | 否 | 3.0 行为未知 |
| 11 | rpcTimer | 是 | 否 | 3.0 行为未知 | | 11 | rpcMaxTime | 是 | 否 | 3.0 行为未知 |
| 12 | rpcMaxTime | 是 | 否 | 3.0 行为未知 | | 12 | rpcForceTcp | 是 | 否 | 默认为 TCP |
| 13 | rpcForceTcp | 是 | 否 | 默认为 TCP | | 13 | tcpConnTimeout | 是 | 否 | 3.0 行为未知 |
| 14 | tcpConnTimeout | 是 | 否 | 3.0 行为未知 | | 14 | syncCheckInterval | 是 | 否 | 3.0 行为未知 |
| 15 | syncCheckInterval | 是 | 否 | 3.0 行为未知 | | 15 | maxTmrCtrl | 是 | 否 | 3.0 行为未知 |
| 16 | maxTmrCtrl | 是 | 否 | 3.0 行为未知 | | 16 | monitorReplica | 是 | 否 | 由 RAFT 协议管理多副本 |
| 17 | monitorReplica | 是 | 否 | 由 RAFT 协议管理多副本 | | 17 | smlTagNullName | 是 | 否 | 3.0 行为未知 |
| 18 | smlTagNullName | 是 | 否 | 3.0 行为未知 | | 18 | ratioOfQueryCores | 是 | 否 | 由 线程池 相关配置参数决定 |
| 20 | ratioOfQueryCores | 是 | 否 | 由 线程池 相关配置参数决定 | | 19 | maxStreamCompDelay | 是 | 否 | 3.0 行为未知 |
| 21 | maxStreamCompDelay | 是 | 否 | 3.0 行为未知 | | 20 | maxFirstStreamCompDelay | 是 | 否 | 3.0 行为未知 |
| 22 | maxFirstStreamCompDelay | 是 | 否 | 3.0 行为未知 | | 21 | retryStreamCompDelay | 是 | 否 | 3.0 行为未知 |
| 23 | retryStreamCompDelay | 是 | 否 | 3.0 行为未知 | | 22 | streamCompDelayRatio | 是 | 否 | 3.0 行为未知 |
| 24 | streamCompDelayRatio | 是 | 否 | 3.0 行为未知 | | 23 | maxVgroupsPerDb | 是 | 否 | 由 create db 的参数 vgroups 指定实际 vgroups 数量 |
| 25 | maxVgroupsPerDb | 是 | 否 | 由 create db 的参数 vgroups 指定实际 vgroups 数量 | | 24 | maxTablesPerVnode | 是 | 否 | DB 中的所有表近似平均分配到各个 vgroup |
| 26 | maxTablesPerVnode | 是 | 否 | DB 中的所有表近似平均分配到各个 vgroup | | 25 | minTablesPerVnode | 是 | 否 | DB 中的所有表近似平均分配到各个 vgroup |
| 27 | minTablesPerVnode | 是 | 否 | DB 中的所有表近似平均分配到各个 vgroup | | 26 | tableIncStepPerVnode | 是 | 否 | DB 中的所有表近似平均分配到各个 vgroup |
| 28 | tableIncStepPerVnode | 是 | 否 | DB 中的所有表近似平均分配到各个 vgroup | | 27 | cache | 是 | 否 | 由 buffer 代替 cache\*blocks |
| 29 | cache | 是 | 否 | 由 buffer 代替 cache\*blocks | | 28 | blocks | 是 | 否 | 由 buffer 代替 cache\*blocks |
| 30 | blocks | 是 | 否 | 由 buffer 代替 cache\*blocks | | 29 | days | 是 | 否 | 由 create db 的参数 duration 取代 |
| 31 | days | 是 | 否 | 由 create db 的参数 duration 取代 | | 30 | keep | 是 | 否 | 由 create db 的参数 keep 取代 |
| 32 | keep | 是 | 否 | 由 create db 的参数 keep 取代 | | 31 | minRows | 是 | 否 | 由 create db 的参数 minRows 取代 |
| 33 | minRows | 是 | 否 | 由 create db 的参数 minRows 取代 | | 32 | maxRows | 是 | 否 | 由 create db 的参数 maxRows 取代 |
| 34 | maxRows | 是 | 否 | 由 create db 的参数 maxRows 取代 | | 33 | quorum | 是 | 否 | 由 RAFT 协议决定 |
| 35 | quorum | 是 | 否 | 由 RAFT 协议决定 | | 34 | comp | 是 | 否 | 由 create db 的参数 comp 取代 |
| 36 | comp | 是 | 否 | 由 create db 的参数 comp 取代 | | 35 | walLevel | 是 | 否 | 由 create db 的参数 wal_level 取代 |
| 37 | walLevel | 是 | 否 | 由 create db 的参数 wal_level 取代 | | 36 | fsync | 是 | 否 | 由 create db 的参数 wal_fsync_period 取代 |
| 38 | fsync | 是 | 否 | 由 create db 的参数 wal_fsync_period 取代 | | 37 | replica | 是 | 否 | 由 create db 的参数 replica 取代 |
| 39 | replica | 是 | 否 | 由 create db 的参数 replica 取代 | | 38 | partitions | 是 | 否 | 3.0 行为未知 |
| 40 | partitions | 是 | 否 | 3.0 行为未知 | | 39 | update | 是 | 否 | 允许更新部分列 |
| 41 | update | 是 | 否 | 允许更新部分列 | | 40 | cachelast | 是 | 否 | 由 create db 的参数 cacheModel 取代 |
| 42 | cachelast | 是 | 否 | 由 create db 的参数 cacheModel 取代 | | 41 | maxSQLLength | 是 | 否 | SQL 上限为 1MB,无需参数控制 |
| 43 | maxSQLLength | 是 | 否 | SQL 上限为 1MB,无需参数控制 | | 42 | maxWildCardsLength | 是 | 否 | 3.0 行为未知 |
| 44 | maxWildCardsLength | 是 | 否 | 3.0 行为未知 | | 43 | maxRegexStringLen | 是 | 否 | 3.0 行为未知 |
| 45 | maxRegexStringLen | 是 | 否 | 3.0 行为未知 | | 44 | maxNumOfOrderedRes | 是 | 否 | 3.0 行为未知 |
| 46 | maxNumOfOrderedRes | 是 | 否 | 3.0 行为未知 | | 45 | maxConnections | 是 | 否 | 取决于系统配置和系统处理能力,详见后面的 Note |
| 47 | maxConnections | 是 | 否 | 取决于系统配置和系统处理能力,详见后面的 Note | | 46 | mnodeEqualVnodeNum | 是 | 否 | 3.0 行为未知 |
| 48 | mnodeEqualVnodeNum | 是 | 否 | 3.0 行为未知 | | 47 | http | 是 | 否 | http 服务由 taosAdapter 提供 |
| 49 | http | 是 | 否 | http 服务由 taosAdapter 提供 | | 48 | httpEnableRecordSql | 是 | 否 | taosd 不提供 http 服务 |
| 50 | httpEnableRecordSql | 是 | 否 | taosd 不提供 http 服务 | | 49 | httpMaxThreads | 是 | 否 | taosd 不提供 http 服务 |
| 51 | httpMaxThreads | 是 | 否 | taosd 不提供 http 服务 | | 50 | restfulRowLimit | 是 | 否 | taosd 不提供 http 服务 |
| 52 | restfulRowLimit | 是 | 否 | taosd 不提供 http 服务 | | 51 | httpDbNameMandatory | 是 | 否 | taosd 不提供 http 服务 |
| 53 | httpDbNameMandatory | 是 | 否 | taosd 不提供 http 服务 | | 52 | httpKeepAlive | 是 | 否 | taosd 不提供 http 服务 |
| 54 | httpKeepAlive | 是 | 否 | taosd 不提供 http 服务 | | 53 | enableRecordSql | 是 | 否 | 3.0 行为未知 |
| 55 | enableRecordSql | 是 | 否 | 3.0 行为未知 | | 54 | maxBinaryDisplayWidth | 是 | 否 | 3.0 行为未知 |
| 56 | maxBinaryDisplayWidth | 是 | 否 | 3.0 行为未知 | | 55 | stream | 是 | 否 | 默认启用连续查询 |
| 57 | stream | 是 | 否 | 默认启用连续查询 | | 56 | retrieveBlockingModel | 是 | 否 | 3.0 行为未知 |
| 58 | retrieveBlockingModel | 是 | 否 | 3.0 行为未知 | | 57 | tsdbMetaCompactRatio | 是 | 否 | 3.0 行为未知 |
| 59 | tsdbMetaCompactRatio | 是 | 否 | 3.0 行为未知 | | 58 | defaultJSONStrType | 是 | 否 | 3.0 行为未知 |
| 60 | defaultJSONStrType | 是 | 否 | 3.0 行为未知 | | 59 | walFlushSize | 是 | 否 | 3.0 行为未知 |
| 61 | walFlushSize | 是 | 否 | 3.0 行为未知 | | 60 | flowctrl | 是 | 否 | 3.0 行为未知 |
| 62 | keepTimeOffset | 是 | 否 | 3.0 行为未知 | | 61 | slaveQuery | 是 | 否 | 3.0 行为未知: slave vnode 是否能够处理查询? |
| 63 | flowctrl | 是 | 否 | 3.0 行为未知 | | 62 | adjustMaster | 是 | 否 | 3.0 行为未知 |
| 64 | slaveQuery | 是 | 否 | 3.0 行为未知: slave vnode 是否能够处理查询? | | 63 | topicBinaryLen | 是 | 否 | 3.0 行为未知 |
| 65 | adjustMaster | 是 | 否 | 3.0 行为未知 | | 64 | telegrafUseFieldNum | 是 | 否 | 3.0 行为未知 |
| 66 | topicBinaryLen | 是 | 否 | 3.0 行为未知 | | 65 | deadLockKillQuery | 是 | 否 | 3.0 行为未知 |
| 67 | telegrafUseFieldNum | 是 | 否 | 3.0 行为未知 | | 66 | clientMerge | 是 | 否 | 3.0 行为未知 |
| 68 | deadLockKillQuery | 是 | 否 | 3.0 行为未知 | | 67 | sdbDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
| 69 | clientMerge | 是 | 否 | 3.0 行为未知 | | 68 | odbcDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
| 70 | sdbDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 | | 69 | httpDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
| 71 | odbcDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 | | 70 | monDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
| 72 | httpDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 | | 71 | cqDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
| 73 | monDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 | | 72 | shortcutFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 |
| 74 | cqDebugFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 | | 73 | probeSeconds | 是 | 否 | 3.0 行为未知 |
| 75 | shortcutFlag | 是 | 否 | 参考 3.0 的 DebugFlag 系列参数 | | 74 | probeKillSeconds | 是 | 否 | 3.0 行为未知 |
| 76 | probeSeconds | 是 | 否 | 3.0 行为未知 | | 75 | probeInterval | 是 | 否 | 3.0 行为未知 |
| 77 | probeKillSeconds | 是 | 否 | 3.0 行为未知 | | 76 | lossyColumns | 是 | 否 | 3.0 行为未知 |
| 78 | probeInterval | 是 | 否 | 3.0 行为未知 | | 77 | fPrecision | 是 | 否 | 3.0 行为未知 |
| 79 | lossyColumns | 是 | 否 | 3.0 行为未知 | | 78 | dPrecision | 是 | 否 | 3.0 行为未知 |
| 80 | fPrecision | 是 | 否 | 3.0 行为未知 | | 79 | maxRange | 是 | 否 | 3.0 行为未知 |
| 81 | dPrecision | 是 | 否 | 3.0 行为未知 | | 80 | range | 是 | 否 | 3.0 行为未知 |
| 82 | maxRange | 是 | 否 | 3.0 行为未知 |
| 83 | range | 是 | 否 | 3.0 行为未知 |
...@@ -48,6 +48,7 @@ extern int32_t tsMaxNumOfDistinctResults; ...@@ -48,6 +48,7 @@ extern int32_t tsMaxNumOfDistinctResults;
extern int32_t tsCompatibleModel; extern int32_t tsCompatibleModel;
extern bool tsPrintAuth; extern bool tsPrintAuth;
extern int64_t tsTickPerMin[3]; extern int64_t tsTickPerMin[3];
extern int64_t tsTickPerHour[3];
extern int32_t tsCountAlwaysReturnValue; extern int32_t tsCountAlwaysReturnValue;
extern float tsSelectivityRatio; extern float tsSelectivityRatio;
extern int32_t tsTagFilterResCacheSize; extern int32_t tsTagFilterResCacheSize;
...@@ -185,6 +186,7 @@ extern bool tsDisableStream; ...@@ -185,6 +186,7 @@ extern bool tsDisableStream;
extern int64_t tsStreamBufferSize; extern int64_t tsStreamBufferSize;
extern int64_t tsCheckpointInterval; extern int64_t tsCheckpointInterval;
extern bool tsFilterScalarMode; extern bool tsFilterScalarMode;
extern int32_t tsKeepTimeOffset;
extern int32_t tsMaxStreamBackendCache; extern int32_t tsMaxStreamBackendCache;
extern int32_t tsPQSortMemThreshold; extern int32_t tsPQSortMemThreshold;
......
...@@ -108,6 +108,9 @@ ...@@ -108,6 +108,9 @@
# time period of keeping log files, in days # time period of keeping log files, in days
# logKeepDays 0 # logKeepDays 0
# unit Hour. Latency of data migration
# keepTimeOffset 0
############ 3. Debug Flag and levels ############################################# ############ 3. Debug Flag and levels #############################################
......
...@@ -186,6 +186,13 @@ bool tsDeployOnSnode = true; ...@@ -186,6 +186,13 @@ bool tsDeployOnSnode = true;
* TSDB_TIME_PRECISION_NANO: 60000000000L * TSDB_TIME_PRECISION_NANO: 60000000000L
*/ */
int64_t tsTickPerMin[] = {60000L, 60000000L, 60000000000L}; int64_t tsTickPerMin[] = {60000L, 60000000L, 60000000000L};
/*
* millisecond by default
* for TSDB_TIME_PRECISION_MILLI: 3600000L
* TSDB_TIME_PRECISION_MICRO: 3600000000L
* TSDB_TIME_PRECISION_NANO: 3600000000000L
*/
int64_t tsTickPerHour[] = {3600000L, 3600000000L, 3600000000000L};
// lossy compress 6 // lossy compress 6
char tsLossyColumns[32] = ""; // "float|double" means all float and double columns can be lossy compressed. set empty char tsLossyColumns[32] = ""; // "float|double" means all float and double columns can be lossy compressed. set empty
...@@ -217,6 +224,7 @@ bool tsDisableStream = false; ...@@ -217,6 +224,7 @@ bool tsDisableStream = false;
int64_t tsStreamBufferSize = 128 * 1024 * 1024; int64_t tsStreamBufferSize = 128 * 1024 * 1024;
int64_t tsCheckpointInterval = 3 * 60 * 60 * 1000; int64_t tsCheckpointInterval = 3 * 60 * 60 * 1000;
bool tsFilterScalarMode = false; bool tsFilterScalarMode = false;
int32_t tsKeepTimeOffset = 0; // latency of data migration
#ifndef _STORAGE #ifndef _STORAGE
int32_t taosSetTfsCfg(SConfig *pCfg) { int32_t taosSetTfsCfg(SConfig *pCfg) {
...@@ -537,6 +545,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { ...@@ -537,6 +545,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
if (cfgAddInt32(pCfg, "cacheLazyLoadThreshold", tsCacheLazyLoadThreshold, 0, 100000, 0) != 0) return -1; if (cfgAddInt32(pCfg, "cacheLazyLoadThreshold", tsCacheLazyLoadThreshold, 0, 100000, 0) != 0) return -1;
if (cfgAddBool(pCfg, "filterScalarMode", tsFilterScalarMode, 0) != 0) return -1; if (cfgAddBool(pCfg, "filterScalarMode", tsFilterScalarMode, 0) != 0) return -1;
if (cfgAddInt32(pCfg, "keepTimeOffset", tsKeepTimeOffset, 0, 23, 0) != 0) return -1;
if (cfgAddInt32(pCfg, "maxStreamBackendCache", tsMaxStreamBackendCache, 16, 1024, 0) != 0) return -1; if (cfgAddInt32(pCfg, "maxStreamBackendCache", tsMaxStreamBackendCache, 16, 1024, 0) != 0) return -1;
if (cfgAddInt32(pCfg, "pqSortMemThreshold", tsPQSortMemThreshold, 1, 10240, 0) != 0) return -1; if (cfgAddInt32(pCfg, "pqSortMemThreshold", tsPQSortMemThreshold, 1, 10240, 0) != 0) return -1;
...@@ -921,6 +930,7 @@ static int32_t taosSetServerCfg(SConfig *pCfg) { ...@@ -921,6 +930,7 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
tsCheckpointInterval = cfgGetItem(pCfg, "checkpointInterval")->i64; tsCheckpointInterval = cfgGetItem(pCfg, "checkpointInterval")->i64;
tsFilterScalarMode = cfgGetItem(pCfg, "filterScalarMode")->bval; tsFilterScalarMode = cfgGetItem(pCfg, "filterScalarMode")->bval;
tsKeepTimeOffset = cfgGetItem(pCfg, "keepTimeOffset")->i32;
tsMaxStreamBackendCache = cfgGetItem(pCfg, "maxStreamBackendCache")->i32; tsMaxStreamBackendCache = cfgGetItem(pCfg, "maxStreamBackendCache")->i32;
tsPQSortMemThreshold = cfgGetItem(pCfg, "pqSortMemThreshold")->i32; tsPQSortMemThreshold = cfgGetItem(pCfg, "pqSortMemThreshold")->i32;
...@@ -1478,6 +1488,19 @@ void taosCfgDynamicOptions(const char *option, const char *value) { ...@@ -1478,6 +1488,19 @@ void taosCfgDynamicOptions(const char *option, const char *value) {
return; return;
} }
if (strcasecmp(option, "keepTimeOffset") == 0) {
int32_t newKeepTimeOffset = atoi(value);
if (newKeepTimeOffset < 0 || newKeepTimeOffset > 23) {
uError("failed to set keepTimeOffset from %d to %d. Valid range: [0, 23]", tsKeepTimeOffset, newKeepTimeOffset);
return;
}
uInfo("keepTimeOffset set from %d to %d", tsKeepTimeOffset, newKeepTimeOffset);
tsKeepTimeOffset = newKeepTimeOffset;
return;
}
const char *options[] = { const char *options[] = {
"dDebugFlag", "vDebugFlag", "mDebugFlag", "wDebugFlag", "sDebugFlag", "tsdbDebugFlag", "tqDebugFlag", "dDebugFlag", "vDebugFlag", "mDebugFlag", "wDebugFlag", "sDebugFlag", "tsdbDebugFlag", "tqDebugFlag",
"fsDebugFlag", "udfDebugFlag", "smaDebugFlag", "idxDebugFlag", "tdbDebugFlag", "tmrDebugFlag", "uDebugFlag", "fsDebugFlag", "udfDebugFlag", "smaDebugFlag", "idxDebugFlag", "tdbDebugFlag", "tmrDebugFlag", "uDebugFlag",
......
...@@ -542,6 +542,8 @@ int32_t tsdbFidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int64_t nowSec) { ...@@ -542,6 +542,8 @@ int32_t tsdbFidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int64_t nowSec) {
ASSERT(0); ASSERT(0);
} }
nowSec = nowSec - tsKeepTimeOffset * tsTickPerHour[pKeepCfg->precision];
key = nowSec - pKeepCfg->keep0 * tsTickPerMin[pKeepCfg->precision]; key = nowSec - pKeepCfg->keep0 * tsTickPerMin[pKeepCfg->precision];
aFid[0] = tsdbKeyFid(key, pKeepCfg->days, pKeepCfg->precision); aFid[0] = tsdbKeyFid(key, pKeepCfg->days, pKeepCfg->precision);
key = nowSec - pKeepCfg->keep1 * tsTickPerMin[pKeepCfg->precision]; key = nowSec - pKeepCfg->keep1 * tsTickPerMin[pKeepCfg->precision];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册