|
| 1 | +package client |
| 2 | + |
| 3 | +import ( |
| 4 | + "github.com/crypto-org-chain/cronos/versiondb/tsrocksdb" |
| 5 | + "github.com/linxGnu/grocksdb" |
| 6 | + "github.com/spf13/cobra" |
| 7 | +) |
| 8 | + |
| 9 | +const ( |
| 10 | + FlagDryRun = "dry-run" |
| 11 | + FlagStore = "store-name" |
| 12 | +) |
| 13 | + |
| 14 | +func FixDataCmd(defaultStores []string) *cobra.Command { |
| 15 | + cmd := &cobra.Command{ |
| 16 | + Use: "fixdata <dir>", |
| 17 | + Args: cobra.ExactArgs(1), |
| 18 | + Short: "Fix wrong data in versiondb, see: https://github.com/crypto-org-chain/cronos/issues/1683", |
| 19 | + RunE: func(cmd *cobra.Command, args []string) error { |
| 20 | + dir := args[0] |
| 21 | + dryRun, err := cmd.Flags().GetBool(FlagDryRun) |
| 22 | + if err != nil { |
| 23 | + return err |
| 24 | + } |
| 25 | + stores, err := cmd.Flags().GetStringArray(FlagStore) |
| 26 | + if err != nil { |
| 27 | + return err |
| 28 | + } |
| 29 | + if len(stores) == 0 { |
| 30 | + stores = defaultStores |
| 31 | + } |
| 32 | + |
| 33 | + var ( |
| 34 | + db *grocksdb.DB |
| 35 | + cfHandle *grocksdb.ColumnFamilyHandle |
| 36 | + ) |
| 37 | + |
| 38 | + if dryRun { |
| 39 | + db, cfHandle, err = tsrocksdb.OpenVersionDBForReadOnly(dir, false) |
| 40 | + } else { |
| 41 | + db, cfHandle, err = tsrocksdb.OpenVersionDB(dir) |
| 42 | + } |
| 43 | + if err != nil { |
| 44 | + return err |
| 45 | + } |
| 46 | + |
| 47 | + versionDB := tsrocksdb.NewStoreWithDB(db, cfHandle) |
| 48 | + if err := versionDB.FixData(stores, dryRun); err != nil { |
| 49 | + return err |
| 50 | + } |
| 51 | + |
| 52 | + return nil |
| 53 | + }, |
| 54 | + } |
| 55 | + |
| 56 | + cmd.Flags().Bool(FlagDryRun, false, "Dry run, do not write to the database, open the database in read-only mode.") |
| 57 | + cmd.Flags().StringArray(FlagStore, []string{}, "Store names to fix, if not specified, all stores will be fixed.") |
| 58 | + return cmd |
| 59 | +} |
0 commit comments