95 lines
3.4 KiB

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", "", "master listening ip address, default to listen on all network interfaces")
  27. mPublicIp = cmdMaster.Flag.String("publicIp", "", "peer accessible <ip>|<server_name>")
  28. metaFolder = cmdMaster.Flag.String("mdir", os.TempDir(), "data directory to store meta data")
  29. masterPeers = cmdMaster.Flag.String("peers", "", "other master nodes in comma separated ip:port list")
  30. volumeSizeLimitMB = cmdMaster.Flag.Uint("volumeSizeLimitMB", 30*1000, "Master stops directing writes to oversized volumes.")
  31. mpulse = cmdMaster.Flag.Int("pulseSeconds", 5, "number of seconds between heartbeats")
  32. confFile = cmdMaster.Flag.String("conf", "/etc/weedfs/weedfs.conf", "xml configuration file")
  33. defaultReplicaPlacement = cmdMaster.Flag.String("defaultReplication", "000", "Default replication type if not specified.")
  34. mTimeout = cmdMaster.Flag.Int("idleTimeout", 10, "connection idle seconds")
  35. mMaxCpu = cmdMaster.Flag.Int("maxCpu", 0, "maximum number of CPUs. 0 means all available CPUs")
  36. garbageThreshold = cmdMaster.Flag.String("garbageThreshold", "0.3", "threshold to vacuum and reclaim spaces")
  37. masterWhiteListOption = cmdMaster.Flag.String("whiteList", "", "comma separated Ip addresses having write permission. No limit if empty.")
  38. masterWhiteList []string
  39. )
  40. func runMaster(cmd *Command, args []string) bool {
  41. if *mMaxCpu < 1 {
  42. *mMaxCpu = runtime.NumCPU()
  43. }
  44. runtime.GOMAXPROCS(*mMaxCpu)
  45. if err := util.TestFolderWritable(*metaFolder); err != nil {
  46. glog.Fatalf("Check Meta Folder (-mdir) Writable %s : %s", *metaFolder, err)
  47. }
  48. if *masterWhiteListOption != "" {
  49. masterWhiteList = strings.Split(*masterWhiteListOption, ",")
  50. }
  51. r := mux.NewRouter()
  52. ms := weed_server.NewMasterServer(r, *mport, *metaFolder,
  53. *volumeSizeLimitMB, *mpulse, *confFile, *defaultReplicaPlacement, *garbageThreshold, masterWhiteList,
  54. )
  55. listeningAddress := *masterIp + ":" + strconv.Itoa(*mport)
  56. glog.V(0).Infoln("Start Weed Master", util.VERSION, "at", listeningAddress)
  57. listener, e := util.NewListener(listeningAddress, time.Duration(*mTimeout)*time.Second)
  58. if e != nil {
  59. glog.Fatalf(e.Error())
  60. }
  61. go func() {
  62. time.Sleep(100 * time.Millisecond)
  63. if *mPublicIp == "" {
  64. if *masterIp == "" {
  65. *mPublicIp = "localhost"
  66. } else {
  67. *mPublicIp = *masterIp
  68. }
  69. }
  70. myPublicMasterAddress := *mPublicIp + ":" + strconv.Itoa(*mport)
  71. var peers []string
  72. if *masterPeers != "" {
  73. peers = strings.Split(*masterPeers, ",")
  74. }
  75. raftServer := weed_server.NewRaftServer(r, peers, myPublicMasterAddress, *metaFolder, ms.Topo, *mpulse)
  76. ms.SetRaftServer(raftServer)
  77. }()
  78. if e := http.Serve(listener, r); e != nil {
  79. glog.Fatalf("Fail to serve:%s", e.Error())
  80. }
  81. return true
  82. }