From 87b9243fd99cab70d93f1f5049f925cd31420a1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 02:48:16 +0000 Subject: [PATCH] chore(deps): Bump cloud.google.com/go/storage Bumps [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go) from 1.59.1 to 1.59.2. - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/storage/v1.59.1...storage/v1.59.2) --- updated-dependencies: - dependency-name: cloud.google.com/go/storage dependency-version: 1.59.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- ci/resources/stemcell-version-bump/go.mod | 2 +- ci/resources/stemcell-version-bump/go.sum | 4 +- .../cloud.google.com/go/storage/CHANGES.md | 6 ++ .../go/storage/grpc_reader_multi_range.go | 84 +++++++++++++++---- .../go/storage/internal/version.go | 2 +- .../stemcell-version-bump/vendor/modules.txt | 2 +- 6 files changed, 79 insertions(+), 21 deletions(-) diff --git a/ci/resources/stemcell-version-bump/go.mod b/ci/resources/stemcell-version-bump/go.mod index ae25871d..b17619a3 100644 --- a/ci/resources/stemcell-version-bump/go.mod +++ b/ci/resources/stemcell-version-bump/go.mod @@ -5,7 +5,7 @@ go 1.24.0 toolchain go1.24.1 require ( - cloud.google.com/go/storage v1.59.1 + cloud.google.com/go/storage v1.59.2 github.com/stretchr/testify v1.11.1 google.golang.org/api v0.262.0 ) diff --git a/ci/resources/stemcell-version-bump/go.sum b/ci/resources/stemcell-version-bump/go.sum index 93d31feb..5ce49bdd 100644 --- a/ci/resources/stemcell-version-bump/go.sum +++ b/ci/resources/stemcell-version-bump/go.sum @@ -16,8 +16,8 @@ cloud.google.com/go/longrunning v0.7.0 h1:FV0+SYF1RIj59gyoWDRi45GiYUMM3K1qO51qob cloud.google.com/go/longrunning v0.7.0/go.mod h1:ySn2yXmjbK9Ba0zsQqunhDkYi0+9rlXIwnoAf+h+TPY= cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= -cloud.google.com/go/storage v1.59.1 h1:DXAZLcTimtiXdGqDSnebROVPd9QvRsFVVlptz02Wk58= -cloud.google.com/go/storage v1.59.1/go.mod h1:cMWbtM+anpC74gn6qjLh+exqYcfmB9Hqe5z6adx+CLI= +cloud.google.com/go/storage v1.59.2 h1:gmOAuG1opU8YvycMNpP+DvHfT9BfzzK5Cy+arP+Nocw= +cloud.google.com/go/storage v1.59.2/go.mod h1:cMWbtM+anpC74gn6qjLh+exqYcfmB9Hqe5z6adx+CLI= cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= diff --git a/ci/resources/stemcell-version-bump/vendor/cloud.google.com/go/storage/CHANGES.md b/ci/resources/stemcell-version-bump/vendor/cloud.google.com/go/storage/CHANGES.md index ea259da7..efa8edce 100644 --- a/ci/resources/stemcell-version-bump/vendor/cloud.google.com/go/storage/CHANGES.md +++ b/ci/resources/stemcell-version-bump/vendor/cloud.google.com/go/storage/CHANGES.md @@ -1,6 +1,12 @@ # Changes +## [1.59.2](https://github.com/googleapis/google-cloud-go/releases/tag/storage%2Fv1.59.2) (2026-01-28) + +### Bug Fixes + +* deadlock in event loop while coordinating channels (#13652) ([ff6c8e7](https://github.com/googleapis/google-cloud-go/commit/ff6c8e780b2207b154808ba22e3124b68d6b4f7d)) + ## [1.59.1](https://github.com/googleapis/google-cloud-go/releases/tag/storage%2Fv1.59.1) (2026-01-14) ### Bug Fixes diff --git a/ci/resources/stemcell-version-bump/vendor/cloud.google.com/go/storage/grpc_reader_multi_range.go b/ci/resources/stemcell-version-bump/vendor/cloud.google.com/go/storage/grpc_reader_multi_range.go index 4b05813c..1e3f4fd1 100644 --- a/ci/resources/stemcell-version-bump/vendor/cloud.google.com/go/storage/grpc_reader_multi_range.go +++ b/ci/resources/stemcell-version-bump/vendor/cloud.google.com/go/storage/grpc_reader_multi_range.go @@ -15,6 +15,7 @@ package storage import ( + "container/list" "context" "errors" "fmt" @@ -34,6 +35,10 @@ import ( const ( mrdCommandChannelSize = 1 mrdResponseChannelSize = 100 + // This should never be hit in practice, but is a safety valve to prevent + // unbounded memory usage if the user is adding ranges faster than they + // can be processed. + mrdAddInternalQueueMaxSize = 50000 ) // --- internalMultiRangeDownloader Interface --- @@ -83,18 +88,19 @@ func (c *grpcStorageClient) NewMultiRangeDownloader(ctx context.Context, params // Create the manager manager := &multiRangeDownloaderManager{ - ctx: mCtx, - cancel: cancel, - client: c, - settings: s, - params: params, - cmds: make(chan mrdCommand, mrdCommandChannelSize), - sessionResps: make(chan mrdSessionResult, mrdResponseChannelSize), - pendingRanges: make(map[int64]*rangeRequest), - readIDCounter: 1, - readSpec: readSpec, - attrsReady: make(chan struct{}), - spanCtx: ctx, + ctx: mCtx, + cancel: cancel, + client: c, + settings: s, + params: params, + cmds: make(chan mrdCommand, mrdCommandChannelSize), + sessionResps: make(chan mrdSessionResult, mrdResponseChannelSize), + pendingRanges: make(map[int64]*rangeRequest), + readIDCounter: 1, + readSpec: readSpec, + attrsReady: make(chan struct{}), + spanCtx: ctx, + unsentRequests: newRequestQueue(), } mrd := &MultiRangeDownloader{ @@ -227,6 +233,7 @@ type multiRangeDownloaderManager struct { attrsOnce sync.Once spanCtx context.Context callbackWg sync.WaitGroup + unsentRequests *requestQueue } type rangeRequest struct { @@ -374,10 +381,29 @@ func (m *multiRangeDownloaderManager) eventLoop() { } for { + var nextReq *storagepb.BidiReadObjectRequest + var targetChan chan<- *storagepb.BidiReadObjectRequest + + // Only try to send if we have queued requests + if m.unsentRequests.Len() > 0 && m.currentSession != nil { + nextReq = m.unsentRequests.Front() + if nextReq != nil { + targetChan = m.currentSession.reqC + } + } + // Only read from cmds if we have space in the unsentRequests queue. + var cmdsChan chan mrdCommand + if m.unsentRequests.Len() < mrdAddInternalQueueMaxSize { + cmdsChan = m.cmds + } select { case <-m.ctx.Done(): return - case cmd := <-m.cmds: + // This path only triggers if space is available in the channel. + // It never blocks the eventLoop. + case targetChan <- nextReq: + m.unsentRequests.RemoveFront() + case cmd := <-cmdsChan: cmd.apply(m.ctx, m) if _, ok := cmd.(*mrdCloseCmd); ok { return @@ -386,7 +412,7 @@ func (m *multiRangeDownloaderManager) eventLoop() { m.processSessionResult(result) } - if len(m.pendingRanges) == 0 { + if len(m.pendingRanges) == 0 && m.unsentRequests.Len() == 0 { for _, waiter := range m.waiters { close(waiter) } @@ -512,7 +538,7 @@ func (m *multiRangeDownloaderManager) handleAddCmd(ctx context.Context, cmd *mrd ReadId: req.readID, }}, } - m.currentSession.SendRequest(protoReq) + m.unsentRequests.PushBack(protoReq) } func (m *multiRangeDownloaderManager) convertToPositiveOffset(req *rangeRequest) error { @@ -655,7 +681,8 @@ func (m *multiRangeDownloaderManager) ensureSession(ctx context.Context) error { } } if len(rangesToResend) > 0 { - m.currentSession.SendRequest(&storagepb.BidiReadObjectRequest{ReadRanges: rangesToResend}) + retryReq := &storagepb.BidiReadObjectRequest{ReadRanges: rangesToResend} + m.unsentRequests.PushFront(retryReq) } return nil }, m.settings.retry, true) @@ -900,3 +927,28 @@ func readerAttrsFromObject(o *ObjectAttrs) ReaderObjectAttrs { CRC32C: o.CRC32C, } } + +type requestQueue struct { + l *list.List +} + +func newRequestQueue() *requestQueue { + return &requestQueue{l: list.New()} +} + +func (q *requestQueue) PushBack(r *storagepb.BidiReadObjectRequest) { q.l.PushBack(r) } +func (q *requestQueue) PushFront(r *storagepb.BidiReadObjectRequest) { q.l.PushFront(r) } +func (q *requestQueue) Len() int { return q.l.Len() } + +func (q *requestQueue) Front() *storagepb.BidiReadObjectRequest { + if f := q.l.Front(); f != nil { + return f.Value.(*storagepb.BidiReadObjectRequest) + } + return nil +} + +func (q *requestQueue) RemoveFront() { + if f := q.l.Front(); f != nil { + q.l.Remove(f) + } +} diff --git a/ci/resources/stemcell-version-bump/vendor/cloud.google.com/go/storage/internal/version.go b/ci/resources/stemcell-version-bump/vendor/cloud.google.com/go/storage/internal/version.go index 0db74236..cee1b2a0 100644 --- a/ci/resources/stemcell-version-bump/vendor/cloud.google.com/go/storage/internal/version.go +++ b/ci/resources/stemcell-version-bump/vendor/cloud.google.com/go/storage/internal/version.go @@ -17,4 +17,4 @@ package internal // Version is the current tagged release of the library. -const Version = "1.59.1" +const Version = "1.59.2" diff --git a/ci/resources/stemcell-version-bump/vendor/modules.txt b/ci/resources/stemcell-version-bump/vendor/modules.txt index 28e8243f..6a43191c 100644 --- a/ci/resources/stemcell-version-bump/vendor/modules.txt +++ b/ci/resources/stemcell-version-bump/vendor/modules.txt @@ -42,7 +42,7 @@ cloud.google.com/go/iam/apiv1/iampb cloud.google.com/go/monitoring/apiv3/v2 cloud.google.com/go/monitoring/apiv3/v2/monitoringpb cloud.google.com/go/monitoring/internal -# cloud.google.com/go/storage v1.59.1 +# cloud.google.com/go/storage v1.59.2 ## explicit; go 1.24.0 cloud.google.com/go/storage cloud.google.com/go/storage/experimental