alice-lg/db/benchmark/benchmark.go
2022-03-14 14:03:06 +01:00

114 lines
2.4 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"log"
"math/rand"
"time"
"github.com/alice-lg/alice-lg/pkg/api"
"github.com/alice-lg/alice-lg/pkg/config"
"github.com/alice-lg/alice-lg/pkg/store/backends/postgres"
)
func randomNet() string {
return fmt.Sprintf("fd42:%d:%d:%d::%d",
1+rand.Intn(9999),
1+rand.Intn(9999),
1+rand.Intn(9999),
1+rand.Intn(99))
}
func makeRoute(n int) *api.LookupRoute {
id := fmt.Sprintf("route_%d", n)
nid := fmt.Sprintf("neighbor_%d", n%50)
gw := fmt.Sprintf("fd23:2342:%04d::1", n%50)
net := randomNet()
return &api.LookupRoute{
Route: &api.Route{
ID: id,
NeighborID: nid,
Network: net,
Interface: "enp0s23",
Gateway: gw,
Metric: 100,
Age: 30 * time.Second,
Type: []string{"BGP", "unicast", "univ"},
Primary: true,
LearntFrom: gw,
},
State: "imported",
Neighbor: &api.Neighbor{
ID: nid,
Address: gw,
State: "up",
Description: fmt.Sprintf("Neighbor AS 2342%d", n%50),
RoutesReceived: 23000,
RoutesFiltered: 0,
RoutesExported: 42000,
RoutesPreferred: 23,
RoutesAccepted: 23910,
Uptime: 20 * time.Minute,
RouteServerID: "rsid",
},
}
}
func makeRoutes(count int) api.LookupRoutes {
routes := make(api.LookupRoutes, 0, count)
for i := 0; i < count; i++ {
routes = append(routes, makeRoute(i))
}
return routes
}
func main() {
fmt.Println("benchmarking routes insert")
configFilenameFlag := flag.String(
"config", "/etc/alice-lg/alice.conf",
"Alice looking glass configuration file",
)
flag.Parse()
ctx := context.Background()
fmt.Println("using config:", *configFilenameFlag)
// Load configuration
cfg, err := config.LoadConfig(*configFilenameFlag)
if err != nil {
log.Fatal(err)
}
pool, err := postgres.Connect(ctx, cfg.Postgres)
if err != nil {
log.Fatal(err)
}
m := postgres.NewManager(pool)
if err := m.Initialize(ctx); err != nil {
log.Fatal(err)
}
log.Println("database initialized")
go m.Start(ctx)
backend := postgres.NewRoutesBackend(pool)
// Now insert tons of routes...
for i := 0; i < 10; i++ {
routes := makeRoutes(100000)
t := time.Now()
if err := backend.SetRoutes(
ctx, "rs1-example-fra1", routes); err != nil {
log.Fatal(err)
}
elapsed := time.Since(t)
log.Println(
"set routes", i, "finished after:", elapsed)
}
}