Browse Source

refactor command.go,server.go: add raftWrapper as context, totally get rid of reference in command.go

Xiang Li 12 years ago
parent
commit
255e14a5c4
2 changed files with 19 additions and 15 deletions
  1. 7 5
      command.go
  2. 12 10
      raft_server.go

+ 7 - 5
command.go

@@ -192,12 +192,12 @@ type JoinCommand struct {
 	EtcdURL     string `json:"etcdURL"`
 }
 
-func newJoinCommand() *JoinCommand {
+func newJoinCommand(version, name, raftUrl, etcdUrl string) *JoinCommand {
 	return &JoinCommand{
-		RaftVersion: r.version,
-		Name:        r.name,
-		RaftURL:     r.url,
-		EtcdURL:     e.url,
+		RaftVersion: version,
+		Name:        name,
+		RaftURL:     raftUrl,
+		EtcdURL:     etcdUrl,
 	}
 }
 
@@ -209,6 +209,7 @@ func (c *JoinCommand) CommandName() string {
 // Join a server to the cluster
 func (c *JoinCommand) Apply(server *raft.Server) (interface{}, error) {
 	s, _ := server.StateMachine().(*store.Store)
+	r, _ := server.Context().(*raftServer)
 
 	// check if the join command is from a previous machine, who lost all its previous log.
 	e, _ := s.Get(path.Join("/_etcd/machines", c.Name), false, false, server.CommitIndex(), server.Term())
@@ -263,6 +264,7 @@ func (c *RemoveCommand) CommandName() string {
 // Remove a server from the cluster
 func (c *RemoveCommand) Apply(server *raft.Server) (interface{}, error) {
 	s, _ := server.StateMachine().(*store.Store)
+	r, _ := server.Context().(*raftServer)
 
 	// remove machine in etcd storage
 	key := path.Join("_etcd/machines", c.Name)

+ 12 - 10
raft_server.go

@@ -35,13 +35,7 @@ func newRaftServer(name string, url string, listenHost string, tlsConf *TLSConfi
 	// Create transporter for raft
 	raftTransporter := newTransporter(tlsConf.Scheme, tlsConf.Client)
 
-	// Create raft server
-	server, err := raft.NewServer(name, dirPath, raftTransporter, etcdStore, nil, "")
-
-	check(err)
-
-	return &raftServer{
-		Server:     server,
+	raftWrapper := &raftServer{
 		version:    raftVersion,
 		name:       name,
 		url:        url,
@@ -62,6 +56,14 @@ func newRaftServer(name string, url string, listenHost string, tlsConf *TLSConfi
 			},
 		},
 	}
+
+	// Create raft server
+	server, err := raft.NewServer(name, dirPath, raftTransporter, etcdStore, raftWrapper, "")
+	check(err)
+
+	raftWrapper.Server = server
+
+	return raftWrapper
 }
 
 // Start the raft server
@@ -127,7 +129,7 @@ func (r *raftServer) ListenAndServe() {
 func startAsLeader() {
 	// leader need to join self as a peer
 	for {
-		_, err := r.Do(newJoinCommand())
+		_, err := r.Do(newJoinCommand(r.version, r.Name(), r.url, e.url))
 		if err == nil {
 			break
 		}
@@ -243,7 +245,7 @@ func joinByMachine(s *raft.Server, machine string, scheme string) error {
 		return fmt.Errorf("Unable to join: internal version mismatch, entire cluster must be running identical versions of etcd")
 	}
 
-	json.NewEncoder(&b).Encode(newJoinCommand())
+	json.NewEncoder(&b).Encode(newJoinCommand(r.version, r.Name(), r.url, e.url))
 
 	joinURL := url.URL{Host: machine, Scheme: scheme, Path: "/join"}
 
@@ -270,7 +272,7 @@ func joinByMachine(s *raft.Server, machine string, scheme string) error {
 				address := resp.Header.Get("Location")
 				debugf("Send Join Request to %s", address)
 
-				json.NewEncoder(&b).Encode(newJoinCommand())
+				json.NewEncoder(&b).Encode(newJoinCommand(r.version, r.Name(), r.url, e.url))
 
 				resp, req, err = t.Post(address, &b)