@@ -17,6 +17,13 @@ import (
17
17
)
18
18
19
19
const (
20
+ //the rollback step for the applyUpgrade function
21
+ STEP1 = iota
22
+ STEP2
23
+ STEP3
24
+ STEP4
25
+ COMPLETED
26
+
20
27
assetName = "dtm-" + runtime .GOOS + "-" + runtime .GOARCH
21
28
dtmTmpFileName = "dtm-tmp"
22
29
dtmBakFileName = "dtm-bak"
@@ -137,30 +144,67 @@ func parseVersion(old, new string) (*semver.Version, *semver.Version, error) {
137
144
// (2) rename `dtm-tmp` to current dtm file name.
138
145
// (3) grant new dtm file execute permission.
139
146
// (4) remove `dtm-bak` binary file.
140
- // TODO(hxcGit): Support for rollback in case of error in intermediate steps
147
+
141
148
func applyUpgrade (workDir string ) error {
142
149
dtmFilePath := filepath .Join (workDir , dtmFileName )
143
150
dtmBakFilePath := filepath .Join (workDir , dtmBakFileName )
144
151
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
+ }()
145
185
146
186
if err := os .Rename (dtmFilePath , dtmBakFilePath ); err != nil {
147
187
return err
148
188
}
189
+ updateProgress ++
149
190
log .Debugf ("Dtm upgrade: rename %s to dtm-bak successfully." , dtmFileName )
150
191
151
192
if err := os .Rename (dtmTmpFilePath , dtmFilePath ); err != nil {
152
193
return err
153
194
}
195
+ updateProgress ++
154
196
log .Debugf ("Dtm upgrade: rename dtm-tmp to %s successfully." , dtmFileName )
155
197
156
198
if err := os .Chmod (dtmFilePath , 0755 ); err != nil {
157
199
return err
158
200
}
201
+ updateProgress ++
159
202
log .Debugf ("Dtm upgrade: grant %s execute permission successfully." , dtmFileName )
160
203
161
204
if err := os .Remove (dtmBakFilePath ); err != nil {
162
205
return err
163
206
}
207
+ updateProgress ++
164
208
log .Debug ("Dtm upgrade: remove dtm-bak successfully." )
165
209
166
210
return nil
0 commit comments