chore(deps): bump cloud.google.com/go/storage from 1.39.1 to 1.40.0 (#3097)
Bumps [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go) from 1.39.1 to 1.40.0. - [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.39.1...spanner/v1.40.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/storage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit is contained in:
parent
b47d323f2e
commit
6f58a95455
8
go.mod
8
go.mod
|
|
@ -3,7 +3,7 @@ module github.com/GoogleContainerTools/kaniko
|
|||
go 1.22
|
||||
|
||||
require (
|
||||
cloud.google.com/go/storage v1.39.1
|
||||
cloud.google.com/go/storage v1.40.0
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.1
|
||||
github.com/aws/aws-sdk-go-v2 v1.26.0
|
||||
github.com/aws/aws-sdk-go-v2/config v1.27.7
|
||||
|
|
@ -49,7 +49,7 @@ require (
|
|||
cloud.google.com/go v0.112.1 // indirect
|
||||
cloud.google.com/go/compute v1.25.1 // indirect
|
||||
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
||||
cloud.google.com/go/iam v1.1.6 // indirect
|
||||
cloud.google.com/go/iam v1.1.7 // indirect
|
||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
|
||||
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
|
||||
github.com/Azure/go-autorest/autorest v0.11.29 // indirect
|
||||
|
|
@ -154,11 +154,9 @@ require (
|
|||
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.2 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect
|
||||
github.com/GoogleCloudPlatform/docker-credential-gcr v2.0.5+incompatible // indirect
|
||||
github.com/Microsoft/hcsshim v0.11.4 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/ecr v1.24.5 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.21.5 // indirect
|
||||
github.com/awslabs/amazon-ecr-credential-helper v0.7.1 // indirect
|
||||
github.com/cloudflare/circl v1.3.7 // indirect
|
||||
github.com/containerd/cgroups/v3 v3.0.2 // indirect
|
||||
github.com/containerd/log v0.1.0 // indirect
|
||||
|
|
@ -196,7 +194,7 @@ require (
|
|||
go.opentelemetry.io/otel/trace v1.24.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240314234333-6e1732d8331c // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
|
|
|
|||
35
go.sum
35
go.sum
|
|
@ -1,16 +1,14 @@
|
|||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM=
|
||||
cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4=
|
||||
cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg=
|
||||
cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40=
|
||||
cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU=
|
||||
cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls=
|
||||
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
|
||||
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
|
||||
cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc=
|
||||
cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI=
|
||||
cloud.google.com/go/storage v1.39.1 h1:MvraqHKhogCOTXTlct/9C3K3+Uy2jBmFYb3/Sp6dVtY=
|
||||
cloud.google.com/go/storage v1.39.1/go.mod h1:xK6xZmxZmo+fyP7+DEF6FhNc24/JAe95OLyOHCXFH1o=
|
||||
cloud.google.com/go/iam v1.1.7 h1:z4VHOhwKLF/+UYXAJDFwGtNF0b6gjsW1Pk9Ml0U/IoM=
|
||||
cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA=
|
||||
cloud.google.com/go/storage v1.40.0 h1:VEpDQV5CJxFmJ6ueWNsKxcr1QAYOXEgxDa+sBbJahPw=
|
||||
cloud.google.com/go/storage v1.40.0/go.mod h1:Rrj7/hKlG87BLqDJYtwR0fbPld8uJPbQ2ucUMY7Ir0g=
|
||||
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
|
||||
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
|
||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
|
||||
|
|
@ -57,8 +55,6 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp
|
|||
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/GoogleCloudPlatform/docker-credential-gcr v2.0.5+incompatible h1:juIaKLLVhqzP55d8x4cSVgwyQv76Z55/fRv/UBr2KkQ=
|
||||
github.com/GoogleCloudPlatform/docker-credential-gcr v2.0.5+incompatible/go.mod h1:BB1eHdMLYEFuFdBlRMb0N7YGVdM5s6Pt0njxgvfbGGs=
|
||||
github.com/GoogleCloudPlatform/docker-credential-gcr/v2 v2.1.22 h1:HevuUpLsTedep2D6wnIp6AAJbVgP0BiVxaMt3HXeOyA=
|
||||
github.com/GoogleCloudPlatform/docker-credential-gcr/v2 v2.1.22/go.mod h1:nzCpg7DFIIkQIZB3mdUPXVvqQ5f/GahA6xgWXTjnK7w=
|
||||
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
|
||||
|
|
@ -118,8 +114,6 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.28.4 h1:Ppup1nVNAOWbBOrcoOxaxPeEnSFB
|
|||
github.com/aws/aws-sdk-go-v2/service/sts v1.28.4/go.mod h1:+K1rNPVyGxkRuv9NNiaZ4YhBFuyw2MMA9SlIJ1Zlpz8=
|
||||
github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw=
|
||||
github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
|
||||
github.com/awslabs/amazon-ecr-credential-helper v0.7.1 h1:MpOEF1ZCctVadCOnNiALwjmz5K4OZ6O7U7F47wKFn6Q=
|
||||
github.com/awslabs/amazon-ecr-credential-helper v0.7.1/go.mod h1:qdmDatFsfbKXDJD8lc16C4gvMM6Jom09bdHQBPisMJg=
|
||||
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231213181459-b0fcec718dc6 h1:PlJRmqKlSlEUlwem1c3zdPaEMtJc/ktnV7naD5Qvsx4=
|
||||
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231213181459-b0fcec718dc6/go.mod h1:08sPJIlDHu4HwQ1xScPgsBWezvM6U10ghGKBJu0mowA=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
|
|
@ -182,16 +176,12 @@ github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK
|
|||
github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
|
||||
github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
|
||||
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
|
||||
github.com/docker/cli v25.0.3+incompatible h1:KLeNs7zws74oFuVhgZQ5ONGZiXUUdgsdy6/EsX/6284=
|
||||
github.com/docker/cli v25.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||
github.com/docker/cli v26.0.0+incompatible h1:90BKrx1a1HKYpSnnBFR6AgDq/FqkHxwlUyzJVPxD30I=
|
||||
github.com/docker/cli v26.0.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||
github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8=
|
||||
github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/docker v26.0.0+incompatible h1:Ng2qi+gdKADUa/VM+6b6YaY2nlZhk/lVJiKR/2bMudU=
|
||||
github.com/docker/docker v26.0.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||
github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8=
|
||||
github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40=
|
||||
github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo=
|
||||
github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
|
||||
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
|
||||
|
|
@ -270,8 +260,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
|
|||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
|
|
@ -408,9 +396,6 @@ github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU=
|
|||
github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w=
|
||||
github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks=
|
||||
github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
|
||||
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
|
||||
github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI=
|
||||
github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
|
||||
github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo=
|
||||
github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
|
||||
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
|
||||
|
|
@ -483,8 +468,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
|||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
|
||||
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
|
||||
|
|
@ -542,8 +527,6 @@ golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU
|
|||
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
|
||||
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20231219160207-73b9e39aefca h1:+xQfFu/HO/82Wwg4zuJ5xiLp0yaOLJjBGnuafXp85YQ=
|
||||
golang.org/x/exp v0.0.0-20231219160207-73b9e39aefca/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
|
||||
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw=
|
||||
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
|
|
@ -554,8 +537,6 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
|
||||
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
|
||||
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
|
|
@ -652,8 +633,6 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
|||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc=
|
||||
golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps=
|
||||
golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw=
|
||||
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
|
@ -673,8 +652,8 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98
|
|||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y=
|
||||
google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 h1:rIo7ocm2roD9DcFIX67Ym8icoGCKSARAiPljFhh5suQ=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240314234333-6e1732d8331c h1:kaI7oewGK5YnVwj+Y+EJBO/YN1ht8iTL9XkFHtVZLsc=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240314234333-6e1732d8331c/go.mod h1:VQW3tUculP/D4B+xVCo+VgSq8As6wA9ZjHl//pmk+6s=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c h1:lfpJ/2rWPa/kJgxyyXM8PrNnfCzcmxJ265mADgwmvLI=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
|
|
|
|||
|
|
@ -1,6 +1,13 @@
|
|||
# Changes
|
||||
|
||||
|
||||
## [1.1.7](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.6...iam/v1.1.7) (2024-03-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **iam:** Update protobuf dep to v1.33.0 ([30b038d](https://github.com/googleapis/google-cloud-go/commit/30b038d8cac0b8cd5dd4761c87f3f298760dd33a))
|
||||
|
||||
## [1.1.6](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.5...iam/v1.1.6) (2024-01-30)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.32.0
|
||||
// protoc v4.23.2
|
||||
// protoc v4.25.2
|
||||
// source: google/iam/v1/iam_policy.proto
|
||||
|
||||
package iampb
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.32.0
|
||||
// protoc v4.23.2
|
||||
// protoc v4.25.2
|
||||
// source: google/iam/v1/options.proto
|
||||
|
||||
package iampb
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.32.0
|
||||
// protoc v4.23.2
|
||||
// protoc v4.25.2
|
||||
// source: google/iam/v1/policy.proto
|
||||
|
||||
package iampb
|
||||
|
|
|
|||
|
|
@ -1,6 +1,25 @@
|
|||
# Changes
|
||||
|
||||
|
||||
## [1.40.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.39.1...storage/v1.40.0) (2024-03-29)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **storage:** Implement io.WriterTo in Reader ([#9659](https://github.com/googleapis/google-cloud-go/issues/9659)) ([8264a96](https://github.com/googleapis/google-cloud-go/commit/8264a962d1c21d52e8fca50af064c5535c3708d3))
|
||||
* **storage:** New storage control client ([#9631](https://github.com/googleapis/google-cloud-go/issues/9631)) ([1f4d279](https://github.com/googleapis/google-cloud-go/commit/1f4d27957743878976d6b4549cc02a5bb894d330))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **storage:** Retry errors from last recv on uploads ([#9616](https://github.com/googleapis/google-cloud-go/issues/9616)) ([b6574aa](https://github.com/googleapis/google-cloud-go/commit/b6574aa42ebad0532c2749b6ece879b932f95cb9))
|
||||
* **storage:** Update protobuf dep to v1.33.0 ([30b038d](https://github.com/googleapis/google-cloud-go/commit/30b038d8cac0b8cd5dd4761c87f3f298760dd33a))
|
||||
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* **storage:** Remove protobuf's copy of data on unmarshalling ([#9526](https://github.com/googleapis/google-cloud-go/issues/9526)) ([81281c0](https://github.com/googleapis/google-cloud-go/commit/81281c04e503fd83301baf88cc352c77f5d476ca))
|
||||
|
||||
## [1.39.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.39.0...storage/v1.39.1) (2024-03-11)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ import (
|
|||
"encoding/base64"
|
||||
"errors"
|
||||
"fmt"
|
||||
"hash/crc32"
|
||||
"io"
|
||||
"net/url"
|
||||
"os"
|
||||
|
|
@ -27,6 +28,7 @@ import (
|
|||
"cloud.google.com/go/internal/trace"
|
||||
gapic "cloud.google.com/go/storage/internal/apiv2"
|
||||
"cloud.google.com/go/storage/internal/apiv2/storagepb"
|
||||
"github.com/golang/protobuf/proto"
|
||||
"github.com/googleapis/gax-go/v2"
|
||||
"google.golang.org/api/googleapi"
|
||||
"google.golang.org/api/iterator"
|
||||
|
|
@ -34,8 +36,10 @@ import (
|
|||
"google.golang.org/api/option/internaloption"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/encoding"
|
||||
"google.golang.org/grpc/metadata"
|
||||
"google.golang.org/grpc/status"
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb"
|
||||
)
|
||||
|
||||
|
|
@ -902,12 +906,50 @@ func (c *grpcStorageClient) RewriteObject(ctx context.Context, req *rewriteObjec
|
|||
return r, nil
|
||||
}
|
||||
|
||||
// bytesCodec is a grpc codec which permits receiving messages as either
|
||||
// protobuf messages, or as raw []bytes.
|
||||
type bytesCodec struct {
|
||||
encoding.Codec
|
||||
}
|
||||
|
||||
func (bytesCodec) Marshal(v any) ([]byte, error) {
|
||||
vv, ok := v.(proto.Message)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("failed to marshal, message is %T, want proto.Message", v)
|
||||
}
|
||||
return proto.Marshal(vv)
|
||||
}
|
||||
|
||||
func (bytesCodec) Unmarshal(data []byte, v any) error {
|
||||
switch v := v.(type) {
|
||||
case *[]byte:
|
||||
// If gRPC could recycle the data []byte after unmarshaling (through
|
||||
// buffer pools), we would need to make a copy here.
|
||||
*v = data
|
||||
return nil
|
||||
case proto.Message:
|
||||
return proto.Unmarshal(data, v)
|
||||
default:
|
||||
return fmt.Errorf("can not unmarshal type %T", v)
|
||||
}
|
||||
}
|
||||
|
||||
func (bytesCodec) Name() string {
|
||||
// If this isn't "", then gRPC sets the content-subtype of the call to this
|
||||
// value and we get errors.
|
||||
return ""
|
||||
}
|
||||
|
||||
func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRangeReaderParams, opts ...storageOption) (r *Reader, err error) {
|
||||
ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.grpcStorageClient.NewRangeReader")
|
||||
defer func() { trace.EndSpan(ctx, err) }()
|
||||
|
||||
s := callSettings(c.settings, opts...)
|
||||
|
||||
s.gax = append(s.gax, gax.WithGRPCOptions(
|
||||
grpc.ForceCodec(bytesCodec{}),
|
||||
))
|
||||
|
||||
if s.userProject != "" {
|
||||
ctx = setUserProjectMetadata(ctx, s.userProject)
|
||||
}
|
||||
|
|
@ -923,6 +965,8 @@ func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRange
|
|||
req.Generation = params.gen
|
||||
}
|
||||
|
||||
var databuf []byte
|
||||
|
||||
// Define a function that initiates a Read with offset and length, assuming
|
||||
// we have already read seen bytes.
|
||||
reopen := func(seen int64) (*readStreamResponse, context.CancelFunc, error) {
|
||||
|
|
@ -957,12 +1001,23 @@ func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRange
|
|||
return err
|
||||
}
|
||||
|
||||
msg, err = stream.Recv()
|
||||
// Receive the message into databuf as a wire-encoded message so we can
|
||||
// use a custom decoder to avoid an extra copy at the protobuf layer.
|
||||
err := stream.RecvMsg(&databuf)
|
||||
// These types of errors show up on the Recv call, rather than the
|
||||
// initialization of the stream via ReadObject above.
|
||||
if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {
|
||||
return ErrObjectNotExist
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// Use a custom decoder that uses protobuf unmarshalling for all
|
||||
// fields except the checksummed data.
|
||||
// Subsequent receives in Read calls will skip all protobuf
|
||||
// unmarshalling and directly read the content from the gRPC []byte
|
||||
// response, since only the first call will contain other fields.
|
||||
msg, err = readFullObjectResponse(databuf)
|
||||
|
||||
return err
|
||||
}, s.retry, s.idempotent)
|
||||
|
|
@ -988,6 +1043,16 @@ func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRange
|
|||
// This is the size of the entire object, even if only a range was requested.
|
||||
size := obj.GetSize()
|
||||
|
||||
// Only support checksums when reading an entire object, not a range.
|
||||
var (
|
||||
wantCRC uint32
|
||||
checkCRC bool
|
||||
)
|
||||
if checksums := msg.GetObjectChecksums(); checksums != nil && checksums.Crc32C != nil && params.offset == 0 && params.length < 0 {
|
||||
wantCRC = checksums.GetCrc32C()
|
||||
checkCRC = true
|
||||
}
|
||||
|
||||
r = &Reader{
|
||||
Attrs: ReaderObjectAttrs{
|
||||
Size: size,
|
||||
|
|
@ -1008,7 +1073,11 @@ func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRange
|
|||
leftovers: msg.GetChecksummedData().GetContent(),
|
||||
settings: s,
|
||||
zeroRange: params.length == 0,
|
||||
databuf: databuf,
|
||||
wantCRC: wantCRC,
|
||||
checkCRC: checkCRC,
|
||||
},
|
||||
checkCRC: checkCRC,
|
||||
}
|
||||
|
||||
cr := msg.GetContentRange()
|
||||
|
|
@ -1026,12 +1095,6 @@ func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRange
|
|||
r.reader.Close()
|
||||
}
|
||||
|
||||
// Only support checksums when reading an entire object, not a range.
|
||||
if checksums := msg.GetObjectChecksums(); checksums != nil && checksums.Crc32C != nil && params.offset == 0 && params.length < 0 {
|
||||
r.wantCRC = checksums.GetCrc32C()
|
||||
r.checkCRC = true
|
||||
}
|
||||
|
||||
return r, nil
|
||||
}
|
||||
|
||||
|
|
@ -1406,14 +1469,37 @@ type gRPCReader struct {
|
|||
stream storagepb.Storage_ReadObjectClient
|
||||
reopen func(seen int64) (*readStreamResponse, context.CancelFunc, error)
|
||||
leftovers []byte
|
||||
databuf []byte
|
||||
cancel context.CancelFunc
|
||||
settings *settings
|
||||
checkCRC bool // should we check the CRC?
|
||||
wantCRC uint32 // the CRC32c value the server sent in the header
|
||||
gotCRC uint32 // running crc
|
||||
}
|
||||
|
||||
// Update the running CRC with the data in the slice, if CRC checking was enabled.
|
||||
func (r *gRPCReader) updateCRC(b []byte) {
|
||||
if r.checkCRC {
|
||||
r.gotCRC = crc32.Update(r.gotCRC, crc32cTable, b)
|
||||
}
|
||||
}
|
||||
|
||||
// Checks whether the CRC matches at the conclusion of a read, if CRC checking was enabled.
|
||||
func (r *gRPCReader) runCRCCheck() error {
|
||||
if r.checkCRC && r.gotCRC != r.wantCRC {
|
||||
return fmt.Errorf("storage: bad CRC on read: got %d, want %d", r.gotCRC, r.wantCRC)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Read reads bytes into the user's buffer from an open gRPC stream.
|
||||
func (r *gRPCReader) Read(p []byte) (int, error) {
|
||||
// The entire object has been read by this reader, return EOF.
|
||||
// The entire object has been read by this reader, check the checksum if
|
||||
// necessary and return EOF.
|
||||
if r.size == r.seen || r.zeroRange {
|
||||
if err := r.runCRCCheck(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return 0, io.EOF
|
||||
}
|
||||
|
||||
|
|
@ -1422,7 +1508,7 @@ func (r *gRPCReader) Read(p []byte) (int, error) {
|
|||
// using the same reader. One encounters an error and the stream is closed
|
||||
// and then reopened while the other routine attempts to read from it.
|
||||
if r.stream == nil {
|
||||
return 0, fmt.Errorf("reader has been closed")
|
||||
return 0, fmt.Errorf("storage: reader has been closed")
|
||||
}
|
||||
|
||||
var n int
|
||||
|
|
@ -1431,12 +1517,13 @@ func (r *gRPCReader) Read(p []byte) (int, error) {
|
|||
if len(r.leftovers) > 0 {
|
||||
n = copy(p, r.leftovers)
|
||||
r.seen += int64(n)
|
||||
r.updateCRC(p[:n])
|
||||
r.leftovers = r.leftovers[n:]
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// Attempt to Recv the next message on the stream.
|
||||
msg, err := r.recv()
|
||||
content, err := r.recv()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
|
@ -1448,7 +1535,6 @@ func (r *gRPCReader) Read(p []byte) (int, error) {
|
|||
// present in the response here.
|
||||
// TODO: Figure out if we need to support decompressive transcoding
|
||||
// https://cloud.google.com/storage/docs/transcoding.
|
||||
content := msg.GetChecksummedData().GetContent()
|
||||
n = copy(p[n:], content)
|
||||
leftover := len(content) - n
|
||||
if leftover > 0 {
|
||||
|
|
@ -1457,10 +1543,78 @@ func (r *gRPCReader) Read(p []byte) (int, error) {
|
|||
r.leftovers = content[n:]
|
||||
}
|
||||
r.seen += int64(n)
|
||||
r.updateCRC(p[:n])
|
||||
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// WriteTo writes all the data requested by the Reader into w, implementing
|
||||
// io.WriterTo.
|
||||
func (r *gRPCReader) WriteTo(w io.Writer) (int64, error) {
|
||||
// The entire object has been read by this reader, check the checksum if
|
||||
// necessary and return nil.
|
||||
if r.size == r.seen || r.zeroRange {
|
||||
if err := r.runCRCCheck(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
// No stream to read from, either never initialized or Close was called.
|
||||
// Note: There is a potential concurrency issue if multiple routines are
|
||||
// using the same reader. One encounters an error and the stream is closed
|
||||
// and then reopened while the other routine attempts to read from it.
|
||||
if r.stream == nil {
|
||||
return 0, fmt.Errorf("storage: reader has been closed")
|
||||
}
|
||||
|
||||
// Track bytes written during before call.
|
||||
var alreadySeen = r.seen
|
||||
|
||||
// Write any leftovers to the stream. There will be some leftovers from the
|
||||
// original NewRangeReader call.
|
||||
if len(r.leftovers) > 0 {
|
||||
// Write() will write the entire leftovers slice unless there is an error.
|
||||
written, err := w.Write(r.leftovers)
|
||||
r.seen += int64(written)
|
||||
r.updateCRC(r.leftovers)
|
||||
r.leftovers = nil
|
||||
if err != nil {
|
||||
return r.seen - alreadySeen, err
|
||||
}
|
||||
}
|
||||
|
||||
// Loop and receive additional messages until the entire data is written.
|
||||
for {
|
||||
// Attempt to receive the next message on the stream.
|
||||
// Will terminate with io.EOF once data has all come through.
|
||||
// recv() handles stream reopening and retry logic so no need for retries here.
|
||||
msg, err := r.recv()
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
// We are done; check the checksum if necessary and return.
|
||||
err = r.runCRCCheck()
|
||||
}
|
||||
return r.seen - alreadySeen, err
|
||||
}
|
||||
|
||||
// TODO: Determine if we need to capture incremental CRC32C for this
|
||||
// chunk. The Object CRC32C checksum is captured when directed to read
|
||||
// the entire Object. If directed to read a range, we may need to
|
||||
// calculate the range's checksum for verification if the checksum is
|
||||
// present in the response here.
|
||||
// TODO: Figure out if we need to support decompressive transcoding
|
||||
// https://cloud.google.com/storage/docs/transcoding.
|
||||
written, err := w.Write(msg)
|
||||
r.seen += int64(written)
|
||||
r.updateCRC(msg)
|
||||
if err != nil {
|
||||
return r.seen - alreadySeen, err
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Close cancels the read stream's context in order for it to be closed and
|
||||
// collected.
|
||||
func (r *gRPCReader) Close() error {
|
||||
|
|
@ -1471,9 +1625,10 @@ func (r *gRPCReader) Close() error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// recv attempts to Recv the next message on the stream. In the event
|
||||
// that a retryable error is encountered, the stream will be closed, reopened,
|
||||
// and Recv again. This will attempt to Recv until one of the following is true:
|
||||
// recv attempts to Recv the next message on the stream and extract the object
|
||||
// data that it contains. In the event that a retryable error is encountered,
|
||||
// the stream will be closed, reopened, and RecvMsg again.
|
||||
// This will attempt to Recv until one of the following is true:
|
||||
//
|
||||
// * Recv is successful
|
||||
// * A non-retryable error is encountered
|
||||
|
|
@ -1481,8 +1636,9 @@ func (r *gRPCReader) Close() error {
|
|||
//
|
||||
// The last error received is the one that is returned, which could be from
|
||||
// an attempt to reopen the stream.
|
||||
func (r *gRPCReader) recv() (*storagepb.ReadObjectResponse, error) {
|
||||
msg, err := r.stream.Recv()
|
||||
func (r *gRPCReader) recv() ([]byte, error) {
|
||||
err := r.stream.RecvMsg(&r.databuf)
|
||||
|
||||
var shouldRetry = ShouldRetry
|
||||
if r.settings.retry != nil && r.settings.retry.shouldRetry != nil {
|
||||
shouldRetry = r.settings.retry.shouldRetry
|
||||
|
|
@ -1492,10 +1648,195 @@ func (r *gRPCReader) recv() (*storagepb.ReadObjectResponse, error) {
|
|||
// reopen the stream, but will backoff if further attempts are necessary.
|
||||
// Reopening the stream Recvs the first message, so if retrying is
|
||||
// successful, the next logical chunk will be returned.
|
||||
msg, err = r.reopenStream()
|
||||
msg, err := r.reopenStream()
|
||||
return msg.GetChecksummedData().GetContent(), err
|
||||
}
|
||||
|
||||
return msg, err
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return readObjectResponseContent(r.databuf)
|
||||
}
|
||||
|
||||
// ReadObjectResponse field and subfield numbers.
|
||||
const (
|
||||
checksummedDataField = protowire.Number(1)
|
||||
checksummedDataContentField = protowire.Number(1)
|
||||
checksummedDataCRC32CField = protowire.Number(2)
|
||||
objectChecksumsField = protowire.Number(2)
|
||||
contentRangeField = protowire.Number(3)
|
||||
metadataField = protowire.Number(4)
|
||||
)
|
||||
|
||||
// readObjectResponseContent returns the checksummed_data.content field of a
|
||||
// ReadObjectResponse message, or an error if the message is invalid.
|
||||
// This can be used on recvs of objects after the first recv, since only the
|
||||
// first message will contain non-data fields.
|
||||
func readObjectResponseContent(b []byte) ([]byte, error) {
|
||||
checksummedData, err := readProtoBytes(b, checksummedDataField)
|
||||
if err != nil {
|
||||
return b, fmt.Errorf("invalid ReadObjectResponse.ChecksummedData: %v", err)
|
||||
}
|
||||
content, err := readProtoBytes(checksummedData, checksummedDataContentField)
|
||||
if err != nil {
|
||||
return content, fmt.Errorf("invalid ReadObjectResponse.ChecksummedData.Content: %v", err)
|
||||
}
|
||||
|
||||
return content, nil
|
||||
}
|
||||
|
||||
// readFullObjectResponse returns the ReadObjectResponse that is encoded in the
|
||||
// wire-encoded message buffer b, or an error if the message is invalid.
|
||||
// This must be used on the first recv of an object as it may contain all fields
|
||||
// of ReadObjectResponse, and we use or pass on those fields to the user.
|
||||
// This function is essentially identical to proto.Unmarshal, except it aliases
|
||||
// the data in the input []byte. If the proto library adds a feature to
|
||||
// Unmarshal that does that, this function can be dropped.
|
||||
func readFullObjectResponse(b []byte) (*storagepb.ReadObjectResponse, error) {
|
||||
msg := &storagepb.ReadObjectResponse{}
|
||||
|
||||
// Loop over the entire message, extracting fields as we go. This does not
|
||||
// handle field concatenation, in which the contents of a single field
|
||||
// are split across multiple protobuf tags.
|
||||
off := 0
|
||||
for off < len(b) {
|
||||
// Consume the next tag. This will tell us which field is next in the
|
||||
// buffer, its type, and how much space it takes up.
|
||||
fieldNum, fieldType, fieldLength := protowire.ConsumeTag(b[off:])
|
||||
if fieldLength < 0 {
|
||||
return nil, protowire.ParseError(fieldLength)
|
||||
}
|
||||
off += fieldLength
|
||||
|
||||
// Unmarshal the field according to its type. Only fields that are not
|
||||
// nil will be present.
|
||||
switch {
|
||||
case fieldNum == checksummedDataField && fieldType == protowire.BytesType:
|
||||
// The ChecksummedData field was found. Initialize the struct.
|
||||
msg.ChecksummedData = &storagepb.ChecksummedData{}
|
||||
|
||||
// Get the bytes corresponding to the checksummed data.
|
||||
fieldContent, n := protowire.ConsumeBytes(b[off:])
|
||||
if n < 0 {
|
||||
return nil, fmt.Errorf("invalid ReadObjectResponse.ChecksummedData: %v", protowire.ParseError(n))
|
||||
}
|
||||
off += n
|
||||
|
||||
// Get the nested fields. We need to do this manually as it contains
|
||||
// the object content bytes.
|
||||
contentOff := 0
|
||||
for contentOff < len(fieldContent) {
|
||||
gotNum, gotTyp, n := protowire.ConsumeTag(fieldContent[contentOff:])
|
||||
if n < 0 {
|
||||
return nil, protowire.ParseError(n)
|
||||
}
|
||||
contentOff += n
|
||||
|
||||
switch {
|
||||
case gotNum == checksummedDataContentField && gotTyp == protowire.BytesType:
|
||||
// Get the content bytes.
|
||||
bytes, n := protowire.ConsumeBytes(fieldContent[contentOff:])
|
||||
if n < 0 {
|
||||
return nil, fmt.Errorf("invalid ReadObjectResponse.ChecksummedData.Content: %v", protowire.ParseError(n))
|
||||
}
|
||||
msg.ChecksummedData.Content = bytes
|
||||
contentOff += n
|
||||
case gotNum == checksummedDataCRC32CField && gotTyp == protowire.Fixed32Type:
|
||||
v, n := protowire.ConsumeFixed32(fieldContent[contentOff:])
|
||||
if n < 0 {
|
||||
return nil, fmt.Errorf("invalid ReadObjectResponse.ChecksummedData.Crc32C: %v", protowire.ParseError(n))
|
||||
}
|
||||
msg.ChecksummedData.Crc32C = &v
|
||||
contentOff += n
|
||||
default:
|
||||
n = protowire.ConsumeFieldValue(gotNum, gotTyp, fieldContent[contentOff:])
|
||||
if n < 0 {
|
||||
return nil, protowire.ParseError(n)
|
||||
}
|
||||
contentOff += n
|
||||
}
|
||||
}
|
||||
case fieldNum == objectChecksumsField && fieldType == protowire.BytesType:
|
||||
// The field was found. Initialize the struct.
|
||||
msg.ObjectChecksums = &storagepb.ObjectChecksums{}
|
||||
|
||||
// Get the bytes corresponding to the checksums.
|
||||
bytes, n := protowire.ConsumeBytes(b[off:])
|
||||
if n < 0 {
|
||||
return nil, fmt.Errorf("invalid ReadObjectResponse.ObjectChecksums: %v", protowire.ParseError(n))
|
||||
}
|
||||
off += n
|
||||
|
||||
// Unmarshal.
|
||||
if err := proto.Unmarshal(bytes, msg.ObjectChecksums); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
case fieldNum == contentRangeField && fieldType == protowire.BytesType:
|
||||
msg.ContentRange = &storagepb.ContentRange{}
|
||||
|
||||
bytes, n := protowire.ConsumeBytes(b[off:])
|
||||
if n < 0 {
|
||||
return nil, fmt.Errorf("invalid ReadObjectResponse.ContentRange: %v", protowire.ParseError(n))
|
||||
}
|
||||
off += n
|
||||
|
||||
if err := proto.Unmarshal(bytes, msg.ContentRange); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
case fieldNum == metadataField && fieldType == protowire.BytesType:
|
||||
msg.Metadata = &storagepb.Object{}
|
||||
|
||||
bytes, n := protowire.ConsumeBytes(b[off:])
|
||||
if n < 0 {
|
||||
return nil, fmt.Errorf("invalid ReadObjectResponse.Metadata: %v", protowire.ParseError(n))
|
||||
}
|
||||
off += n
|
||||
|
||||
if err := proto.Unmarshal(bytes, msg.Metadata); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
default:
|
||||
fieldLength = protowire.ConsumeFieldValue(fieldNum, fieldType, b[off:])
|
||||
if fieldLength < 0 {
|
||||
return nil, fmt.Errorf("default: %v", protowire.ParseError(fieldLength))
|
||||
}
|
||||
off += fieldLength
|
||||
}
|
||||
}
|
||||
|
||||
return msg, nil
|
||||
}
|
||||
|
||||
// readProtoBytes returns the contents of the protobuf field with number num
|
||||
// and type bytes from a wire-encoded message. If the field cannot be found,
|
||||
// the returned slice will be nil and no error will be returned.
|
||||
//
|
||||
// It does not handle field concatenation, in which the contents of a single field
|
||||
// are split across multiple protobuf tags. Encoded data containing split fields
|
||||
// of this form is technically permissable, but uncommon.
|
||||
func readProtoBytes(b []byte, num protowire.Number) ([]byte, error) {
|
||||
off := 0
|
||||
for off < len(b) {
|
||||
gotNum, gotTyp, n := protowire.ConsumeTag(b[off:])
|
||||
if n < 0 {
|
||||
return nil, protowire.ParseError(n)
|
||||
}
|
||||
off += n
|
||||
if gotNum == num && gotTyp == protowire.BytesType {
|
||||
b, n := protowire.ConsumeBytes(b[off:])
|
||||
if n < 0 {
|
||||
return nil, protowire.ParseError(n)
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
n = protowire.ConsumeFieldValue(gotNum, gotTyp, b[off:])
|
||||
if n < 0 {
|
||||
return nil, protowire.ParseError(n)
|
||||
}
|
||||
off += n
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// reopenStream "closes" the existing stream and attempts to reopen a stream and
|
||||
|
|
@ -1630,6 +1971,7 @@ func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*st
|
|||
|
||||
// Send a request with as many bytes as possible.
|
||||
// Loop until all bytes are sent.
|
||||
sendBytes: // label this loop so that we can use a continue statement from a nested block
|
||||
for {
|
||||
bytesNotYetSent := recvd - sent
|
||||
remainingDataFitsInSingleReq := bytesNotYetSent <= maxPerMessageWriteSize
|
||||
|
|
@ -1707,10 +2049,6 @@ func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*st
|
|||
// we retry.
|
||||
w.stream = nil
|
||||
|
||||
// Drop the stream reference as a new one will need to be created if
|
||||
// we can retry the upload
|
||||
w.stream = nil
|
||||
|
||||
// Retriable errors mean we should start over and attempt to
|
||||
// resend the entire buffer via a new stream.
|
||||
// If not retriable, falling through will return the error received.
|
||||
|
|
@ -1724,7 +2062,7 @@ func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*st
|
|||
|
||||
// Continue sending requests, opening a new stream and resending
|
||||
// any bytes not yet persisted as per QueryWriteStatus
|
||||
continue
|
||||
continue sendBytes
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
|
|
@ -1739,7 +2077,7 @@ func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*st
|
|||
// Not done sending data, do not attempt to commit it yet, loop around
|
||||
// and send more data.
|
||||
if recvd-sent > 0 {
|
||||
continue
|
||||
continue sendBytes
|
||||
}
|
||||
|
||||
// The buffer has been uploaded and there is still more data to be
|
||||
|
|
@ -1770,7 +2108,7 @@ func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*st
|
|||
// Drop the stream reference as a new one will need to be created.
|
||||
w.stream = nil
|
||||
|
||||
continue
|
||||
continue sendBytes
|
||||
}
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
|
|
@ -1780,7 +2118,7 @@ func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*st
|
|||
// Retry if not all bytes were persisted.
|
||||
writeOffset = resp.GetPersistedSize()
|
||||
sent = int(writeOffset) - int(start)
|
||||
continue
|
||||
continue sendBytes
|
||||
}
|
||||
} else {
|
||||
// If the object is done uploading, close the send stream to signal
|
||||
|
|
@ -1800,6 +2138,15 @@ func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*st
|
|||
var obj *storagepb.Object
|
||||
for obj == nil {
|
||||
resp, err := w.stream.Recv()
|
||||
if shouldRetry(err) {
|
||||
writeOffset, err = w.determineOffset(start)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
sent = int(writeOffset) - int(start)
|
||||
w.stream = nil
|
||||
continue sendBytes
|
||||
}
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ import (
|
|||
"encoding/base64"
|
||||
"errors"
|
||||
"fmt"
|
||||
"hash/crc32"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
|
|
@ -1218,9 +1219,12 @@ func (c *httpStorageClient) DeleteNotification(ctx context.Context, bucket strin
|
|||
}
|
||||
|
||||
type httpReader struct {
|
||||
body io.ReadCloser
|
||||
seen int64
|
||||
reopen func(seen int64) (*http.Response, error)
|
||||
body io.ReadCloser
|
||||
seen int64
|
||||
reopen func(seen int64) (*http.Response, error)
|
||||
checkCRC bool // should we check the CRC?
|
||||
wantCRC uint32 // the CRC32c value the server sent in the header
|
||||
gotCRC uint32 // running crc
|
||||
}
|
||||
|
||||
func (r *httpReader) Read(p []byte) (int, error) {
|
||||
|
|
@ -1229,7 +1233,22 @@ func (r *httpReader) Read(p []byte) (int, error) {
|
|||
m, err := r.body.Read(p[n:])
|
||||
n += m
|
||||
r.seen += int64(m)
|
||||
if err == nil || err == io.EOF {
|
||||
if r.checkCRC {
|
||||
r.gotCRC = crc32.Update(r.gotCRC, crc32cTable, p[:n])
|
||||
}
|
||||
if err == nil {
|
||||
return n, nil
|
||||
}
|
||||
if err == io.EOF {
|
||||
// Check CRC here. It would be natural to check it in Close, but
|
||||
// everybody defers Close on the assumption that it doesn't return
|
||||
// anything worth looking at.
|
||||
if r.checkCRC {
|
||||
if r.gotCRC != r.wantCRC {
|
||||
return n, fmt.Errorf("storage: bad CRC on read: got %d, want %d",
|
||||
r.gotCRC, r.wantCRC)
|
||||
}
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
// Read failed (likely due to connection issues), but we will try to reopen
|
||||
|
|
@ -1435,11 +1454,12 @@ func parseReadResponse(res *http.Response, params *newRangeReaderParams, reopen
|
|||
Attrs: attrs,
|
||||
size: size,
|
||||
remain: remain,
|
||||
wantCRC: crc,
|
||||
checkCRC: checkCRC,
|
||||
reader: &httpReader{
|
||||
reopen: reopen,
|
||||
body: body,
|
||||
reopen: reopen,
|
||||
body: body,
|
||||
wantCRC: crc,
|
||||
checkCRC: checkCRC,
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,4 +15,4 @@
|
|||
package internal
|
||||
|
||||
// Version is the current tagged release of the library.
|
||||
const Version = "1.39.1"
|
||||
const Version = "1.40.0"
|
||||
|
|
|
|||
|
|
@ -198,9 +198,7 @@ var emptyBody = ioutil.NopCloser(strings.NewReader(""))
|
|||
type Reader struct {
|
||||
Attrs ReaderObjectAttrs
|
||||
seen, remain, size int64
|
||||
checkCRC bool // should we check the CRC?
|
||||
wantCRC uint32 // the CRC32c value the server sent in the header
|
||||
gotCRC uint32 // running crc
|
||||
checkCRC bool // Did we check the CRC? This is now only used by tests.
|
||||
|
||||
reader io.ReadCloser
|
||||
ctx context.Context
|
||||
|
|
@ -218,17 +216,17 @@ func (r *Reader) Read(p []byte) (int, error) {
|
|||
if r.remain != -1 {
|
||||
r.remain -= int64(n)
|
||||
}
|
||||
if r.checkCRC {
|
||||
r.gotCRC = crc32.Update(r.gotCRC, crc32cTable, p[:n])
|
||||
// Check CRC here. It would be natural to check it in Close, but
|
||||
// everybody defers Close on the assumption that it doesn't return
|
||||
// anything worth looking at.
|
||||
if err == io.EOF {
|
||||
if r.gotCRC != r.wantCRC {
|
||||
return n, fmt.Errorf("storage: bad CRC on read: got %d, want %d",
|
||||
r.gotCRC, r.wantCRC)
|
||||
}
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
// WriteTo writes all the data from the Reader to w. Fulfills the io.WriterTo interface.
|
||||
// This is called implicitly when calling io.Copy on a Reader.
|
||||
func (r *Reader) WriteTo(w io.Writer) (int64, error) {
|
||||
// This implicitly calls r.reader.WriteTo for gRPC only. JSON and XML don't have an
|
||||
// implementation of WriteTo.
|
||||
n, err := io.Copy(w, r.reader)
|
||||
if r.remain != -1 {
|
||||
r.remain -= int64(n)
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,11 +10,11 @@ cloud.google.com/go/compute/internal
|
|||
# cloud.google.com/go/compute/metadata v0.2.3
|
||||
## explicit; go 1.19
|
||||
cloud.google.com/go/compute/metadata
|
||||
# cloud.google.com/go/iam v1.1.6
|
||||
# cloud.google.com/go/iam v1.1.7
|
||||
## explicit; go 1.19
|
||||
cloud.google.com/go/iam
|
||||
cloud.google.com/go/iam/apiv1/iampb
|
||||
# cloud.google.com/go/storage v1.39.1
|
||||
# cloud.google.com/go/storage v1.40.0
|
||||
## explicit; go 1.19
|
||||
cloud.google.com/go/storage
|
||||
cloud.google.com/go/storage/internal
|
||||
|
|
@ -105,8 +105,6 @@ github.com/Azure/go-autorest/logger
|
|||
# github.com/Azure/go-autorest/tracing v0.6.0
|
||||
## explicit; go 1.12
|
||||
github.com/Azure/go-autorest/tracing
|
||||
# github.com/GoogleCloudPlatform/docker-credential-gcr v2.0.5+incompatible
|
||||
## explicit
|
||||
# github.com/GoogleCloudPlatform/docker-credential-gcr/v2 v2.1.22
|
||||
## explicit; go 1.21
|
||||
github.com/GoogleCloudPlatform/docker-credential-gcr/v2
|
||||
|
|
@ -317,8 +315,6 @@ github.com/aws/smithy-go/time
|
|||
github.com/aws/smithy-go/transport/http
|
||||
github.com/aws/smithy-go/transport/http/internal/io
|
||||
github.com/aws/smithy-go/waiter
|
||||
# github.com/awslabs/amazon-ecr-credential-helper v0.7.1
|
||||
## explicit
|
||||
# github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231213181459-b0fcec718dc6
|
||||
## explicit; go 1.19
|
||||
github.com/awslabs/amazon-ecr-credential-helper/ecr-login
|
||||
|
|
@ -1227,7 +1223,7 @@ google.golang.org/appengine/urlfetch
|
|||
google.golang.org/genproto/googleapis/type/date
|
||||
google.golang.org/genproto/googleapis/type/expr
|
||||
google.golang.org/genproto/protobuf/field_mask
|
||||
# google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2
|
||||
# google.golang.org/genproto/googleapis/api v0.0.0-20240314234333-6e1732d8331c
|
||||
## explicit; go 1.19
|
||||
google.golang.org/genproto/googleapis/api
|
||||
google.golang.org/genproto/googleapis/api/annotations
|
||||
|
|
|
|||
Loading…
Reference in New Issue