[cipd] Add per-RPC timeout to inner gcs.Reader.ReadAt call.

We've spotted this Reader implementation taking up to 20 minutes
without timing out while reading 64MB of data. When this happens,
the CIPD verification backend takes an extraordinary amount of time
(e.g. greater than an hour), leading to client side timeouts.

We're not certain what the root underlying cause is, but we are sure
that these RPCs should never be allowed to take this long, and we
see evidence that retrying can lead to successful (and reasonably
fast) RPC responses.

This CL computes a timeout for the RPC based on the theoretical
amount of time it SHOULD take to transfer the requested chunk (plus
an extra 500ms of headroom). If the timeout hits, it's treated as
any other transient error and the chunk will be retried.

We're hoping that this will be enough to allow the verification
backend to make forward progress, even in the event of apparently
arbitrarily slow responses from GCS.

R=bryner, fancl, vadimsh

Bug: 40202444, 361711863
Change-Id: I4c768dea4d07694c242124bcf14d642c4dcc2367
Reviewed-on: https://chromium-review.googlesource.com/c/infra/luci/luci-go/+/6181407
Commit-Queue: Robbie Iannucci <iannucci@chromium.org>
Reviewed-by: Vadim Shtayura <vadimsh@chromium.org>
Reviewed-by: Chenlin Fan <fancl@chromium.org>
Reviewed-by: Brian Ryner <bryner@google.com>
5 files changed
tree: 37620c3072e7528bc90585190d04637c95c282af
  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. recipes_py/
  33. resultdb/
  34. scheduler/
  35. scripts/
  36. server/
  37. source_index/
  38. standalone/
  39. starlark/
  40. swarming/
  41. teams/
  42. third_party/
  43. tokenserver/
  44. tools/
  45. tree_status/
  46. vpython/
  47. web/
  48. .gitallowed
  49. .gitattributes
  50. .gitignore
  51. .go-lintable
  52. AUTHORS
  53. codereview.settings
  54. CONTRIBUTING.md
  55. CONTRIBUTORS
  56. go.mod
  57. go.sum
  58. LICENSE
  59. OWNERS
  60. PRESUBMIT.py
  61. README.md
  62. staticcheck.conf
  63. tools.go
  64. 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.