@@ -41,17 +41,16 @@ func NewStateStore(logger logger.Logger, homeDir string, ssConfig config.StateSt
4141 if err != nil {
4242 return nil , err
4343 }
44+
4445 // Handle auto recovery for DB running with async mode
45- if ssConfig .DedicatedChangelog {
46- changelogPath := utils .GetChangelogPath (utils .GetStateStorePath (homeDir , ssConfig .Backend ))
47- if ssConfig .DBDirectory != "" {
48- changelogPath = utils .GetChangelogPath (ssConfig .DBDirectory )
49- }
50- err := RecoverStateStore (logger , changelogPath , stateStore )
51- if err != nil {
52- return nil , err
53- }
46+ changelogPath := utils .GetChangelogPath (utils .GetStateStorePath (homeDir , ssConfig .Backend ))
47+ if ssConfig .DBDirectory != "" {
48+ changelogPath = utils .GetChangelogPath (ssConfig .DBDirectory )
49+ }
50+ if err := RecoverStateStore (logger , changelogPath , stateStore ); err != nil {
51+ return nil , err
5452 }
53+
5554 // Start the pruning manager for DB
5655 pruningManager := pruning .NewPruningManager (logger , stateStore , int64 (ssConfig .KeepRecent ), int64 (ssConfig .PruneIntervalSeconds ))
5756 pruningManager .Start ()
@@ -62,9 +61,6 @@ func NewStateStore(logger logger.Logger, homeDir string, ssConfig config.StateSt
6261func RecoverStateStore (logger logger.Logger , changelogPath string , stateStore types.StateStore ) error {
6362 ssLatestVersion := stateStore .GetLatestVersion ()
6463 logger .Info (fmt .Sprintf ("Recovering from changelog %s with latest SS version %d" , changelogPath , ssLatestVersion ))
65- if ssLatestVersion <= 0 {
66- return nil
67- }
6864 streamHandler , err := changelog .NewStream (logger , changelogPath , changelog.Config {})
6965 if err != nil {
7066 return err
@@ -84,15 +80,20 @@ func RecoverStateStore(logger logger.Logger, changelogPath string, stateStore ty
8480 // Look backward to find where we should start replay from
8581 curVersion := lastEntry .Version
8682 curOffset := lastOffset
87- for curVersion > ssLatestVersion && curOffset > firstOffset {
88- curOffset --
89- curEntry , errRead := streamHandler .ReadAt (curOffset )
90- if errRead != nil {
91- return err
83+ if ssLatestVersion > 0 {
84+ for curVersion > ssLatestVersion && curOffset > firstOffset {
85+ curOffset --
86+ curEntry , errRead := streamHandler .ReadAt (curOffset )
87+ if errRead != nil {
88+ return err
89+ }
90+ curVersion = curEntry .Version
9291 }
93- curVersion = curEntry .Version
92+ } else {
93+ // Fresh store (or no applied versions) – start from the first offset
94+ curOffset = firstOffset
9495 }
95- // Replay from the offset where the offset where the version is larger than SS store latest version
96+ // Replay from the offset where the version is larger than SS store latest version
9697 targetStartOffset := curOffset
9798 logger .Info (fmt .Sprintf ("Start replaying changelog to recover StateStore from offset %d to %d" , targetStartOffset , lastOffset ))
9899 if targetStartOffset < lastOffset {
0 commit comments