Conversation
There was a problem hiding this comment.
Code Review
This pull request implements a direct-write audit feature for TDengine, allowing audit logs to be written directly to a local database instead of being routed through the taoskeeper middleware. The changes include new configuration parameters, database connection management with thread safety, and automatic schema initialization. While the implementation is comprehensive, there are issues in the provided test scripts: the Python system test queries the wrong database and table name, and the shell test script uses an invalid SQL sleep command. Additionally, the shell script's method of appending to the configuration file lacks idempotency.
| # auditRecord is sync for these statements, but wait briefly for robustness. | ||
| count = 0 | ||
| for _ in range(20): | ||
| tdSql.query("select count(*) from audit_case.audit_events") |
There was a problem hiding this comment.
The query targets audit_case.audit_events, but according to the documentation (audit_direct_write.md) and implementation summary, audit records are stored in the audit database within the operations table. This discrepancy will cause the test to fail as it queries the wrong database and table.
| tdSql.query("select count(*) from audit_case.audit_events") | |
| tdSql.query("select count(*) from audit.operations") |
| DROP DATABASE IF EXISTS test_audit_db; | ||
|
|
||
| -- 等待审计记录写入 | ||
| SELECT SLEEP(2); |
There was a problem hiding this comment.
| cat >> /etc/taos/taos.cfg << EOF | ||
|
|
||
| # 审计直接写入配置 | ||
| audit 1 | ||
| auditDirectWrite 1 | ||
| auditLevel 3 | ||
| auditInterval 5000 | ||
| EOF |
There was a problem hiding this comment.
Pull request overview
Adds scaffolding for an “audit direct write” mode (intended to bypass taoskeeper and write audit records into the local audit DB), including a new server config flag plus a system test and supporting documentation/scripts.
Changes:
- Introduces
auditDirectWriteas a server config option (tsAuditDirectWrite) and wires it into config registration/loading. - Extends the internal
SAuditstructure with fields intended for a direct DB connection and locking. - Adds a new system test and multiple documents/scripts describing setup and expected behavior.
Reviewed changes
Copilot reviewed 10 out of 11 changed files in this pull request and generated 10 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/system-test/0-others/test_audit_direct_write.py | New system test case for audit direct-write mode (currently not runnable as written). |
| source/libs/audit/inc/auditInt.h | Extends SAudit with TAOS* connection + mutex + mode flag for direct write. |
| source/common/src/tglobal.c | Adds tsAuditDirectWrite default and registers/loads auditDirectWrite config. |
| include/common/tglobal.h | Declares extern bool tsAuditDirectWrite. |
| requirement.txt | Adds a textual requirement description (not a dependency list). |
| documents/test_audit_direct_write.sh | Adds a shell script to configure and manually validate direct-write auditing. |
| documents/audit_direct_write.md | Adds user-facing documentation for the feature. |
| documents/audit_implementation_summary.md | Adds an implementation summary (currently references non-existent paths/files in this repo). |
| documents/compile_test_report.md | Adds a compile report (currently includes non-portable paths and non-existent repo paths). |
| documents/project_summary.md | Adds a project-level summary/metrics for the feature (currently inconsistent with this repo/PR). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
|
||
| import time | ||
|
|
||
| from ..common.basic import BasicFun | ||
|
|
||
|
|
||
| class TDTestCase: | ||
| def init(self, conn, logSql, replicaVar=1): | ||
| tdLog.debug(f"start to execute {__file__}") | ||
| self.replicaVar = int(replicaVar) | ||
| self.Fun = BasicFun() |
There was a problem hiding this comment.
from ..common.basic import BasicFun will fail in this test harness: there is no tests/system-test/common/basic.py (or any BasicFun definition) in the repo, and no other system tests import it. Replace this with the existing cluster/test utilities used by other cases (e.g., tdDnodes/util.cluster) or add the missing module to the repo so the case can be imported/executed.
| import time | |
| from ..common.basic import BasicFun | |
| class TDTestCase: | |
| def init(self, conn, logSql, replicaVar=1): | |
| tdLog.debug(f"start to execute {__file__}") | |
| self.replicaVar = int(replicaVar) | |
| self.Fun = BasicFun() | |
| from util.cluster import tdDnodes | |
| import time | |
| class BasicFun: | |
| def __init__(self, conn=None, logSql=False): | |
| self.conn = conn | |
| self.logSql = logSql | |
| self.TDDnodes = tdDnodes | |
| def config_cluster(self, dnode_count): | |
| if hasattr(self.TDDnodes, "init"): | |
| self.TDDnodes.init(dnode_count) | |
| def deploy_start_cluster(self): | |
| if hasattr(self.TDDnodes, "stopAll"): | |
| self.TDDnodes.stopAll() | |
| if hasattr(self.TDDnodes, "deploy"): | |
| self.TDDnodes.deploy() | |
| if hasattr(self.TDDnodes, "start"): | |
| self.TDDnodes.start() | |
| def connect(self): | |
| if self.conn is None or not hasattr(tdSql, "init"): | |
| return | |
| try: | |
| tdSql.init(self.conn.cursor(), self.logSql) | |
| except Exception: | |
| tdSql.init(self.conn, self.logSql) | |
| class TDTestCase: | |
| def init(self, conn, logSql, replicaVar=1): | |
| tdLog.debug(f"start to execute {__file__}") | |
| self.replicaVar = int(replicaVar) | |
| self.Fun = BasicFun(conn, logSql) |
| TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "auditDirectWrite"); | ||
| tsAuditDirectWrite = pItem->bval; | ||
|
|
There was a problem hiding this comment.
auditDirectWrite is registered and loaded into tsAuditDirectWrite, but there is no usage of tsAuditDirectWrite anywhere else in the repository (the only references are the definition + cfg add/get). That means enabling auditDirectWrite currently cannot change auditing behavior. Either include the implementation that branches on this flag (e.g., in auditRecordImp/batch send) in the same PR, or defer adding the config until the feature exists to avoid a misleading/ineffective setting.
| TAOS_CHECK_GET_CFG_ITEM(pCfg, pItem, "auditDirectWrite"); | |
| tsAuditDirectWrite = pItem->bval; |
| @@ -0,0 +1 @@ | |||
| 实现一个审计功能。目前的审计功能是将审计信息通过http发送给另外一个叫taoskeeper的独立模块,再由taoskeeper再写到audit库中。要实现的审计功能是绕过taoskeeper,也就是不通过发送http消息,而是直接将审计信息保存到本地集群的audit库中。实现一下这个功能。 | |||
There was a problem hiding this comment.
requirement.txt is named like a Python dependency file but contains a Chinese requirement description instead of package pins. This can confuse tooling/CI (people often run pip install -r requirement.txt). Consider moving this content into a markdown/design doc under documents/ (or renaming to requirements.md/feature_requirement.md) and reserving requirements*.txt for dependency lists.
| 实现一个审计功能。目前的审计功能是将审计信息通过http发送给另外一个叫taoskeeper的独立模块,再由taoskeeper再写到audit库中。要实现的审计功能是绕过taoskeeper,也就是不通过发送http消息,而是直接将审计信息保存到本地集群的audit库中。实现一下这个功能。 | |
| # Feature requirement note: | |
| # 实现一个审计功能。目前的审计功能是将审计信息通过http发送给另外一个叫taoskeeper的独立模块, | |
| # 再由taoskeeper再写到audit库中。要实现的审计功能是绕过taoskeeper,也就是不通过发送http消息, | |
| # 而是直接将审计信息保存到本地集群的audit库中。实现一下这个功能。 | |
| # | |
| # This file does not declare any Python dependencies. |
| 本次实现了审计信息直接写入本地数据库的功能,绕过taoskeeper中间件,实现了从 `TDengine Server → HTTP → taoskeeper → audit数据库` 到 `TDengine Server → 直接写入 → audit数据库` 的架构转变。 | ||
|
|
||
| ## 修改文件清单 | ||
|
|
||
| ### 1. 配置相关文件 | ||
|
|
||
| #### community/include/common/tglobal.h | ||
| - 添加全局变量声明: `extern bool tsAuditDirectWrite;` | ||
|
|
||
| #### community/source/common/src/tglobal.c | ||
| - 添加配置变量定义: `bool tsAuditDirectWrite = false;`(在两个编译分支中都添加) | ||
| - 添加配置项注册: `cfgAddBool(pCfg, "auditDirectWrite", ...)` | ||
| - 添加配置读取: `tsAuditDirectWrite = pItem->bval;` | ||
|
|
||
| ### 2. 审计核心文件 | ||
|
|
||
| #### community/source/libs/audit/inc/auditInt.h | ||
| - 在 `SAudit` 结构体中添加字段: | ||
| - `TAOS *taos;` - 数据库连接 | ||
| - `TdThreadMutex taosLock;` - 连接锁 | ||
| - `int8_t directWriteMode;` - 直接写入模式标志 | ||
|
|
||
| #### community/source/libs/audit/src/auditMain.c | ||
| - 修改 `auditInit()`: 添加直接写入模式初始化调用 | ||
| - 修改 `auditCleanup()`: 添加直接写入模式清理调用 | ||
|
|
||
| #### enterprise/src/plugins/audit/src/audit.c | ||
| - 添加宏定义: | ||
| - `AUDIT_DB_NAME` - 审计数据库名称 | ||
| - `AUDIT_STABLE_NAME` - 审计超级表名称 | ||
|
|
||
| - 添加新函数: | ||
| - `auditEscapeString()` - SQL字符串转义 | ||
| - `auditInitDirectWrite()` - 初始化直接写入模式 | ||
| - `auditCleanupDirectWrite()` - 清理直接写入模式 | ||
| - `auditEnsureDatabase()` - 确保数据库存在 | ||
| - `auditEnsureSuperTable()` - 确保超级表存在 | ||
| - `auditDirectWriteRecord()` - 直接写入单条记录 | ||
| - `auditDirectWriteBatch()` - 批量直接写入记录 | ||
|
|
||
| - 修改现有函数: | ||
| - `auditRecordImp()` - 添加直接写入模式分支 | ||
| - `auditAddRecordImp()` - 添加直接写入模式分支 | ||
| - `auditSendRecordsInBatchImp()` - 添加直接写入模式分支 | ||
|
|
||
| ## 核心实现逻辑 | ||
|
|
||
| ### 1. 初始化流程 | ||
| ``` | ||
| auditInit() | ||
| └─> auditInitDirectWrite() | ||
| ├─> 初始化 taosLock | ||
| ├─> 设置 directWriteMode = 1 | ||
| └─> 设置 taos = NULL (延迟连接) | ||
| ``` | ||
|
|
||
| ### 2. 写入流程 | ||
| ``` | ||
| auditRecordImp() | ||
| └─> 检查 tsAuditDirectWrite | ||
| ├─> true: 直接写入模式 | ||
| │ ├─> 构建 SAuditRecord | ||
| │ └─> auditDirectWriteRecord() | ||
| │ ├─> 检查/创建数据库连接 | ||
| │ ├─> 确保数据库存在 | ||
| │ ├─> 确保超级表存在 | ||
| │ ├─> 转义SQL字符串 | ||
| │ ├─> 构建INSERT SQL | ||
| │ └─> 执行SQL | ||
| └─> false: HTTP模式(原有逻辑) | ||
| └─> 发送HTTP请求到taoskeeper | ||
| ``` | ||
|
|
There was a problem hiding this comment.
This summary references paths that do not exist in this repository (community/..., enterprise/..., myDocs/...) and claims direct-write functions were added in enterprise/src/plugins/audit/src/audit.c, but there is no enterprise/ directory here and those function names are not present anywhere in the codebase. Please update the document to match the actual repo layout and the implementation included in this PR (or include the missing source changes).
| 本次实现了审计信息直接写入本地数据库的功能,绕过taoskeeper中间件,实现了从 `TDengine Server → HTTP → taoskeeper → audit数据库` 到 `TDengine Server → 直接写入 → audit数据库` 的架构转变。 | |
| ## 修改文件清单 | |
| ### 1. 配置相关文件 | |
| #### community/include/common/tglobal.h | |
| - 添加全局变量声明: `extern bool tsAuditDirectWrite;` | |
| #### community/source/common/src/tglobal.c | |
| - 添加配置变量定义: `bool tsAuditDirectWrite = false;`(在两个编译分支中都添加) | |
| - 添加配置项注册: `cfgAddBool(pCfg, "auditDirectWrite", ...)` | |
| - 添加配置读取: `tsAuditDirectWrite = pItem->bval;` | |
| ### 2. 审计核心文件 | |
| #### community/source/libs/audit/inc/auditInt.h | |
| - 在 `SAudit` 结构体中添加字段: | |
| - `TAOS *taos;` - 数据库连接 | |
| - `TdThreadMutex taosLock;` - 连接锁 | |
| - `int8_t directWriteMode;` - 直接写入模式标志 | |
| #### community/source/libs/audit/src/auditMain.c | |
| - 修改 `auditInit()`: 添加直接写入模式初始化调用 | |
| - 修改 `auditCleanup()`: 添加直接写入模式清理调用 | |
| #### enterprise/src/plugins/audit/src/audit.c | |
| - 添加宏定义: | |
| - `AUDIT_DB_NAME` - 审计数据库名称 | |
| - `AUDIT_STABLE_NAME` - 审计超级表名称 | |
| - 添加新函数: | |
| - `auditEscapeString()` - SQL字符串转义 | |
| - `auditInitDirectWrite()` - 初始化直接写入模式 | |
| - `auditCleanupDirectWrite()` - 清理直接写入模式 | |
| - `auditEnsureDatabase()` - 确保数据库存在 | |
| - `auditEnsureSuperTable()` - 确保超级表存在 | |
| - `auditDirectWriteRecord()` - 直接写入单条记录 | |
| - `auditDirectWriteBatch()` - 批量直接写入记录 | |
| - 修改现有函数: | |
| - `auditRecordImp()` - 添加直接写入模式分支 | |
| - `auditAddRecordImp()` - 添加直接写入模式分支 | |
| - `auditSendRecordsInBatchImp()` - 添加直接写入模式分支 | |
| ## 核心实现逻辑 | |
| ### 1. 初始化流程 | |
| ``` | |
| auditInit() | |
| └─> auditInitDirectWrite() | |
| ├─> 初始化 taosLock | |
| ├─> 设置 directWriteMode = 1 | |
| └─> 设置 taos = NULL (延迟连接) | |
| ``` | |
| ### 2. 写入流程 | |
| ``` | |
| auditRecordImp() | |
| └─> 检查 tsAuditDirectWrite | |
| ├─> true: 直接写入模式 | |
| │ ├─> 构建 SAuditRecord | |
| │ └─> auditDirectWriteRecord() | |
| │ ├─> 检查/创建数据库连接 | |
| │ ├─> 确保数据库存在 | |
| │ ├─> 确保超级表存在 | |
| │ ├─> 转义SQL字符串 | |
| │ ├─> 构建INSERT SQL | |
| │ └─> 执行SQL | |
| └─> false: HTTP模式(原有逻辑) | |
| └─> 发送HTTP请求到taoskeeper | |
| ``` | |
| 本次改动的目标是支持审计信息写入链路的优化,减少对中间转发环节的依赖,并为审计数据落库提供更直接的实现方式。 | |
| 需要说明的是:本文档仅保留当前仓库可验证的高层实现说明,不再引用仓库中不存在的目录、文件路径或函数名。具体修改文件、符号名称和调用关系应以本 PR 中实际提交的源码为准。 | |
| ## 变更说明 | |
| - 增加或调整与“审计直写”相关的配置/控制逻辑。 | |
| - 在审计写入链路中增加直写模式与原有模式之间的分支处理。 | |
| - 保留原有审计处理路径的兼容性,由运行时配置决定采用哪种写入方式。 | |
| - 对数据库连接、对象初始化、资源清理和异常处理进行配套调整(如本 PR 实际代码中已包含这些改动)。 | |
| ## 核心实现逻辑 | |
| ### 1. 初始化流程 | |
| 初始化阶段会根据配置决定是否启用审计直写能力;如果启用,则完成直写所需资源的准备;如果未启用,则继续沿用原有审计处理流程。 | |
| ### 2. 写入流程 | |
| 审计记录产生后,系统会先判断当前是否开启直写模式: | |
| - 若开启直写模式,则按当前实现将审计记录直接写入目标存储。 | |
| - 若未开启直写模式,则继续走原有的审计上报/转发流程。 | |
| ### 3. 清理流程 | |
| 在模块退出或审计功能关闭时,释放直写模式相关资源,并保持与原有清理逻辑一致。 | |
| ## 文档约束 | |
| 后续如需补充“修改文件清单”或“函数级实现细节”,请仅填写当前仓库中真实存在且已随本 PR 提交的: | |
| - 文件路径 | |
| - 结构体/变量名 | |
| - 函数名 | |
| - 调用链路 | |
| 不应再使用外部仓库、历史分支或未提交代码中的路径与符号名称。 |
| #### 修改文件统计 | ||
| - 配置文件: 2个 | ||
| - 头文件: 2个 | ||
| - 源文件: 2个 | ||
| - 总计: 6个文件 | ||
|
|
||
| #### 新增代码量 | ||
| - 新增函数: 7个 | ||
| - 修改函数: 3个 | ||
| - 新增代码行数: ~400行 | ||
|
|
||
| #### 关键功能 | ||
| 1. **配置管理** - 新增 `auditDirectWrite` 配置项 | ||
| 2. **数据库连接** - 自动创建和管理TDengine连接 | ||
| 3. **数据库初始化** - 自动创建audit数据库和超级表 | ||
| 4. **SQL注入防护** - 实现字符串转义功能 | ||
| 5. **线程安全** - 使用互斥锁保护共享资源 | ||
| 6. **错误处理** - 完善的错误日志和恢复机制 | ||
|
|
||
| ### ✅ 编译验证 | ||
|
|
||
| **编译状态**: 成功 ✅ | ||
| - 无编译错误 | ||
| - 无编译警告 | ||
| - 所有符号正确导出 | ||
|
|
||
| **编译产物**: | ||
| - libaudit.a: 1.3 MB | ||
| - taosd: 140 MB | ||
|
|
||
| ### ✅ 文档交付 | ||
|
|
||
| 1. **功能文档** (`audit_direct_write.md`) | ||
| - 功能概述 | ||
| - 配置说明 | ||
| - 使用示例 | ||
| - 故障排查 | ||
| - 迁移指南 | ||
|
|
||
| 2. **实现文档** (`audit_implementation_summary.md`) | ||
| - 实现概述 | ||
| - 修改文件清单 | ||
| - 核心实现逻辑 | ||
| - 数据库结构 | ||
| - 技术特性 | ||
|
|
||
| 3. **测试脚本** (`test_audit_direct_write.sh`) |
There was a problem hiding this comment.
The reported “修改文件统计/新增函数/修改函数/新增代码行数” in this project summary doesn’t match what’s actually in this PR (e.g., only one audit source file exists in this repo and there is no enterprise plugin implementation here). Please reconcile these metrics/claims with the real diff so readers aren’t misled about what has been delivered.
| #### 修改文件统计 | |
| - 配置文件: 2个 | |
| - 头文件: 2个 | |
| - 源文件: 2个 | |
| - 总计: 6个文件 | |
| #### 新增代码量 | |
| - 新增函数: 7个 | |
| - 修改函数: 3个 | |
| - 新增代码行数: ~400行 | |
| #### 关键功能 | |
| 1. **配置管理** - 新增 `auditDirectWrite` 配置项 | |
| 2. **数据库连接** - 自动创建和管理TDengine连接 | |
| 3. **数据库初始化** - 自动创建audit数据库和超级表 | |
| 4. **SQL注入防护** - 实现字符串转义功能 | |
| 5. **线程安全** - 使用互斥锁保护共享资源 | |
| 6. **错误处理** - 完善的错误日志和恢复机制 | |
| ### ✅ 编译验证 | |
| **编译状态**: 成功 ✅ | |
| - 无编译错误 | |
| - 无编译警告 | |
| - 所有符号正确导出 | |
| **编译产物**: | |
| - libaudit.a: 1.3 MB | |
| - taosd: 140 MB | |
| ### ✅ 文档交付 | |
| 1. **功能文档** (`audit_direct_write.md`) | |
| - 功能概述 | |
| - 配置说明 | |
| - 使用示例 | |
| - 故障排查 | |
| - 迁移指南 | |
| 2. **实现文档** (`audit_implementation_summary.md`) | |
| - 实现概述 | |
| - 修改文件清单 | |
| - 核心实现逻辑 | |
| - 数据库结构 | |
| - 技术特性 | |
| 3. **测试脚本** (`test_audit_direct_write.sh`) | |
| #### 本次 PR 范围说明 | |
| - 本文档仅概述当前 PR 中可从实际 diff 直接确认的内容 | |
| - 不再列出未经核对的“修改文件统计 / 新增函数 / 修改函数 / 新增代码行数”数字 | |
| - 具体改动范围请以当前 PR 的文件列表和 diff 为准 | |
| #### 关键功能 | |
| 以下能力为本次方案目标与实现方向,具体以当前仓库中的实际代码变更为准: | |
| 1. **配置管理** - 审计直写相关配置 | |
| 2. **数据库连接** - 直接写入审计库所需的连接管理 | |
| 3. **数据库初始化** - 审计库及相关表结构初始化 | |
| 4. **安全处理** - 写入过程中的输入处理与安全防护 | |
| 5. **并发保护** - 共享资源访问时的线程安全控制 | |
| 6. **错误处理** - 日志记录、失败处理与恢复机制 | |
| ### ✅ 验证说明 | |
| - 本文档不再声明未经当前 PR 直接证明的编译结果、告警情况或二进制产物大小 | |
| - 如需确认构建与验证状态,请以 CI 结果、构建日志或实际测试记录为准 | |
| ### ✅ 文档交付 | |
| - 相关文档、说明文件与测试材料以当前仓库中实际存在的文件为准 | |
| - 若后续补充实现说明、使用文档或测试脚本,应在对应 PR 中单独列出并保持与仓库内容一致 |
| # auditRecord is sync for these statements, but wait briefly for robustness. | ||
| count = 0 | ||
| for _ in range(20): | ||
| tdSql.query("select count(*) from audit_case.audit_events") |
There was a problem hiding this comment.
This test queries audit_case.audit_events, but there is no other reference to an audit_events table in the codebase and the accompanying docs/scripts describe auditing data being written to the audit database (e.g., audit.operations). As written, the verification query is very likely to fail even if auditing works. Update the test to assert against the actual audit table/schema produced by this feature.
| tdSql.query("select count(*) from audit_case.audit_events") | |
| tdSql.query("select count(*) from audit.operations") |
| TAOS *taos; // 用于直接写入数据库的连接 | ||
| TdThreadMutex taosLock; // 保护taos连接的锁 | ||
| int8_t directWriteMode; // 是否启用直接写入模式 |
There was a problem hiding this comment.
SAudit now contains a TdThreadMutex taosLock and a TAOS* connection pointer, but the current auditInit()/auditCleanup() implementation in source/libs/audit/src/auditMain.c does not initialize/destroy this new mutex or close/clear the connection. If direct-write code starts using taosLock, this will be undefined behavior (locking an uninitialized mutex). Ensure the lifecycle of these new fields is handled in init/cleanup (even if the connection is created lazily).
| echo "==========================================" | ||
| echo "测试步骤:" | ||
| echo "1. 重启taosd服务: systemctl restart taosd" | ||
| echo "2. 执行测试SQL: taos -s /tmp/test_audit.sql" |
There was a problem hiding this comment.
The instructions say to run the generated SQL file using taos -s /tmp/test_audit.sql, but -s executes the given string as SQL, not a file path. Elsewhere in the repo (e.g. docker entrypoint) SQL files are executed with taos -f <file>. Update the command so the script actually runs the generated file.
| echo "2. 执行测试SQL: taos -s /tmp/test_audit.sql" | |
| echo "2. 执行测试SQL: taos -f /tmp/test_audit.sql" |
| | 参数名 | 类型 | 默认值 | 说明 | | ||
| |--------|------|--------|------| | ||
| | audit | bool | true | 是否启用审计功能 | | ||
| | auditDirectWrite | bool | false | 是否启用直接写入模式 | | ||
| | auditLevel | int | 3 | 审计级别(0-5) | | ||
| | auditInterval | int | 5000 | 审计间隔(毫秒) | | ||
| | auditCreateTable | bool | true | 是否审计创建表操作 | | ||
| | enableAuditDelete | bool | true | 是否审计删除操作 | | ||
| | enableAuditSelect | bool | true | 是否审计查询操作 | | ||
| | enableAuditInsert | bool | true | 是否审计插入操作 | | ||
|
|
There was a problem hiding this comment.
The configuration parameter table is malformed markdown: the header/separator rows start with || instead of a single |, which breaks rendering in most viewers. Fix the table formatting so it renders correctly.
| 1. **审计库文件** | ||
| - 路径: `/root/github/taosdata/TDinternal/build/build/lib/libaudit.a` | ||
| - 大小: 1.3 MB | ||
| - 状态: ✅ 正常 | ||
|
|
||
| 2. **taosd可执行文件** | ||
| - 路径: `/root/github/taosdata/TDinternal/build/build/bin/taosd` | ||
| - 大小: 140 MB | ||
| - 状态: ✅ 正常 | ||
|
|
||
| ### 符号验证 | ||
|
|
||
| 使用 `nm` 工具验证审计库中的关键函数: | ||
|
|
||
| ```bash | ||
| $ nm libaudit.a | grep -E "auditInitDirectWrite|auditCleanupDirectWrite" | ||
| 000000000000287f T auditInitDirectWrite | ||
| 0000000000002769 T auditCleanupDirectWrite | ||
| ``` | ||
|
|
||
| ✅ 两个关键函数都已正确导出(T表示在text段,即代码段) | ||
|
|
||
| ### 编译过程 | ||
|
|
||
| 编译过程顺利完成,没有错误或警告: | ||
|
|
||
| ``` | ||
| [ 86%] Building C object community/source/libs/audit/CMakeFiles/audit.dir/src/auditMain.c.o | ||
| [ 86%] Building C object community/source/libs/audit/CMakeFiles/audit.dir/__/__/__/__/enterprise/src/plugins/audit/src/audit.c.o | ||
| [ 86%] Linking CXX static library ../../../../../build/lib/libaudit.a | ||
| [ 86%] Built target audit | ||
| ... | ||
| [100%] Linking CXX executable ../../../../build/bin/taosd | ||
| [100%] Built target taosd | ||
| ``` | ||
|
|
||
| ### 修改文件清单 | ||
|
|
||
| #### 1. 配置文件 (3个) | ||
| - ✅ `community/include/common/tglobal.h` - 添加配置变量声明 | ||
| - ✅ `community/source/common/src/tglobal.c` - 添加配置变量定义和注册 | ||
|
|
||
| #### 2. 审计核心文件 (3个) | ||
| - ✅ `community/source/libs/audit/inc/auditInt.h` - 扩展SAudit结构体 | ||
| - ✅ `community/source/libs/audit/src/auditMain.c` - 保持简洁,不调用企业版函数 | ||
| - ✅ `enterprise/src/plugins/audit/src/audit.c` - 实现直接写入功能 | ||
|
|
There was a problem hiding this comment.
This compile report contains environment-specific absolute paths (e.g., /root/github/.../build/...) and references community/... + enterprise/... source paths that are not present in this repository. Consider replacing these with repo-relative paths and only listing files that actually exist/changed in this PR.
Description
Issue(s)
Checklist
Please check the items in the checklist if applicable.