diff options
| author | Chris Lu <chris.lu@gmail.com> | 2013-02-10 03:25:35 -0800 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2013-02-10 03:25:35 -0800 |
| commit | ab6fb13ad795763ba7fc7c91696d2890be6da543 (patch) | |
| tree | 3d956452bdcef7ea4b50457faff07df06f8d4346 /weed/fix.go | |
| parent | 1b6f53cdac9a44370f67276ede138f5cde8806c2 (diff) | |
| download | seaweedfs-ab6fb13ad795763ba7fc7c91696d2890be6da543.tar.xz seaweedfs-ab6fb13ad795763ba7fc7c91696d2890be6da543.zip | |
avoid the "src" folder
Diffstat (limited to 'weed/fix.go')
| -rw-r--r-- | weed/fix.go | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/weed/fix.go b/weed/fix.go new file mode 100644 index 000000000..0a21965b7 --- /dev/null +++ b/weed/fix.go @@ -0,0 +1,64 @@ +package main + +import ( + "log" + "os" + "path" + "weed/storage" + "strconv" +) + +func init() { + cmdFix.Run = runFix // break init cycle + cmdFix.IsDebug = cmdFix.Flag.Bool("debug", false, "enable debug mode") +} + +var cmdFix = &Command{ + UsageLine: "fix -dir=/tmp -volumeId=234", + Short: "run weed tool fix on index file if corrupted", + Long: `Fix runs the WeedFS fix command to re-create the index .idx file. + + `, +} + +var ( + fixVolumePath = cmdFix.Flag.String("dir", "/tmp", "data directory to store files") + fixVolumeId = cmdFix.Flag.Int("volumeId", -1, "a volume id. The volume should already exist in the dir. The volume index file should not exist.") +) + +func runFix(cmd *Command, args []string) bool { + + if *fixVolumeId == -1 { + return false + } + + fileName := strconv.Itoa(*fixVolumeId) + indexFile, err := os.OpenFile(path.Join(*fixVolumePath, fileName+".idx"), os.O_WRONLY|os.O_CREATE, 0644) + if err != nil { + log.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, vid, func(superBlock storage.SuperBlock) error { + return nil + }, func(n *storage.Needle, offset uint32) error { + debug("key", n.Id, "offset", offset, "size", n.Size, "disk_size", n.DiskSize(), "gzip", n.IsGzipped()) + if n.Size > 0 { + count, pe := nm.Put(n.Id, offset/storage.NeedlePaddingSize, n.Size) + debug("saved", count, "with error", pe) + } else { + debug("skipping deleted file ...") + nm.Delete(n.Id) + } + return nil + }) + if err != nil { + log.Fatalf("Export Volume File [ERROR] %s\n", err) + } + + return true +} |
