()
| 150 | } |
| 151 | |
| 152 | func (info *RuntimeInfo) sendHTTPRequestLoop() { |
| 153 | needStop := false |
| 154 | defer func() { |
| 155 | if needStop { |
| 156 | info.stopRuntime() |
| 157 | } |
| 158 | }() |
| 159 | loop: |
| 160 | for { |
| 161 | select { |
| 162 | case request := <-info.httpRequestChan: |
| 163 | |
| 164 | httpreq := request.Request |
| 165 | reqLogger := request.Logger |
| 166 | requestInfo := info.loadRequest(request.RequestID) |
| 167 | if requestInfo != nil { |
| 168 | requestInfo.StepDone(StageSendRequest) |
| 169 | } |
| 170 | cancel := request.CtxCancel |
| 171 | retryDuration := httpRetryDuration |
| 172 | timer := time.NewTimer(info.retryDeadline) |
| 173 | RequestLoop: |
| 174 | for { |
| 175 | select { |
| 176 | case <-timer.C: |
| 177 | errMsg := fmt.Sprintf("%s Task timed out after %d seconds", requestInfo.RequestID, info.WaitRuntimeAliveTimeout) |
| 178 | m := innerErr.AwsErrorMessage{ |
| 179 | ErrorMessage: errMsg, |
| 180 | } |
| 181 | requestInfo.InvokeResult(StatusTimeout, m.String()) |
| 182 | requestInfo.Notify() |
| 183 | break RequestLoop |
| 184 | case <-requestInfo.TimeoutChannel: |
| 185 | // when request timeout, cancel the request |
| 186 | cancel() |
| 187 | break RequestLoop |
| 188 | default: |
| 189 | invokeStart := time.Now().UnixNano() |
| 190 | httprsp, err := info.httpClient.Do(httpreq) |
| 191 | invokeEnd := time.Now().UnixNano() |
| 192 | if err != nil { |
| 193 | reqLogger.Infof("request failed: %s retry after %s", err.Error(), retryDuration.String()) |
| 194 | <-time.After(retryDuration) |
| 195 | if retryDuration < time.Second { |
| 196 | retryDuration += time.Duration(100) * time.Millisecond |
| 197 | } |
| 198 | continue |
| 199 | } |
| 200 | requestInfo.InvokeDone() |
| 201 | requestInfo.StepDone(StageInvokeDone) |
| 202 | reqLogger.Infof("invoke time %d", time.Duration(invokeEnd-invokeStart)/time.Microsecond) |
| 203 | resp := &InvokeHTTPResponse{ |
| 204 | RequestID: request.RequestID, |
| 205 | Response: httprsp, |
| 206 | } |
| 207 | info.httpResponseChan <- resp |
| 208 | break RequestLoop |
| 209 | } |
no test coverage detected