Skip to content

Commit e95ebc7

Browse files
authored
feat: support for rollback in case of error in intermediate steps (#1379)
* feat: support for rollback in case of error in intermediate steps Signed-off-by: 0zyt <[email protected]>
1 parent a40893f commit e95ebc7

File tree

1 file changed

+45
-1
lines changed

1 file changed

+45
-1
lines changed

internal/pkg/upgrade/upgrade.go

+45-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ import (
1717
)
1818

1919
const (
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+
141148
func 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

Comments
 (0)