Chromium Code Reviews| Index: appengine/cmd/milo/swarming/build.go |
| diff --git a/appengine/cmd/milo/swarming/build.go b/appengine/cmd/milo/swarming/build.go |
| index 7decfc96c2d518776e8823ec268d0ea0b8589cbf..a1c5b27fb05e6d6c3dc94c6cfeb8b1408f63b1bb 100644 |
| --- a/appengine/cmd/milo/swarming/build.go |
| +++ b/appengine/cmd/milo/swarming/build.go |
| @@ -114,8 +114,10 @@ func getSwarmingResult(sc *swarming.Service, taskID string) ( |
| return srtr, nil |
| } |
| +// getSwarming fetches both the swarming task data and log data, and returns |
| +// the task result, the log string, task error, and log error. |
| func getSwarming(c context.Context, server string, taskID string) ( |
| - *swarming.SwarmingRpcsTaskResult, string, error) { |
| + *swarming.SwarmingRpcsTaskResult, string, error, error) { |
| var log string |
| var sr *swarming.SwarmingRpcsTaskResult |
| @@ -125,15 +127,12 @@ func getSwarming(c context.Context, server string, taskID string) ( |
| if server == "debug" { |
| sr, errRes = getDebugSwarmingResult(taskID) |
| log, errLog = getDebugTaskOutput(taskID) |
| - if errLog != nil { |
| - return sr, log, errLog |
| - } |
| - return sr, log, errRes |
| + return sr, log, errRes, errLog |
| } |
| sc, err := getSwarmingClient(c, server) |
| if err != nil { |
| - return nil, "", err |
| + return nil, "", err, nil |
| } |
| var wg sync.WaitGroup |
| @@ -148,10 +147,7 @@ func getSwarming(c context.Context, server string, taskID string) ( |
| sr, errRes = getSwarmingResult(sc, taskID) |
| }() |
| wg.Wait() |
| - if errRes != nil { |
| - return sr, log, errRes |
| - } |
| - return sr, log, errLog |
| + return sr, log, errRes, errLog |
| } |
| func taskProperties(sr *swarming.SwarmingRpcsTaskResult) *resp.PropertyGroup { |
| @@ -292,9 +288,18 @@ func streamsFromAnnotatedLog(ctx context.Context, log string) (*logdog.Streams, |
| func swarmingBuildImpl(c context.Context, URL string, server string, taskID string) (*resp.MiloBuild, error) { |
| // Fetch the data from Swarming |
| - sr, body, err := getSwarming(c, server, taskID) |
| - if err != nil { |
| - return nil, err |
| + sr, body, errRes, errLog := getSwarming(c, server, taskID) |
| + // Swarming result must come back. |
| + if errRes != nil { |
| + return nil, errRes |
| + } |
| + switch sr.State { |
| + case TaskCompleted, TaskRunning, TaskCanceled: |
| + if errLog != nil { |
| + // If the task is completed, running, or canceled, we'd expect a log. |
| + // If not, we don't necessarily expect the log to come back. |
|
nodir
2016/06/28 20:36:49
I think getSwarming is a better place for this log
|
| + return nil, errLog |
| + } |
| } |
| allowMilo := false |
| @@ -316,20 +321,22 @@ func swarmingBuildImpl(c context.Context, URL string, server string, taskID stri |
| // Decode the data using annotee. The logdog stream returned here is assumed |
| // to be consistent, which is why the following block of code are not |
| // expected to ever err out. |
| - lds, err := streamsFromAnnotatedLog(c, body) |
| - if err != nil { |
| - build.Components = []*resp.BuildComponent{{ |
| - Type: resp.Summary, |
| - Label: "Milo annotation parser", |
| - Text: []string{err.Error()}, |
| - Status: resp.InfraFailure, |
| - SubLink: []*resp.Link{{ |
| - Label: "swarming task", |
| - URL: taskPageURL(server, taskID), |
| - }}, |
| - }} |
| - } else { |
| - logdog.AddLogDogToBuild(c, URL, lds, build) |
| + if errLog != nil && body != "" { |
| + lds, err := streamsFromAnnotatedLog(c, body) |
| + if err != nil { |
| + build.Components = []*resp.BuildComponent{{ |
| + Type: resp.Summary, |
| + Label: "Milo annotation parser", |
| + Text: []string{err.Error()}, |
| + Status: resp.InfraFailure, |
| + SubLink: []*resp.Link{{ |
| + Label: "swarming task", |
| + URL: taskPageURL(server, taskID), |
| + }}, |
| + }} |
| + } else { |
| + logdog.AddLogDogToBuild(c, URL, lds, build) |
| + } |
| } |
| return build, nil |