You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

86 lines
2.3 KiB

package shell
import (
"flag"
"fmt"
cp "github.com/otiai10/copy"
"github.com/seaweedfs/seaweedfs/weed/filer"
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
"github.com/seaweedfs/seaweedfs/weed/util"
"github.com/syndtr/goleveldb/leveldb"
"io"
)
func init() {
Commands = append(Commands, &commandFsMetaSnapshotsCreate{})
}
type commandFsMetaSnapshotsCreate struct {
}
func (c *commandFsMetaSnapshotsCreate) Name() string {
return "fs.meta.snapshots.create"
}
func (c *commandFsMetaSnapshotsCreate) Help() string {
return `create snapshots of meta data from given time range.
fs.meta.snapshots.create -s yyyy-mm-dd -e yyyy-mm-dd -o
//These snapshot maybe later used to backup the system to certain timestamp.
`
}
func (c *commandFsMetaSnapshotsCreate) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) {
db, err := leveldb.OpenFile("/root/go/repos/seaweedfs/weed/snapshots.db", nil)
if err != nil {
return err
}
defer db.Close()
fsMetaSnapshotsCreateCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError)
if err = fsMetaSnapshotsCreateCommand.Parse(args); err != nil {
return err
}
path := filer.SystemLogDir
count := 0
err = filer_pb.TraverseBfs(commandEnv, util.FullPath(path), func(parentPath util.FullPath, entry *filer_pb.Entry) {
if !entry.IsDirectory {
fmt.Println("%+v", entry)
err = db.Put([]byte(entry.GetName()), entry.Content, nil)
count++
if count%2 == 0 {
snapshotName := fmt.Sprintf("/root/go/repos/seaweedfs/weed/snapshots-%d.db", count/2)
e := cp.Copy("/root/go/repos/seaweedfs/weed/snapshots.db", snapshotName)
println(snapshotName)
if e != nil {
println("failed to generate " + snapshotName + e.Error())
}
}
}
})
verifying, err := leveldb.OpenFile("/root/go/repos/seaweedfs/weed/snapshots-1.db", nil)
if err != nil {
return err
}
iter := verifying.NewIterator(nil, nil)
for iter.Next() {
key := iter.Key()
fmt.Println("1 ---->")
fmt.Println(string(key))
}
verifying.Close()
verifying, err = leveldb.OpenFile("/root/go/repos/seaweedfs/weed/snapshots-4.db", nil)
if err != nil {
return err
}
iter = verifying.NewIterator(nil, nil)
for iter.Next() {
key := iter.Key()
fmt.Println("4 ---->")
fmt.Println(string(key))
}
verifying.Close()
return err
}