1+ //go:build linux
2+
13package main
24
35import (
@@ -11,27 +13,49 @@ import (
1113 "os"
1214 "os/signal"
1315 "syscall"
16+ "time"
1417
18+ "github.com/malbeclabs/doublezero/client/doublezerod/internal/api"
19+ "github.com/malbeclabs/doublezero/client/doublezerod/internal/bgp"
20+ "github.com/malbeclabs/doublezero/client/doublezerod/internal/manager"
21+ "github.com/malbeclabs/doublezero/client/doublezerod/internal/pim"
22+ "github.com/malbeclabs/doublezero/client/doublezerod/internal/probing"
23+ "github.com/malbeclabs/doublezero/client/doublezerod/internal/routing"
1524 "github.com/malbeclabs/doublezero/client/doublezerod/internal/runtime"
25+ "github.com/malbeclabs/doublezero/client/doublezerod/internal/services"
1626 "github.com/malbeclabs/doublezero/config"
1727 "github.com/prometheus/client_golang/prometheus"
1828 "github.com/prometheus/client_golang/prometheus/promauto"
1929 "github.com/prometheus/client_golang/prometheus/promhttp"
2030)
2131
32+ const (
33+ defaultRouteProbingInterval = 1 * time .Second
34+ defaultRouteProbingMaxConcurrency = 1024
35+ defaultRouteProbingProbeTimeout = 1 * time .Second
36+ defaultRouteProbingUpThreshold = 3
37+ defaultRouteProbingDownThreshold = 3
38+ )
39+
2240var (
23- sockFile = flag .String ("sock-file" , "/var/run/doublezerod/doublezerod.sock" , "path to doublezerod domain socket" )
24- enableLatencyProbing = flag .Bool ("latency-probing" , true , "enable latency probing to doublezero nodes" )
25- versionFlag = flag .Bool ("version" , false , "build version" )
26- env = flag .String ("env" , config .EnvTestnet , "environment to use" )
27- programId = flag .String ("program-id" , "" , "override smartcontract program id to monitor" )
28- rpcEndpoint = flag .String ("solana-rpc-endpoint" , "" , "override solana rpc endpoint url" )
29- probeInterval = flag .Int ("probe-interval" , 30 , "latency probe interval in seconds" )
30- cacheUpdateInterval = flag .Int ("cache-update-interval" , 30 , "latency cache update interval in seconds" )
31- enableVerboseLogging = flag .Bool ("v" , false , "enables verbose logging" )
32- enableLatencyMetrics = flag .Bool ("enable-latency-metrics" , false , "enables latency metrics" )
33- metricsEnable = flag .Bool ("metrics-enable" , false , "Enable prometheus metrics" )
34- metricsAddr = flag .String ("metrics-addr" , "localhost:0" , "Address to listen on for prometheus metrics" )
41+ sockFile = flag .String ("sock-file" , "/var/run/doublezerod/doublezerod.sock" , "path to doublezerod domain socket" )
42+ enableLatencyProbing = flag .Bool ("latency-probing" , true , "enable latency probing to doublezero nodes" )
43+ versionFlag = flag .Bool ("version" , false , "build version" )
44+ env = flag .String ("env" , config .EnvTestnet , "environment to use" )
45+ programId = flag .String ("program-id" , "" , "override smartcontract program id to monitor" )
46+ rpcEndpoint = flag .String ("solana-rpc-endpoint" , "" , "override solana rpc endpoint url" )
47+ probeInterval = flag .Int ("probe-interval" , 30 , "latency probe interval in seconds" )
48+ cacheUpdateInterval = flag .Int ("cache-update-interval" , 30 , "latency cache update interval in seconds" )
49+ enableVerboseLogging = flag .Bool ("v" , false , "enables verbose logging" )
50+ enableLatencyMetrics = flag .Bool ("enable-latency-metrics" , false , "enables latency metrics" )
51+ metricsEnable = flag .Bool ("metrics-enable" , false , "Enable prometheus metrics" )
52+ metricsAddr = flag .String ("metrics-addr" , "localhost:0" , "Address to listen on for prometheus metrics" )
53+ routeProbingEnable = flag .Bool ("route-probing-enable" , false , "enables route liveness probing" )
54+ routeProbingInterval = flag .Duration ("route-probing-interval" , defaultRouteProbingInterval , "route liveness probing interval as a duration (i.e. 5s, 10s, 30s)" )
55+ routeProbingProbeTimeout = flag .Duration ("route-probing-probe-timeout" , defaultRouteProbingProbeTimeout , "route liveness probing probe timeout as a duration (i.e. 1s, 3s, 5s)" )
56+ routeProbingUpThreshold = flag .Uint ("route-probing-up-threshold" , defaultRouteProbingUpThreshold , "route liveness probing up threshold" )
57+ routeProbingDownThreshold = flag .Uint ("route-probing-down-threshold" , defaultRouteProbingDownThreshold , "route liveness probing down threshold" )
58+ routeProbingMaxConcurrency = flag .Uint ("route-probing-max-concurrency" , defaultRouteProbingMaxConcurrency , "route liveness probing max concurrency" )
3559
3660 // set by LDFLAGS
3761 version = "dev"
@@ -114,7 +138,47 @@ func main() {
114138 ctx , stop := signal .NotifyContext (context .Background (), os .Interrupt , syscall .SIGTERM )
115139 defer stop ()
116140
117- if err := runtime .Run (ctx , * sockFile , * enableLatencyProbing , * enableLatencyMetrics , * programId , * rpcEndpoint , * probeInterval , * cacheUpdateInterval ); err != nil {
141+ db , err := manager .NewDb ()
142+ if err != nil {
143+ slog .Error ("error initializing db" , "error" , err )
144+ os .Exit (1 )
145+ }
146+
147+ nlr := routing.Netlink {}
148+
149+ bgps , err := bgp .NewBgpServer (net .IPv4 (1 , 1 , 1 , 1 ))
150+ if err != nil {
151+ slog .Error ("error creating bgp server" , "error" , err )
152+ os .Exit (1 )
153+ }
154+
155+ pim := pim .NewPIMServer ()
156+
157+ nlm := manager .NewNetlinkManager (nlr , bgps , db , func (userType api.UserType ) (manager.Provisioner , error ) {
158+ if userType != api .UserTypeIBRL || ! * routeProbingEnable {
159+ return manager .CreatePassthroughService (userType , bgps , nlr , db , pim )
160+ }
161+
162+ return services .NewIBRLService (bgps , nlr , db , func (iface string , src net.IP ) (bgp.RouteManager , error ) {
163+ if * routeProbingEnable {
164+ return probing .NewRouteManager (& probing.Config {
165+ Logger : logger ,
166+ Context : ctx ,
167+ Netlink : nlr ,
168+ Liveness : probing .NewHysteresisLivenessPolicy (* routeProbingUpThreshold , * routeProbingDownThreshold ),
169+ ListenFunc : probing .DefaultListenFunc (logger , iface , src ),
170+ ProbeFunc : probing .DefaultProbeFunc (logger , iface , * routeProbingProbeTimeout ),
171+ Interval : * routeProbingInterval ,
172+ ProbeTimeout : * routeProbingProbeTimeout ,
173+ MaxConcurrency : * routeProbingMaxConcurrency ,
174+ })
175+ } else {
176+ return manager .NewNetlinkerPassthroughRouteManager (nlr ), nil
177+ }
178+ }), nil
179+ })
180+
181+ if err := runtime .Run (ctx , nlm , * sockFile , * enableLatencyProbing , * enableLatencyMetrics , * programId , * rpcEndpoint , * probeInterval , * cacheUpdateInterval ); err != nil {
118182 slog .Error ("runtime error" , "error" , err )
119183 os .Exit (1 )
120184 }
0 commit comments