You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
3.0 KiB

13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
13 years ago
  1. package main
  2. import (
  3. "code.google.com/p/weed-fs/go/glog"
  4. "code.google.com/p/weed-fs/go/util"
  5. "code.google.com/p/weed-fs/go/weed/weed_server"
  6. "github.com/gorilla/mux"
  7. "net/http"
  8. "os"
  9. "runtime"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. func init() {
  15. cmdMaster.Run = runMaster // break init cycle
  16. }
  17. var cmdMaster = &Command{
  18. UsageLine: "master -port=9333",
  19. Short: "start a master server",
  20. Long: `start a master server to provide volume=>location mapping service
  21. and sequence number of file ids
  22. `,
  23. }
  24. var (
  25. mport = cmdMaster.Flag.Int("port", 9333, "http listen port")
  26. masterIp = cmdMaster.Flag.String("ip", "localhost", "master ip address")
  27. metaFolder = cmdMaster.Flag.String("mdir", os.TempDir(), "data directory to store meta data")
  28. masterPeers = cmdMaster.Flag.String("peers", "", "other master nodes in comma separated ip:port list")
  29. volumeSizeLimitMB = cmdMaster.Flag.Uint("volumeSizeLimitMB", 32*1000, "Default Volume Size in MegaBytes")
  30. mpulse = cmdMaster.Flag.Int("pulseSeconds", 5, "number of seconds between heartbeats")
  31. confFile = cmdMaster.Flag.String("conf", "/etc/weedfs/weedfs.conf", "xml configuration file")
  32. defaultReplicaPlacement = cmdMaster.Flag.String("defaultReplication", "000", "Default replication type if not specified.")
  33. mReadTimeout = cmdMaster.Flag.Int("readTimeout", 3, "connection read timeout in seconds")
  34. mMaxCpu = cmdMaster.Flag.Int("maxCpu", 0, "maximum number of CPUs. 0 means all available CPUs")
  35. garbageThreshold = cmdMaster.Flag.String("garbageThreshold", "0.3", "threshold to vacuum and reclaim spaces")
  36. masterWhiteListOption = cmdMaster.Flag.String("whiteList", "", "comma separated Ip addresses having write permission. No limit if empty.")
  37. masterWhiteList []string
  38. )
  39. func runMaster(cmd *Command, args []string) bool {
  40. if *mMaxCpu < 1 {
  41. *mMaxCpu = runtime.NumCPU()
  42. }
  43. runtime.GOMAXPROCS(*mMaxCpu)
  44. if err := util.TestFolderWritable(*metaFolder); err != nil {
  45. glog.Fatalf("Check Meta Folder (-mdir) Writable %s : %s", *metaFolder, err)
  46. }
  47. if *masterWhiteListOption != "" {
  48. masterWhiteList = strings.Split(*masterWhiteListOption, ",")
  49. }
  50. r := mux.NewRouter()
  51. ms := weed_server.NewMasterServer(r, VERSION, *mport, *metaFolder,
  52. *volumeSizeLimitMB, *mpulse, *confFile, *defaultReplicaPlacement, *garbageThreshold, masterWhiteList,
  53. )
  54. glog.V(0).Infoln("Start Weed Master", VERSION, "at port", *masterIp+":"+strconv.Itoa(*mport))
  55. srv := &http.Server{
  56. Addr: *masterIp + ":" + strconv.Itoa(*mport),
  57. Handler: r,
  58. ReadTimeout: time.Duration(*mReadTimeout) * time.Second,
  59. }
  60. go func() {
  61. time.Sleep(100 * time.Millisecond)
  62. var peers []string
  63. if *masterPeers != "" {
  64. peers = strings.Split(*masterPeers, ",")
  65. }
  66. raftServer := weed_server.NewRaftServer(r, VERSION, peers, *masterIp+":"+strconv.Itoa(*mport), *metaFolder)
  67. ms.SetRaftServer(raftServer)
  68. }()
  69. e := srv.ListenAndServe()
  70. if e != nil {
  71. glog.Fatalf("Fail to start:%s", e)
  72. }
  73. return true
  74. }