[auth] Shard deflated AuthDB when storing it in datastore.

This affects GAE v1 apps only (GAE v2 apps don't use datastore
for AuthDB).

AuthDBDeflated quickly approaches 1MB datastore limit. When it is
hit, auth group updates will stop propagating. In this CL we now
split AuthDBDeflated blob into multiple separate entities to avoid
hitting the limit.

There are some nuances related to the rollout and rollbacks: old
code doesn't know about ShardIDs field and can't use it. As soon as
we *actually* start splitting AuthDBDeflated into shards, old code
versions will stop working with errors like:

  failed to update instance of *authdb.SnapshotDB ::
  {"error":"gae: cannot load field \"ShardIDs\" into a
  \"authdbimpl.Snapshot\": no such struct field (and 1
  other error)"}

It means if we need to rollback a service to a version that
doesn't understand sharded AuthDB, we are screwed.

For that reason this CL should be deployed and stabilized
*everywhere* before we actually start splitting AuthDB into
shards, because once we have sharded AuthDB in the datastore,
there's no way to rollback to old code.

Unfortunately we have little control over AuthDB size. The only
thing we can control is the sharding threshold and per-shard sizes.
This CL sets them to 1020 KiB. The hard datastore limit is 1024 KiB.
The current AuthDB size is 962 KiB. So we have 58 KiB of room to grow
before rollbacks may become problematic.

R=cjacomet@google.com
BUG=1284778

Change-Id: Ia2c180ac914d91c024dce774816268ff80874a24
Reviewed-on: https://chromium-review.googlesource.com/c/infra/luci/luci-go/+/3369024
Reviewed-by: Camilo Jacomet <cjacomet@google.com>
Commit-Queue: Vadim Shtayura <vadimsh@chromium.org>
3 files changed
tree: fec1671d2a12009061dbc8c8f41ca8eed3cc2ce5
  1. appengine/
  2. auth/
  3. auth_service/
  4. build/
  5. buildbucket/
  6. casviewer/
  7. cipd/
  8. client/
  9. cmdrunner/
  10. common/
  11. config/
  12. cv/
  13. dm/
  14. examples/
  15. gae/
  16. gce/
  17. grpc/
  18. hacks/
  19. hardcoded/
  20. led/
  21. logdog/
  22. luci_notify/
  23. lucicfg/
  24. lucictx/
  25. luciexe/
  26. machine-db/
  27. mailer/
  28. milo/
  29. mmutex/
  30. resultdb/
  31. scheduler/
  32. scripts/
  33. server/
  34. starlark/
  35. swarming/
  36. tokenserver/
  37. tools/
  38. tumble/
  39. vpython/
  40. web/
  41. .gitallowed
  42. .gitattributes
  43. .golangci.yml
  44. AUTHORS
  45. codereview.settings
  46. CONTRIBUTING.md
  47. CONTRIBUTORS
  48. go.mod
  49. go.sum
  50. LICENSE
  51. OWNERS
  52. PRESUBMIT.py
  53. README.md
  54. tools.go
  55. WATCHLISTS
README.md

luci-go: LUCI services and tools in Go

GoDoc

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

Contributing

Contributing uses the same flow as Chromium contributions.