aboutsummaryrefslogtreecommitdiff
path: root/weed/server/filer_server.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/server/filer_server.go')
-rw-r--r--weed/server/filer_server.go94
1 files changed, 12 insertions, 82 deletions
diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go
index 3e175e960..827971a0d 100644
--- a/weed/server/filer_server.go
+++ b/weed/server/filer_server.go
@@ -1,12 +1,8 @@
package weed_server
import (
- "math/rand"
"net/http"
"strconv"
- "sync"
- "time"
-
"github.com/chrislusf/seaweedfs/weed/filer2"
_ "github.com/chrislusf/seaweedfs/weed/filer2/cassandra"
_ "github.com/chrislusf/seaweedfs/weed/filer2/leveldb"
@@ -14,16 +10,13 @@ import (
_ "github.com/chrislusf/seaweedfs/weed/filer2/mysql"
_ "github.com/chrislusf/seaweedfs/weed/filer2/postgres"
_ "github.com/chrislusf/seaweedfs/weed/filer2/redis"
- "github.com/chrislusf/seaweedfs/weed/glog"
"github.com/chrislusf/seaweedfs/weed/security"
- "github.com/chrislusf/seaweedfs/weed/storage"
- "github.com/chrislusf/seaweedfs/weed/util"
+ "github.com/chrislusf/seaweedfs/weed/glog"
)
type FilerServer struct {
port string
- master string
- mnLock sync.RWMutex
+ masters []string
collection string
defaultReplication string
redirectOnRead bool
@@ -31,16 +24,15 @@ type FilerServer struct {
secret security.Secret
filer *filer2.Filer
maxMB int
- masterNodes *storage.MasterNodes
}
-func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, ip string, port int, master string, collection string,
+func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, ip string, port int, masters []string, collection string,
replication string, redirectOnRead bool, disableDirListing bool,
maxMB int,
secret string,
) (fs *FilerServer, err error) {
fs = &FilerServer{
- master: master,
+ masters: masters,
collection: collection,
defaultReplication: replication,
redirectOnRead: redirectOnRead,
@@ -48,7 +40,14 @@ func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, ip string, port int,
maxMB: maxMB,
port: ip + ":" + strconv.Itoa(port),
}
- fs.filer = filer2.NewFiler(master)
+
+ if len(masters) == 0 {
+ glog.Fatal("master list is required!")
+ }
+
+ fs.filer = filer2.NewFiler(masters)
+
+ go fs.filer.KeepConnectedToMaster()
fs.filer.LoadConfiguration()
@@ -59,78 +58,9 @@ func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, ip string, port int,
readonlyMux.HandleFunc("/", fs.readonlyFilerHandler)
}
- go func() {
- connected := true
-
- fs.masterNodes = storage.NewMasterNodes(fs.master)
- glog.V(0).Infof("Filer server bootstraps with master %s", fs.getMasterNode())
-
- for {
- glog.V(4).Infof("Filer server sending to master %s", fs.getMasterNode())
- master, err := fs.detectHealthyMaster(fs.getMasterNode())
- if err == nil {
- if !connected {
- connected = true
- if fs.getMasterNode() != master {
- fs.setMasterNode(master)
- }
- glog.V(0).Infoln("Filer Server Connected with master at", master)
- }
- } else {
- glog.V(1).Infof("Filer Server Failed to talk with master %s: %v", fs.getMasterNode(), err)
- if connected {
- connected = false
- }
- }
- if connected {
- time.Sleep(time.Duration(float32(10*1e3)*(1+rand.Float32())) * time.Millisecond)
- } else {
- time.Sleep(time.Duration(float32(10*1e3)*0.25) * time.Millisecond)
- }
- }
- }()
-
return fs, nil
}
func (fs *FilerServer) jwt(fileId string) security.EncodedJwt {
return security.GenJwt(fs.secret, fileId)
}
-
-func (fs *FilerServer) getMasterNode() string {
- fs.mnLock.RLock()
- defer fs.mnLock.RUnlock()
- return fs.master
-}
-
-func (fs *FilerServer) setMasterNode(masterNode string) {
- fs.mnLock.Lock()
- defer fs.mnLock.Unlock()
- fs.master = masterNode
-}
-
-func (fs *FilerServer) detectHealthyMaster(masterNode string) (master string, e error) {
- if e = checkMaster(masterNode); e != nil {
- fs.masterNodes.Reset()
- for i := 0; i <= 3; i++ {
- master, e = fs.masterNodes.FindMaster()
- if e != nil {
- continue
- } else {
- if e = checkMaster(master); e == nil {
- break
- }
- }
- }
- } else {
- master = masterNode
- }
- return
-}
-
-func checkMaster(masterNode string) error {
- statUrl := "http://" + masterNode + "/stats/health"
- glog.V(4).Infof("Connecting to %s ...", statUrl)
- _, e := util.Get(statUrl)
- return e
-}