func runCompact(cmd *Command, args []string) bool { if *compactVolumeId == -1 { return false } vid := storage.VolumeId(*compactVolumeId) v, err := storage.NewVolume(*compactVolumePath, *compactVolumeCollection, vid, storage.NeedleMapInMemory, nil) if err != nil { glog.Fatalf("Load Volume [ERROR] %s\n", err) } if err = v.Compact(); err != nil { glog.Fatalf("Compact Volume [ERROR] %s\n", err) } return true }
func setup(topologyLayout string) *Topology { var data interface{} err := json.Unmarshal([]byte(topologyLayout), &data) if err != nil { fmt.Println("error:", err) } fmt.Println("data:", data) //need to connect all nodes first before server adding volumes topo, err := NewTopology("weedfs", "/etc/weedfs/weedfs.conf", storage.NewCollectionSettings("000", "0.3"), sequence.NewMemorySequencer(), 32*1024, 5) if err != nil { panic("error: " + err.Error()) } mTopology := data.(map[string]interface{}) for dcKey, dcValue := range mTopology { dc := NewDataCenter(dcKey) dcMap := dcValue.(map[string]interface{}) topo.LinkChildNode(dc) for rackKey, rackValue := range dcMap { rack := NewRack(rackKey) rackMap := rackValue.(map[string]interface{}) dc.LinkChildNode(rack) for serverKey, serverValue := range rackMap { server := NewDataNode(serverKey) serverMap := serverValue.(map[string]interface{}) rack.LinkChildNode(server) for _, v := range serverMap["volumes"].([]interface{}) { m := v.(map[string]interface{}) vi := &storage.VolumeInfo{ Id: storage.VolumeId(int64(m["id"].(float64))), Size: uint64(m["size"].(float64)), Version: storage.CurrentVersion} server.AddOrUpdateVolume(vi) } server.UpAdjustMaxVolumeCountDelta(int(serverMap["limit"].(float64))) } } } return topo }
func runBackup(cmd *Command, args []string) bool { if *s.volumeId == -1 { return false } vid := storage.VolumeId(*s.volumeId) // find volume location, replication, ttl info lookup, err := operation.Lookup(*s.master, vid.String()) if err != nil { fmt.Printf("Error looking up volume %d: %v\n", vid, err) return true } volumeServer := lookup.Locations[0].Url stats, err := operation.GetVolumeSyncStatus(volumeServer, vid.String()) if err != nil { fmt.Printf("Error get volume %d status: %v\n", vid, err) return true } ttl, err := storage.ReadTTL(stats.Ttl) if err != nil { fmt.Printf("Error get volume %d ttl %s: %v\n", vid, stats.Ttl, err) return true } replication, err := storage.NewReplicaPlacementFromString(stats.Replication) if err != nil { fmt.Printf("Error get volume %d replication %s : %v\n", vid, stats.Replication, err) return true } v, err := storage.NewVolume(*s.dir, *s.collection, vid, storage.NeedleMapInMemory, replication, ttl) if err != nil { fmt.Printf("Error creating or reading from volume %d: %v\n", vid, err) return true } if err := v.Synchronize(volumeServer); err != nil { fmt.Printf("Error synchronizing volume %d: %v\n", vid, err) return true } return true }
func runFix(cmd *Command, args []string) bool { if *fixVolumeId == -1 { return false } fileName := strconv.Itoa(*fixVolumeId) if *fixVolumeCollection != "" { fileName = *fixVolumeCollection + "_" + fileName } indexFile, err := os.OpenFile(path.Join(*fixVolumePath, fileName+".idx"), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { glog.Fatalf("Create Volume Index [ERROR] %s\n", err) } defer indexFile.Close() nm := storage.NewNeedleMap(indexFile) defer nm.Close() vid := storage.VolumeId(*fixVolumeId) err = storage.ScanVolumeFile(*fixVolumePath, *fixVolumeCollection, vid, storage.NeedleMapInMemory, func(superBlock storage.SuperBlock) error { return nil }, false, func(n *storage.Needle, offset int64) error { glog.V(2).Infof("key %d offset %d size %d disk_size %d gzip %v", n.Id, offset, n.Size, n.DiskSize(), n.IsGzipped()) if n.Size > 0 { pe := nm.Put(n.Id, uint32(offset/storage.NeedlePaddingSize), n.Size) glog.V(2).Infof("saved %d with error %v", n.Size, pe) } else { glog.V(2).Infof("skipping deleted file ...") return nm.Delete(n.Id) } return nil }) if err != nil { glog.Fatalf("Export Volume File [ERROR] %s\n", err) } return true }
func runExport(cmd *Command, args []string) bool { var err error if *newer != "" { if newerThan, err = time.ParseInLocation(timeFormat, *newer, localLocation); err != nil { fmt.Println("cannot parse 'newer' argument: " + err.Error()) return false } newerThanUnix = newerThan.Unix() } if *export.volumeId == -1 { return false } if *output != "" { if *output != "-" && !strings.HasSuffix(*output, ".tar") { fmt.Println("the output file", *output, "should be '-' or end with .tar") return false } if fileNameTemplate, err = template.New("name").Parse(*format); err != nil { fmt.Println("cannot parse format " + *format + ": " + err.Error()) return false } var outputFile *os.File if *output == "-" { outputFile = os.Stdout } else { if outputFile, err = os.Create(*output); err != nil { glog.Fatalf("cannot open output tar %s: %s", *output, err) } } defer outputFile.Close() tarOutputFile = tar.NewWriter(outputFile) defer tarOutputFile.Close() t := time.Now() tarHeader = tar.Header{Mode: 0644, ModTime: t, Uid: os.Getuid(), Gid: os.Getgid(), Typeflag: tar.TypeReg, AccessTime: t, ChangeTime: t} } fileName := strconv.Itoa(*export.volumeId) if *export.collection != "" { fileName = *export.collection + "_" + fileName } vid := storage.VolumeId(*export.volumeId) indexFile, err := os.OpenFile(path.Join(*export.dir, fileName+".idx"), os.O_RDONLY, 0644) if err != nil { glog.Fatalf("Create Volume Index [ERROR] %s\n", err) } defer indexFile.Close() needleMap, err := storage.LoadNeedleMap(indexFile) if err != nil { glog.Fatalf("cannot load needle map from %s: %s", indexFile.Name(), err) } var version storage.Version err = storage.ScanVolumeFile(*export.dir, *export.collection, vid, storage.NeedleMapInMemory, func(superBlock storage.SuperBlock) error { version = superBlock.Version() return nil }, true, func(n *storage.Needle, offset int64) error { nv, ok := needleMap.Get(n.Id) glog.V(3).Infof("key %d offset %d size %d disk_size %d gzip %v ok %v nv %+v", n.Id, offset, n.Size, n.DiskSize(), n.IsGzipped(), ok, nv) if ok && nv.Size > 0 && int64(nv.Offset)*8 == offset { if newerThanUnix >= 0 && n.HasLastModifiedDate() && n.LastModified < uint64(newerThanUnix) { glog.V(3).Infof("Skipping this file, as it's old enough: LastModified %d vs %d", n.LastModified, newerThanUnix) return nil } return walker(vid, n, version) } if !ok { glog.V(2).Infof("This seems deleted %d size %d", n.Id, n.Size) } else { glog.V(2).Infof("Skipping later-updated Id %d size %d", n.Id, n.Size) } return nil }) if err != nil { glog.Fatalf("Export Volume File [ERROR] %s\n", err) } return true }