|
|
@ -22,14 +22,13 @@ func init() { |
|
|
|
} |
|
|
|
|
|
|
|
var cmdFix = &Command{ |
|
|
|
UsageLine: "fix -path=/tmp [-volumeId=234] [-collection=bigData]", |
|
|
|
Short: "run weed tool fix to recreate index file(s) if corrupted", |
|
|
|
Long: `Fix runs the SeaweedFS fix command on dat files to re-create the index .idx file. |
|
|
|
UsageLine: "fix [-volumeId=234] [-collection=bigData] /tmp", |
|
|
|
Short: "run weed tool fix on files or whole folders to recreate index file(s) if corrupted", |
|
|
|
Long: `Fix runs the SeaweedFS fix command on dat files or whole folders to re-create the index .idx file. |
|
|
|
`, |
|
|
|
} |
|
|
|
|
|
|
|
var ( |
|
|
|
fixVolumePath = cmdFix.Flag.String("path", ".", "path to an individual .dat file or a folder of dat files") |
|
|
|
fixVolumeCollection = cmdFix.Flag.String("collection", "", "an optional volume collection name, if specified only it will be processed") |
|
|
|
fixVolumeId = cmdFix.Flag.Int64("volumeId", 0, "an optional volume id, if not 0 (default) only it will be processed") |
|
|
|
) |
|
|
@ -61,51 +60,52 @@ func (scanner *VolumeFileScanner4Fix) VisitNeedle(n *needle.Needle, offset int64 |
|
|
|
} |
|
|
|
|
|
|
|
func runFix(cmd *Command, args []string) bool { |
|
|
|
basePath, f := path.Split(util.ResolvePath(*fixVolumePath)) |
|
|
|
|
|
|
|
files := []fs.DirEntry{} |
|
|
|
if f == "" { |
|
|
|
fileInfo, err := os.ReadDir(basePath + f) |
|
|
|
if err != nil { |
|
|
|
fmt.Println(err) |
|
|
|
return false |
|
|
|
} |
|
|
|
files = fileInfo |
|
|
|
} else { |
|
|
|
fileInfo, err := os.Stat(basePath + f) |
|
|
|
if err != nil { |
|
|
|
fmt.Println(err) |
|
|
|
return false |
|
|
|
for _, arg := range args { |
|
|
|
basePath, f := path.Split(util.ResolvePath(arg)) |
|
|
|
|
|
|
|
files := []fs.DirEntry{} |
|
|
|
if f == "" { |
|
|
|
fileInfo, err := os.ReadDir(basePath) |
|
|
|
if err != nil { |
|
|
|
fmt.Println(err) |
|
|
|
return false |
|
|
|
} |
|
|
|
files = fileInfo |
|
|
|
} else { |
|
|
|
fileInfo, err := os.Stat(basePath + f) |
|
|
|
if err != nil { |
|
|
|
fmt.Println(err) |
|
|
|
return false |
|
|
|
} |
|
|
|
files = []fs.DirEntry{fs.FileInfoToDirEntry(fileInfo)} |
|
|
|
} |
|
|
|
files = []fs.DirEntry{fs.FileInfoToDirEntry(fileInfo)} |
|
|
|
} |
|
|
|
|
|
|
|
for _, file := range files { |
|
|
|
if !strings.HasSuffix(file.Name(), ".dat") { |
|
|
|
continue |
|
|
|
} |
|
|
|
if *fixVolumeCollection != "" { |
|
|
|
if !strings.HasPrefix(file.Name(), *fixVolumeCollection+"_") { |
|
|
|
for _, file := range files { |
|
|
|
if !strings.HasSuffix(file.Name(), ".dat") { |
|
|
|
continue |
|
|
|
} |
|
|
|
if *fixVolumeCollection != "" { |
|
|
|
if !strings.HasPrefix(file.Name(), *fixVolumeCollection+"_") { |
|
|
|
continue |
|
|
|
} |
|
|
|
} |
|
|
|
baseFileName := file.Name()[:len(file.Name())-4] |
|
|
|
collection, volumeIdStr := "", baseFileName |
|
|
|
if sepIndex := strings.LastIndex(baseFileName, "_"); sepIndex > 0 { |
|
|
|
collection = baseFileName[:sepIndex] |
|
|
|
volumeIdStr = baseFileName[sepIndex+1:] |
|
|
|
} |
|
|
|
volumeId, parseErr := strconv.ParseInt(volumeIdStr, 10, 64) |
|
|
|
if parseErr != nil { |
|
|
|
fmt.Printf("Failed to parse volume id from %s: %v\n", baseFileName, parseErr) |
|
|
|
return false |
|
|
|
} |
|
|
|
if *fixVolumeId != 0 && *fixVolumeId != volumeId { |
|
|
|
continue |
|
|
|
} |
|
|
|
doFixOneVolume(basePath, baseFileName, collection, volumeId) |
|
|
|
} |
|
|
|
baseFileName := file.Name()[:len(file.Name())-4] |
|
|
|
collection, volumeIdStr := "", baseFileName |
|
|
|
if sepIndex := strings.LastIndex(baseFileName, "_"); sepIndex > 0 { |
|
|
|
collection = baseFileName[:sepIndex] |
|
|
|
volumeIdStr = baseFileName[sepIndex+1:] |
|
|
|
} |
|
|
|
volumeId, parseErr := strconv.ParseInt(volumeIdStr, 10, 64) |
|
|
|
if parseErr != nil { |
|
|
|
fmt.Printf("Failed to parse volume id from %s: %v\n", baseFileName, parseErr) |
|
|
|
return false |
|
|
|
} |
|
|
|
if *fixVolumeId != 0 && *fixVolumeId != volumeId { |
|
|
|
continue |
|
|
|
} |
|
|
|
doFixOneVolume(basePath, baseFileName, collection, volumeId) |
|
|
|
} |
|
|
|
|
|
|
|
return true |
|
|
|
} |
|
|
|
|
|
|
|