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✅ 极限配置也能工作!") } }