[swarming] Store task text output in a file to avoid OOMs.

Avoid keeping task's stdout in memory as much as possible. Instead
write it to a file and read this file back when necessary. Note that
when using `-task-output-stdout json` we still need to load the
entirety of task's stdout in memory in order to put it into JSON
(because we need to make sure it is properly escaped as a JSON string
and we currently can't do this in a streaming fashion and this is
likely an overkill anyway).

As an alternative, there's a new `-task-output-stdout dir:<path>`
mode. When this flag is passed, tasks's text output is stored in
`<path>/<task-ID>.txt` files. `<path>` defaults to `-output-dir`
(i.e. when fetching isolated outputs somewhere, passing
`-task-output-stdout dir` will also fetch text outputs at the same
directory).

There's one other minor observable change: when using
`-task-output-stdout console` tasks' output is written into
os.Stdout as is, without extra UTF-8 validation (that way we just
copy bytes from one file into another, which doesn't require much
memory). It should be fine, since this is how Swarming CLI worked
until few recent commits that introduced UTF-8 validation.

Likewise, files produced in `-task-output-stdout dir:<path>` mode
contain raw Swarming text output with potentially invalid UTF-8.

We still do UTF-8 validation when writing to JSON though (because
the protobuf library wants valid UTF-8).

Increase default fetch concurrency now that each fetch eats
less memory.

R=chanli@chromium.org, randymaldonado@google.com
BUG=40276579

Change-Id: I586e178f601dbdf7f53e34387cc3d64cb0c681cd
Reviewed-on: https://chromium-review.googlesource.com/c/infra/luci/luci-go/+/5336479
Commit-Queue: Vadim Shtayura <vadimsh@chromium.org>
Reviewed-by: Chan Li <chanli@chromium.org>
3 files changed
tree: b153c9996cd0c641446ab06730473eccc994be75
  1. analysis/
  2. appengine/
  3. auth/
  4. auth_service/
  5. bisection/
  6. build/
  7. buildbucket/
  8. casviewer/
  9. cipd/
  10. cipkg/
  11. client/
  12. common/
  13. config/
  14. config_service/
  15. cv/
  16. deploy/
  17. examples/
  18. gae/
  19. gce/
  20. grpc/
  21. hardcoded/
  22. led/
  23. logdog/
  24. luci_notify/
  25. lucicfg/
  26. lucictx/
  27. luciexe/
  28. mailer/
  29. milo/
  30. mmutex/
  31. provenance/
  32. resultdb/
  33. scheduler/
  34. scripts/
  35. server/
  36. standalone/
  37. starlark/
  38. swarming/
  39. teams/
  40. third_party/
  41. tokenserver/
  42. tools/
  43. tree_status/
  44. vpython/
  45. web/
  46. .gitallowed
  47. .gitattributes
  48. .gitignore
  49. .go-lintable
  50. AUTHORS
  51. codereview.settings
  52. CONTRIBUTING.md
  53. CONTRIBUTORS
  54. go.mod
  55. go.sum
  56. LICENSE
  57. OWNERS
  58. PRESUBMIT.py
  59. README.md
  60. tools.go
  61. WATCHLISTS
README.md

luci-go: LUCI services and tools in Go

GoReference

Installing

LUCI Go code is meant to be worked on from an Chromium infra.git checkout, which enforces packages versions and Go toolchain version. First get fetch via depot_tools.git then run:

fetch infra
cd infra/go
eval `./env.py`
cd src/go.chromium.org/luci

It is now possible to directly install tools with go install:

go install go.chromium.org/luci/auth/client/cmd/...@latest
go install go.chromium.org/luci/buildbucket/cmd/...@latest
go install go.chromium.org/luci/cipd/client/cmd/...@latest
go install go.chromium.org/luci/client/cmd/...@latest
go install go.chromium.org/luci/cv/cmd/...@latest
go install go.chromium.org/luci/gce/cmd/...@latest
go install go.chromium.org/luci/grpc/cmd/...@latest
go install go.chromium.org/luci/logdog/client/cmd/...@latest
go install go.chromium.org/luci/luci_notify/cmd/...@latest
go install go.chromium.org/luci/lucicfg/cmd/...@latest
go install go.chromium.org/luci/luciexe/legacy/cmd/...@latest
go install go.chromium.org/luci/mailer/cmd/...@latest
go install go.chromium.org/luci/mmutex/cmd/...@latest
go install go.chromium.org/luci/resultdb/cmd/...@latest
go install go.chromium.org/luci/server/cmd/...@latest
go install go.chromium.org/luci/swarming/cmd/...@latest
go install go.chromium.org/luci/tokenserver/cmd/...@latest
go install go.chromium.org/luci/tools/cmd/...@latest

Contributing

Contributing uses the same flow as Chromium contributions.