89 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package fusenrender
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"log"
 | |
| 	"net"
 | |
| 	"os"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/hashicorp/raft"
 | |
| )
 | |
| 
 | |
| func main() {
 | |
| 
 | |
| }
 | |
| 
 | |
| func StartNode(ServerID string, RaftBind string, serverconfigs []*ConfigServer) *FsmQueue {
 | |
| 	fsm := NewQueueFSM(fmt.Sprintf("/tmp/fusenrender/%s", ServerID))
 | |
| 	var retainSnapshotCount = 2
 | |
| 	// var ServerID string = "fs1"
 | |
| 	// var RaftBind string = "localhost:5500"
 | |
| 	var RaftDir string = fmt.Sprintf("/tmp/raftdir/%s", ServerID)
 | |
| 
 | |
| 	// Setup Raft configuration.
 | |
| 	config := raft.DefaultConfig()
 | |
| 	config.LocalID = raft.ServerID(ServerID)
 | |
| 
 | |
| 	// Setup Raft communication.
 | |
| 	addr, err := net.ResolveTCPAddr("tcp", RaftBind)
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 	transport, err := raft.NewTCPTransport(RaftBind, addr, 3, 30*time.Second, os.Stderr)
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 
 | |
| 	// Create the snapshot store. This allows the Raft to truncate the log.
 | |
| 	snapshots, err := raft.NewFileSnapshotStore(RaftDir, retainSnapshotCount, os.Stderr)
 | |
| 	if err != nil {
 | |
| 		panic(fmt.Errorf("file snapshot store: %s", err))
 | |
| 	}
 | |
| 
 | |
| 	// Create the log store and stable store.
 | |
| 	logStore := raft.NewInmemStore()
 | |
| 	stableStore := raft.NewInmemStore()
 | |
| 
 | |
| 	// Create the Raft system.
 | |
| 	fsm.ra, err = raft.NewRaft(config, fsm, logStore, stableStore, snapshots, transport)
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 
 | |
| 	var dup map[string]bool = make(map[string]bool)
 | |
| 	var rserver []raft.Server = []raft.Server{
 | |
| 		{
 | |
| 			Suffrage: raft.Voter,
 | |
| 			ID:       config.LocalID,
 | |
| 			Address:  transport.LocalAddr(),
 | |
| 		},
 | |
| 	}
 | |
| 	dup[string(config.LocalID)] = true
 | |
| 
 | |
| 	for _, cfg := range serverconfigs {
 | |
| 
 | |
| 		if _, ok := dup[cfg.ServerID]; !ok {
 | |
| 			dup[cfg.ServerID] = true
 | |
| 			rserver = append(rserver, raft.Server{
 | |
| 				Suffrage: raft.Voter,
 | |
| 				ID:       raft.ServerID(cfg.ServerID),
 | |
| 				Address:  raft.ServerAddress(cfg.Address()),
 | |
| 			})
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	configuration := raft.Configuration{
 | |
| 		Servers: rserver,
 | |
| 	}
 | |
| 
 | |
| 	fu := fsm.ra.BootstrapCluster(configuration)
 | |
| 	if err := fu.Error(); err != nil {
 | |
| 		log.Println(err)
 | |
| 	}
 | |
| 
 | |
| 	waitForCluster(fsm.ra)
 | |
| 
 | |
| 	return fsm
 | |
| }
 |