add rely-sqlite to benchmark
Some checks failed
Go / build-and-release (push) Has been cancelled

This commit is contained in:
2025-11-20 20:55:37 +00:00
parent 00a6a78a41
commit 55add34ac1
54 changed files with 5519 additions and 4442 deletions

View File

@@ -0,0 +1,151 @@
package main
import (
"fmt"
"log"
"os"
"path/filepath"
"time"
"next.orly.dev/pkg/database"
)
// RelySQLiteBenchmark wraps a Benchmark with rely-sqlite-specific setup
type RelySQLiteBenchmark struct {
config *BenchmarkConfig
database database.Database
bench *BenchmarkAdapter
dbPath string
}
// NewRelySQLiteBenchmark creates a new rely-sqlite benchmark instance
func NewRelySQLiteBenchmark(config *BenchmarkConfig) (*RelySQLiteBenchmark, error) {
// Create database path
dbPath := filepath.Join(config.DataDir, "relysqlite.db")
// Ensure parent directory exists
if err := os.MkdirAll(config.DataDir, 0755); err != nil {
return nil, fmt.Errorf("failed to create data directory: %w", err)
}
// Remove existing database file if it exists
if _, err := os.Stat(dbPath); err == nil {
if err := os.Remove(dbPath); err != nil {
return nil, fmt.Errorf("failed to remove existing database: %w", err)
}
}
// Create wrapper
wrapper, err := NewRelySQLiteWrapper(dbPath)
if err != nil {
return nil, fmt.Errorf("failed to create rely-sqlite wrapper: %w", err)
}
// Wait for database to be ready
fmt.Println("Waiting for rely-sqlite database to be ready...")
select {
case <-wrapper.Ready():
fmt.Println("Rely-sqlite database is ready")
case <-time.After(10 * time.Second):
wrapper.Close()
return nil, fmt.Errorf("rely-sqlite database failed to become ready")
}
// Create adapter to use Database interface with Benchmark
adapter := NewBenchmarkAdapter(config, wrapper)
relysqliteBench := &RelySQLiteBenchmark{
config: config,
database: wrapper,
bench: adapter,
dbPath: dbPath,
}
return relysqliteBench, nil
}
// Close closes the rely-sqlite benchmark
func (rsb *RelySQLiteBenchmark) Close() {
fmt.Println("Closing rely-sqlite benchmark...")
if rsb.database != nil {
rsb.database.Close()
}
// Clean up database file
if rsb.dbPath != "" {
os.Remove(rsb.dbPath)
}
}
// RunSuite runs the benchmark suite on rely-sqlite
func (rsb *RelySQLiteBenchmark) RunSuite() {
fmt.Println("\n╔════════════════════════════════════════════════════════╗")
fmt.Println("║ RELY-SQLITE BACKEND BENCHMARK SUITE ║")
fmt.Println("╚════════════════════════════════════════════════════════╝")
// Run benchmark tests
fmt.Printf("\n=== Starting Rely-SQLite benchmark ===\n")
fmt.Printf("RunPeakThroughputTest (Rely-SQLite)..\n")
rsb.bench.RunPeakThroughputTest()
fmt.Println("Wiping database between tests...")
rsb.wipeDatabase()
time.Sleep(5 * time.Second)
fmt.Printf("RunBurstPatternTest (Rely-SQLite)..\n")
rsb.bench.RunBurstPatternTest()
fmt.Println("Wiping database between tests...")
rsb.wipeDatabase()
time.Sleep(5 * time.Second)
fmt.Printf("RunMixedReadWriteTest (Rely-SQLite)..\n")
rsb.bench.RunMixedReadWriteTest()
fmt.Println("Wiping database between tests...")
rsb.wipeDatabase()
time.Sleep(5 * time.Second)
fmt.Printf("RunQueryTest (Rely-SQLite)..\n")
rsb.bench.RunQueryTest()
fmt.Println("Wiping database between tests...")
rsb.wipeDatabase()
time.Sleep(5 * time.Second)
fmt.Printf("RunConcurrentQueryStoreTest (Rely-SQLite)..\n")
rsb.bench.RunConcurrentQueryStoreTest()
fmt.Printf("\n=== Rely-SQLite benchmark completed ===\n\n")
}
// wipeDatabase recreates the database for a clean slate
func (rsb *RelySQLiteBenchmark) wipeDatabase() {
// Close existing database
if rsb.database != nil {
rsb.database.Close()
}
// Remove database file
if rsb.dbPath != "" {
os.Remove(rsb.dbPath)
}
// Recreate database
wrapper, err := NewRelySQLiteWrapper(rsb.dbPath)
if err != nil {
log.Printf("Failed to recreate database: %v", err)
return
}
rsb.database = wrapper
rsb.bench.db = wrapper
}
// GenerateReport generates the benchmark report
func (rsb *RelySQLiteBenchmark) GenerateReport() {
rsb.bench.GenerateReport()
}
// GenerateAsciidocReport generates asciidoc format report
func (rsb *RelySQLiteBenchmark) GenerateAsciidocReport() {
rsb.bench.GenerateAsciidocReport()
}