aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--weed/operation/list_masters.go12
-rw-r--r--weed/server/filer_server.go11
-rw-r--r--weed/server/volume_grpc_client.go3
-rw-r--r--weed/storage/store.go37
4 files changed, 25 insertions, 38 deletions
diff --git a/weed/operation/list_masters.go b/weed/operation/list_masters.go
index 0a15b0af8..75838de4d 100644
--- a/weed/operation/list_masters.go
+++ b/weed/operation/list_masters.go
@@ -13,20 +13,20 @@ type ClusterStatusResult struct {
Peers []string `json:"Peers,omitempty"`
}
-func ListMasters(server string) ([]string, error) {
+func ListMasters(server string) (leader string, peers []string, err error) {
jsonBlob, err := util.Get("http://" + server + "/cluster/status")
glog.V(2).Info("list masters result :", string(jsonBlob))
if err != nil {
- return nil, err
+ return "", nil, err
}
var ret ClusterStatusResult
err = json.Unmarshal(jsonBlob, &ret)
if err != nil {
- return nil, err
+ return "", nil, err
}
- masters := ret.Peers
+ peers = ret.Peers
if ret.IsLeader {
- masters = append(masters, ret.Leader)
+ peers = append(peers, ret.Leader)
}
- return masters, nil
+ return ret.Leader, peers, nil
}
diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go
index 4a0b2103b..0601effed 100644
--- a/weed/server/filer_server.go
+++ b/weed/server/filer_server.go
@@ -117,17 +117,6 @@ func NewFilerServer(r *http.ServeMux, ip string, port int, master string, dir st
fs.masterNodes = storage.NewMasterNodes(fs.master)
glog.V(0).Infof("Filer server bootstraps with master %s", fs.getMasterNode())
- //force initialize with all available master nodes
- for {
- _, err := fs.masterNodes.FindMaster()
- if err != nil {
- glog.Infof("filer server failed to get master cluster info:%s", err.Error())
- time.Sleep(3 * time.Second)
- } else {
- break
- }
- }
-
for {
glog.V(4).Infof("Filer server sending to master %s", fs.getMasterNode())
master, err := fs.detectHealthyMaster(fs.getMasterNode())
diff --git a/weed/server/volume_grpc_client.go b/weed/server/volume_grpc_client.go
index ac3871c8c..d2d6f1a91 100644
--- a/weed/server/volume_grpc_client.go
+++ b/weed/server/volume_grpc_client.go
@@ -23,13 +23,14 @@ func (vs *VolumeServer) heartbeat() {
err := vs.doHeartbeat(time.Duration(vs.pulseSeconds) * time.Second)
if err != nil {
glog.V(0).Infof("heartbeat error: %v", err)
- time.Sleep(time.Duration(3*vs.pulseSeconds) * time.Second)
+ time.Sleep(time.Duration(vs.pulseSeconds) * time.Second)
}
}
}
func (vs *VolumeServer) doHeartbeat(sleepInterval time.Duration) error {
+ vs.masterNodes.Reset()
masterNode, err := vs.masterNodes.FindMaster()
if err != nil {
return fmt.Errorf("No master found: %v", err)
diff --git a/weed/storage/store.go b/weed/storage/store.go
index c62ac9ab7..ade323c2e 100644
--- a/weed/storage/store.go
+++ b/weed/storage/store.go
@@ -3,7 +3,6 @@ package storage
import (
"errors"
"fmt"
- "math/rand"
"strconv"
"strings"
@@ -17,49 +16,47 @@ const (
)
type MasterNodes struct {
- nodes []string
- lastNode int
+ nodes []string
+ leader string
}
func (mn *MasterNodes) String() string {
- return fmt.Sprintf("nodes:%v, lastNode:%d", mn.nodes, mn.lastNode)
+ return fmt.Sprintf("nodes:%v, leader:%s", mn.nodes, mn.leader)
}
func NewMasterNodes(bootstrapNode string) (mn *MasterNodes) {
- mn = &MasterNodes{nodes: []string{bootstrapNode}, lastNode: -1}
+ mn = &MasterNodes{nodes: []string{bootstrapNode}, leader: ""}
return
}
func (mn *MasterNodes) Reset() {
- glog.V(4).Infof("Resetting master nodes: %v", mn)
- if len(mn.nodes) > 1 && mn.lastNode >= 0 {
- glog.V(0).Infof("Reset master %s from: %v", mn.nodes[mn.lastNode], mn.nodes)
- mn.lastNode = -mn.lastNode - 1
+ if mn.leader != "" {
+ mn.leader = ""
+ glog.V(0).Infof("Resetting master nodes: %v", mn)
}
}
-func (mn *MasterNodes) FindMaster() (string, error) {
+func (mn *MasterNodes) FindMaster() (leader string, err error) {
if len(mn.nodes) == 0 {
return "", errors.New("No master node found!")
}
- if mn.lastNode < 0 {
+ if mn.leader == "" {
for _, m := range mn.nodes {
glog.V(4).Infof("Listing masters on %s", m)
- if masters, e := operation.ListMasters(m); e == nil {
- if len(masters) == 0 {
- continue
+ if leader, masters, e := operation.ListMasters(m); e == nil {
+ if leader != "" {
+ mn.nodes = append(masters, m)
+ mn.leader = leader
+ glog.V(2).Infof("current master nodes is %v", mn)
+ break
}
- mn.nodes = append(masters, m)
- mn.lastNode = rand.Intn(len(mn.nodes))
- glog.V(2).Infof("current master nodes is %v", mn)
- break
} else {
glog.V(4).Infof("Failed listing masters on %s: %v", m, e)
}
}
}
- if mn.lastNode < 0 {
+ if mn.leader == "" {
return "", errors.New("No master node available!")
}
- return mn.nodes[mn.lastNode], nil
+ return mn.leader, nil
}
/*