diff --git a/go/weed/weed_server/volume_server.go b/go/weed/weed_server/volume_server.go index 8846c4794..12010c454 100644 --- a/go/weed/weed_server/volume_server.go +++ b/go/weed/weed_server/volume_server.go @@ -4,6 +4,7 @@ import ( "math/rand" "net/http" "strconv" + "sync" "time" "github.com/chrislusf/weed-fs/go/glog" @@ -13,6 +14,7 @@ import ( type VolumeServer struct { masterNode string + mnLock sync.RWMutex pulseSeconds int dataCenter string rack string @@ -31,12 +33,12 @@ func NewVolumeServer(publicMux, adminMux *http.ServeMux, ip string, fixJpgOrientation bool) *VolumeServer { publicUrl := publicIp + ":" + strconv.Itoa(port) vs := &VolumeServer{ - masterNode: masterNode, pulseSeconds: pulseSeconds, dataCenter: dataCenter, rack: rack, FixJpgOrientation: fixJpgOrientation, } + vs.SetMasterNode(masterNode) vs.store = storage.NewStore(port, adminPort, ip, publicUrl, folders, maxCounts) vs.guard = security.NewGuard(whiteList, "") @@ -56,7 +58,8 @@ func NewVolumeServer(publicMux, adminMux *http.ServeMux, ip string, go func() { connected := true - vs.store.SetBootstrapMaster(vs.masterNode) + + vs.store.SetBootstrapMaster(vs.GetMasterNode()) vs.store.SetDataCenter(vs.dataCenter) vs.store.SetRack(vs.rack) for { @@ -64,8 +67,8 @@ func NewVolumeServer(publicMux, adminMux *http.ServeMux, ip string, if err == nil { if !connected { connected = true - vs.masterNode = master - glog.V(0).Infoln("Volume Server Connected with master at", master) + vs.SetMasterNode(master) + glog.V(0).Infoln("Volume Server Connected with master at", master, "and set it as masterNode") } } else { glog.V(4).Infoln("Volume Server Failed to talk with master:", err.Error()) @@ -84,6 +87,18 @@ func NewVolumeServer(publicMux, adminMux *http.ServeMux, ip string, return vs } +func (vs *VolumeServer) GetMasterNode() string { + vs.mnLock.RLock() + defer vs.mnLock.RUnlock() + return vs.masterNode +} + +func (vs *VolumeServer) SetMasterNode(masterNode string) { + vs.mnLock.Lock() + defer vs.mnLock.Unlock() + vs.masterNode = masterNode +} + func (vs *VolumeServer) Shutdown() { glog.V(0).Infoln("Shutting down volume server...") vs.store.Close() diff --git a/go/weed/weed_server/volume_server_handlers.go b/go/weed/weed_server/volume_server_handlers.go index 6b47ee84d..3d7b1758d 100644 --- a/go/weed/weed_server/volume_server_handlers.go +++ b/go/weed/weed_server/volume_server_handlers.go @@ -58,7 +58,7 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) glog.V(4).Infoln("volume", volumeId, "reading", n) if !vs.store.HasVolume(volumeId) { - lookupResult, err := operation.Lookup(vs.masterNode, volumeId.String()) + lookupResult, err := operation.Lookup(vs.GetMasterNode(), volumeId.String()) glog.V(2).Infoln("volume", volumeId, "found on", lookupResult, "error", err) if err == nil && len(lookupResult.Locations) > 0 { http.Redirect(w, r, "http://"+lookupResult.Locations[0].PublicUrl+r.URL.Path, http.StatusMovedPermanently) @@ -253,7 +253,7 @@ func (vs *VolumeServer) PostHandler(w http.ResponseWriter, r *http.Request) { } ret := operation.UploadResult{} - size, errorStatus := topology.ReplicatedWrite(vs.masterNode, vs.store, volumeId, needle, r) + size, errorStatus := topology.ReplicatedWrite(vs.GetMasterNode(), vs.store, volumeId, needle, r) httpStatus := http.StatusCreated if errorStatus != "" { httpStatus = http.StatusInternalServerError @@ -290,7 +290,7 @@ func (vs *VolumeServer) DeleteHandler(w http.ResponseWriter, r *http.Request) { } n.Size = 0 - ret := topology.ReplicatedDelete(vs.masterNode, vs.store, volumeId, n, r) + ret := topology.ReplicatedDelete(vs.GetMasterNode(), vs.store, volumeId, n, r) if ret != 0 { m := make(map[string]uint32)