mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
Now works with a single file too
Parsing removed from doFixOneVolume Needle init removed from runFix
This commit is contained in:
parent
3b1dc85c6f
commit
fba1efb77a
|
@ -2,7 +2,7 @@ package command
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/fs"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -22,17 +22,16 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
var cmdFix = &Command{
|
var cmdFix = &Command{
|
||||||
UsageLine: "fix -dir=/tmp -volumeId=234",
|
UsageLine: "fix -path=/tmp [-volumeId=234] [-collection=bigData]",
|
||||||
Short: "run weed tool fix on index file if corrupted",
|
Short: "run weed tool fix to recreate index file(s) if corrupted",
|
||||||
Long: `Fix runs the SeaweedFS fix command to re-create the index .idx file.
|
Long: `Fix runs the SeaweedFS fix command on dat files to re-create the index .idx file.
|
||||||
|
|
||||||
`,
|
`,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
fixVolumePath = cmdFix.Flag.String("dir", ".", "data directory to store files")
|
fixVolumePath = cmdFix.Flag.String("path", ".", "path to an individual .dat file or a folder of dat files")
|
||||||
fixVolumeCollection = cmdFix.Flag.String("collection", "", "the volume collection name")
|
fixVolumeCollection = cmdFix.Flag.String("collection", "", "an optional volume collection name, if specified only it will be processed")
|
||||||
fixVolumeId = cmdFix.Flag.Int("volumeId", 0, "an optional volume id.")
|
fixVolumeId = cmdFix.Flag.Int64("volumeId", 0, "an optional volume id, if not 0 (default) only it will be processed")
|
||||||
)
|
)
|
||||||
|
|
||||||
type VolumeFileScanner4Fix struct {
|
type VolumeFileScanner4Fix struct {
|
||||||
|
@ -62,17 +61,23 @@ func (scanner *VolumeFileScanner4Fix) VisitNeedle(n *needle.Needle, offset int64
|
||||||
}
|
}
|
||||||
|
|
||||||
func runFix(cmd *Command, args []string) bool {
|
func runFix(cmd *Command, args []string) bool {
|
||||||
|
basePath, f := path.Split(util.ResolvePath(*fixVolumePath))
|
||||||
|
|
||||||
dir := util.ResolvePath(*fixVolumePath)
|
files := []fs.DirEntry{}
|
||||||
if *fixVolumeId != 0 {
|
if f == "" {
|
||||||
doFixOneVolume(dir, *fixVolumeCollection, needle.VolumeId(*fixVolumeId))
|
fileInfo, err := os.ReadDir(basePath + f)
|
||||||
return true
|
if err != nil {
|
||||||
}
|
fmt.Println(err)
|
||||||
|
return false
|
||||||
files, err := ioutil.ReadDir(dir)
|
}
|
||||||
if err != nil {
|
files = fileInfo
|
||||||
fmt.Println(err)
|
} else {
|
||||||
return false
|
fileInfo, err := os.Stat(basePath + f)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
files = []fs.DirEntry{fs.FileInfoToDirEntry(fileInfo)}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, file := range files {
|
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)
|
fmt.Printf("Failed to parse volume id from %s: %v\n", baseFileName, parseErr)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
doFixOneVolume(dir, collection, needle.VolumeId(volumeId))
|
if *fixVolumeId != 0 && *fixVolumeId != volumeId {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
doFixOneVolume(basePath, baseFileName, collection, volumeId)
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func doFixOneVolume(dir, collection string, volumeId needle.VolumeId) {
|
func doFixOneVolume(basepath string, baseFileName string, collection string, volumeId int64) {
|
||||||
|
|
||||||
baseFileName := strconv.Itoa(int(volumeId))
|
indexFileName := path.Join(basepath, baseFileName+".idx")
|
||||||
if collection != "" {
|
|
||||||
baseFileName = collection + "_" + baseFileName
|
|
||||||
}
|
|
||||||
|
|
||||||
indexFileName := path.Join(dir, baseFileName+".idx")
|
|
||||||
|
|
||||||
nm := needle_map.NewMemDb()
|
nm := needle_map.NewMemDb()
|
||||||
defer nm.Close()
|
defer nm.Close()
|
||||||
|
|
||||||
vid := needle.VolumeId(*fixVolumeId)
|
vid := needle.VolumeId(volumeId)
|
||||||
scanner := &VolumeFileScanner4Fix{
|
scanner := &VolumeFileScanner4Fix{
|
||||||
nm: nm,
|
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)
|
glog.Fatalf("scan .dat File: %v", err)
|
||||||
os.Remove(indexFileName)
|
os.Remove(indexFileName)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue