func runMount(cmd *Command, args []string) bool { fmt.Printf("This is Seaweed File System version %s %s %s\n", util.VERSION, runtime.GOOS, runtime.GOARCH) if *mountOptions.dir == "" { fmt.Printf("Please specify the mount directory via \"-dir\"") return false } c, err := fuse.Mount(*mountOptions.dir) if err != nil { glog.Fatal(err) return false } //信号处理 OnInterrupt(func() { fuse.Unmount(*mountOptions.dir) c.Close() }) err = fs.Serve(c, WFS{}) if err != nil { fuse.Unmount(*mountOptions.dir) } // check if the mount process has an error to report <-c.Ready //到此才完全成功 if err := c.MountError; err != nil { glog.Fatal(err) } return true }
func NewFilerServer(r *http.ServeMux, port int, master string, dir string, collection string) (fs *FilerServer, err error) { fs = &FilerServer{ master: master, collection: collection, port: ":" + strconv.Itoa(port), } if fs.filer, err = filer.NewFilerEmbedded(master, dir); err != nil { glog.Fatal("Can not start filer in dir", dir, ": ", err.Error()) return } r.HandleFunc("/admin/mv", fs.moveHandler) r.HandleFunc("/", fs.filerHandler) return fs, nil }
func runServer(cmd *Command, args []string) bool { if *serverOptions.cpuprofile != "" { f, err := os.Create(*serverOptions.cpuprofile) if err != nil { glog.Fatal(err) } //开启cpu profile pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } if *serverPublicIp == "" { if *serverIp == "" { *serverPublicIp = "localhost" } else { *serverPublicIp = *serverIp } } *filerOptions.master = *serverPublicIp + ":" + strconv.Itoa(*masterPort) if *filerOptions.defaultReplicaPlacement == "" { *filerOptions.defaultReplicaPlacement = *masterDefaultReplicaPlacement } if *serverMaxCpu < 1 { *serverMaxCpu = runtime.NumCPU() } runtime.GOMAXPROCS(*serverMaxCpu) folders := strings.Split(*volumeDataFolders, ",") maxCountStrings := strings.Split(*volumeMaxDataVolumeCounts, ",") maxCounts := make([]int, 0) for _, maxString := range maxCountStrings { if max, e := strconv.Atoi(maxString); e == nil { maxCounts = append(maxCounts, max) } else { glog.Fatalf("The max specified in -max not a valid number %s", maxString) } } if len(folders) != len(maxCounts) { glog.Fatalf("%d directories by -dir, but only %d max is set by -max", len(folders), len(maxCounts)) } for _, folder := range folders { if err := util.TestFolderWritable(folder); err != nil { glog.Fatalf("Check Data Folder(-dir) Writable %s : %s", folder, err) } } if *masterMetaFolder == "" { *masterMetaFolder = folders[0] } if *filerOptions.dir == "" { *filerOptions.dir = *masterMetaFolder + "/filer" os.MkdirAll(*filerOptions.dir, 0700) } if err := util.TestFolderWritable(*masterMetaFolder); err != nil { glog.Fatalf("Check Meta Folder (-mdir=\"%s\") Writable: %s", *masterMetaFolder, err) } if err := util.TestFolderWritable(*filerOptions.dir); err != nil { glog.Fatalf("Check Mapping Meta Folder (-filer.dir=\"%s\") Writable: %s", *filerOptions.dir, err) } if *serverWhiteListOption != "" { serverWhiteList = strings.Split(*serverWhiteListOption, ",") } //启用filer 翻译服务 即将weedfs的目录结构翻译成传统目录结构 if *isStartingFiler { go func() { r := http.NewServeMux() //r.HandleFunc("/admin/mv", fs.moveHandler) //r.HandleFunc("/", fs.filerHandler) _, nfs_err := weed_server.NewFilerServer(r, *filerOptions.port, *filerOptions.master, *filerOptions.dir, *filerOptions.collection) if nfs_err != nil { glog.Fatalf(nfs_err.Error()) } 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(e.Error()) } if e := http.Serve(filerListener, r); e != nil { glog.Fatalf("Filer Fail to serve:%s", e.Error()) } }() } var raftWaitForMaster sync.WaitGroup var volumeWait sync.WaitGroup raftWaitForMaster.Add(1) volumeWait.Add(1) go func() { r := mux.NewRouter() ms := weed_server.NewMasterServer(r, *masterPort, *masterMetaFolder, *masterVolumeSizeLimitMB, *volumePulse, *masterConfFile, *masterDefaultReplicaPlacement, *serverGarbageThreshold, serverWhiteList, ) glog.V(0).Infoln("Start Seaweed Master", util.VERSION, "at", *serverIp+":"+strconv.Itoa(*masterPort)) masterListener, e := util.NewListener(*serverBindIp+":"+strconv.Itoa(*masterPort), time.Duration(*serverTimeout)*time.Second) if e != nil { glog.Fatalf(e.Error()) } //开启一个新的go程完成 RaftServer的启用 go func() { raftWaitForMaster.Wait() time.Sleep(100 * time.Millisecond) myAddress := *serverPublicIp + ":" + strconv.Itoa(*masterPort) var peers []string if *serverPeers != "" { peers = strings.Split(*serverPeers, ",") } raftServer := weed_server.NewRaftServer(r, peers, myAddress, *masterMetaFolder, ms.Topo, *volumePulse) ms.SetRaftServer(raftServer) volumeWait.Done() }() raftWaitForMaster.Done() if e := http.Serve(masterListener, r); e != nil { glog.Fatalf("Master Fail to serve:%s", e.Error()) } }() volumeWait.Wait() time.Sleep(100 * time.Millisecond) r := http.NewServeMux() volumeServer := weed_server.NewVolumeServer(r, *serverIp, *volumePort, *serverPublicIp, folders, maxCounts, *serverIp+":"+strconv.Itoa(*masterPort), *volumePulse, *serverDataCenter, *serverRack, serverWhiteList, *volumeFixJpgOrientation, ) glog.V(0).Infoln("Start Seaweed volume server", util.VERSION, "at", *serverIp+":"+strconv.Itoa(*volumePort)) volumeListener, e := util.NewListener( *serverBindIp+":"+strconv.Itoa(*volumePort), time.Duration(*serverTimeout)*time.Second, ) if e != nil { glog.Fatalf(e.Error()) } //信号处理 OnInterrupt(func() { volumeServer.Shutdown() pprof.StopCPUProfile() }) //开启一个volumeLister if e := http.Serve(volumeListener, r); e != nil { glog.Fatalf("Fail to serve:%s", e.Error()) } return true }