| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- package main
- import (
- "TsDB2/DB"
- "fmt"
- "os"
- "time"
- )
- type Record struct {
- DB.BaseModel
- Name string `vrtx:"maxlen:32"`
- }
- const dbPath = "stress_extreme.db"
- func testConfig(bpCapacity int, dirtyThreshold int, rows int) (success bool, elapsed time.Duration, errMsg string) {
- os.Remove(dbPath)
- db, err := DB.Open(dbPath)
- if err != nil {
- return false, 0, fmt.Sprintf("Open failed: %v", err)
- }
- defer db.Close()
- db.SetBufferPoolCapacity(bpCapacity)
- db.SetDirtyThreshold(dirtyThreshold)
- db.SetAutoCommitDelay(0)
- tbl, err := DB.UseTable[Record](db, "test")
- if err != nil {
- return false, 0, fmt.Sprintf("UseTable failed: %v", err)
- }
- start := time.Now()
- done := make(chan error, 1)
- go func() {
- for i := 1; i <= rows; i++ {
- err := tbl.Insert(&Record{
- Name: fmt.Sprintf("Emp%07d", i),
- })
- if err != nil {
- done <- fmt.Errorf("Insert failed at row %d: %v", i, err)
- return
- }
- }
- done <- nil
- }()
- select {
- case err := <-done:
- elapsed = time.Since(start)
- if err != nil {
- return false, elapsed, err.Error()
- }
- db.Commit()
- count, _ := tbl.Count()
- if int(count) != rows {
- return false, elapsed, fmt.Sprintf("Count mismatch: %d vs %d", count, rows)
- }
- db.Close()
- db2, _ := DB.Open(dbPath)
- defer db2.Close()
- tbl2, _ := DB.UseTable[Record](db2, "test")
- count2, _ := tbl2.Count()
- if int(count2) != rows {
- return false, elapsed, fmt.Sprintf("Reopen count mismatch: %d vs %d", count2, rows)
- }
- return true, elapsed, ""
- case <-time.After(15 * time.Second):
- return false, time.Since(start), "DEADLOCK (15s timeout)"
- }
- }
- func main() {
- fmt.Println("==============================================")
- fmt.Println(" 极限小配置压力测试")
- fmt.Print("==============================================\n\n")
- rows := 2000
- fmt.Printf("测试场景: 插入 %d 行数据(极端小配置)\n\n", rows)
- fmt.Printf("%-8s %-8s %-10s %-10s %s\n", "BP(页)", "DT(页)", "耗时", "结果", "内存占用")
- fmt.Println("-------- -------- ---------- ---------- -------------------")
- configs := []struct {
- bp int
- dt int
- }{
- {10, 5}, // 极小 - 可能死锁
- {10, 10}, // 极小
- {20, 10}, // 很小
- {20, 20}, // 很小
- {50, 10}, // 小
- {50, 20}, // 小
- {50, 50}, // 小
- }
- passCount := 0
- failCount := 0
- for _, cfg := range configs {
- success, elapsed, errMsg := testConfig(cfg.bp, cfg.dt, rows)
- status := "✅"
- detail := fmt.Sprintf("%.2fs", elapsed.Seconds())
- if !success {
- status = "❌"
- detail = errMsg
- failCount++
- } else {
- passCount++
- }
- memTotal := float64(cfg.bp+cfg.dt) * 16 / 1024
- desc := fmt.Sprintf("总=%.2fMB", memTotal)
- fmt.Printf("%-8d %-8d %-10s %-10s %s\n", cfg.bp, cfg.dt, detail, status, desc)
- }
- fmt.Println("")
- fmt.Printf("结果: %d 通过, %d 失败\n", passCount, failCount)
- if failCount > 0 {
- fmt.Println("\n⚠️ 发现边界问题!")
- } else {
- fmt.Println("\n✅ 极限配置也能工作!")
- }
- }
|