@@ -135,32 +135,38 @@ func getResponseData(data map[string]interface{}) map[string]interface{} {
135
135
}
136
136
137
137
func pollAsyncJob (r * Request , jobID string ) (map [string ]interface {}, error ) {
138
- for timeout := float64 (r .Config .Core .Timeout ); timeout > 0.0 ; {
139
- startTime := time .Now ()
140
- spinner := r .Config .StartSpinner ("polling for async API result" )
141
- queryResult , queryError := NewAPIRequest (r , "queryAsyncJobResult" , []string {"jobid=" + jobID }, false )
142
- diff := time .Duration (1 * time .Second ).Nanoseconds () - time .Now ().Sub (startTime ).Nanoseconds ()
143
- if diff > 0 {
144
- time .Sleep (time .Duration (diff ) * time .Nanosecond )
145
- }
146
- timeout = timeout - time .Now ().Sub (startTime ).Seconds ()
147
- r .Config .StopSpinner (spinner )
148
- if queryError != nil {
149
- return queryResult , queryError
150
- }
151
- jobStatus := queryResult ["jobstatus" ].(float64 )
152
- if jobStatus == 0 {
153
- continue
154
- }
155
- if jobStatus == 1 {
156
- return queryResult ["jobresult" ].(map [string ]interface {}), nil
138
+ timeout := time .NewTimer (time .Duration (float64 (r .Config .Core .Timeout )) * time .Second )
139
+ ticker := time .NewTicker (time .Duration (2 * time .Second ))
140
+ defer ticker .Stop ()
141
+ defer timeout .Stop ()
157
142
158
- }
159
- if jobStatus == 2 {
160
- return queryResult , errors .New ("async API failed for job " + jobID )
143
+ spinner := r .Config .StartSpinner ("polling for async API result" )
144
+ defer r .Config .StopSpinner (spinner )
145
+
146
+ for {
147
+ select {
148
+ case <- timeout .C :
149
+ return nil , errors .New ("async API job query timed out" )
150
+
151
+ case <- ticker .C :
152
+ queryResult , queryError := NewAPIRequest (r , "queryAsyncJobResult" , []string {"jobid=" + jobID }, false )
153
+ if queryError != nil {
154
+ return queryResult , queryError
155
+ }
156
+ jobStatus := queryResult ["jobstatus" ].(float64 )
157
+
158
+ switch jobStatus {
159
+ case 0 :
160
+ continue
161
+
162
+ case 1 :
163
+ return queryResult ["jobresult" ].(map [string ]interface {}), nil
164
+
165
+ case 2 :
166
+ return queryResult , errors .New ("async API failed for job " + jobID )
167
+ }
161
168
}
162
169
}
163
- return nil , errors .New ("async API job query timed out" )
164
170
}
165
171
166
172
// NewAPIRequest makes an API request to configured management server
0 commit comments