mirror of https://github.com/hashicorp/consul
Move raft_protocol out of autopilot config
parent
0023454ccc
commit
950a9d2212
|
@ -264,9 +264,6 @@ type Telemetry struct {
|
||||||
|
|
||||||
// Autopilot is used to configure helpful features for operating Consul servers.
|
// Autopilot is used to configure helpful features for operating Consul servers.
|
||||||
type Autopilot struct {
|
type Autopilot struct {
|
||||||
// RaftProtocolVersion sets the Raft protocol version to use on this server.
|
|
||||||
RaftProtocolVersion int `mapstructure:"raft_protocol"`
|
|
||||||
|
|
||||||
// DeadServerCleanup enables the automatic cleanup of dead servers when new ones
|
// DeadServerCleanup enables the automatic cleanup of dead servers when new ones
|
||||||
// are added to the peer list. Defaults to true.
|
// are added to the peer list. Defaults to true.
|
||||||
DeadServerCleanup *bool `mapstructure:"dead_server_cleanup"`
|
DeadServerCleanup *bool `mapstructure:"dead_server_cleanup"`
|
||||||
|
@ -405,6 +402,9 @@ type Config struct {
|
||||||
// Protocol is the Consul protocol version to use.
|
// Protocol is the Consul protocol version to use.
|
||||||
Protocol int `mapstructure:"protocol"`
|
Protocol int `mapstructure:"protocol"`
|
||||||
|
|
||||||
|
// RaftProtocol sets the Raft protocol version to use on this server.
|
||||||
|
RaftProtocol int `mapstructure:"raft_protocol"`
|
||||||
|
|
||||||
// EnableDebug is used to enable various debugging features
|
// EnableDebug is used to enable various debugging features
|
||||||
EnableDebug bool `mapstructure:"enable_debug"`
|
EnableDebug bool `mapstructure:"enable_debug"`
|
||||||
|
|
||||||
|
@ -1299,6 +1299,9 @@ func MergeConfig(a, b *Config) *Config {
|
||||||
if b.Protocol > 0 {
|
if b.Protocol > 0 {
|
||||||
result.Protocol = b.Protocol
|
result.Protocol = b.Protocol
|
||||||
}
|
}
|
||||||
|
if b.RaftProtocol != 0 {
|
||||||
|
result.RaftProtocol = b.RaftProtocol
|
||||||
|
}
|
||||||
if b.NodeID != "" {
|
if b.NodeID != "" {
|
||||||
result.NodeID = b.NodeID
|
result.NodeID = b.NodeID
|
||||||
}
|
}
|
||||||
|
@ -1347,9 +1350,6 @@ func MergeConfig(a, b *Config) *Config {
|
||||||
if b.SkipLeaveOnInt != nil {
|
if b.SkipLeaveOnInt != nil {
|
||||||
result.SkipLeaveOnInt = b.SkipLeaveOnInt
|
result.SkipLeaveOnInt = b.SkipLeaveOnInt
|
||||||
}
|
}
|
||||||
if b.Autopilot.RaftProtocolVersion != 0 {
|
|
||||||
result.Autopilot.RaftProtocolVersion = b.Autopilot.RaftProtocolVersion
|
|
||||||
}
|
|
||||||
if b.Autopilot.DeadServerCleanup != nil {
|
if b.Autopilot.DeadServerCleanup != nil {
|
||||||
result.Autopilot.DeadServerCleanup = b.Autopilot.DeadServerCleanup
|
result.Autopilot.DeadServerCleanup = b.Autopilot.DeadServerCleanup
|
||||||
}
|
}
|
||||||
|
|
|
@ -285,6 +285,17 @@ func TestDecodeConfig(t *testing.T) {
|
||||||
t.Fatalf("bad: %#v", config)
|
t.Fatalf("bad: %#v", config)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// raft protocol
|
||||||
|
input = `{"raft_protocol": 3}`
|
||||||
|
config, err = DecodeConfig(bytes.NewReader([]byte(input)))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.RaftProtocol != 3 {
|
||||||
|
t.Fatalf("bad: %#v", config)
|
||||||
|
}
|
||||||
|
|
||||||
// Node metadata fields
|
// Node metadata fields
|
||||||
input = `{"node_meta": {"thing1": "1", "thing2": "2"}}`
|
input = `{"node_meta": {"thing1": "1", "thing2": "2"}}`
|
||||||
config, err = DecodeConfig(bytes.NewReader([]byte(input)))
|
config, err = DecodeConfig(bytes.NewReader([]byte(input)))
|
||||||
|
@ -1099,14 +1110,11 @@ func TestDecodeConfig_Performance(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDecodeConfig_Autopilot(t *testing.T) {
|
func TestDecodeConfig_Autopilot(t *testing.T) {
|
||||||
input := `{"autopilot": { "raft_protocol": 3, "dead_server_cleanup": true }}`
|
input := `{"autopilot": { "dead_server_cleanup": true }}`
|
||||||
config, err := DecodeConfig(bytes.NewReader([]byte(input)))
|
config, err := DecodeConfig(bytes.NewReader([]byte(input)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
if config.Autopilot.RaftProtocolVersion != 3 {
|
|
||||||
t.Fatalf("bad: raft_protocol isn't set: %#v", config)
|
|
||||||
}
|
|
||||||
if config.Autopilot.DeadServerCleanup == nil || !*config.Autopilot.DeadServerCleanup {
|
if config.Autopilot.DeadServerCleanup == nil || !*config.Autopilot.DeadServerCleanup {
|
||||||
t.Fatalf("bad: dead_server_cleanup isn't set: %#v", config)
|
t.Fatalf("bad: dead_server_cleanup isn't set: %#v", config)
|
||||||
}
|
}
|
||||||
|
@ -1633,8 +1641,8 @@ func TestMergeConfig(t *testing.T) {
|
||||||
Server: true,
|
Server: true,
|
||||||
LeaveOnTerm: Bool(true),
|
LeaveOnTerm: Bool(true),
|
||||||
SkipLeaveOnInt: Bool(true),
|
SkipLeaveOnInt: Bool(true),
|
||||||
|
RaftProtocol: 3,
|
||||||
Autopilot: Autopilot{
|
Autopilot: Autopilot{
|
||||||
RaftProtocolVersion: 3,
|
|
||||||
DeadServerCleanup: Bool(true),
|
DeadServerCleanup: Bool(true),
|
||||||
},
|
},
|
||||||
EnableDebug: true,
|
EnableDebug: true,
|
||||||
|
|
|
@ -366,8 +366,9 @@ func DefaultConfig() *Config {
|
||||||
conf.SerfLANConfig.MemberlistConfig.BindPort = DefaultLANSerfPort
|
conf.SerfLANConfig.MemberlistConfig.BindPort = DefaultLANSerfPort
|
||||||
conf.SerfWANConfig.MemberlistConfig.BindPort = DefaultWANSerfPort
|
conf.SerfWANConfig.MemberlistConfig.BindPort = DefaultWANSerfPort
|
||||||
|
|
||||||
// Enable interoperability with unversioned Raft library, and don't
|
// TODO: default to 3 in Consul 0.9
|
||||||
// start using new ID-based features yet.
|
// Use a transitional version of the raft protocol to interoperate with
|
||||||
|
// versions 1 and 3
|
||||||
conf.RaftConfig.ProtocolVersion = 2
|
conf.RaftConfig.ProtocolVersion = 2
|
||||||
conf.ScaleRaft(DefaultRaftMultiplier)
|
conf.ScaleRaft(DefaultRaftMultiplier)
|
||||||
|
|
||||||
|
|
|
@ -620,16 +620,17 @@ func (s *Server) removeConsulServer(m serf.Member, port int) error {
|
||||||
for _, server := range configFuture.Configuration().Servers {
|
for _, server := range configFuture.Configuration().Servers {
|
||||||
// If we understand the new add/remove APIs and the server was added by ID, use the new remove API
|
// If we understand the new add/remove APIs and the server was added by ID, use the new remove API
|
||||||
if minRaftProtocol >= 2 && server.ID == raft.ServerID(parts.ID) {
|
if minRaftProtocol >= 2 && server.ID == raft.ServerID(parts.ID) {
|
||||||
s.logger.Printf("[INFO] consul: removing server via new api, %q %q", server.ID, server.Address)
|
s.logger.Printf("[INFO] consul: removing server by ID: %q", server.ID)
|
||||||
future := s.raft.RemoveServer(raft.ServerID(parts.ID), 0, 0)
|
future := s.raft.RemoveServer(raft.ServerID(parts.ID), 0, 0)
|
||||||
if err := future.Error(); err != nil {
|
if err := future.Error(); err != nil {
|
||||||
s.logger.Printf("[ERR] consul: failed to remove raft peer '%v': %v",
|
s.logger.Printf("[ERR] consul: failed to remove raft peer '%v': %v",
|
||||||
addr, err)
|
server.ID, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
} else if server.Address == raft.ServerAddress(addr) {
|
} else if server.Address == raft.ServerAddress(addr) {
|
||||||
// If not, use the old remove API
|
// If not, use the old remove API
|
||||||
|
s.logger.Printf("[INFO] consul: removing server by address: %q", server.Address)
|
||||||
future := s.raft.RemovePeer(raft.ServerAddress(addr))
|
future := s.raft.RemovePeer(raft.ServerAddress(addr))
|
||||||
if err := future.Error(); err != nil {
|
if err := future.Error(); err != nil {
|
||||||
s.logger.Printf("[ERR] consul: failed to remove raft peer '%v': %v",
|
s.logger.Printf("[ERR] consul: failed to remove raft peer '%v': %v",
|
||||||
|
|
|
@ -112,6 +112,11 @@ func ServerMinRaftProtocol(members []serf.Member) (int, error) {
|
||||||
minVersion = raftVsn
|
minVersion = raftVsn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if minVersion == -1 {
|
||||||
|
return minVersion, fmt.Errorf("No servers found")
|
||||||
|
}
|
||||||
|
|
||||||
return minVersion, nil
|
return minVersion, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue