@@ -14,6 +14,7 @@ import (
14
14
)
15
15
16
16
var ssStore types.StateStore
17
+ var dryRun = true
17
18
18
19
func ReplayChangelogCmd () * cobra.Command {
19
20
dumpDbCmd := & cobra.Command {
@@ -23,33 +24,49 @@ func ReplayChangelogCmd() *cobra.Command {
23
24
}
24
25
25
26
dumpDbCmd .PersistentFlags ().StringP ("db-dir" , "d" , "" , "Database Directory" )
26
- dumpDbCmd .PersistentFlags ().Int64P ("start-offset" , "s" , 0 , "From offset" )
27
- dumpDbCmd .PersistentFlags ().Int64P ("end-offset" , "e" , 1 , "End offset" )
27
+ dumpDbCmd .PersistentFlags ().Int64P ("start-offset" , "s" , 0 , "Start offset, default to earliest offset" )
28
+ dumpDbCmd .PersistentFlags ().Int64P ("end-offset" , "e" , 0 , "End offset, default to latest offset" )
28
29
dumpDbCmd .PersistentFlags ().Bool ("no-dry-run" , false , "Whether to dry run or re-apply the changelog to DB" )
29
30
30
31
return dumpDbCmd
31
32
}
32
33
33
34
func executeReplayChangelog (cmd * cobra.Command , _ []string ) {
34
35
dbDir , _ := cmd .Flags ().GetString ("db-dir" )
35
- start , _ := cmd .Flags ().GetInt64 ("start-offset" )
36
- end , _ := cmd .Flags ().GetInt64 ("end-offset" )
36
+ start , _ := cmd .Flags ().GetUint64 ("start-offset" )
37
+ end , _ := cmd .Flags ().GetUint64 ("end-offset" )
37
38
noDryRun , _ := cmd .Flags ().GetBool ("no-dry-run" )
38
39
if dbDir == "" {
39
40
panic ("Must provide database dir" )
40
41
}
41
42
42
- if start > end || start < 0 {
43
- panic ("Must provide a valid start/end offset" )
44
- }
45
43
logDir := filepath .Join (dbDir , "changelog" )
46
44
stream , err := changelog .NewStream (logger .NewNopLogger (), logDir , changelog.Config {})
47
45
if err != nil {
48
46
panic (err )
49
47
}
50
48
49
+ // use first available offset
50
+ if start <= 0 {
51
+ startOffset , err := stream .FirstOffset ()
52
+ if err != nil {
53
+ panic (err )
54
+ }
55
+ start = startOffset
56
+ }
57
+
58
+ if end <= 0 {
59
+ // use latest offset
60
+ endOffset , err := stream .LastOffset ()
61
+ if err != nil {
62
+ panic (err )
63
+ }
64
+ end = endOffset
65
+ }
66
+
51
67
// open the database if this is not a dry run
52
68
if noDryRun {
69
+ dryRun = false
53
70
ssConfig := config .DefaultStateStoreConfig ()
54
71
ssConfig .KeepRecent = 0
55
72
ssConfig .DBDirectory = dbDir
@@ -60,7 +77,7 @@ func executeReplayChangelog(cmd *cobra.Command, _ []string) {
60
77
}
61
78
62
79
// replay the changelog
63
- err = stream .Replay (uint64 ( start ), uint64 ( end ) , processChangelogEntry )
80
+ err = stream .Replay (start , end , processChangelogEntry )
64
81
if err != nil {
65
82
panic (err )
66
83
}
@@ -77,7 +94,9 @@ func processChangelogEntry(index uint64, entry proto.ChangelogEntry) error {
77
94
for _ , changeset := range entry .Changesets {
78
95
storeName := changeset .Name
79
96
for _ , kv := range changeset .Changeset .Pairs {
80
- fmt .Printf ("store: %s, key: %X\n " , storeName , kv .Key )
97
+ if dryRun {
98
+ fmt .Printf ("store: %s, key: %X\n " , storeName , kv .Key )
99
+ }
81
100
}
82
101
if ssStore != nil {
83
102
fmt .Printf ("Re-applied changeset for height %d\n " , entry .Version )
0 commit comments