func do() error { if err := btrfs.CheckVersion(); err != nil { return err } shardNum := flag.Int("shard", -1, "Optional. The shard to service.") modulos := flag.Int("modulos", 4, "The total number of shards.") address := flag.String("address", "", "Optional. The address to advertise for this node.") flag.Parse() addrs, err := net.InterfaceAddrs() if err != nil { return err } if *address == "" { // No address, we'll try to use our ip addr instead for _, addr := range addrs { if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if ipnet.IP.To4() != nil { *address = ipnet.IP.String() break } } } } if *address == "" { return fmt.Errorf("pfs: Couldn't find machine ip.") } shard := storage.NewShard( "http://"+*address, fmt.Sprintf("data-%d-%d", *shardNum, *modulos), fmt.Sprintf("pipe-%d-%d", *shardNum, *modulos), uint64(*shardNum), uint64(*modulos), etcache.NewCache(), ) if *shardNum == -1 { go shard.FindRole() } else { if err := shard.EnsureRepos(); err != nil { return err } go shard.FillRole() } log.Print("Listening on port 80...") return http.ListenAndServe(":80", storage.NewShardHTTPHandler(shard)) }
func newCluster(t *testing.T, prefix string, shards int, testCache etcache.TestCache) *cluster { var res cluster for i := 0; i < shards; i++ { repoStr := fmt.Sprintf("%s-%d-%d", prefix, i, shards) s := storage.NewShard("", repoStr+"-data", repoStr+"-pipeline", uint64(i), uint64(shards), testCache) require.NoError(t, s.EnsureRepos()) server := httptest.NewServer(storage.NewShardHTTPHandler(s)) res.shards = append(res.shards, server) testCache.SpoofOne(fmt.Sprintf("/pfs/master/%d-%d", i, shards), server.URL) } var urls []string for _, server := range res.shards { urls = append(urls, server.URL) } testCache.SpoofMany("/pfs/master", urls, false) res.router = httptest.NewServer(NewRouter(uint64(shards), testCache).RouterMux()) return &res }