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

2 years ago
  1. package shell
  2. import (
  3. "flag"
  4. "fmt"
  5. cp "github.com/otiai10/copy"
  6. "github.com/seaweedfs/seaweedfs/weed/filer"
  7. "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
  8. "github.com/seaweedfs/seaweedfs/weed/util"
  9. "github.com/syndtr/goleveldb/leveldb"
  10. "io"
  11. )
  12. func init() {
  13. Commands = append(Commands, &commandFsMetaSnapshotsCreate{})
  14. }
  15. type commandFsMetaSnapshotsCreate struct {
  16. }
  17. func (c *commandFsMetaSnapshotsCreate) Name() string {
  18. return "fs.meta.snapshots.create"
  19. }
  20. func (c *commandFsMetaSnapshotsCreate) Help() string {
  21. return `create snapshots of meta data from given time range.
  22. fs.meta.snapshots.create -s yyyy-mm-dd -e yyyy-mm-dd -o
  23. //These snapshot maybe later used to backup the system to certain timestamp.
  24. `
  25. }
  26. func (c *commandFsMetaSnapshotsCreate) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) {
  27. db, err := leveldb.OpenFile("/root/go/repos/seaweedfs/weed/snapshots.db", nil)
  28. if err != nil {
  29. return err
  30. }
  31. defer db.Close()
  32. fsMetaSnapshotsCreateCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError)
  33. if err = fsMetaSnapshotsCreateCommand.Parse(args); err != nil {
  34. return err
  35. }
  36. path := filer.SystemLogDir
  37. count := 0
  38. err = filer_pb.TraverseBfs(commandEnv, util.FullPath(path), func(parentPath util.FullPath, entry *filer_pb.Entry) {
  39. if !entry.IsDirectory {
  40. fmt.Println("%+v", entry)
  41. err = db.Put([]byte(entry.GetName()), entry.Content, nil)
  42. count++
  43. if count%2 == 0 {
  44. snapshotName := fmt.Sprintf("/root/go/repos/seaweedfs/weed/snapshots-%d.db", count/2)
  45. e := cp.Copy("/root/go/repos/seaweedfs/weed/snapshots.db", snapshotName)
  46. println(snapshotName)
  47. if e != nil {
  48. println("failed to generate " + snapshotName + e.Error())
  49. }
  50. }
  51. }
  52. })
  53. verifying, err := leveldb.OpenFile("/root/go/repos/seaweedfs/weed/snapshots-1.db", nil)
  54. if err != nil {
  55. return err
  56. }
  57. iter := verifying.NewIterator(nil, nil)
  58. for iter.Next() {
  59. key := iter.Key()
  60. fmt.Println("1 ---->")
  61. fmt.Println(string(key))
  62. }
  63. verifying.Close()
  64. verifying, err = leveldb.OpenFile("/root/go/repos/seaweedfs/weed/snapshots-4.db", nil)
  65. if err != nil {
  66. return err
  67. }
  68. iter = verifying.NewIterator(nil, nil)
  69. for iter.Next() {
  70. key := iter.Key()
  71. fmt.Println("4 ---->")
  72. fmt.Println(string(key))
  73. }
  74. verifying.Close()
  75. return err
  76. }