55 "strings"
66
77 "github.com/hashicorp/consul/consul/agent"
8+ "github.com/hashicorp/raft"
89 "github.com/hashicorp/serf/serf"
910)
1011
@@ -53,7 +54,7 @@ func (s *Server) lanEventHandler() {
5354 case serf .EventMemberUpdate : // Ignore
5455 case serf .EventQuery : // Ignore
5556 default :
56- s .logger .Printf ("[WARN] consul: unhandled LAN Serf Event: %#v" , e )
57+ s .logger .Printf ("[WARN] consul: Unhandled LAN Serf Event: %#v" , e )
5758 }
5859
5960 case <- s .shutdownCh :
@@ -77,7 +78,7 @@ func (s *Server) wanEventHandler() {
7778 case serf .EventUser :
7879 case serf .EventQuery : // Ignore
7980 default :
80- s .logger .Printf ("[WARN] consul: unhandled WAN Serf Event: %#v" , e )
81+ s .logger .Printf ("[WARN] consul: Unhandled WAN Serf Event: %#v" , e )
8182 }
8283
8384 case <- s .shutdownCh :
@@ -127,7 +128,7 @@ func (s *Server) localEvent(event serf.UserEvent) {
127128 }
128129 case isUserEvent (name ):
129130 event .Name = rawUserEventName (name )
130- s .logger .Printf ("[DEBUG] consul: user event: %s" , event .Name )
131+ s .logger .Printf ("[DEBUG] consul: User event: %s" , event .Name )
131132
132133 // Trigger the callback
133134 if s .config .UserEventHandler != nil {
@@ -145,12 +146,12 @@ func (s *Server) lanNodeJoin(me serf.MemberEvent) {
145146 if ! ok {
146147 continue
147148 }
148- s .logger .Printf ("[INFO] consul: adding LAN server %s" , parts )
149+ s .logger .Printf ("[INFO] consul: Adding LAN server %s" , parts )
149150
150151 // See if it's configured as part of our DC.
151152 if parts .Datacenter == s .config .Datacenter {
152153 s .localLock .Lock ()
153- s .localConsuls [parts .Addr .String ()] = parts
154+ s .localConsuls [raft . ServerAddress ( parts .Addr .String () )] = parts
154155 s .localLock .Unlock ()
155156 }
156157
@@ -166,10 +167,10 @@ func (s *Server) wanNodeJoin(me serf.MemberEvent) {
166167 for _ , m := range me .Members {
167168 ok , parts := agent .IsConsulServer (m )
168169 if ! ok {
169- s .logger .Printf ("[WARN] consul: non -server in WAN pool: %s" , m .Name )
170+ s .logger .Printf ("[WARN] consul: Non -server in WAN pool: %s" , m .Name )
170171 continue
171172 }
172- s .logger .Printf ("[INFO] consul: adding WAN server %s" , parts )
173+ s .logger .Printf ("[INFO] consul: Adding WAN server %s" , parts )
173174
174175 // Search for this node in our existing remotes.
175176 found := false
@@ -193,20 +194,20 @@ func (s *Server) wanNodeJoin(me serf.MemberEvent) {
193194
194195// maybeBootsrap is used to handle bootstrapping when a new consul server joins
195196func (s * Server ) maybeBootstrap () {
197+ // Bootstrap can only be done if there are no committed logs, remove our
198+ // expectations of bootstrapping. This is slightly cheaper than the full
199+ // check that BootstrapCluster will do, so this is a good pre-filter.
196200 index , err := s .raftStore .LastIndex ()
197201 if err != nil {
198- s .logger .Printf ("[ERR] consul: failed to read last raft index: %v" , err )
202+ s .logger .Printf ("[ERR] consul: Failed to read last raft index: %v" , err )
199203 return
200204 }
201-
202- // Bootstrap can only be done if there are no committed logs,
203- // remove our expectations of bootstrapping
204205 if index != 0 {
205206 s .config .BootstrapExpect = 0
206207 return
207208 }
208209
209- // Scan for all the known servers
210+ // Scan for all the known servers.
210211 members := s .serfLAN .Members ()
211212 addrs := make ([]string , 0 )
212213 for _ , member := range members {
@@ -230,18 +231,30 @@ func (s *Server) maybeBootstrap() {
230231 addrs = append (addrs , addr .String ())
231232 }
232233
233- // Skip if we haven't met the minimum expect count
234+ // Skip if we haven't met the minimum expect count.
234235 if len (addrs ) < s .config .BootstrapExpect {
235236 return
236237 }
237238
238- // Update the peer set
239- s .logger .Printf ("[INFO] consul: Attempting bootstrap with nodes: %v" , addrs )
240- if err := s .raft .SetPeers (addrs ).Error (); err != nil {
241- s .logger .Printf ("[ERR] consul: failed to bootstrap peers: %v" , err )
239+ // Attempt a live bootstrap!
240+ var configuration raft.Configuration
241+ for _ , addr := range addrs {
242+ // TODO (slackpad) - This will need to be updated once we support
243+ // node IDs.
244+ server := raft.Server {
245+ ID : raft .ServerID (addr ),
246+ Address : raft .ServerAddress (addr ),
247+ }
248+ configuration .Servers = append (configuration .Servers , server )
249+ }
250+ s .logger .Printf ("[INFO] consul: Found expected number of peers (%s), attempting to bootstrap cluster..." ,
251+ strings .Join (addrs , "," ))
252+ future := s .raft .BootstrapCluster (configuration )
253+ if err := future .Error (); err != nil {
254+ s .logger .Printf ("[ERR] consul: Failed to bootstrap cluster: %v" , err )
242255 }
243256
244- // Bootstrapping complete, don't enter this again
257+ // Bootstrapping complete, don't enter this again.
245258 s .config .BootstrapExpect = 0
246259}
247260
@@ -252,10 +265,10 @@ func (s *Server) lanNodeFailed(me serf.MemberEvent) {
252265 if ! ok {
253266 continue
254267 }
255- s .logger .Printf ("[INFO] consul: removing LAN server %s" , parts )
268+ s .logger .Printf ("[INFO] consul: Removing LAN server %s" , parts )
256269
257270 s .localLock .Lock ()
258- delete (s .localConsuls , parts .Addr .String ())
271+ delete (s .localConsuls , raft . ServerAddress ( parts .Addr .String () ))
259272 s .localLock .Unlock ()
260273 }
261274}
@@ -267,7 +280,7 @@ func (s *Server) wanNodeFailed(me serf.MemberEvent) {
267280 if ! ok {
268281 continue
269282 }
270- s .logger .Printf ("[INFO] consul: removing WAN server %s" , parts )
283+ s .logger .Printf ("[INFO] consul: Removing WAN server %s" , parts )
271284
272285 // Remove the server if known
273286 s .remoteLock .Lock ()
0 commit comments