github.com/decred/dcrlnd@v0.7.6/lncfg/cluster.go (about) 1 package lncfg 2 3 import ( 4 "context" 5 "fmt" 6 "os" 7 8 "github.com/decred/dcrlnd/cluster" 9 ) 10 11 const ( 12 // DefaultEtcdElectionPrefix is used as election prefix if none is provided 13 // through the config. 14 DefaultEtcdElectionPrefix = "/leader/" 15 ) 16 17 // Cluster holds configuration for clustered LND. 18 type Cluster struct { 19 EnableLeaderElection bool `long:"enable-leader-election" description:"Enables leader election if set."` 20 21 LeaderElector string `long:"leader-elector" choice:"etcd" description:"Leader elector to use. Valid values: \"etcd\"."` 22 23 EtcdElectionPrefix string `long:"etcd-election-prefix" description:"Election key prefix when using etcd leader elector."` 24 25 ID string `long:"id" description:"Identifier for this node inside the cluster (used in leader election). Defaults to the hostname."` 26 27 LeaderSessionTTL int `long:"leader-session-ttl" description:"The TTL in seconds to use for the leader election session."` 28 } 29 30 // DefaultCluster creates and returns a new default DB config. 31 func DefaultCluster() *Cluster { 32 hostname, _ := os.Hostname() 33 return &Cluster{ 34 LeaderElector: cluster.EtcdLeaderElector, 35 EtcdElectionPrefix: DefaultEtcdElectionPrefix, 36 LeaderSessionTTL: 60, 37 ID: hostname, 38 } 39 } 40 41 // MakeLeaderElector is a helper method to construct the concrete leader elector 42 // based on the current configuration. 43 func (c *Cluster) MakeLeaderElector(electionCtx context.Context, db *DB) ( 44 cluster.LeaderElector, error) { 45 46 if c.LeaderElector == cluster.EtcdLeaderElector { 47 return cluster.MakeLeaderElector( 48 electionCtx, c.LeaderElector, c.ID, 49 c.EtcdElectionPrefix, c.LeaderSessionTTL, db.Etcd, 50 ) 51 } 52 53 return nil, fmt.Errorf("unsupported leader elector") 54 } 55 56 // Validate validates the Cluster config. 57 func (c *Cluster) Validate() error { 58 if !c.EnableLeaderElection { 59 return nil 60 } 61 62 switch c.LeaderElector { 63 64 case cluster.EtcdLeaderElector: 65 if c.EtcdElectionPrefix == "" { 66 return fmt.Errorf("etcd-election-prefix must be set") 67 } 68 return nil 69 70 default: 71 return fmt.Errorf("unknown leader elector, valid values are: "+ 72 "\"%v\"", cluster.EtcdLeaderElector) 73 } 74 } 75 76 // Compile-time constraint to ensure Workers implements the Validator interface. 77 var _ Validator = (*Cluster)(nil)