fixed error comparing hex/binary in pubkey white/blacklist, complete neo4j and tests"
Some checks failed
Go / build-and-release (push) Has been cancelled
Some checks failed
Go / build-and-release (push) Has been cancelled
This commit is contained in:
135
cmd/benchmark/neo4j_benchmark.go
Normal file
135
cmd/benchmark/neo4j_benchmark.go
Normal file
@@ -0,0 +1,135 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"next.orly.dev/pkg/database"
|
||||
_ "next.orly.dev/pkg/neo4j" // Import to register neo4j factory
|
||||
)
|
||||
|
||||
// Neo4jBenchmark wraps a Benchmark with Neo4j-specific setup
|
||||
type Neo4jBenchmark struct {
|
||||
config *BenchmarkConfig
|
||||
docker *Neo4jDocker
|
||||
database database.Database
|
||||
bench *BenchmarkAdapter
|
||||
}
|
||||
|
||||
// NewNeo4jBenchmark creates a new Neo4j benchmark instance
|
||||
func NewNeo4jBenchmark(config *BenchmarkConfig) (*Neo4jBenchmark, error) {
|
||||
// Create Docker manager
|
||||
docker, err := NewNeo4jDocker()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create Neo4j docker manager: %w", err)
|
||||
}
|
||||
|
||||
// Start Neo4j container
|
||||
if err := docker.Start(); err != nil {
|
||||
return nil, fmt.Errorf("failed to start Neo4j: %w", err)
|
||||
}
|
||||
|
||||
// Set environment variables for Neo4j connection
|
||||
os.Setenv("ORLY_NEO4J_URI", "bolt://localhost:7687")
|
||||
os.Setenv("ORLY_NEO4J_USER", "neo4j")
|
||||
os.Setenv("ORLY_NEO4J_PASSWORD", "benchmark123")
|
||||
|
||||
// Create database instance using Neo4j backend
|
||||
ctx := context.Background()
|
||||
cancel := func() {}
|
||||
db, err := database.NewDatabase(ctx, cancel, "neo4j", config.DataDir, "warn")
|
||||
if err != nil {
|
||||
docker.Stop()
|
||||
return nil, fmt.Errorf("failed to create Neo4j database: %w", err)
|
||||
}
|
||||
|
||||
// Wait for database to be ready
|
||||
fmt.Println("Waiting for Neo4j database to be ready...")
|
||||
select {
|
||||
case <-db.Ready():
|
||||
fmt.Println("Neo4j database is ready")
|
||||
case <-time.After(30 * time.Second):
|
||||
db.Close()
|
||||
docker.Stop()
|
||||
return nil, fmt.Errorf("Neo4j database failed to become ready")
|
||||
}
|
||||
|
||||
// Create adapter to use Database interface with Benchmark
|
||||
adapter := NewBenchmarkAdapter(config, db)
|
||||
|
||||
neo4jBench := &Neo4jBenchmark{
|
||||
config: config,
|
||||
docker: docker,
|
||||
database: db,
|
||||
bench: adapter,
|
||||
}
|
||||
|
||||
return neo4jBench, nil
|
||||
}
|
||||
|
||||
// Close closes the Neo4j benchmark and stops Docker container
|
||||
func (ngb *Neo4jBenchmark) Close() {
|
||||
fmt.Println("Closing Neo4j benchmark...")
|
||||
|
||||
if ngb.database != nil {
|
||||
ngb.database.Close()
|
||||
}
|
||||
|
||||
if ngb.docker != nil {
|
||||
if err := ngb.docker.Stop(); err != nil {
|
||||
log.Printf("Error stopping Neo4j Docker: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// RunSuite runs the benchmark suite on Neo4j
|
||||
func (ngb *Neo4jBenchmark) RunSuite() {
|
||||
fmt.Println("\n╔════════════════════════════════════════════════════════╗")
|
||||
fmt.Println("║ NEO4J BACKEND BENCHMARK SUITE ║")
|
||||
fmt.Println("╚════════════════════════════════════════════════════════╝")
|
||||
|
||||
// Run benchmark tests
|
||||
fmt.Printf("\n=== Starting Neo4j benchmark ===\n")
|
||||
|
||||
fmt.Printf("RunPeakThroughputTest (Neo4j)..\n")
|
||||
ngb.bench.RunPeakThroughputTest()
|
||||
fmt.Println("Wiping database between tests...")
|
||||
ngb.database.Wipe()
|
||||
time.Sleep(10 * time.Second)
|
||||
|
||||
fmt.Printf("RunBurstPatternTest (Neo4j)..\n")
|
||||
ngb.bench.RunBurstPatternTest()
|
||||
fmt.Println("Wiping database between tests...")
|
||||
ngb.database.Wipe()
|
||||
time.Sleep(10 * time.Second)
|
||||
|
||||
fmt.Printf("RunMixedReadWriteTest (Neo4j)..\n")
|
||||
ngb.bench.RunMixedReadWriteTest()
|
||||
fmt.Println("Wiping database between tests...")
|
||||
ngb.database.Wipe()
|
||||
time.Sleep(10 * time.Second)
|
||||
|
||||
fmt.Printf("RunQueryTest (Neo4j)..\n")
|
||||
ngb.bench.RunQueryTest()
|
||||
fmt.Println("Wiping database between tests...")
|
||||
ngb.database.Wipe()
|
||||
time.Sleep(10 * time.Second)
|
||||
|
||||
fmt.Printf("RunConcurrentQueryStoreTest (Neo4j)..\n")
|
||||
ngb.bench.RunConcurrentQueryStoreTest()
|
||||
|
||||
fmt.Printf("\n=== Neo4j benchmark completed ===\n\n")
|
||||
}
|
||||
|
||||
// GenerateReport generates the benchmark report
|
||||
func (ngb *Neo4jBenchmark) GenerateReport() {
|
||||
ngb.bench.GenerateReport()
|
||||
}
|
||||
|
||||
// GenerateAsciidocReport generates asciidoc format report
|
||||
func (ngb *Neo4jBenchmark) GenerateAsciidocReport() {
|
||||
ngb.bench.GenerateAsciidocReport()
|
||||
}
|
||||
Reference in New Issue
Block a user