main.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package main
  2. import (
  3. "TsDB2/DB"
  4. "fmt"
  5. "os"
  6. "time"
  7. )
  8. type Record struct {
  9. DB.BaseModel
  10. Name string `vrtx:"maxlen:32"`
  11. }
  12. const dbPath = "stress_extreme.db"
  13. func testConfig(bpCapacity int, dirtyThreshold int, rows int) (success bool, elapsed time.Duration, errMsg string) {
  14. os.Remove(dbPath)
  15. db, err := DB.Open(dbPath)
  16. if err != nil {
  17. return false, 0, fmt.Sprintf("Open failed: %v", err)
  18. }
  19. defer db.Close()
  20. db.SetBufferPoolCapacity(bpCapacity)
  21. db.SetDirtyThreshold(dirtyThreshold)
  22. db.SetAutoCommitDelay(0)
  23. tbl, err := DB.UseTable[Record](db, "test")
  24. if err != nil {
  25. return false, 0, fmt.Sprintf("UseTable failed: %v", err)
  26. }
  27. start := time.Now()
  28. done := make(chan error, 1)
  29. go func() {
  30. for i := 1; i <= rows; i++ {
  31. err := tbl.Insert(&Record{
  32. Name: fmt.Sprintf("Emp%07d", i),
  33. })
  34. if err != nil {
  35. done <- fmt.Errorf("Insert failed at row %d: %v", i, err)
  36. return
  37. }
  38. }
  39. done <- nil
  40. }()
  41. select {
  42. case err := <-done:
  43. elapsed = time.Since(start)
  44. if err != nil {
  45. return false, elapsed, err.Error()
  46. }
  47. db.Commit()
  48. count, _ := tbl.Count()
  49. if int(count) != rows {
  50. return false, elapsed, fmt.Sprintf("Count mismatch: %d vs %d", count, rows)
  51. }
  52. db.Close()
  53. db2, _ := DB.Open(dbPath)
  54. defer db2.Close()
  55. tbl2, _ := DB.UseTable[Record](db2, "test")
  56. count2, _ := tbl2.Count()
  57. if int(count2) != rows {
  58. return false, elapsed, fmt.Sprintf("Reopen count mismatch: %d vs %d", count2, rows)
  59. }
  60. return true, elapsed, ""
  61. case <-time.After(15 * time.Second):
  62. return false, time.Since(start), "DEADLOCK (15s timeout)"
  63. }
  64. }
  65. func main() {
  66. fmt.Println("==============================================")
  67. fmt.Println(" 极限小配置压力测试")
  68. fmt.Print("==============================================\n\n")
  69. rows := 2000
  70. fmt.Printf("测试场景: 插入 %d 行数据(极端小配置)\n\n", rows)
  71. fmt.Printf("%-8s %-8s %-10s %-10s %s\n", "BP(页)", "DT(页)", "耗时", "结果", "内存占用")
  72. fmt.Println("-------- -------- ---------- ---------- -------------------")
  73. configs := []struct {
  74. bp int
  75. dt int
  76. }{
  77. {10, 5}, // 极小 - 可能死锁
  78. {10, 10}, // 极小
  79. {20, 10}, // 很小
  80. {20, 20}, // 很小
  81. {50, 10}, // 小
  82. {50, 20}, // 小
  83. {50, 50}, // 小
  84. }
  85. passCount := 0
  86. failCount := 0
  87. for _, cfg := range configs {
  88. success, elapsed, errMsg := testConfig(cfg.bp, cfg.dt, rows)
  89. status := "✅"
  90. detail := fmt.Sprintf("%.2fs", elapsed.Seconds())
  91. if !success {
  92. status = "❌"
  93. detail = errMsg
  94. failCount++
  95. } else {
  96. passCount++
  97. }
  98. memTotal := float64(cfg.bp+cfg.dt) * 16 / 1024
  99. desc := fmt.Sprintf("总=%.2fMB", memTotal)
  100. fmt.Printf("%-8d %-8d %-10s %-10s %s\n", cfg.bp, cfg.dt, detail, status, desc)
  101. }
  102. fmt.Println("")
  103. fmt.Printf("结果: %d 通过, %d 失败\n", passCount, failCount)
  104. if failCount > 0 {
  105. fmt.Println("\n⚠️ 发现边界问题!")
  106. } else {
  107. fmt.Println("\n✅ 极限配置也能工作!")
  108. }
  109. }