Chris Lu
11 years ago
4 changed files with 138 additions and 35 deletions
@ -0,0 +1,79 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"code.google.com/p/weed-fs/go/glog" |
|||
"code.google.com/p/weed-fs/go/util" |
|||
"code.google.com/p/weed-fs/go/weed/weed_server" |
|||
"net/http" |
|||
"os" |
|||
"strconv" |
|||
"time" |
|||
) |
|||
|
|||
var ( |
|||
f FilerOptions |
|||
) |
|||
|
|||
type FilerOptions struct { |
|||
master *string |
|||
port *int |
|||
collection *string |
|||
defaultReplicaPlacement *string |
|||
dir *string |
|||
} |
|||
|
|||
func init() { |
|||
cmdFiler.Run = runFiler // break init cycle
|
|||
f.master = cmdFiler.Flag.String("master", "localhost:9333", "master server location") |
|||
f.collection = cmdFiler.Flag.String("collection", "", "all data will be stored in this collection") |
|||
f.port = cmdFiler.Flag.Int("port", 8888, "filer server http listen port") |
|||
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.") |
|||
} |
|||
|
|||
var cmdFiler = &Command{ |
|||
UsageLine: "filer -port=8888 -dir=/tmp -master=<ip:port>", |
|||
Short: "start a file server that points to a master server", |
|||
Long: `start a file server which accepts REST operation for any files. |
|||
|
|||
//create or overwrite the file, the directories /path/to will be automatically created
|
|||
POST /path/to/file |
|||
//get the file content
|
|||
GET /path/to/file |
|||
//create or overwrite the file, the filename in the multipart request will be used
|
|||
POST /path/to/ |
|||
//return a json format subdirectory and files listing
|
|||
GET /path/to/ |
|||
|
|||
Current <fullpath~fileid> mapping metadata store is local embedded leveldb. |
|||
It should be highly scalable to hundreds of millions of files on a modest machine. |
|||
|
|||
Future we will ensure it can avoid of being SPOF. |
|||
|
|||
`, |
|||
} |
|||
|
|||
func runFiler(cmd *Command, args []string) bool { |
|||
if err := util.TestFolderWritable(*f.dir); err != nil { |
|||
glog.Fatalf("Check Meta Folder (-dir) Writable %s : %s", *f.dir, err) |
|||
} |
|||
|
|||
r := http.NewServeMux() |
|||
_, nfs_err := weed_server.NewFilerServer(r, *f.port, *f.master, *f.dir, *f.collection) |
|||
if nfs_err != nil { |
|||
glog.Fatalf(nfs_err.Error()) |
|||
} |
|||
glog.V(0).Infoln("Start Weed Filer", util.VERSION, "at port", strconv.Itoa(*f.port)) |
|||
filerListener, e := util.NewListener( |
|||
":"+strconv.Itoa(*f.port), |
|||
time.Duration(10)*time.Second, |
|||
) |
|||
if e != nil { |
|||
glog.Fatalf(e.Error()) |
|||
} |
|||
if e := http.Serve(filerListener, r); e != nil { |
|||
glog.Fatalf("Filer Fail to serve:%s", e.Error()) |
|||
} |
|||
|
|||
return true |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue