api.go
func BootstrapCluster(conf *Config, logs LogStore, stable StableStore,
	snaps SnapshotStore, trans Transport, configuration Configuration) error {
	// Validate the Raft server config.
	if err := ValidateConfig(conf); err != nil {
		return err
	}

	// Sanity check the Raft peer configuration.
	if err := checkConfiguration(configuration); err != nil {
		return err
	}

	// Make sure the cluster is in a clean state.
	hasState, err := HasExistingState(logs, stable, snaps)
	if err != nil {
		return fmt.Errorf("failed to check for existing state: %v", err)
	}
	if hasState {
		return ErrCantBootstrap
	}

	// Set current term to 1.
	if err := stable.SetUint64(keyCurrentTerm, 1); err != nil {
		return fmt.Errorf("failed to save current term: %v", err)
	}

	// Append configuration entry to log.
	entry := &Log{
		Index: 1,
		Term:  1,
	}
	if conf.ProtocolVersion < 3 {
		entry.Type = LogRemovePeerDeprecated
		entry.Data = encodePeers(configuration, trans)
	} else {
		entry.Type = LogConfiguration
		entry.Data = encodeConfiguration(configuration)
	}
	if err := logs.StoreLog(entry); err != nil {
		return fmt.Errorf("failed to append configuration entry to log: %v", err)
	}

	return nil
}
func BootstrapCluster(conf *Config, logs LogStore, stable StableStore,
	snaps SnapshotStore, trans Transport, configuration Configuration) error {
	// Validate the Raft server config.
	if err := ValidateConfig(conf); err != nil {
		return err
	}

	// Sanity check the Raft peer configuration.
	if err := checkConfiguration(configuration); err != nil {
		return err
	}

	// Make sure the cluster is in a clean state.
	hasState, err := HasExistingState(logs, stable, snaps)
	if err != nil {
		return fmt.Errorf("failed to check for existing state: %v", err)
	}
	if hasState {
		return ErrCantBootstrap
	}

	// Set current term to 1.
	if err := stable.SetUint64(keyCurrentTerm, 1); err != nil {
		return fmt.Errorf("failed to save current term: %v", err)
	}

	// Append configuration entry to log.
	entry := &Log{
		Index: 1,
		Term:  1,
	}
	if conf.ProtocolVersion < 3 {
		entry.Type = LogRemovePeerDeprecated
		entry.Data = encodePeers(configuration, trans)
	} else {
		entry.Type = LogConfiguration
		entry.Data = encodeConfiguration(configuration)
	}
	if err := logs.StoreLog(entry); err != nil {
		return fmt.Errorf("failed to append configuration entry to log: %v", err)
	}

	return nil
}
func BootstrapCluster ( conf * Config , logs LogStore , stable StableStore , snaps SnapshotStore , trans Transport , configuration Configuration ) error { // Validate the Raft server config. if err := ValidateConfig ( conf ) ; err != nil { return err } // Sanity check the Raft peer configuration. if err := checkConfiguration ( configuration ) ; err != nil { return err } // Make sure the cluster is in a clean state. hasState , err := HasExistingState ( logs , stable , snaps ) if err != nil { return fmt . Errorf ( " " , err ) } if hasState { return ErrCantBootstrap } // Set current term to 1. if err := stable . SetUint64 ( keyCurrentTerm , 1 ) ; err != nil { return fmt . Errorf ( " " , err ) } // Append configuration entry to log. entry := & Log { Index : 1 , Term : 1 , } if conf . ProtocolVersion < 3 { entry . Type = LogRemovePeerDeprecated entry . Data = encodePeers ( configuration , trans ) } else { entry . Type = LogConfiguration entry . Data = encodeConfiguration ( configuration ) } if err := logs . StoreLog ( entry ) ; err != nil { return fmt . Errorf ( " " , err ) } return nil }
// BootstrapCluster initializes a server's storage with the given cluster
// configuration. This should only be called at the beginning of time for the
// cluster, and you absolutely must make sure that you call it with the same
// configuration on all the Voter servers. There is no need to bootstrap
// Nonvoter and Staging servers.
//
// One sane approach is to bootstrap a single server with a configuration
// listing just itself as a Voter, then invoke AddVoter() on it to add other
// servers to the cluster.
BootstrapCluster initializes a server s storage with the given cluster configuration . This should only be called at the beginning of time for the cluster and you absolutely must make sure that you call it with the same configuration on all the Voter servers . There is no need to bootstrap Nonvoter and Staging servers . One sane approach is to bootstrap a single server with a configuration listing just itself as a Voter then invoke AddVoter () on it to add other servers to the cluster .