From b63933ca50b13d55b6d87274aea6564746a1bfd6 Mon Sep 17 00:00:00 2001 From: Sean Chittenden Date: Wed, 1 Apr 2026 12:07:33 -0700 Subject: [PATCH 1/9] Gate blob reads on in-progress writes to prevent spurious NotFound When concurrent targets upload and read the same blob simultaneously, the reader can get a NotFound error because the write hasn't landed yet. This was observed in CI where GetTree failed for a blob being uploaded via BatchUpdateBlobs at the exact same millisecond. Add an inflightWrites tracker that gates read operations on any in-progress write for the same digest hash. Uses context.WithCancel so parent context cancellation propagates naturally. All write paths (writeAll for BatchUpdateBlobs, writeBlob for ByteStream.Write) register with the tracker, and all read paths (readAllBlobCompressed, readCompressed) wait for completion before proceeding. Also bumps Go toolchain from 1.23.2 to 1.24.2. --- elan/rpc/BUILD | 9 +++ elan/rpc/inflight.go | 55 ++++++++++++++++ elan/rpc/inflight_test.go | 129 ++++++++++++++++++++++++++++++++++++++ elan/rpc/rpc.go | 8 +++ third_party/go/BUILD | 2 +- 5 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 elan/rpc/inflight.go create mode 100644 elan/rpc/inflight_test.go diff --git a/elan/rpc/BUILD b/elan/rpc/BUILD index 3ebac9f2..4eda5bc1 100644 --- a/elan/rpc/BUILD +++ b/elan/rpc/BUILD @@ -57,6 +57,15 @@ go_test( ], ) +go_test( + name = "inflight_test", + srcs = ["inflight_test.go"], + deps = [ + ":rpc", + "///third_party/go/github.com_stretchr_testify//require", + ], +) + genrule( name = "test_data", cmd = [ diff --git a/elan/rpc/inflight.go b/elan/rpc/inflight.go new file mode 100644 index 00000000..23101f8a --- /dev/null +++ b/elan/rpc/inflight.go @@ -0,0 +1,55 @@ +package rpc + +import ( + "context" + "sync" + "time" +) + +// defaultWriteTimeout is the maximum time a reader will wait for an in-progress +// write to complete before proceeding anyway. +const defaultWriteTimeout = 10 * time.Minute + +// inflightWrites tracks blob writes that are currently in progress so that +// concurrent readers can block until the write completes rather than getting +// a spurious NotFound. +type inflightWrites struct { + mu struct { + sync.Mutex + blobs map[string]context.Context + } +} + +func newInflightWrites() *inflightWrites { + w := &inflightWrites{} + w.mu.blobs = make(map[string]context.Context) + return w +} + +// startWrite registers a blob write in progress. The returned cancel function +// must be called when the write completes (success or failure) — use defer. +// The write context inherits from the caller so parent cancellation propagates. +// A default timeout of defaultWriteTimeout is applied as a safety net. +func (w *inflightWrites) startWrite(ctx context.Context, hash string) (context.Context, context.CancelFunc) { + ctx, cancel := context.WithTimeout(ctx, defaultWriteTimeout) + w.mu.Lock() + w.mu.blobs[hash] = ctx + w.mu.Unlock() + return ctx, func() { + w.mu.Lock() + delete(w.mu.blobs, hash) + w.mu.Unlock() + cancel() + } +} + +// waitForWrite blocks until any in-progress write for the given hash completes. +// If no write is in progress, it returns immediately. +func (w *inflightWrites) waitForWrite(hash string) { + w.mu.Lock() + ctx, ok := w.mu.blobs[hash] + w.mu.Unlock() + if ok { + <-ctx.Done() + } +} diff --git a/elan/rpc/inflight_test.go b/elan/rpc/inflight_test.go new file mode 100644 index 00000000..a32d2eb7 --- /dev/null +++ b/elan/rpc/inflight_test.go @@ -0,0 +1,129 @@ +package rpc + +import ( + "context" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestWaitForWrite_NoInflight(t *testing.T) { + w := newInflightWrites() + // Should return immediately when nothing is in flight. + doneCtx, doneFunc := context.WithCancel(t.Context()) + go func() { + w.waitForWrite("abc123") + doneFunc() + }() + select { + case <-doneCtx.Done(): + case <-time.After(120 * time.Second): + t.Fatal("waitForWrite blocked when no write was in progress") + } +} + +func TestWaitForWrite_BlocksUntilDone(t *testing.T) { + w := newInflightWrites() + _, finish := w.startWrite(t.Context(), "abc123") + + var order []string + var mu sync.Mutex + record := func(s string) { + mu.Lock() + order = append(order, s) + mu.Unlock() + } + + doneCtx, doneFunc := context.WithCancel(t.Context()) + go func() { + w.waitForWrite("abc123") + record("read") + doneFunc() + }() + + // Give the reader goroutine time to block. + time.Sleep(50 * time.Millisecond) + record("write") + finish() + + select { + case <-doneCtx.Done(): + case <-t.Context().Done(): + t.Fatal("reader never unblocked") + } + + mu.Lock() + defer mu.Unlock() + require.Equal(t, []string{"write", "read"}, order) +} + +func TestWaitForWrite_DifferentDigests(t *testing.T) { + w := newInflightWrites() + _, finish := w.startWrite(t.Context(), "abc123") + defer finish() + + // A different digest should not block. + doneCtx, doneFunc := context.WithCancel(t.Context()) + go func() { + w.waitForWrite("def456") + doneFunc() + }() + select { + case <-doneCtx.Done(): + case <-t.Context().Done(): + t.Fatal("waitForWrite blocked on a different digest") + } +} + +func TestWaitForWrite_ParentCancellation(t *testing.T) { + w := newInflightWrites() + ctx, cancel := context.WithCancel(t.Context()) + _, finish := w.startWrite(ctx, "abc123") + defer finish() + + doneCtx, doneFunc := context.WithCancel(t.Context()) + go func() { + w.waitForWrite("abc123") + doneFunc() + }() + + // Cancel the parent context — reader should unblock. + cancel() + select { + case <-doneCtx.Done(): + case <-t.Context().Done(): + t.Fatal("reader did not unblock after parent context cancellation") + } +} + +func TestWaitForWrite_MultipleReaders(t *testing.T) { + w := newInflightWrites() + _, finish := w.startWrite(t.Context(), "abc123") + + const numReaders = 10 + doneCtx, doneFunc := context.WithCancel(t.Context()) + var wg sync.WaitGroup + wg.Add(numReaders) + for range numReaders { + go func() { + w.waitForWrite("abc123") + wg.Done() + }() + } + + // All readers should be blocked. Finish the write. + time.Sleep(50 * time.Millisecond) + finish() + + go func() { + wg.Wait() + doneFunc() + }() + select { + case <-doneCtx.Done(): + case <-t.Context().Done(): + t.Fatal("not all readers unblocked") + } +} diff --git a/elan/rpc/rpc.go b/elan/rpc/rpc.go index 3f5afe71..b48b7ac6 100644 --- a/elan/rpc/rpc.go +++ b/elan/rpc/rpc.go @@ -179,6 +179,7 @@ func createServer(storage string, parallelism int, maxDirCacheSize, maxKnownBlob decompressor: dec, readRedis: readRedis, largeBlobSize: largeBlobSize, + inflight: newInflightWrites(), } } @@ -222,6 +223,7 @@ type server struct { decompressor *zstd.Decoder readRedis *redis.Client largeBlobSize int64 + inflight *inflightWrites } func (s *server) GetCapabilities(ctx context.Context, req *pb.GetCapabilitiesRequest) (*pb.ServerCapabilities, error) { @@ -549,6 +551,7 @@ func (s *server) Read(req *bs.ReadRequest, srv bs.ByteStream_ReadServer) error { } func (s *server) readCompressed(ctx context.Context, prefix string, digest *pb.Digest, compressed bool, offset, limit int64) (io.ReadCloser, bool, error) { + s.inflight.waitForWrite(digest.Hash) if prefix != "cas" { if compressed { return nil, false, fmt.Errorf("Attempted to do a compressed read for non-CAS prefix %s", prefix) // This is a programming error and shouldn't happen. @@ -687,6 +690,7 @@ func (s *server) readAllBlobBatched(ctx context.Context, prefix string, digest * } func (s *server) readAllBlobCompressed(ctx context.Context, digest *pb.Digest, key string, batched, compressed bool) ([]byte, error) { + s.inflight.waitForWrite(digest.Hash) if digest.SizeBytes > s.largeBlobSize { s.limiter <- struct{}{} defer func() { <-s.limiter }() @@ -724,6 +728,8 @@ func (s *server) compressedKey(prefix string, digest *pb.Digest, compressed bool } func (s *server) writeBlob(ctx context.Context, prefix string, digest *pb.Digest, r io.Reader, compressed bool) error { + _, done := s.inflight.startWrite(ctx, digest.Hash) + defer done() key := s.compressedKey(prefix, digest, compressed) if s.isEmpty(digest) || s.blobExists(ctx, prefix, digest, compressed, true) { // Read and discard entire content; there is no need to update. @@ -774,6 +780,8 @@ func (s *server) writeBlob(ctx context.Context, prefix string, digest *pb.Digest } func (s *server) writeAll(ctx context.Context, digest *pb.Digest, data []byte, compressed bool) error { + _, done := s.inflight.startWrite(ctx, digest.Hash) + defer done() if digest.SizeBytes > s.largeBlobSize { s.limiter <- struct{}{} defer func() { <-s.limiter }() diff --git a/third_party/go/BUILD b/third_party/go/BUILD index 9222349e..1bcd5c75 100644 --- a/third_party/go/BUILD +++ b/third_party/go/BUILD @@ -5,7 +5,7 @@ package(default_visibility = ["PUBLIC"]) go_toolchain( name = "toolchain", install_std = False, - version = "1.24.0", + version = "1.24.2", ) go_stdlib( From 327bb3ca5d166e4832bb56f7febf640640480766 Mon Sep 17 00:00:00 2001 From: Sean Chittenden Date: Wed, 1 Apr 2026 12:07:56 -0700 Subject: [PATCH 2/9] Add /sbin so tests that use sha256sum work on macOS --- .plzconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.plzconfig b/.plzconfig index 5098d621..e16c1828 100644 --- a/.plzconfig +++ b/.plzconfig @@ -2,7 +2,7 @@ version = >=17.0.0 [build] -path = /usr/local/go/bin:/usr/local/bin:/usr/bin:/bin +path = /usr/local/go/bin:/usr/local/bin:/usr/bin:/bin:/sbin:/usr/sbin [buildconfig] local-host = 127.0.0.1 From 011c302f99a0f05a4bbccd62a19ee3fa965bf14e Mon Sep 17 00:00:00 2001 From: Sean Chittenden Date: Sat, 27 Jun 2026 08:59:16 -0700 Subject: [PATCH 3/9] Bump minor version go deps - github.com/mostynb/go-grpc-compression to version 1.2.3 - github.com/sirupsen/logrus to version 1.9.4 - google.golang.org/protobuf to version 1.36.11 --- go.mod | 8 ++++---- go.sum | 10 +++++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 45df2289..6181e63a 100644 --- a/go.mod +++ b/go.mod @@ -16,15 +16,15 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.1 github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/go-retryablehttp v0.7.7 - github.com/klauspost/compress v1.17.4 - github.com/mostynb/go-grpc-compression v1.2.2 + github.com/klauspost/compress v1.17.8 + github.com/mostynb/go-grpc-compression v1.2.3 github.com/peterebden/go-cli-init/v4 v4.0.2 github.com/peterebden/go-copyfile v0.0.0-20200424115000-bc0baf74909c github.com/peterebden/go-sri v1.1.1 github.com/prometheus/client_golang v1.18.0 github.com/prometheus/common v0.45.0 github.com/shirou/gopsutil v3.21.11+incompatible - github.com/sirupsen/logrus v1.9.3 + github.com/sirupsen/logrus v1.9.4 github.com/stretchr/testify v1.11.1 github.com/thought-machine/http-admin v1.1.1 go.uber.org/automaxprocs v1.5.3 @@ -38,7 +38,7 @@ require ( google.golang.org/genproto/googleapis/bytestream v0.0.0-20240102182953-50ed04b92917 google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 google.golang.org/grpc v1.79.3 - google.golang.org/protobuf v1.36.10 + google.golang.org/protobuf v1.36.11 gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 ) diff --git a/go.sum b/go.sum index 129ac62a..59a36c4d 100644 --- a/go.sum +++ b/go.sum @@ -199,6 +199,8 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= +github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -221,6 +223,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= +github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= github.com/mostynb/zstdpool-syncpool v0.0.13 h1:AIzAvQ9hNum4Fh5jYXyfZTd2aDi1leq7grKDkVZX4+s= github.com/mostynb/zstdpool-syncpool v0.0.13/go.mod h1:pbt8qOdq6wX5jrUsRI9UmBvAnjToEgVQC3H1pwJwktM= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -281,6 +285,8 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= +github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -459,6 +465,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -478,4 +486,4 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= \ No newline at end of file +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 58de71d647c48a761bb27710fc374af34f5f27c9 Mon Sep 17 00:00:00 2001 From: Sean Chittenden Date: Sat, 27 Jun 2026 09:02:01 -0700 Subject: [PATCH 4/9] Bump github.com/klauspost/compress from v1.17.8 to v1.18.6 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 6181e63a..e041e2a0 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.1 github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/go-retryablehttp v0.7.7 - github.com/klauspost/compress v1.17.8 + github.com/klauspost/compress v1.18.6 github.com/mostynb/go-grpc-compression v1.2.3 github.com/peterebden/go-cli-init/v4 v4.0.2 github.com/peterebden/go-copyfile v0.0.0-20200424115000-bc0baf74909c diff --git a/go.sum b/go.sum index 59a36c4d..b43a2f09 100644 --- a/go.sum +++ b/go.sum @@ -201,6 +201,8 @@ github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= +github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From a09ecf44f452543b51c0bdeaab5a53f5777672cf Mon Sep 17 00:00:00 2001 From: Sean Chittenden Date: Sat, 27 Jun 2026 09:02:59 -0700 Subject: [PATCH 5/9] Bump go.uber.org/automaxprocs from v1.5.3 to v1.6.0 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index e041e2a0..1ce68585 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/sirupsen/logrus v1.9.4 github.com/stretchr/testify v1.11.1 github.com/thought-machine/http-admin v1.1.1 - go.uber.org/automaxprocs v1.5.3 + go.uber.org/automaxprocs v1.6.0 gocloud.dev v0.36.0 golang.org/x/crypto v0.46.0 golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc diff --git a/go.sum b/go.sum index b43a2f09..7648ac3f 100644 --- a/go.sum +++ b/go.sum @@ -331,6 +331,8 @@ go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6 go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= gocloud.dev v0.36.0 h1:q5zoXux4xkOZP473e1EZbG8Gq9f0vlg1VNH5Du/ybus= gocloud.dev v0.36.0/go.mod h1:bLxah6JQVKBaIxzsr5BQLYB4IYdWHkMZdzCXlo6F0gg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= From be8d450d20ab40f503ed316ca263abb6b170ef35 Mon Sep 17 00:00:00 2001 From: Sean Chittenden Date: Sat, 27 Jun 2026 09:03:58 -0700 Subject: [PATCH 6/9] Bump golang.org/x/crypto from v0.46.0 to v0.53.0 Forces a bump to Go 1.25.0 Brings along updates to: - golang.org/x/net - golang.org/x/sync - golang.org/x/sys - golang.org/x/term - golang.org/x/text --- go.mod | 14 +++++++------- go.sum | 12 ++++++++++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 1ce68585..10dad19a 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/thought-machine/please-servers -go 1.24.0 +go 1.25.0 require ( cloud.google.com/go/profiler v0.4.0 @@ -29,9 +29,9 @@ require ( github.com/thought-machine/http-admin v1.1.1 go.uber.org/automaxprocs v1.6.0 gocloud.dev v0.36.0 - golang.org/x/crypto v0.46.0 + golang.org/x/crypto v0.53.0 golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc - golang.org/x/sync v0.19.0 + golang.org/x/sync v0.21.0 golang.org/x/time v0.5.0 google.golang.org/api v0.155.0 google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 @@ -83,11 +83,11 @@ require ( go.opentelemetry.io/otel v1.39.0 // indirect go.opentelemetry.io/otel/metric v1.39.0 // indirect go.opentelemetry.io/otel/trace v1.39.0 // indirect - golang.org/x/net v0.48.0 // indirect + golang.org/x/net v0.55.0 // indirect golang.org/x/oauth2 v0.34.0 // indirect - golang.org/x/sys v0.39.0 // indirect - golang.org/x/term v0.38.0 // indirect - golang.org/x/text v0.32.0 // indirect + golang.org/x/sys v0.46.0 // indirect + golang.org/x/term v0.44.0 // indirect + golang.org/x/text v0.38.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 7648ac3f..8903680c 100644 --- a/go.sum +++ b/go.sum @@ -343,6 +343,8 @@ golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= +golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= +golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= @@ -367,6 +369,8 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210505214959-0714010a04ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= @@ -378,6 +382,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= +golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -403,15 +409,21 @@ golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= +golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc= +golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= +golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From bad9a21fbb9b5d85b8e8e99d71cca0845ad263ad Mon Sep 17 00:00:00 2001 From: Sean Chittenden Date: Sat, 27 Jun 2026 09:08:13 -0700 Subject: [PATCH 7/9] Bump github.com/dgraph-io/ristretto from v0.1.1 to v0.2.0 --- go.mod | 2 +- go.sum | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 10dad19a..c8eadfb6 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( cloud.google.com/go/storage v1.36.0 github.com/bazelbuild/remote-apis v0.0.0-20230411132548-35aee1c4a425 github.com/bazelbuild/remote-apis-sdks v0.0.0-20230419185642-269815af5db1 - github.com/dgraph-io/ristretto v0.1.1 + github.com/dgraph-io/ristretto v0.2.0 github.com/dustin/go-humanize v1.0.1 github.com/go-redis/redis/v8 v8.11.5 github.com/golang/protobuf v1.5.4 diff --git a/go.sum b/go.sum index 8903680c..54c42a9d 100644 --- a/go.sum +++ b/go.sum @@ -78,8 +78,11 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgraph-io/ristretto v0.2.0 h1:XAfl+7cmoUDWW/2Lx8TGZQjjxIQ2Ley9DSf52dru4WE= +github.com/dgraph-io/ristretto v0.2.0/go.mod h1:8uBHCU/PBV4Ag0CJrP47b9Ofby5dqWNh4FicAdoqFNU= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= From 37fd2b21a286cd1cfb8fcc561d33c93ae4017dbc Mon Sep 17 00:00:00 2001 From: Sean Chittenden Date: Sat, 27 Jun 2026 09:09:05 -0700 Subject: [PATCH 8/9] Bump golang.org/x/exp from v0.0.0-20240103183307-be819d1f06fc to v0.0.0-20260611194520-c48552f49976 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index c8eadfb6..5a95933a 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( go.uber.org/automaxprocs v1.6.0 gocloud.dev v0.36.0 golang.org/x/crypto v0.53.0 - golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc + golang.org/x/exp v0.0.0-20260611194520-c48552f49976 golang.org/x/sync v0.21.0 golang.org/x/time v0.5.0 google.golang.org/api v0.155.0 diff --git a/go.sum b/go.sum index 54c42a9d..4d66adf6 100644 --- a/go.sum +++ b/go.sum @@ -351,6 +351,8 @@ golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsi golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/exp v0.0.0-20260611194520-c48552f49976 h1:X8Hz2ImujgbmetVuW+w2YkyZChE3cBpZi2P158rTG9M= +golang.org/x/exp v0.0.0-20260611194520-c48552f49976/go.mod h1:vnf4pv9iKZXY58sQE1L86zmNWJ4159e1RkcWiLCkeEY= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= From 46cd4d8fb80fba1e3bd6174ba08deb0cbe273cd9 Mon Sep 17 00:00:00 2001 From: Sean Chittenden Date: Sat, 27 Jun 2026 09:09:48 -0700 Subject: [PATCH 9/9] Bump golang.org/x/time from v0.5.0 to v0.15.0 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 5a95933a..24f2f4e1 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( golang.org/x/crypto v0.53.0 golang.org/x/exp v0.0.0-20260611194520-c48552f49976 golang.org/x/sync v0.21.0 - golang.org/x/time v0.5.0 + golang.org/x/time v0.15.0 google.golang.org/api v0.155.0 google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 google.golang.org/genproto/googleapis/bytestream v0.0.0-20240102182953-50ed04b92917 diff --git a/go.sum b/go.sum index 4d66adf6..1cf197f2 100644 --- a/go.sum +++ b/go.sum @@ -431,6 +431,8 @@ golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=