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)