mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
migrate fix command
git-svn-id: https://weed-fs.googlecode.com/svn/trunk@63 282b0af5-e82d-9cf1-ede4-77906d7719d0
This commit is contained in:
parent
51860424a6
commit
3f1136c194
|
@ -10,7 +10,7 @@ import (
|
||||||
type Command struct {
|
type Command struct {
|
||||||
// Run runs the command.
|
// Run runs the command.
|
||||||
// The args are the arguments after the command name.
|
// The args are the arguments after the command name.
|
||||||
Run func(cmd *Command, args []string)
|
Run func(cmd *Command, args []string) bool
|
||||||
|
|
||||||
// UsageLine is the one-line usage message.
|
// UsageLine is the one-line usage message.
|
||||||
// The first word in the line is taken to be the command name.
|
// The first word in the line is taken to be the command name.
|
||||||
|
@ -25,9 +25,6 @@ type Command struct {
|
||||||
// Flag is a set of flags specific to this command.
|
// Flag is a set of flags specific to this command.
|
||||||
Flag flag.FlagSet
|
Flag flag.FlagSet
|
||||||
|
|
||||||
// CustomFlags indicates that the command will do its own
|
|
||||||
// flag parsing.
|
|
||||||
CustomFlags bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name returns the command's name: the first word in the usage line.
|
// Name returns the command's name: the first word in the usage line.
|
||||||
|
@ -41,8 +38,8 @@ func (c *Command) Name() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Command) Usage() {
|
func (c *Command) Usage() {
|
||||||
fmt.Fprintf(os.Stderr, "usage: %s\n\n", c.UsageLine)
|
fmt.Fprintf(os.Stderr, "Usage: %s\n", c.UsageLine)
|
||||||
fmt.Fprintf(os.Stderr, "%s\n", strings.TrimSpace(c.Long))
|
fmt.Fprintf(os.Stderr, " %s\n", strings.TrimSpace(c.Long))
|
||||||
os.Exit(2)
|
os.Exit(2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
69
weed-fs/src/cmd/weed/fix.go
Normal file
69
weed-fs/src/cmd/weed/fix.go
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"pkg/storage"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
cmdFix.Run = runFix // break init cycle
|
||||||
|
}
|
||||||
|
|
||||||
|
var cmdFix = &Command{
|
||||||
|
UsageLine: "fix -dir=/tmp -volumeId=234 -debug=1",
|
||||||
|
Short: "run weed tool fix on data file if corrupted",
|
||||||
|
Long: `Fix runs the WeedFS fix command on the .dat volume file.
|
||||||
|
|
||||||
|
`,
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
dir = cmdFix.Flag.String("dir", "/tmp", "data directory to store files")
|
||||||
|
volumeId = cmdFix.Flag.Int("volumeId", -1, "a non-negative volume id. The volume should already exist in the dir. The volume index file should not exist.")
|
||||||
|
IsDebug = cmdFix.Flag.Bool("debug", false, "enable debug mode")
|
||||||
|
|
||||||
|
store *storage.Store
|
||||||
|
)
|
||||||
|
|
||||||
|
func runFix(cmd *Command, args []string) bool {
|
||||||
|
|
||||||
|
if *volumeId == -1 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
fileName := strconv.Itoa(*volumeId)
|
||||||
|
dataFile, e := os.OpenFile(path.Join(*dir, fileName+".dat"), os.O_RDONLY, 0644)
|
||||||
|
if e != nil {
|
||||||
|
log.Fatalf("Read Volume [ERROR] %s\n", e)
|
||||||
|
}
|
||||||
|
defer dataFile.Close()
|
||||||
|
indexFile, ie := os.OpenFile(path.Join(*dir, fileName+".idx"), os.O_WRONLY|os.O_CREATE, 0644)
|
||||||
|
if ie != nil {
|
||||||
|
log.Fatalf("Create Volume Index [ERROR] %s\n", ie)
|
||||||
|
}
|
||||||
|
defer indexFile.Close()
|
||||||
|
|
||||||
|
//skip the volume super block
|
||||||
|
dataFile.Seek(storage.SuperBlockSize, 0)
|
||||||
|
|
||||||
|
n, length := storage.ReadNeedle(dataFile)
|
||||||
|
nm := storage.NewNeedleMap(indexFile)
|
||||||
|
offset := uint32(storage.SuperBlockSize)
|
||||||
|
for n != nil {
|
||||||
|
if *IsDebug {
|
||||||
|
log.Println("key", n.Key, "volume offset", offset, "data_size", n.Size, "length", length)
|
||||||
|
}
|
||||||
|
if n.Size > 0 {
|
||||||
|
count, pe := nm.Put(n.Key, offset/8, n.Size)
|
||||||
|
if *IsDebug {
|
||||||
|
log.Println("saved", count, "with error", pe)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
offset += length
|
||||||
|
n, length = storage.ReadNeedle(dataFile)
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
|
@ -1,7 +1,3 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -16,10 +12,11 @@ var cmdVersion = &Command{
|
||||||
Long: `Version prints the Weed File System version`,
|
Long: `Version prints the Weed File System version`,
|
||||||
}
|
}
|
||||||
|
|
||||||
func runVersion(cmd *Command, args []string) {
|
func runVersion(cmd *Command, args []string) bool{
|
||||||
if len(args) != 0 {
|
if len(args) != 0 {
|
||||||
cmd.Usage()
|
cmd.Usage()
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("version 0.15 %s %s\n",runtime.GOOS, runtime.GOARCH)
|
fmt.Printf("version 0.15 %s %s\n",runtime.GOOS, runtime.GOARCH)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var commands = []*Command{
|
var commands = []*Command{
|
||||||
|
cmdFix,
|
||||||
cmdVersion,
|
cmdVersion,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,13 +47,14 @@ func main() {
|
||||||
for _, cmd := range commands {
|
for _, cmd := range commands {
|
||||||
if cmd.Name() == args[0] && cmd.Run != nil {
|
if cmd.Name() == args[0] && cmd.Run != nil {
|
||||||
cmd.Flag.Usage = func() { cmd.Usage() }
|
cmd.Flag.Usage = func() { cmd.Usage() }
|
||||||
if cmd.CustomFlags {
|
cmd.Flag.Parse(args[1:])
|
||||||
args = args[1:]
|
args = cmd.Flag.Args()
|
||||||
} else {
|
if !cmd.Run(cmd, args) {
|
||||||
cmd.Flag.Parse(args[1:])
|
fmt.Fprintf(os.Stderr, "Default Parameters:\n")
|
||||||
args = cmd.Flag.Args()
|
cmd.Flag.PrintDefaults()
|
||||||
|
fmt.Fprintf(os.Stderr, "\n")
|
||||||
|
cmd.Flag.Usage()
|
||||||
}
|
}
|
||||||
cmd.Run(cmd, args)
|
|
||||||
exit()
|
exit()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -63,7 +65,7 @@ func main() {
|
||||||
exit()
|
exit()
|
||||||
}
|
}
|
||||||
|
|
||||||
var usageTemplate = `Go is a tool for managing Go source code.
|
var usageTemplate = `WeedFS is a software to store billions of files and serve them fast!
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
|
|
||||||
|
@ -83,9 +85,9 @@ Use "weed help [topic]" for more information about that topic.
|
||||||
|
|
||||||
`
|
`
|
||||||
|
|
||||||
var helpTemplate = `{{if .Runnable}}usage: weed {{.UsageLine}}
|
var helpTemplate = `{{if .Runnable}}Usage: weed {{.UsageLine}}
|
||||||
|
{{end}}
|
||||||
{{end}}{{.Long | trim}}
|
{{.Long}}
|
||||||
`
|
`
|
||||||
|
|
||||||
// tmpl executes the given template text on data, writing the result to w.
|
// tmpl executes the given template text on data, writing the result to w.
|
||||||
|
@ -154,16 +156,6 @@ func exit() {
|
||||||
os.Exit(exitStatus)
|
os.Exit(exitStatus)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fatalf(format string, args ...interface{}) {
|
|
||||||
errorf(format, args...)
|
|
||||||
exit()
|
|
||||||
}
|
|
||||||
|
|
||||||
func errorf(format string, args ...interface{}) {
|
|
||||||
log.Printf(format, args...)
|
|
||||||
setExitStatus(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
var logf = log.Printf
|
var logf = log.Printf
|
||||||
|
|
||||||
func exitIfErrors() {
|
func exitIfErrors() {
|
||||||
|
@ -171,20 +163,3 @@ func exitIfErrors() {
|
||||||
exit()
|
exit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// stringList's arguments should be a sequence of string or []string values.
|
|
||||||
// stringList flattens them into a single []string.
|
|
||||||
func stringList(args ...interface{}) []string {
|
|
||||||
var x []string
|
|
||||||
for _, arg := range args {
|
|
||||||
switch arg := arg.(type) {
|
|
||||||
case []string:
|
|
||||||
x = append(x, arg...)
|
|
||||||
case string:
|
|
||||||
x = append(x, arg)
|
|
||||||
default:
|
|
||||||
panic("stringList: invalid argument")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue