func runVolume(cmd *Command, args []string) bool { if *v.maxCpu < 1 { *v.maxCpu = runtime.NumCPU() } runtime.GOMAXPROCS(*v.maxCpu) //Set multiple folders and each folder's max volume count limit' v.folders = strings.Split(*volumeFolders, ",") maxCountStrings := strings.Split(*maxVolumeCounts, ",") for _, maxString := range maxCountStrings { if max, e := strconv.Atoi(maxString); e == nil { v.folderMaxLimits = append(v.folderMaxLimits, max) } else { glog.Fatalf("The max specified in -max not a valid number %s", maxString) } } if len(v.folders) != len(v.folderMaxLimits) { glog.Fatalf("%d directories by -dir, but only %d max is set by -max", len(v.folders), len(v.folderMaxLimits)) } for _, folder := range v.folders { if err := util.TestFolderWritable(folder); err != nil { glog.Fatalf("Check Data Folder(-dir) Writable %s : %s", folder, err) } } //security related white list configuration if *volumeWhiteListOption != "" { v.whiteList = strings.Split(*volumeWhiteListOption, ",") } // if *v.ip == "" { // *v.ip = "127.0.0.1" // } if *v.publicPort == 0 { *v.publicPort = *v.port } if *v.publicUrl == "" { *v.publicUrl = net.JoinHostPort(*v.ip, strconv.Itoa(*v.publicPort)) } isSeperatedPublicPort := *v.publicPort != *v.port volumeMux := http.NewServeMux() publicVolumeMux := volumeMux if isSeperatedPublicPort { publicVolumeMux = http.NewServeMux() } volumeNeedleMapKind := storage.NeedleMapInMemory switch *v.indexType { case "leveldb": volumeNeedleMapKind = storage.NeedleMapLevelDb case "boltdb": volumeNeedleMapKind = storage.NeedleMapBoltDb } volumeServer := weedserver.NewVolumeServer(volumeMux, publicVolumeMux, *v.ip, *v.port, *v.publicUrl, v.folders, v.folderMaxLimits, volumeNeedleMapKind, *v.master, *v.pulseSeconds, *v.dataCenter, *v.rack, v.whiteList, *v.fixJpgOrientation, *v.readRedirect, *v.readRemoteNeedle, ) listeningAddress := net.JoinHostPort(*v.bindIp, strconv.Itoa(*v.port)) glog.V(0).Infoln("Start Seaweed volume server", util.VERSION, "at", listeningAddress) listener, e := util.NewListener(listeningAddress, time.Duration(*v.idleConnectionTimeout)*time.Second) if e != nil { glog.Fatalf("Volume server listener error:%v", e) } if isSeperatedPublicPort { publicListeningAddress := net.JoinHostPort(*v.bindIp, strconv.Itoa(*v.publicPort)) glog.V(0).Infoln("Start Seaweed volume server", util.VERSION, "public at", publicListeningAddress) publicListener, e := util.NewListener(publicListeningAddress, time.Duration(*v.idleConnectionTimeout)*time.Second) if e != nil { glog.Fatalf("Volume server listener error:%v", e) } go func() { if e := http.Serve(publicListener, publicVolumeMux); e != nil { glog.Fatalf("Volume server fail to serve public: %v", e) } }() } OnInterrupt(func() { volumeServer.Shutdown() }) if e := http.Serve(listener, volumeMux); e != nil { glog.Fatalf("Volume server fail to serve: %v", e) } return true }
func runServer(cmd *Command, args []string) bool { filerOptions.secretKey = serverSecureKey if *serverOptions.cpuprofile != "" { f, err := os.Create(*serverOptions.cpuprofile) if err != nil { glog.Fatal(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } if *filerOptions.redirectOnRead { *isStartingFiler = true } *filerOptions.master = net.JoinHostPort(*serverIp, strconv.Itoa(*masterPort)) if *filerOptions.defaultReplicaPlacement == "" { *filerOptions.defaultReplicaPlacement = *masterDefaultReplicaPlacement } if *volumePublicPort == 0 { *volumePublicPort = *volumePort } if *serverMaxCpu < 1 { *serverMaxCpu = runtime.NumCPU() } runtime.GOMAXPROCS(*serverMaxCpu) folders := strings.Split(*volumeDataFolders, ",") maxCountStrings := strings.Split(*volumeMaxDataVolumeCounts, ",") var maxCounts []int 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 *isStartingFiler { if *filerOptions.dir == "" { *filerOptions.dir = *masterMetaFolder + "/filer" os.MkdirAll(*filerOptions.dir, 0700) } if err := util.TestFolderWritable(*filerOptions.dir); err != nil { glog.Fatalf("Check Mapping Meta Folder (-filer.dir=\"%s\") Writable: %s", *filerOptions.dir, err) } } if err := util.TestFolderWritable(*masterMetaFolder); err != nil { glog.Fatalf("Check Meta Folder (-mdir=\"%s\") Writable: %s", *masterMetaFolder, err) } if *serverWhiteListOption != "" { serverWhiteList = strings.Split(*serverWhiteListOption, ",") } if *isStartingFiler { go func() { r := http.NewServeMux() _, nfs_err := weedserver.NewFilerServer(r, *filerOptions.port, *filerOptions.master, *filerOptions.dir, *filerOptions.collection, *filerOptions.defaultReplicaPlacement, *filerOptions.redirectOnRead, *filerOptions.disableDirListing, *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) } }() } var raftWaitForMaster sync.WaitGroup var volumeWait sync.WaitGroup raftWaitForMaster.Add(1) volumeWait.Add(1) go func() { r := mux.NewRouter() ms := weedserver.NewMasterServer(r, *masterPort, *masterMetaFolder, *masterVolumeSizeLimitMB, *volumePulse, *masterConfFile, *masterDefaultReplicaPlacement, *serverGarbageThreshold, serverWhiteList, *serverSecureKey, ) glog.V(0).Infoln("Start Seaweed Master", util.VERSION, "at", net.JoinHostPort(*serverIp, strconv.Itoa(*masterPort))) masterListener, e := util.NewListener(net.JoinHostPort(*serverBindIp, strconv.Itoa(*masterPort)), time.Duration(*serverTimeout)*time.Second) if e != nil { glog.Fatalf("Master startup error: %v", e) } go func() { raftWaitForMaster.Wait() time.Sleep(100 * time.Millisecond) myAddress := net.JoinHostPort(*serverIp, strconv.Itoa(*masterPort)) var peers []string if *serverPeers != "" { peers = strings.Split(*serverPeers, ",") } raftServer := weedserver.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) if *volumePublicPort == 0 { *volumePublicPort = *volumePort } if *volumeServerPublicUrl == "" { *volumeServerPublicUrl = net.JoinHostPort(*serverIp, strconv.Itoa(*volumePublicPort)) } isSeperatedPublicPort := *volumePublicPort != *volumePort volumeMux := http.NewServeMux() publicVolumeMux := volumeMux if isSeperatedPublicPort { publicVolumeMux = http.NewServeMux() } volumeNeedleMapKind := storage.NeedleMapInMemory switch *volumeIndexType { case "leveldb": volumeNeedleMapKind = storage.NeedleMapLevelDb case "boltdb": volumeNeedleMapKind = storage.NeedleMapBoltDb } volumeServer := weedserver.NewVolumeServer(volumeMux, publicVolumeMux, *serverIp, *volumePort, *volumeServerPublicUrl, folders, maxCounts, volumeNeedleMapKind, net.JoinHostPort(*serverIp, strconv.Itoa(*masterPort)), *volumePulse, *serverDataCenter, *serverRack, serverWhiteList, *volumeFixJpgOrientation, *volumeReadRedirect, *volumeReadRemoteNeedle, ) glog.V(0).Infoln("Start Seaweed volume server", util.VERSION, "at", net.JoinHostPort(*serverIp, strconv.Itoa(*volumePort))) volumeListener, eListen := util.NewListener( net.JoinHostPort(*serverBindIp, strconv.Itoa(*volumePort)), time.Duration(*serverTimeout)*time.Second, ) if eListen != nil { glog.Fatalf("Volume server listener error: %v", eListen) } if isSeperatedPublicPort { publicListeningAddress := net.JoinHostPort(*serverIp, strconv.Itoa(*volumePublicPort)) glog.V(0).Infoln("Start Seaweed volume server", util.VERSION, "public at", publicListeningAddress) publicListener, e := util.NewListener(publicListeningAddress, time.Duration(*serverTimeout)*time.Second) if e != nil { glog.Fatalf("Volume server listener error:%v", e) } go func() { if e := http.Serve(publicListener, publicVolumeMux); e != nil { glog.Fatalf("Volume server fail to serve public: %v", e) } }() } OnInterrupt(func() { volumeServer.Shutdown() pprof.StopCPUProfile() }) if e := http.Serve(volumeListener, volumeMux); e != nil { glog.Fatalf("Volume server fail to serve:%v", e) } return true }