aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2017-05-27 20:14:22 -0700
committerChris Lu <chris.lu@gmail.com>2017-05-27 20:14:22 -0700
commit478fe0ecf200243ab1f9002978a17627bc330630 (patch)
tree2645a1614f4df858fb231e68dfd310d741c24aed
parent7ecc0f4b11ab9dd860f7799881b024c0fbb5994c (diff)
downloadseaweedfs-478fe0ecf200243ab1f9002978a17627bc330630.tar.xz
seaweedfs-478fe0ecf200243ab1f9002978a17627bc330630.zip
filer add readonly public port
-rw-r--r--weed/command/filer.go50
-rw-r--r--weed/command/server.go29
-rw-r--r--weed/server/filer_server.go5
-rw-r--r--weed/server/filer_server_handlers.go9
4 files changed, 58 insertions, 35 deletions
diff --git a/weed/command/filer.go b/weed/command/filer.go
index 2e1c9d1dc..b90d88edc 100644
--- a/weed/command/filer.go
+++ b/weed/command/filer.go
@@ -19,6 +19,7 @@ type FilerOptions struct {
master *string
ip *string
port *int
+ publicPort *int
collection *string
defaultReplicaPlacement *string
dir *string
@@ -40,6 +41,7 @@ func init() {
f.collection = cmdFiler.Flag.String("collection", "", "all data will be stored in this collection")
f.ip = cmdFiler.Flag.String("ip", "", "filer server http listen ip address")
f.port = cmdFiler.Flag.Int("port", 8888, "filer server http listen port")
+ f.publicPort = cmdFiler.Flag.Int("port.public", 0, "port opened to public")
f.dir = cmdFiler.Flag.String("dir", os.TempDir(), "directory to store meta data")
f.defaultReplicaPlacement = cmdFiler.Flag.String("defaultReplicaPlacement", "000", "default replication type if not specified")
f.redirectOnRead = cmdFiler.Flag.Bool("redirectOnRead", false, "whether proxy or redirect to volume server during file GET request")
@@ -83,21 +85,50 @@ func runFiler(cmd *Command, args []string) bool {
glog.Fatalf("Check Meta Folder (-dir) Writable %s : %s", *f.dir, err)
}
+ f.start()
+
+ return true
+}
+
+func (fo *FilerOptions) start() {
+
defaultMux := http.NewServeMux()
- _, nfs_err := weed_server.NewFilerServer(defaultMux, *f.ip, *f.port, *f.master, *f.dir, *f.collection,
- *f.defaultReplicaPlacement, *f.redirectOnRead, *f.disableDirListing,
- *f.confFile,
- *f.maxMB,
- *f.secretKey,
- *f.cassandra_server, *f.cassandra_keyspace,
- *f.redis_server, *f.redis_password, *f.redis_database,
+ publicVolumeMux := defaultMux
+
+ if *fo.publicPort != 0 {
+ publicVolumeMux = http.NewServeMux()
+ }
+
+ _, nfs_err := weed_server.NewFilerServer(defaultMux, publicVolumeMux,
+ *fo.ip, *fo.port, *fo.master, *fo.dir, *fo.collection,
+ *fo.defaultReplicaPlacement, *fo.redirectOnRead, *fo.disableDirListing,
+ *fo.confFile,
+ *fo.maxMB,
+ *fo.secretKey,
+ *fo.cassandra_server, *fo.cassandra_keyspace,
+ *fo.redis_server, *fo.redis_password, *fo.redis_database,
)
if nfs_err != nil {
glog.Fatalf("Filer startup error: %v", nfs_err)
}
- glog.V(0).Infoln("Start Seaweed Filer", util.VERSION, "at port", strconv.Itoa(*f.port))
+
+ if *fo.publicPort != 0 {
+ publicListeningAddress := *fo.ip + ":" + strconv.Itoa(*fo.publicPort)
+ glog.V(0).Infoln("Start Seaweed filer server", util.VERSION, "public at", publicListeningAddress)
+ publicListener, e := util.NewListener(publicListeningAddress, 0)
+ if e != nil {
+ glog.Fatalf("Filer server public listener error on port %d:%v", *fo.publicPort, e)
+ }
+ go func() {
+ if e := http.Serve(publicListener, publicVolumeMux); e != nil {
+ glog.Fatalf("Volume server fail to serve public: %v", e)
+ }
+ }()
+ }
+
+ glog.V(0).Infoln("Start Seaweed Filer", util.VERSION, "at port", strconv.Itoa(*fo.port))
filerListener, e := util.NewListener(
- ":"+strconv.Itoa(*f.port),
+ ":"+strconv.Itoa(*fo.port),
time.Duration(10)*time.Second,
)
if e != nil {
@@ -107,5 +138,4 @@ func runFiler(cmd *Command, args []string) bool {
glog.Fatalf("Filer Fail to serve: %v", e)
}
- return true
}
diff --git a/weed/command/server.go b/weed/command/server.go
index ad6916b8f..0c5070981 100644
--- a/weed/command/server.go
+++ b/weed/command/server.go
@@ -87,6 +87,7 @@ func init() {
filerOptions.master = cmdServer.Flag.String("filer.master", "", "default to current master server")
filerOptions.collection = cmdServer.Flag.String("filer.collection", "", "all data will be stored in this collection")
filerOptions.port = cmdServer.Flag.Int("filer.port", 8888, "filer server http listen port")
+ filerOptions.publicPort = cmdServer.Flag.Int("filer.port.public", 0, "filer server public http listen port")
filerOptions.dir = cmdServer.Flag.String("filer.dir", "", "directory to store meta data, default to a 'filer' sub directory of what -dir is specified")
filerOptions.defaultReplicaPlacement = cmdServer.Flag.String("filer.defaultReplicaPlacement", "", "Default replication type if not specified during runtime.")
filerOptions.redirectOnRead = cmdServer.Flag.Bool("filer.redirectOnRead", false, "whether proxy or redirect to volume server during file GET request")
@@ -116,6 +117,7 @@ func runServer(cmd *Command, args []string) bool {
}
*filerOptions.master = *serverIp + ":" + strconv.Itoa(*masterPort)
+ filerOptions.ip = serverIp
if *filerOptions.defaultReplicaPlacement == "" {
*filerOptions.defaultReplicaPlacement = *masterDefaultReplicaPlacement
@@ -172,30 +174,9 @@ func runServer(cmd *Command, args []string) bool {
if *isStartingFiler {
go func() {
time.Sleep(1 * time.Second)
- r := http.NewServeMux()
- _, nfs_err := weed_server.NewFilerServer(r, *serverBindIp, *filerOptions.port, *filerOptions.master, *filerOptions.dir, *filerOptions.collection,
- *filerOptions.defaultReplicaPlacement,
- *filerOptions.redirectOnRead, *filerOptions.disableDirListing,
- *filerOptions.confFile,
- *filerOptions.maxMB,
- *filerOptions.secretKey,
- *filerOptions.cassandra_server, *filerOptions.cassandra_keyspace,
- *filerOptions.redis_server, *filerOptions.redis_password, *filerOptions.redis_database,
- )
- if nfs_err != nil {
- glog.Fatalf("Filer startup error: %v", nfs_err)
- }
- glog.V(0).Infoln("Start Seaweed Filer", util.VERSION, "at port", strconv.Itoa(*filerOptions.port))
- filerListener, e := util.NewListener(
- ":"+strconv.Itoa(*filerOptions.port),
- time.Duration(10)*time.Second,
- )
- if e != nil {
- glog.Fatalf("Filer listener error: %v", e)
- }
- if e := http.Serve(filerListener, r); e != nil {
- glog.Fatalf("Filer Fail to serve: %v", e)
- }
+
+ filerOptions.start()
+
}()
}
diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go
index 467545dfd..26b261087 100644
--- a/weed/server/filer_server.go
+++ b/weed/server/filer_server.go
@@ -57,7 +57,7 @@ type FilerServer struct {
masterNodes *storage.MasterNodes
}
-func NewFilerServer(defaultMux *http.ServeMux, ip string, port int, master string, dir string, collection string,
+func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, ip string, port int, master string, dir string, collection string,
replication string, redirectOnRead bool, disableDirListing bool,
confFile string,
maxMB int,
@@ -111,6 +111,9 @@ func NewFilerServer(defaultMux *http.ServeMux, ip string, port int, master strin
}
defaultMux.HandleFunc("/", fs.filerHandler)
+ if defaultMux != readonlyMux {
+ readonlyMux.HandleFunc("/", fs.readonlyFilerHandler)
+ }
go func() {
connected := true
diff --git a/weed/server/filer_server_handlers.go b/weed/server/filer_server_handlers.go
index 4e39258af..d76d7df8c 100644
--- a/weed/server/filer_server_handlers.go
+++ b/weed/server/filer_server_handlers.go
@@ -18,3 +18,12 @@ func (fs *FilerServer) filerHandler(w http.ResponseWriter, r *http.Request) {
fs.PostHandler(w, r)
}
}
+
+func (fs *FilerServer) readonlyFilerHandler(w http.ResponseWriter, r *http.Request) {
+ switch r.Method {
+ case "GET":
+ fs.GetOrHeadHandler(w, r, true)
+ case "HEAD":
+ fs.GetOrHeadHandler(w, r, false)
+ }
+}