Makefile 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. # TsDB2 Makefile
  2. # 时序数据库构建、测试与开发工具
  3. .PHONY: all build test clean run help \
  4. test-unit test-full test-commit test-dirty test-integrity test-mem \
  5. test-migrate build-migrate \
  6. test-demos test-demos-heavy test-all \
  7. build-analyzer build-migrate-web demo-analyzer fmt lint deps tree
  8. # =============================================================================
  9. # 默认目标
  10. # =============================================================================
  11. all: build
  12. # =============================================================================
  13. # 构建
  14. # =============================================================================
  15. build:
  16. @echo "=== 构建 TsDB2 ==="
  17. go build ./...
  18. @echo "✅ 构建完成"
  19. # =============================================================================
  20. # 测试
  21. # =============================================================================
  22. # 运行所有核心测试
  23. test: test-unit test-full test-commit test-dirty test-integrity test-mem
  24. # 单元测试: 并发/事务/迁移往返等回归正确性的主要测试网。
  25. # 之前只跑 demo, 这批单测不在日常流程里 —— 现在并入默认 test。
  26. test-unit:
  27. @echo ""
  28. @echo "=========================================="
  29. @echo " 单元测试 (DB / DB/core / migrate)"
  30. @echo "=========================================="
  31. go test ./DB/... ./migrate/ -count=1
  32. # 完整功能测试 (28 项测试)
  33. test-full:
  34. @echo ""
  35. @echo "=========================================="
  36. @echo " 完整功能测试 (28 项)"
  37. @echo "=========================================="
  38. cd demo/full_test && go run main.go
  39. # 自动提交机制测试 (5 场景)
  40. test-commit:
  41. @echo ""
  42. @echo "=========================================="
  43. @echo " 自动提交机制测试 (5 场景)"
  44. @echo "=========================================="
  45. cd demo/no_commit_test && go run main.go
  46. # 脏页阈值性能测试
  47. test-dirty:
  48. @echo ""
  49. @echo "=========================================="
  50. @echo " 脏页阈值性能对比测试"
  51. @echo "=========================================="
  52. cd demo/dirty_threshold_test && go run main.go
  53. # 数据完整性测试
  54. test-integrity:
  55. @echo ""
  56. @echo "=========================================="
  57. @echo " 数据完整性测试"
  58. @echo "=========================================="
  59. cd demo/integrity_test && go run main.go
  60. # 内存使用测试
  61. test-mem:
  62. @echo ""
  63. @echo "=========================================="
  64. @echo " 内存使用测试"
  65. @echo "=========================================="
  66. cd demo/mem_test && go run main.go
  67. # =============================================================================
  68. # 跨库迁移 (VRTX ↔ MySQL ↔ SQLite)
  69. # =============================================================================
  70. # 往返一致性测试 (结构 / 数据 / 索引 / 主键 / 边界值 / 时序表)
  71. test-migrate:
  72. @echo ""
  73. @echo "=========================================="
  74. @echo " 跨库迁移往返测试 (VRTX ↔ SQLite)"
  75. @echo "=========================================="
  76. go test ./migrate/ -count=1
  77. # 构建跨库迁移命令行工具
  78. build-migrate:
  79. @echo "=== 构建 vrtxsql ==="
  80. go build -o vrtxsql ./cmd/vrtxsql
  81. @echo "✅ 构建完成: ./vrtxsql"
  82. # 构建跨库迁移的 Web 界面 (和 vrtxsql 同一套 migrate 能力, 只是把 flag 换成表单)
  83. build-migrate-web:
  84. @echo "=== 构建 vrtxsqlweb ==="
  85. go build -o vrtxsqlweb ./cmd/vrtxsqlweb
  86. @echo "✅ 构建完成: ./vrtxsqlweb (启动后打开 http://127.0.0.1:8099)"
  87. # 构建 Analyzer 可执行文件
  88. #
  89. # analyzer 是独立的 module (自带 go.mod), 所以 `go build ./...` 扫不到它 ——
  90. # 想拿到能直接跑、能挂调试器的二进制, 得进它自己的目录编。
  91. # 加 -gcflags="all=-N -l" 可关掉优化与内联 (断点更稳、变量能看全), 排查疑难时用:
  92. # cd analyzer && go build -gcflags="all=-N -l" -o analyzer .
  93. build-analyzer:
  94. @echo "=== 构建 analyzer ==="
  95. cd analyzer && go build -o analyzer .
  96. @echo "✅ 构建完成: ./analyzer/analyzer (启动后打开 http://localhost:8081)"
  97. # =============================================================================
  98. # Demo 程序
  99. # =============================================================================
  100. # demo 清单直接取自磁盘 (含 main.go 的目录), 不在这里手抄一份:
  101. # 手抄的清单一定会漏 —— 新加的 demo 没人想起来往 Makefile 里补一行, 于是它
  102. # 再也没被跑过, 而且"清单看起来是全的"这件事本身还会让人放心地不去检查。
  103. DEMO_DIRS := $(patsubst demo/%/main.go,%,$(wildcard demo/*/main.go))
  104. # 重型 demo: 跑得久或吃资源 (千万行压测 / 极端配置), 不进默认的 test-demos。
  105. # 它们同样必须能跑通, 只是要在需要时显式点名: make test-demos-heavy
  106. # 顺序从轻到重, 先看到多数结果, 最慢的 bench_10m 放最后。
  107. HEAVY_DEMOS := hash_bench stress_small_config stress_test stress_extreme_config bench_10m
  108. # 单独跑一个 demo: make demo-unique_index_test
  109. demo-%:
  110. @echo "===== demo/$* ====="
  111. cd demo/$* && go run main.go
  112. # 跑一遍全部 demo (排除重型)。
  113. #
  114. # 刻意不在第一个失败处退出: 跑一遍只看到第一个坏掉的 demo, 修完再跑又冒出下一个,
  115. # 全量验证要的是"一次拿到所有坏消息"。日志留在 /tmp, 失败时能直接查。
  116. test-demos:
  117. @echo ""
  118. @echo "=========================================="
  119. @echo " Demo 全量验证 (共 $(words $(filter-out $(HEAVY_DEMOS),$(DEMO_DIRS))) 个)"
  120. @echo "=========================================="
  121. @ok=0; fail=0; \
  122. for d in $(filter-out $(HEAVY_DEMOS),$(DEMO_DIRS)); do \
  123. printf " %-26s" "$$d"; \
  124. if ( cd demo/$$d && go run main.go ) > /tmp/tsdb2_demo_$$d.log 2>&1; then \
  125. echo "✅ 通过"; ok=$$((ok+1)); \
  126. else \
  127. echo "❌ 失败 (日志: /tmp/tsdb2_demo_$$d.log)"; fail=$$((fail+1)); \
  128. fi; \
  129. done; \
  130. echo ""; \
  131. echo " 结果: 通过 $$ok, 失败 $$fail"; \
  132. test $$fail -eq 0
  133. # 重型 demo (单独跑)
  134. test-demos-heavy:
  135. @echo ""
  136. @echo "=========================================="
  137. @echo " 重型 Demo (共 $(words $(HEAVY_DEMOS)) 个)"
  138. @echo "=========================================="
  139. @ok=0; fail=0; \
  140. for d in $(HEAVY_DEMOS); do \
  141. printf " %-26s" "$$d"; \
  142. if ( cd demo/$$d && go run main.go ) > /tmp/tsdb2_demo_$$d.log 2>&1; then \
  143. echo "✅ 通过"; ok=$$((ok+1)); \
  144. else \
  145. echo "❌ 失败 (日志: /tmp/tsdb2_demo_$$d.log)"; fail=$$((fail+1)); \
  146. fi; \
  147. done; \
  148. echo ""; \
  149. echo " 结果: 通过 $$ok, 失败 $$fail"; \
  150. test $$fail -eq 0
  151. # 一键全量: 构建 + 迁移往返 + 单元测试 + 全部 demo
  152. test-all: build test-migrate test-unit test-demos
  153. @echo ""
  154. @echo "✅ 全量验证完成 (重型 demo 另跑: make test-demos-heavy)"
  155. # 运行 Analyzer (数据库可视化工具)
  156. #
  157. # 用 `go run .` 而不是 `go run main.go`: analyzer 是多文件包 (store/pagemap/
  158. # audit/indexcheck...), 只喂一个文件会报一片 undefined。
  159. demo-analyzer:
  160. @echo "=== 启动 TsDB2 Analyzer ==="
  161. cd analyzer && go run .
  162. # =============================================================================
  163. # 开发工具
  164. # =============================================================================
  165. # 运行主程序
  166. run:
  167. @echo "=== 运行主程序 ==="
  168. go run main.go
  169. # 代码格式化
  170. fmt:
  171. @echo "=== 格式化代码 ==="
  172. go fmt ./...
  173. @echo "✅ 格式化完成"
  174. # 代码静态检查
  175. lint:
  176. @echo "=== 代码静态检查 ==="
  177. go vet ./...
  178. @echo "✅ 检查完成"
  179. # 依赖管理
  180. deps:
  181. @echo "=== 整理依赖 ==="
  182. go mod tidy
  183. @echo "=== 验证依赖 ==="
  184. go mod verify
  185. @echo "✅ 依赖检查完成"
  186. # 显示项目结构
  187. tree:
  188. @echo "=== TsDB2 项目结构 ==="
  189. @echo ""
  190. @echo "TsDB2/"
  191. @echo "├── DB/ # 数据库核心层"
  192. @echo "│ ├── core/ # 底层引擎 (页式存储、B+树、WAL)"
  193. @echo "│ ├── db.go # DB 层封装"
  194. @echo "│ ├── table.go # 泛型表操作"
  195. @echo "│ ├── query.go # 查询构建器"
  196. @echo "│ └── model.go # 模型解析"
  197. @echo "├── analyzer/ # 数据库可视化工具"
  198. @echo "├── demo/ # 测试程序"
  199. @echo "│ ├── full_test/ # 完整功能测试"
  200. @echo "│ ├── no_commit_test/ # 自动提交测试"
  201. @echo "│ ├── dirty_threshold_test/ # 脏页阈值测试"
  202. @echo "│ ├── integrity_test/ # 数据完整性测试"
  203. @echo "│ └── mem_test/ # 内存使用测试"
  204. @echo "├── docs/ # 文档"
  205. @echo "└── Makefile # 构建脚本"
  206. @echo ""
  207. # 清理临时文件
  208. clean:
  209. @echo "=== 清理临时文件 ==="
  210. @rm -f demo/*/*.db
  211. @rm -f *.db
  212. @rm -f demo/*/*.exe
  213. @rm -f vrtxsql vrtxsql.exe
  214. @rm -f vrtxsqlweb vrtxsqlweb.exe
  215. @rm -f analyzer/analyzer analyzer/analyzer.exe
  216. @rm -f /tmp/tsdb2_demo_*.log
  217. @echo "✅ 清理完成"
  218. # =============================================================================
  219. # 帮助信息
  220. # =============================================================================
  221. help:
  222. @echo "╔═══════════════════════════════════════════════════════════╗"
  223. @echo "║ TsDB2 Makefile 使用说明 ║"
  224. @echo "╚═══════════════════════════════════════════════════════════╝"
  225. @echo ""
  226. @echo "📦 构建与运行"
  227. @echo " make build - 构建整个项目"
  228. @echo " make run - 运行主程序"
  229. @echo " make clean - 清理临时文件 (.db, .exe)"
  230. @echo ""
  231. @echo "🧪 核心测试"
  232. @echo " make test - 运行所有核心测试 (推荐)"
  233. @echo " make test-full - 完整功能测试 (28 项)"
  234. @echo " make test-commit - 自动提交机制测试 (5 场景)"
  235. @echo " make test-dirty - 脏页阈值性能对比测试"
  236. @echo " make test-integrity - 数据完整性测试"
  237. @echo " make test-mem - 内存使用测试"
  238. @echo ""
  239. @echo "🔀 跨库迁移"
  240. @echo " make test-migrate - 迁移往返一致性测试 (VRTX ↔ SQLite)"
  241. @echo " make build-migrate - 构建 vrtxsql 命令行工具"
  242. @echo " make build-migrate-web - 构建 vrtxsqlweb 网页版迁移工具"
  243. @echo " make build-analyzer - 构建 analyzer 可执行文件"
  244. @echo ""
  245. @echo "🎨 Demo 程序"
  246. @echo " make test-demos - 跑一遍全部 demo (排除重型, 逐个报通过/失败)"
  247. @echo " make test-demos-heavy - 重型 demo (千万行压测 / 极端配置)"
  248. @echo " make demo-<name> - 单独跑一个 demo (如 make demo-unique_index_test)"
  249. @echo " make demo-analyzer - 启动数据库可视化工具"
  250. @echo ""
  251. @echo "🛠️ 开发工具"
  252. @echo " make fmt - 格式化代码"
  253. @echo " make lint - 代码静态检查 (go vet)"
  254. @echo " make deps - 依赖管理 (tidy + verify)"
  255. @echo " make tree - 显示项目结构"
  256. @echo ""
  257. @echo "📖 快速开始"
  258. @echo " make build && make test # 构建并运行所有测试"
  259. @echo " make test-all # 构建 + 迁移往返 + 全部 demo (一键全量)"
  260. @echo " make demo-analyzer # 启动可视化工具"
  261. @echo ""
  262. @echo "💡 提示"
  263. @echo " - 首次使用建议运行: make test"
  264. @echo " - 查看 Analyzer: make demo-analyzer"
  265. @echo " - 提交前检查: make fmt && make lint"
  266. @echo ""