@@ -17,6 +17,13 @@ import (
1717)
1818
1919const (
20+ //the rollback step for the applyUpgrade function
21+ STEP1 = iota
22+ STEP2
23+ STEP3
24+ STEP4
25+ COMPLETED
26+
2027 assetName = "dtm-" + runtime .GOOS + "-" + runtime .GOARCH
2128 dtmTmpFileName = "dtm-tmp"
2229 dtmBakFileName = "dtm-bak"
@@ -137,30 +144,67 @@ func parseVersion(old, new string) (*semver.Version, *semver.Version, error) {
137144// (2) rename `dtm-tmp` to current dtm file name.
138145// (3) grant new dtm file execute permission.
139146// (4) remove `dtm-bak` binary file.
140- // TODO(hxcGit): Support for rollback in case of error in intermediate steps
147+
141148func applyUpgrade (workDir string ) error {
142149 dtmFilePath := filepath .Join (workDir , dtmFileName )
143150 dtmBakFilePath := filepath .Join (workDir , dtmBakFileName )
144151 dtmTmpFilePath := filepath .Join (workDir , dtmTmpFileName )
152+ updateProgress := STEP1
153+ defer func () {
154+ for ; updateProgress >= STEP1 ; updateProgress -- {
155+ switch updateProgress {
156+ //If the error occur when step 1 (rename dtmFileName to `dtm-bak`), delete `dtm-tmp`
157+ case STEP1 :
158+ if err := os .Remove (dtmTmpFilePath ); err != nil {
159+ log .Debugf ("Dtm upgrade rollback error: %s" , err .Error ())
160+ }
161+
162+ //the error occur in the step 2
163+ case STEP2 :
164+ if err := os .Rename (dtmBakFilePath , dtmFilePath ); err != nil {
165+ log .Debugf ("Dtm upgrade rollback error: %s" , err .Error ())
166+ }
167+
168+ //the error occur in the step 3
169+ case STEP3 :
170+ if err := os .Rename (dtmFilePath , dtmTmpFilePath ); err != nil {
171+ log .Debugf ("Dtm upgrade rollback error: %s" , err .Error ())
172+ }
173+
174+ //the error occur in the step 4
175+ case STEP4 :
176+ if err := os .Chmod (dtmFilePath , 0644 ); err != nil {
177+ log .Debugf ("Dtm upgrade rollback error: %s" , err .Error ())
178+ }
179+ case COMPLETED :
180+ //Successfully completed all step
181+ return
182+ }
183+ }
184+ }()
145185
146186 if err := os .Rename (dtmFilePath , dtmBakFilePath ); err != nil {
147187 return err
148188 }
189+ updateProgress ++
149190 log .Debugf ("Dtm upgrade: rename %s to dtm-bak successfully." , dtmFileName )
150191
151192 if err := os .Rename (dtmTmpFilePath , dtmFilePath ); err != nil {
152193 return err
153194 }
195+ updateProgress ++
154196 log .Debugf ("Dtm upgrade: rename dtm-tmp to %s successfully." , dtmFileName )
155197
156198 if err := os .Chmod (dtmFilePath , 0755 ); err != nil {
157199 return err
158200 }
201+ updateProgress ++
159202 log .Debugf ("Dtm upgrade: grant %s execute permission successfully." , dtmFileName )
160203
161204 if err := os .Remove (dtmBakFilePath ); err != nil {
162205 return err
163206 }
207+ updateProgress ++
164208 log .Debug ("Dtm upgrade: remove dtm-bak successfully." )
165209
166210 return nil
0 commit comments