mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-08-28 06:32:18 +02:00
lnd: integrate leader elector to lnd main
This commit also changes the order of DB init to be run after the RPC server is up. This will allow us to later add an RPC endpoint to be used to query leadership status.
This commit is contained in:
70
lnd.go
70
lnd.go
@@ -241,17 +241,6 @@ func Main(cfg *Config, lisCfg ListenerCfg, interceptor signal.Interceptor) error
|
||||
return err
|
||||
}
|
||||
|
||||
localChanDB, remoteChanDB, cleanUp, err := initializeDatabases(ctx, cfg)
|
||||
switch {
|
||||
case err == channeldb.ErrDryRunMigrationOK:
|
||||
ltndLog.Infof("%v, exiting", err)
|
||||
return nil
|
||||
case err != nil:
|
||||
return fmt.Errorf("unable to open databases: %v", err)
|
||||
}
|
||||
|
||||
defer cleanUp()
|
||||
|
||||
// Only process macaroons if --no-macaroons isn't set.
|
||||
serverOpts, restDialOpts, restListen, cleanUp, err := getTLSConfig(cfg)
|
||||
if err != nil {
|
||||
@@ -327,6 +316,65 @@ func Main(cfg *Config, lisCfg ListenerCfg, interceptor signal.Interceptor) error
|
||||
}
|
||||
}
|
||||
|
||||
// Start leader election if we're running on etcd. Continuation will be
|
||||
// blocked until this instance is elected as the current leader or
|
||||
// shutting down.
|
||||
elected := false
|
||||
if cfg.Cluster.EnableLeaderElection {
|
||||
electionCtx, cancelElection := context.WithCancel(ctx)
|
||||
|
||||
go func() {
|
||||
<-interceptor.ShutdownChannel()
|
||||
cancelElection()
|
||||
}()
|
||||
|
||||
ltndLog.Infof("Using %v leader elector",
|
||||
cfg.Cluster.LeaderElector)
|
||||
|
||||
leaderElector, err := cfg.Cluster.MakeLeaderElector(
|
||||
electionCtx, cfg.DB,
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if !elected {
|
||||
return
|
||||
}
|
||||
|
||||
ltndLog.Infof("Attempting to resign from leader role "+
|
||||
"(%v)", cfg.Cluster.ID)
|
||||
|
||||
if err := leaderElector.Resign(); err != nil {
|
||||
ltndLog.Errorf("Leader elector failed to "+
|
||||
"resign: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
ltndLog.Infof("Starting leadership campaign (%v)",
|
||||
cfg.Cluster.ID)
|
||||
|
||||
if err := leaderElector.Campaign(electionCtx); err != nil {
|
||||
ltndLog.Errorf("Leadership campaign failed: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
elected = true
|
||||
ltndLog.Infof("Elected as leader (%v)", cfg.Cluster.ID)
|
||||
}
|
||||
|
||||
localChanDB, remoteChanDB, cleanUp, err := initializeDatabases(ctx, cfg)
|
||||
switch {
|
||||
case err == channeldb.ErrDryRunMigrationOK:
|
||||
ltndLog.Infof("%v, exiting", err)
|
||||
return nil
|
||||
case err != nil:
|
||||
return fmt.Errorf("unable to open databases: %v", err)
|
||||
}
|
||||
|
||||
defer cleanUp()
|
||||
|
||||
// We'll create the WalletUnlockerService and check whether the wallet
|
||||
// already exists.
|
||||
pwService := createWalletUnlockerService(cfg)
|
||||
|
Reference in New Issue
Block a user