aboutsummaryrefslogtreecommitdiff
path: root/weed/command
diff options
context:
space:
mode:
Diffstat (limited to 'weed/command')
-rw-r--r--weed/command/fix.go59
1 files changed, 31 insertions, 28 deletions
diff --git a/weed/command/fix.go b/weed/command/fix.go
index 7b99c1d77..bff9416a0 100644
--- a/weed/command/fix.go
+++ b/weed/command/fix.go
@@ -2,7 +2,7 @@ package command
import (
"fmt"
- "io/ioutil"
+ "io/fs"
"os"
"path"
"strconv"
@@ -22,17 +22,16 @@ func init() {
}
var cmdFix = &Command{
- UsageLine: "fix -dir=/tmp -volumeId=234",
- Short: "run weed tool fix on index file if corrupted",
- Long: `Fix runs the SeaweedFS fix command to re-create the index .idx file.
-
+ 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.
`,
}
var (
- fixVolumePath = cmdFix.Flag.String("dir", ".", "data directory to store files")
- fixVolumeCollection = cmdFix.Flag.String("collection", "", "the volume collection name")
- fixVolumeId = cmdFix.Flag.Int("volumeId", 0, "an optional volume id.")
+ 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")
)
type VolumeFileScanner4Fix struct {
@@ -62,17 +61,23 @@ func (scanner *VolumeFileScanner4Fix) VisitNeedle(n *needle.Needle, offset int64
}
func runFix(cmd *Command, args []string) bool {
+ basePath, f := path.Split(util.ResolvePath(*fixVolumePath))
- dir := util.ResolvePath(*fixVolumePath)
- if *fixVolumeId != 0 {
- doFixOneVolume(dir, *fixVolumeCollection, needle.VolumeId(*fixVolumeId))
- return true
- }
-
- files, err := ioutil.ReadDir(dir)
- if err != nil {
- fmt.Println(err)
- return false
+ 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
+ }
+ files = []fs.DirEntry{fs.FileInfoToDirEntry(fileInfo)}
}
for _, file := range files {
@@ -95,30 +100,28 @@ func runFix(cmd *Command, args []string) bool {
fmt.Printf("Failed to parse volume id from %s: %v\n", baseFileName, parseErr)
return false
}
- doFixOneVolume(dir, collection, needle.VolumeId(volumeId))
+ if *fixVolumeId != 0 && *fixVolumeId != volumeId {
+ continue
+ }
+ doFixOneVolume(basePath, baseFileName, collection, volumeId)
}
return true
}
-func doFixOneVolume(dir, collection string, volumeId needle.VolumeId) {
-
- baseFileName := strconv.Itoa(int(volumeId))
- if collection != "" {
- baseFileName = collection + "_" + baseFileName
- }
+func doFixOneVolume(basepath string, baseFileName string, collection string, volumeId int64) {
- indexFileName := path.Join(dir, baseFileName+".idx")
+ indexFileName := path.Join(basepath, baseFileName+".idx")
nm := needle_map.NewMemDb()
defer nm.Close()
- vid := needle.VolumeId(*fixVolumeId)
+ vid := needle.VolumeId(volumeId)
scanner := &VolumeFileScanner4Fix{
nm: nm,
}
- if err := storage.ScanVolumeFile(dir, collection, vid, storage.NeedleMapInMemory, scanner); err != nil {
+ if err := storage.ScanVolumeFile(basepath, collection, vid, storage.NeedleMapInMemory, scanner); err != nil {
glog.Fatalf("scan .dat File: %v", err)
os.Remove(indexFileName)
}