mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-09-13 18:10:25 +02:00
graph+server: add template for new graph Builder sub-system
This is preparation for an upcoming commit that will move over various responsibilities from the ChannelRouter to the graph Builder. So that that commit can be a pure code-move commit, the template for the new sub-system is added up front here.
This commit is contained in:
57
graph/builder.go
Normal file
57
graph/builder.go
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
package graph
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Config holds the configuration required by the Builder.
|
||||||
|
type Config struct{}
|
||||||
|
|
||||||
|
// Builder builds and maintains a view of the Lightning Network graph.
|
||||||
|
type Builder struct {
|
||||||
|
started atomic.Bool
|
||||||
|
stopped atomic.Bool
|
||||||
|
|
||||||
|
cfg *Config
|
||||||
|
|
||||||
|
quit chan struct{}
|
||||||
|
wg sync.WaitGroup
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewBuilder constructs a new Builder.
|
||||||
|
func NewBuilder(cfg *Config) (*Builder, error) {
|
||||||
|
return &Builder{
|
||||||
|
cfg: cfg,
|
||||||
|
quit: make(chan struct{}),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start launches all the goroutines the Builder requires to carry out its
|
||||||
|
// duties. If the builder has already been started, then this method is a noop.
|
||||||
|
func (b *Builder) Start() error {
|
||||||
|
if !b.started.CompareAndSwap(false, true) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info("Builder starting")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop signals to the Builder that it should halt all routines. This method
|
||||||
|
// will *block* until all goroutines have excited. If the builder has already
|
||||||
|
// stopped then this method will return immediately.
|
||||||
|
func (b *Builder) Stop() error {
|
||||||
|
if !b.stopped.CompareAndSwap(false, true) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info("Builder shutting down...")
|
||||||
|
defer log.Debug("Builder shutdown complete")
|
||||||
|
|
||||||
|
close(b.quit)
|
||||||
|
b.wg.Wait()
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
47
graph/log.go
Normal file
47
graph/log.go
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package graph
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/btcsuite/btclog"
|
||||||
|
"github.com/lightningnetwork/lnd/build"
|
||||||
|
)
|
||||||
|
|
||||||
|
// log is a logger that is initialized with no output filters. This means the
|
||||||
|
// package will not perform any logging by default until the caller requests
|
||||||
|
// it.
|
||||||
|
var log btclog.Logger
|
||||||
|
|
||||||
|
const Subsystem = "GRPH"
|
||||||
|
|
||||||
|
// The default amount of logging is none.
|
||||||
|
func init() {
|
||||||
|
UseLogger(build.NewSubLogger(Subsystem, nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
// DisableLog disables all library log output. Logging output is disabled by
|
||||||
|
// by default until UseLogger is called.
|
||||||
|
func DisableLog() {
|
||||||
|
UseLogger(btclog.Disabled)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UseLogger uses a specified Logger to output package logging info. This
|
||||||
|
// should be used in preference to SetLogWriter if the caller is also using
|
||||||
|
// btclog.
|
||||||
|
func UseLogger(logger btclog.Logger) {
|
||||||
|
log = logger
|
||||||
|
}
|
||||||
|
|
||||||
|
// logClosure is used to provide a closure over expensive logging operations so
|
||||||
|
// don't have to be performed when the logging level doesn't warrant it.
|
||||||
|
type logClosure func() string
|
||||||
|
|
||||||
|
// String invokes the underlying function and returns the result.
|
||||||
|
func (c logClosure) String() string {
|
||||||
|
return c()
|
||||||
|
}
|
||||||
|
|
||||||
|
// newLogClosure returns a new closure over a function that returns a string
|
||||||
|
// which itself provides a Stringer interface so that it can be used with the
|
||||||
|
// logging system.
|
||||||
|
func newLogClosure(c func() string) logClosure {
|
||||||
|
return logClosure(c)
|
||||||
|
}
|
2
log.go
2
log.go
@@ -18,6 +18,7 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/contractcourt"
|
"github.com/lightningnetwork/lnd/contractcourt"
|
||||||
"github.com/lightningnetwork/lnd/discovery"
|
"github.com/lightningnetwork/lnd/discovery"
|
||||||
"github.com/lightningnetwork/lnd/funding"
|
"github.com/lightningnetwork/lnd/funding"
|
||||||
|
"github.com/lightningnetwork/lnd/graph"
|
||||||
"github.com/lightningnetwork/lnd/healthcheck"
|
"github.com/lightningnetwork/lnd/healthcheck"
|
||||||
"github.com/lightningnetwork/lnd/htlcswitch"
|
"github.com/lightningnetwork/lnd/htlcswitch"
|
||||||
"github.com/lightningnetwork/lnd/invoices"
|
"github.com/lightningnetwork/lnd/invoices"
|
||||||
@@ -179,6 +180,7 @@ func SetupLoggers(root *build.RotatingLogWriter, interceptor signal.Interceptor)
|
|||||||
AddSubLogger(root, btcwallet.Subsystem, interceptor, btcwallet.UseLogger)
|
AddSubLogger(root, btcwallet.Subsystem, interceptor, btcwallet.UseLogger)
|
||||||
AddSubLogger(root, rpcwallet.Subsystem, interceptor, rpcwallet.UseLogger)
|
AddSubLogger(root, rpcwallet.Subsystem, interceptor, rpcwallet.UseLogger)
|
||||||
AddSubLogger(root, peersrpc.Subsystem, interceptor, peersrpc.UseLogger)
|
AddSubLogger(root, peersrpc.Subsystem, interceptor, peersrpc.UseLogger)
|
||||||
|
AddSubLogger(root, graph.Subsystem, interceptor, graph.UseLogger)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddSubLogger is a helper method to conveniently create and register the
|
// AddSubLogger is a helper method to conveniently create and register the
|
||||||
|
14
server.go
14
server.go
@@ -41,6 +41,7 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/feature"
|
"github.com/lightningnetwork/lnd/feature"
|
||||||
"github.com/lightningnetwork/lnd/fn"
|
"github.com/lightningnetwork/lnd/fn"
|
||||||
"github.com/lightningnetwork/lnd/funding"
|
"github.com/lightningnetwork/lnd/funding"
|
||||||
|
"github.com/lightningnetwork/lnd/graph"
|
||||||
"github.com/lightningnetwork/lnd/healthcheck"
|
"github.com/lightningnetwork/lnd/healthcheck"
|
||||||
"github.com/lightningnetwork/lnd/htlcswitch"
|
"github.com/lightningnetwork/lnd/htlcswitch"
|
||||||
"github.com/lightningnetwork/lnd/htlcswitch/hop"
|
"github.com/lightningnetwork/lnd/htlcswitch/hop"
|
||||||
@@ -271,6 +272,8 @@ type server struct {
|
|||||||
|
|
||||||
missionControl *routing.MissionControl
|
missionControl *routing.MissionControl
|
||||||
|
|
||||||
|
graphBuilder *graph.Builder
|
||||||
|
|
||||||
chanRouter *routing.ChannelRouter
|
chanRouter *routing.ChannelRouter
|
||||||
|
|
||||||
controlTower routing.ControlTower
|
controlTower routing.ControlTower
|
||||||
@@ -973,6 +976,11 @@ func newServer(cfg *Config, listenAddrs []net.Addr,
|
|||||||
strictPruning := cfg.Bitcoin.Node == "neutrino" ||
|
strictPruning := cfg.Bitcoin.Node == "neutrino" ||
|
||||||
cfg.Routing.StrictZombiePruning
|
cfg.Routing.StrictZombiePruning
|
||||||
|
|
||||||
|
s.graphBuilder, err = graph.NewBuilder(&graph.Config{})
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("can't create graph builder: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
s.chanRouter, err = routing.New(routing.Config{
|
s.chanRouter, err = routing.New(routing.Config{
|
||||||
SelfNode: selfNode.PubKeyBytes,
|
SelfNode: selfNode.PubKeyBytes,
|
||||||
RoutingGraph: graphsession.NewRoutingGraph(chanGraph),
|
RoutingGraph: graphsession.NewRoutingGraph(chanGraph),
|
||||||
@@ -2019,6 +2027,12 @@ func (s *server) Start() error {
|
|||||||
}
|
}
|
||||||
cleanup = cleanup.add(s.authGossiper.Stop)
|
cleanup = cleanup.add(s.authGossiper.Stop)
|
||||||
|
|
||||||
|
if err := s.graphBuilder.Start(); err != nil {
|
||||||
|
startErr = err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
cleanup = cleanup.add(s.graphBuilder.Stop)
|
||||||
|
|
||||||
if err := s.chanRouter.Start(); err != nil {
|
if err := s.chanRouter.Start(); err != nil {
|
||||||
startErr = err
|
startErr = err
|
||||||
return
|
return
|
||||||
|
Reference in New Issue
Block a user