@@ -140,32 +140,38 @@ func getResponseData(data map[string]interface{}) map[string]interface{} {
140140}
141141
142142func 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 ()
162147
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+ }
166173 }
167174 }
168- return nil , errors .New ("async API job query timed out" )
169175}
170176
171177// NewAPIRequest makes an API request to configured management server
0 commit comments