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