From 25ce7cf05c053fe55545a3e3bbf4da6b11d4d8e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 12:32:22 +0000 Subject: [PATCH] Bump the googles group across 1 directory with 4 updates Bumps the googles group with 2 updates in the / directory: [google.golang.org/grpc](https://github.com/grpc/grpc-go) and google.golang.org/protobuf. Updates `google.golang.org/grpc` from 1.67.1 to 1.68.1 - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.67.1...v1.68.1) Updates `google.golang.org/protobuf` from 1.35.1 to 1.35.2 Updates `google.golang.org/genproto/googleapis/api` from 0.0.0-20240822170219-fc7c04adadcd to 0.0.0-20240903143218-8af14fe29dc1 - [Commits](https://github.com/googleapis/go-genproto/commits) Updates `google.golang.org/genproto/googleapis/rpc` from 0.0.0-20240822170219-fc7c04adadcd to 0.0.0-20240903143218-8af14fe29dc1 - [Commits](https://github.com/googleapis/go-genproto/commits) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor dependency-group: googles - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-patch dependency-group: googles - dependency-name: google.golang.org/genproto/googleapis/api dependency-type: indirect update-type: version-update:semver-patch dependency-group: googles - dependency-name: google.golang.org/genproto/googleapis/rpc dependency-type: indirect update-type: version-update:semver-patch dependency-group: googles ... Signed-off-by: dependabot[bot] --- go.mod | 11 +- go.sum | 16 +- .../assets/packages/report/dist/index.html | 20 - .../assets/packages/ui/dist/index.html | 19 - .../testdata/customize/config-custom.js | 51 -- .../dashboard/testdata/result.json.gz | Bin 37542 -> 0 bytes .../dashboard/testdata/result.ndjson | 26 - .../dashboard/testdata/result.ndjson.gz | Bin 3455 -> 0 bytes vendor/google.golang.org/grpc/CONTRIBUTING.md | 16 +- .../grpc/balancer/balancer.go | 15 +- .../grpc/balancer/base/balancer.go | 2 +- .../balancer/pickfirst/internal/internal.go | 24 + .../grpc/balancer/pickfirst/pickfirst.go | 14 +- .../pickfirst/pickfirstleaf/pickfirstleaf.go | 625 ++++++++++++++++++ .../grpc/balancer_wrapper.go | 48 +- vendor/google.golang.org/grpc/clientconn.go | 54 +- .../google.golang.org/grpc/credentials/tls.go | 29 +- vendor/google.golang.org/grpc/dialoptions.go | 2 +- .../balancer/gracefulswitch/config.go | 2 + .../grpc/internal/channelz/channel.go | 15 + .../grpc/internal/channelz/server.go | 2 + .../grpc/internal/channelz/socket.go | 7 + .../grpc/internal/channelz/subchannel.go | 2 + .../grpc/internal/channelz/trace.go | 19 +- .../grpc/internal/envconfig/envconfig.go | 5 + .../internal/grpcsync/callback_serializer.go | 2 +- .../grpc/internal/grpcutil/method.go | 2 +- .../grpc/internal/idle/idle.go | 4 +- .../grpc/internal/internal.go | 8 +- .../internal/resolver/dns/dns_resolver.go | 6 +- .../internal/stats/metrics_recorder_list.go | 10 + .../grpc/internal/status/status.go | 35 +- .../grpc/internal/transport/http2_client.go | 60 +- .../grpc/internal/transport/transport.go | 9 + vendor/google.golang.org/grpc/mem/buffers.go | 32 +- vendor/google.golang.org/grpc/rpc_util.go | 3 +- vendor/google.golang.org/grpc/version.go | 2 +- .../encoding/protojson/well_known_types.go | 6 +- .../editiondefaults/editions_defaults.binpb | Bin 93 -> 99 bytes .../internal/editionssupport/editions.go | 5 + .../protobuf/internal/filedesc/desc.go | 15 + .../protobuf/internal/filedesc/editions.go | 4 + .../internal/genid/go_features_gen.go | 17 + .../protobuf/internal/version/version.go | 2 +- .../protobuf/reflect/protodesc/desc.go | 12 +- .../protobuf/reflect/protodesc/editions.go | 5 + .../types/gofeaturespb/go_features.pb.go | 131 +++- vendor/modules.txt | 12 +- 48 files changed, 1118 insertions(+), 288 deletions(-) delete mode 100644 vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/assets/packages/report/dist/index.html delete mode 100644 vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/assets/packages/ui/dist/index.html delete mode 100644 vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/customize/config-custom.js delete mode 100644 vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/result.json.gz delete mode 100644 vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/result.ndjson delete mode 100644 vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/result.ndjson.gz create mode 100644 vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go create mode 100644 vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go diff --git a/go.mod b/go.mod index cf8079f1995..52072d89805 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,7 @@ module go.k6.io/k6 go 1.21 - -toolchain go1.21.13 +toolchain go1.22.5 require ( github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 @@ -52,8 +51,8 @@ require ( golang.org/x/net v0.32.0 golang.org/x/term v0.27.0 golang.org/x/time v0.8.0 - google.golang.org/grpc v1.67.1 - google.golang.org/protobuf v1.35.1 + google.golang.org/grpc v1.68.1 + google.golang.org/protobuf v1.35.2 gopkg.in/guregu/null.v3 v3.3.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -99,7 +98,7 @@ require ( golang.org/x/sync v0.10.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect ) diff --git a/go.sum b/go.sum index b1ea1252cbc..00d1068f20d 100644 --- a/go.sum +++ b/go.sum @@ -328,21 +328,21 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1:BBOTEWLuuEGQy9n1y9MhVJ9Qt0BDu21X8qZs71/uPZo= -google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd h1:6TEm2ZxXoQmFWFlt1vNxvVOa1Q0dXFQD1m/rYjXmS0E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/assets/packages/report/dist/index.html b/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/assets/packages/report/dist/index.html deleted file mode 100644 index ee5a83fc0ee..00000000000 --- a/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/assets/packages/report/dist/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -
- - - - - \ No newline at end of file diff --git a/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/assets/packages/ui/dist/index.html b/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/assets/packages/ui/dist/index.html deleted file mode 100644 index d4b99f917b1..00000000000 --- a/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/assets/packages/ui/dist/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - -
- - - - \ No newline at end of file diff --git a/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/customize/config-custom.js b/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/customize/config-custom.js deleted file mode 100644 index a5f21124214..00000000000 --- a/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/customize/config-custom.js +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Raintank, Inc. dba Grafana Labs -// -// SPDX-License-Identifier: AGPL-3.0-only - -export default function (config) { - function getById(id) { - return this.filter( - (/** @type {{ id: string; }} */ element) => element.id == id - ).at(0); - } - - Array.prototype["getById"] = getById; - - function durationPanel(suffix) { - return { - id: `http_req_duration_${suffix}`, - title: `HTTP Request Duration ${suffix}`, - metric: `http_req_duration_trend_${suffix}`, - format: "duration", - }; - } - - const overview = config.tabs.getById("overview_snapshot"); - - const customPanels = [ - overview.panels.getById("vus"), - overview.panels.getById("http_reqs"), - durationPanel("avg"), - durationPanel("p(90)"), - durationPanel("p(95)"), - durationPanel("p(99)"), - ]; - - const durationChart = Object.assign( - {}, - overview.charts.getById("http_req_duration") - ); - - const customTab = { - id: "custom", - title: "Custom", - event: overview.event, - panels: customPanels, - charts: [overview.charts.getById("http_reqs"), durationChart], - description: "Example of customizing the display of metrics.", - }; - - config.tabs.push(customTab); - - return config; -} diff --git a/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/result.json.gz b/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/result.json.gz deleted file mode 100644 index 3c72ccfb03f8d2e4b7ac0418fcc4398de5e982b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37542 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 L8&jrsk;e`I7T@-} diff --git a/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/result.ndjson b/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/result.ndjson deleted file mode 100644 index c9161ce8609..00000000000 --- a/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/result.ndjson +++ /dev/null @@ -1,26 +0,0 @@ -{"event":"param","data":{"scenarios":["contacts"],"endOffset":50000,"period":2000,"scriptPath":"file:///home/iszkiba/work/xk6-dashboard/scripts/test.js","aggregates":{"counter":["count","rate"],"gauge":["value"],"rate":["rate"],"trend":["avg","max","med","min","p(90)","p(95)","p(99)"]}}} -{"event":"metric","data":{"time":{"type":"gauge","contains":"time"}}} -{"event":"start","data":[[1707753110400]]} -{"event":"metric","data":{"data_received":{"type":"counter","contains":"data"},"data_sent":{"type":"counter","contains":"data"},"http_req_blocked":{"type":"trend","contains":"time"},"http_req_connecting":{"type":"trend","contains":"time"},"http_req_duration":{"type":"trend","contains":"time"},"http_req_failed":{"type":"rate"},"http_req_receiving":{"type":"trend","contains":"time"},"http_req_sending":{"type":"trend","contains":"time"},"http_req_tls_handshaking":{"type":"trend","contains":"time"},"http_req_waiting":{"type":"trend","contains":"time"},"http_reqs":{"type":"counter"},"iteration_duration":{"type":"trend","contains":"time"},"iterations":{"type":"counter"},"vus":{"type":"gauge"},"vus_max":{"type":"gauge"}}} -{"event":"snapshot","data":[[153032,76516],[3112,1556],[34.708,261.19,0.00757,0.00238,157.25,242.43,260.32],[20.941,126.18,0,0,125.26,126.03,126.17],[125.46,129.5,125.23,123.41,127.7,128.34,129.25],[0],[0.12983,0.2734,0.12742,0.04063,0.20904,0.24158,0.26723],[0.05317,0.27672,0.03342,0.01047,0.07691,0.19371,0.26227],[11.077,134.78,0,0,0,111.41,133.93],[125.28,129.34,124.87,123.33,127.5,128.14,129.08],[24,12],[320.6,671.72,250.89,249.86,624.8,668.62,671.1],[12,6],[1707753112400],[2],[2]]} -{"event":"cumulative","data":[[153032,76503],[3112,1555.7],[34.708,261.19,0.00757,0.00238,157.25,242.43,260.32],[20.941,126.18,0,0,125.26,126.03,126.17],[125.46,129.5,125.23,123.41,127.7,128.34,129.25],[0],[0.12983,0.2734,0.12742,0.04063,0.20904,0.24158,0.26723],[0.05317,0.27672,0.03342,0.01047,0.07691,0.19371,0.26227],[11.077,134.78,0,0,0,111.41,133.93],[125.28,129.34,124.87,123.33,127.5,128.14,129.08],[24,11.998],[320.6,671.72,250.89,249.86,624.8,668.62,671.1],[12,5.999],[1707753112400],[2],[2]]} -{"event":"snapshot","data":[[189562,94781],[3232,1616],[0.00659,0.01647,0.00628,0.00204,0.01061,0.01228,0.01547],[0,0,0,0,0,0,0],[125.18,127.29,124.81,123.35,126.66,126.98,127.28],[0],[0.11157,0.26554,0.10349,0.03542,0.17293,0.19397,0.24899],[0.03266,0.0903,0.02916,0.00824,0.05138,0.06219,0.08215],[0,0,0,0,0,0,0],[125.04,127.15,124.71,123.24,126.59,126.8,127.11],[32,16],[250.6,251.71,250.82,249.07,251.47,251.63,251.7],[16,8],[1707753114401],[2],[2]]} -{"event":"cumulative","data":[[342594,85637],[6344,1585.8],[14.878,261.19,0.00698,0.00204,0.01701,156.92,259.11],[8.9747,126.18,0,0,0,124.96,126.15],[125.3,129.5,125.06,123.35,127.06,127.44,128.91],[0],[0.1194,0.2734,0.11376,0.03542,0.1951,0.2216,0.26908],[0.04145,0.27672,0.03096,0.00824,0.06516,0.08199,0.24217],[4.7475,134.78,0,0,0,0,132.74],[125.14,129.34,124.77,123.24,126.87,127.28,128.73],[56,13.998],[280.6,671.72,250.88,249.07,252.26,521.57,670.2],[28,6.9991],[1707753114401],[2],[2]]} -{"event":"snapshot","data":[[189524,94762],[3232,1616],[0.00668,0.01496,0.00638,0.00165,0.01175,0.013,0.01464],[0,0,0,0,0,0,0],[125.03,127.4,124.97,122.92,126.62,126.86,127.25],[0],[0.11551,0.26031,0.107,0.03454,0.17327,0.22248,0.25629],[0.02998,0.08828,0.02604,0.00778,0.05089,0.06632,0.08672],[0,0,0,0,0,0,0],[124.88,127.2,124.79,122.79,126.48,126.69,127.06],[32,16],[250.3,251.73,250.43,248.56,251.23,251.41,251.66],[16,8],[1707753116400],[2],[2]]} -{"event":"cumulative","data":[[532118,88679],[9576,1595.8],[9.4707,261.19,0.00654,0.00165,0.01345,0.02636,257.91],[5.7112,126.18,0,0,0,0,126.14],[125.2,129.5,125.05,122.92,126.82,127.29,128.56],[0],[0.11798,0.2734,0.1114,0.03454,0.19347,0.23492,0.26656],[0.03728,0.27672,0.02875,0.00778,0.06169,0.08183,0.22208],[3.0211,134.78,0,0,0,0,131.55],[125.05,129.34,124.79,122.79,126.66,127.15,128.37],[88,14.665],[269.58,671.72,250.73,248.56,251.72,252.97,669.3],[44,7.3327],[1707753116400],[2],[2]]} -{"event":"snapshot","data":[[189578,94789],[3232,1616],[0.00653,0.03918,0.00472,0.0021,0.0096,0.01408,0.03157],[0,0,0,0,0,0,0],[125.16,127.69,125.19,123.34,126.85,127.23,127.63],[0],[0.10495,0.23818,0.08974,0.04028,0.16617,0.19487,0.22879],[0.02824,0.05858,0.02372,0.0104,0.04745,0.05574,0.05773],[0,0,0,0,0,0,0],[125.02,127.54,124.95,123.21,126.73,127.06,127.49],[32,16],[250.54,251.86,250.66,249.32,251.3,251.46,251.78],[16,8],[1707753118401],[2],[2]]} -{"event":"cumulative","data":[[721696,90196],[12808,1600.7],[6.9469,261.19,0.00634,0.00165,0.01328,0.01822,238.43],[4.1882,126.18,0,0,0,0,126],[125.19,129.5,125.05,122.92,126.85,127.29,128.32],[0],[0.11451,0.2734,0.10484,0.03454,0.1849,0.21452,0.26455],[0.03487,0.27672,0.02788,0.00778,0.05599,0.0719,0.19042],[2.2155,134.78,0,0,0,0,106.17],[125.04,129.34,124.79,122.79,126.72,127.16,128.12],[120,14.997],[264.5,671.72,250.73,248.56,251.72,251.94,668.4],[60,7.4986],[1707753118401],[2],[2]]} -{"event":"snapshot","data":[[189534,94767],[3232,1616],[0.00629,0.01456,0.00612,0.00193,0.01106,0.01223,0.01415],[0,0,0,0,0,0,0],[125.45,131,125.17,123.59,127.51,128.44,130.39],[0],[0.11838,0.27248,0.10859,0.03066,0.19235,0.23028,0.26549],[0.02883,0.06128,0.02741,0.00817,0.04891,0.05468,0.05983],[0,0,0,0,0,0,0],[125.3,130.91,125.02,123.32,127.37,128.22,130.24],[32,16],[251.11,255.32,250.87,249.29,252.6,253.87,255.03],[16,8],[1707753120401],[2],[2]]} -{"event":"cumulative","data":[[911230,91116],[16040,1603.8],[5.4857,261.19,0.00627,0.00165,0.01309,0.01564,206.44],[3.3064,126.18,0,0,0,0,125.78],[125.24,131,125.05,122.92,126.87,127.54,129.27],[0],[0.11532,0.2734,0.10521,0.03066,0.19061,0.22498,0.26894],[0.0336,0.27672,0.0278,0.00778,0.05541,0.06504,0.15087],[1.749,134.78,0,0,0,0,64.226],[125.1,130.91,124.79,122.79,126.75,127.42,129.03],[152,15.198],[261.68,671.72,250.74,248.56,251.77,253.22,667.5],[76,7.5994],[1707753120401],[2],[2]]} -{"event":"snapshot","data":[[189556,94778],[3232,1616],[0.00495,0.01144,0.00415,0.00192,0.0087,0.0105,0.01118],[0,0,0,0,0,0,0],[125.46,132.6,125.25,123.58,126.88,128.17,131.37],[0],[0.08947,0.17905,0.07905,0.03438,0.15324,0.15399,0.17131],[0.02358,0.06454,0.02172,0.00854,0.03727,0.04047,0.05784],[0,0,0,0,0,0,0],[125.35,132.54,125.15,123.46,126.79,128.08,131.31],[32,16],[251.09,256.64,250.38,249.36,253.63,254.82,256.27],[16,8],[1707753122401],[2],[2]]} -{"event":"cumulative","data":[[1100786,91725],[19272,1605.8],[4.5325,261.19,0.0057,0.00165,0.0116,0.01461,174.46],[2.7314,126.18,0,0,0,0,125.57],[125.28,132.6,125.05,122.92,126.9,127.67,129.76],[0],[0.11083,0.2734,0.10257,0.03066,0.17979,0.2131,0.26672],[0.03185,0.27672,0.02667,0.00778,0.05224,0.06359,0.11131],[1.4449,134.78,0,0,0,0,22.282],[125.14,132.54,124.86,122.79,126.76,127.53,129.6],[184,15.332],[259.84,671.72,250.73,248.56,251.86,253.76,666.59],[92,7.6661],[1707753122401],[2],[2]]} -{"event":"snapshot","data":[[189578,94789],[3232,1616],[0.00493,0.01003,0.00411,0.00172,0.00917,0.00959,0.00999],[0,0,0,0,0,0,0],[125.2,128.18,125.1,123.08,127.19,127.76,128.07],[0],[0.08721,0.22691,0.08369,0.03243,0.13193,0.14074,0.20035],[0.02375,0.05778,0.02169,0.00773,0.03702,0.04023,0.05289],[0,0,0,0,0,0,0],[125.09,128.11,124.99,122.97,126.96,127.68,127.99],[32,16],[250.58,252.27,250.18,249.23,252.01,252.08,252.23],[16,8],[1707753124401],[2],[2]]} -{"event":"cumulative","data":[[1290364,92163],[22504,1607.3],[3.8618,261.19,0.00537,0.00165,0.01128,0.0141,157.36],[2.3267,126.18,0,0,0,0,125.35],[125.27,132.6,125.05,122.92,127,127.71,129.43],[0],[0.10733,0.2734,0.09693,0.03066,0.1772,0.21243,0.26476],[0.03065,0.27672,0.02648,0.00773,0.05047,0.06085,0.09],[1.2308,134.78,0,0,0,0,0],[125.13,132.54,124.86,122.79,126.85,127.64,129.25],[216,15.427],[258.47,671.72,250.67,248.56,251.91,253.31,637.43],[108,7.7138],[1707753124401],[2],[2]]} -{"event":"snapshot","data":[[189584,94792],[3232,1616],[0.00531,0.01315,0.00456,0.00175,0.00943,0.01015,0.01223],[0,0,0,0,0,0,0],[125.13,127.35,124.98,123.2,126.66,127.05,127.34],[0],[0.08963,0.21153,0.07727,0.03185,0.15129,0.17022,0.20487],[0.02443,0.05334,0.02022,0.00826,0.04396,0.04801,0.05203],[0,0,0,0,0,0,0],[125.02,127.27,124.86,123.09,126.45,126.96,127.26],[32,16],[250.46,252.07,250.29,249.56,251.54,251.92,252.04],[16,8],[1707753126401],[2],[2]]} -{"event":"cumulative","data":[[1479948,92492],[25736,1608.4],[3.3642,261.19,0.00525,0.00165,0.01083,0.0135,157.13],[2.0265,126.18,0,0,0,0,125.15],[125.25,132.6,125.05,122.92,126.95,127.65,129.28],[0],[0.10504,0.2734,0.09388,0.03066,0.17424,0.21025,0.26308],[0.02985,0.27672,0.02602,0.00773,0.04923,0.0583,0.08935],[1.072,134.78,0,0,0,0,0],[125.12,132.54,124.86,122.79,126.8,127.51,129.06],[248,15.499],[257.44,671.72,250.57,248.56,251.87,253.15,571.91],[124,7.7496],[1707753126401],[2],[2]]} -{"event":"snapshot","data":[[177761,88880],[3030,1515],[0.00526,0.01042,0.00479,0.00212,0.00884,0.00941,0.01025],[0,0,0,0,0,0,0],[125.22,128.32,125,123.22,126.91,127.47,128.22],[0],[0.0943,0.17635,0.08617,0.03753,0.15421,0.16241,0.1744],[0.023,0.04363,0.02226,0.00813,0.03631,0.03976,0.04274],[0,0,0,0,0,0,0],[125.1,128.13,124.86,123.06,126.8,127.38,128.07],[31,15.5],[250.72,252.77,250.41,249.83,251.9,252.51,252.72],[15,7.5],[1707753128400],[2],[2]]} -{"event":"cumulative","data":[[1657709,92093],[28766,1598],[2.9909,261.19,0.00506,0.00165,0.01046,0.01323,156.9],[1.8013,126.18,0,0,0,0,124.95],[125.25,132.6,125.05,122.92,126.93,127.69,129.14],[0],[0.10385,0.2734,0.09343,0.03066,0.17034,0.2027,0.26146],[0.02909,0.27672,0.02549,0.00773,0.04778,0.05743,0.08873],[0.95291,134.78,0,0,0,0,0],[125.12,132.54,124.86,122.79,126.81,127.55,128.88],[279,15.499],[256.71,671.72,250.57,248.56,251.9,253.06,510.5],[139,7.7221],[1707753128400],[2],[2]]} -{"event":"snapshot","data":[[189700,94850],[3232,1616],[0.0093,0.1269,0.00506,0.00161,0.00917,0.0118,0.09135],[0,0,0,0,0,0,0],[125.46,128.18,125.1,123.56,127.56,127.85,128.12],[0],[0.1648,1.5479,0.09961,0.04243,0.19326,0.3427,1.2256],[0.02975,0.08279,0.02233,0.00785,0.04896,0.05565,0.07484],[0,0,0,0,0,0,0],[125.26,128.02,124.98,123.48,127.45,127.74,127.97],[32,16],[251.16,256.09,250.95,249.2,252.52,253.74,255.62],[16,8],[1707753130401],[2],[2]]} -{"event":"cumulative","data":[[1847409,92367],[31998,1599.8],[2.6841,261.19,0.00506,0.00161,0.01043,0.01321,141.08],[1.616,126.18,0,0,0,0,112.32],[125.27,132.6,125.06,122.92,127,127.71,129],[0],[0.11012,1.5479,0.09411,0.03066,0.17376,0.20755,0.27178],[0.02916,0.27672,0.02529,0.00773,0.04867,0.05727,0.08778],[0.85486,134.78,0,0,0,0,0],[125.13,132.54,124.94,122.79,126.84,127.63,128.73],[311,15.549],[256.14,671.72,250.59,248.56,252.01,253.08,444.98],[155,7.7497],[1707753130401],[2],[2]]} -{"event":"cumulative","data":[[1871115,92652],[32402,1604.4],[2.6585,261.19,0.00505,0.00161,0.01043,0.0132,136.38],[1.6005,126.18,0,0,0,0,108.58],[125.27,132.6,125.06,122.92,126.99,127.7,128.99],[0],[0.11002,1.5479,0.09388,0.03066,0.17487,0.20746,0.27158],[0.02905,0.27672,0.02519,0.00773,0.04841,0.05723,0.08763],[0.84669,134.78,0,0,0,0,0],[125.13,132.54,124.95,122.79,126.84,127.63,128.72],[314,15.548],[256.06,671.72,250.57,248.56,252.01,253.07,436.8],[157,7.7742],[1707753130595],[2],[2]]} -{"event":"stop","data":[[1707753130595]]} diff --git a/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/result.ndjson.gz b/vendor/github.com/grafana/xk6-dashboard/dashboard/testdata/result.ndjson.gz deleted file mode 100644 index 3725cd20a7fa5ab58c00c2af022d54ecc05fd07b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3455 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 diff --git a/vendor/google.golang.org/grpc/CONTRIBUTING.md b/vendor/google.golang.org/grpc/CONTRIBUTING.md index 0854d298e41..d9bfa6e1e7c 100644 --- a/vendor/google.golang.org/grpc/CONTRIBUTING.md +++ b/vendor/google.golang.org/grpc/CONTRIBUTING.md @@ -4,7 +4,7 @@ We definitely welcome your patches and contributions to gRPC! Please read the gR organization's [governance rules](https://github.com/grpc/grpc-community/blob/master/governance.md) and [contribution guidelines](https://github.com/grpc/grpc-community/blob/master/CONTRIBUTING.md) before proceeding. -If you are new to github, please start by reading [Pull Request howto](https://help.github.com/articles/about-pull-requests/) +If you are new to GitHub, please start by reading [Pull Request howto](https://help.github.com/articles/about-pull-requests/) ## Legal requirements @@ -25,8 +25,8 @@ How to get your contributions merged smoothly and quickly. is a great place to start. These issues are well-documented and usually can be resolved with a single pull request. -- If you are adding a new file, make sure it has the copyright message template - at the top as a comment. You can copy over the message from an existing file +- If you are adding a new file, make sure it has the copyright message template + at the top as a comment. You can copy over the message from an existing file and update the year. - The grpc package should only depend on standard Go packages and a small number @@ -39,12 +39,12 @@ How to get your contributions merged smoothly and quickly. proposal](https://github.com/grpc/proposal). - Provide a good **PR description** as a record of **what** change is being made - and **why** it was made. Link to a github issue if it exists. + and **why** it was made. Link to a GitHub issue if it exists. -- If you want to fix formatting or style, consider whether your changes are an - obvious improvement or might be considered a personal preference. If a style - change is based on preference, it likely will not be accepted. If it corrects - widely agreed-upon anti-patterns, then please do create a PR and explain the +- If you want to fix formatting or style, consider whether your changes are an + obvious improvement or might be considered a personal preference. If a style + change is based on preference, it likely will not be accepted. If it corrects + widely agreed-upon anti-patterns, then please do create a PR and explain the benefits of the change. - Unless your PR is trivial, you should expect there will be reviewer comments diff --git a/vendor/google.golang.org/grpc/balancer/balancer.go b/vendor/google.golang.org/grpc/balancer/balancer.go index b181f386a1b..3a2092f1056 100644 --- a/vendor/google.golang.org/grpc/balancer/balancer.go +++ b/vendor/google.golang.org/grpc/balancer/balancer.go @@ -130,7 +130,7 @@ type SubConn interface { // UpdateAddresses updates the addresses used in this SubConn. // gRPC checks if currently-connected address is still in the new list. // If it's in the list, the connection will be kept. - // If it's not in the list, the connection will gracefully closed, and + // If it's not in the list, the connection will gracefully close, and // a new connection will be created. // // This will trigger a state transition for the SubConn. @@ -142,8 +142,11 @@ type SubConn interface { Connect() // GetOrBuildProducer returns a reference to the existing Producer for this // ProducerBuilder in this SubConn, or, if one does not currently exist, - // creates a new one and returns it. Returns a close function which must - // be called when the Producer is no longer needed. + // creates a new one and returns it. Returns a close function which may be + // called when the Producer is no longer needed. Otherwise the producer + // will automatically be closed upon connection loss or subchannel close. + // Should only be called on a SubConn in state Ready. Otherwise the + // producer will be unable to create streams. GetOrBuildProducer(ProducerBuilder) (p Producer, close func()) // Shutdown shuts down the SubConn gracefully. Any started RPCs will be // allowed to complete. No future calls should be made on the SubConn. @@ -452,8 +455,10 @@ type ProducerBuilder interface { // Build creates a Producer. The first parameter is always a // grpc.ClientConnInterface (a type to allow creating RPCs/streams on the // associated SubConn), but is declared as `any` to avoid a dependency - // cycle. Should also return a close function that will be called when all - // references to the Producer have been given up. + // cycle. Build also returns a close function that will be called when all + // references to the Producer have been given up for a SubConn, or when a + // connectivity state change occurs on the SubConn. The close function + // should always block until all asynchronous cleanup work is completed. Build(grpcClientConnInterface any) (p Producer, close func()) } diff --git a/vendor/google.golang.org/grpc/balancer/base/balancer.go b/vendor/google.golang.org/grpc/balancer/base/balancer.go index 2b87bd79c75..d5ed172ae69 100644 --- a/vendor/google.golang.org/grpc/balancer/base/balancer.go +++ b/vendor/google.golang.org/grpc/balancer/base/balancer.go @@ -133,7 +133,7 @@ func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error { } } // If resolver state contains no addresses, return an error so ClientConn - // will trigger re-resolve. Also records this as an resolver error, so when + // will trigger re-resolve. Also records this as a resolver error, so when // the overall state turns transient failure, the error message will have // the zero address information. if len(s.ResolverState.Addresses) == 0 { diff --git a/vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go b/vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go new file mode 100644 index 00000000000..c5197894584 --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go @@ -0,0 +1,24 @@ +/* + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package internal contains code internal to the pickfirst package. +package internal + +import "math/rand" + +// RandShuffle pseudo-randomizes the order of addresses. +var RandShuffle = rand.Shuffle diff --git a/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go index 4d69b4052f8..e069346a756 100644 --- a/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go +++ b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go @@ -26,18 +26,23 @@ import ( "math/rand" "google.golang.org/grpc/balancer" + "google.golang.org/grpc/balancer/pickfirst/internal" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/internal" + "google.golang.org/grpc/internal/envconfig" internalgrpclog "google.golang.org/grpc/internal/grpclog" "google.golang.org/grpc/internal/pretty" "google.golang.org/grpc/resolver" "google.golang.org/grpc/serviceconfig" + + _ "google.golang.org/grpc/balancer/pickfirst/pickfirstleaf" // For automatically registering the new pickfirst if required. ) func init() { + if envconfig.NewPickFirstEnabled { + return + } balancer.Register(pickfirstBuilder{}) - internal.ShuffleAddressListForTesting = func(n int, swap func(i, j int)) { rand.Shuffle(n, swap) } } var logger = grpclog.Component("pick-first-lb") @@ -103,10 +108,13 @@ func (b *pickfirstBalancer) ResolverError(err error) { }) } +// Shuffler is an interface for shuffling an address list. type Shuffler interface { ShuffleAddressListForTesting(n int, swap func(i, j int)) } +// ShuffleAddressListForTesting pseudo-randomizes the order of addresses. n +// is the number of elements. swap swaps the elements with indexes i and j. func ShuffleAddressListForTesting(n int, swap func(i, j int)) { rand.Shuffle(n, swap) } func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState) error { @@ -140,7 +148,7 @@ func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState // within each endpoint. - A61 if cfg.ShuffleAddressList { endpoints = append([]resolver.Endpoint{}, endpoints...) - internal.ShuffleAddressListForTesting.(func(int, func(int, int)))(len(endpoints), func(i, j int) { endpoints[i], endpoints[j] = endpoints[j], endpoints[i] }) + internal.RandShuffle(len(endpoints), func(i, j int) { endpoints[i], endpoints[j] = endpoints[j], endpoints[i] }) } // "Flatten the list by concatenating the ordered list of addresses for each diff --git a/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go new file mode 100644 index 00000000000..985b6edc7f4 --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go @@ -0,0 +1,625 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package pickfirstleaf contains the pick_first load balancing policy which +// will be the universal leaf policy after dualstack changes are implemented. +// +// # Experimental +// +// Notice: This package is EXPERIMENTAL and may be changed or removed in a +// later release. +package pickfirstleaf + +import ( + "encoding/json" + "errors" + "fmt" + "sync" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/balancer/pickfirst/internal" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal/envconfig" + internalgrpclog "google.golang.org/grpc/internal/grpclog" + "google.golang.org/grpc/internal/pretty" + "google.golang.org/grpc/resolver" + "google.golang.org/grpc/serviceconfig" +) + +func init() { + if envconfig.NewPickFirstEnabled { + // Register as the default pick_first balancer. + Name = "pick_first" + } + balancer.Register(pickfirstBuilder{}) +} + +var ( + logger = grpclog.Component("pick-first-leaf-lb") + // Name is the name of the pick_first_leaf balancer. + // It is changed to "pick_first" in init() if this balancer is to be + // registered as the default pickfirst. + Name = "pick_first_leaf" +) + +// TODO: change to pick-first when this becomes the default pick_first policy. +const logPrefix = "[pick-first-leaf-lb %p] " + +type pickfirstBuilder struct{} + +func (pickfirstBuilder) Build(cc balancer.ClientConn, _ balancer.BuildOptions) balancer.Balancer { + b := &pickfirstBalancer{ + cc: cc, + addressList: addressList{}, + subConns: resolver.NewAddressMap(), + state: connectivity.Connecting, + mu: sync.Mutex{}, + } + b.logger = internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf(logPrefix, b)) + return b +} + +func (b pickfirstBuilder) Name() string { + return Name +} + +func (pickfirstBuilder) ParseConfig(js json.RawMessage) (serviceconfig.LoadBalancingConfig, error) { + var cfg pfConfig + if err := json.Unmarshal(js, &cfg); err != nil { + return nil, fmt.Errorf("pickfirst: unable to unmarshal LB policy config: %s, error: %v", string(js), err) + } + return cfg, nil +} + +type pfConfig struct { + serviceconfig.LoadBalancingConfig `json:"-"` + + // If set to true, instructs the LB policy to shuffle the order of the list + // of endpoints received from the name resolver before attempting to + // connect to them. + ShuffleAddressList bool `json:"shuffleAddressList"` +} + +// scData keeps track of the current state of the subConn. +// It is not safe for concurrent access. +type scData struct { + // The following fields are initialized at build time and read-only after + // that. + subConn balancer.SubConn + addr resolver.Address + + state connectivity.State + lastErr error +} + +func (b *pickfirstBalancer) newSCData(addr resolver.Address) (*scData, error) { + sd := &scData{ + state: connectivity.Idle, + addr: addr, + } + sc, err := b.cc.NewSubConn([]resolver.Address{addr}, balancer.NewSubConnOptions{ + StateListener: func(state balancer.SubConnState) { + b.updateSubConnState(sd, state) + }, + }) + if err != nil { + return nil, err + } + sd.subConn = sc + return sd, nil +} + +type pickfirstBalancer struct { + // The following fields are initialized at build time and read-only after + // that and therefore do not need to be guarded by a mutex. + logger *internalgrpclog.PrefixLogger + cc balancer.ClientConn + + // The mutex is used to ensure synchronization of updates triggered + // from the idle picker and the already serialized resolver, + // SubConn state updates. + mu sync.Mutex + state connectivity.State + // scData for active subonns mapped by address. + subConns *resolver.AddressMap + addressList addressList + firstPass bool + numTF int +} + +// ResolverError is called by the ClientConn when the name resolver produces +// an error or when pickfirst determined the resolver update to be invalid. +func (b *pickfirstBalancer) ResolverError(err error) { + b.mu.Lock() + defer b.mu.Unlock() + b.resolverErrorLocked(err) +} + +func (b *pickfirstBalancer) resolverErrorLocked(err error) { + if b.logger.V(2) { + b.logger.Infof("Received error from the name resolver: %v", err) + } + + // The picker will not change since the balancer does not currently + // report an error. If the balancer hasn't received a single good resolver + // update yet, transition to TRANSIENT_FAILURE. + if b.state != connectivity.TransientFailure && b.addressList.size() > 0 { + if b.logger.V(2) { + b.logger.Infof("Ignoring resolver error because balancer is using a previous good update.") + } + return + } + + b.cc.UpdateState(balancer.State{ + ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: fmt.Errorf("name resolver error: %v", err)}, + }) +} + +func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState) error { + b.mu.Lock() + defer b.mu.Unlock() + if len(state.ResolverState.Addresses) == 0 && len(state.ResolverState.Endpoints) == 0 { + // Cleanup state pertaining to the previous resolver state. + // Treat an empty address list like an error by calling b.ResolverError. + b.state = connectivity.TransientFailure + b.closeSubConnsLocked() + b.addressList.updateAddrs(nil) + b.resolverErrorLocked(errors.New("produced zero addresses")) + return balancer.ErrBadResolverState + } + cfg, ok := state.BalancerConfig.(pfConfig) + if state.BalancerConfig != nil && !ok { + return fmt.Errorf("pickfirst: received illegal BalancerConfig (type %T): %v: %w", state.BalancerConfig, state.BalancerConfig, balancer.ErrBadResolverState) + } + + if b.logger.V(2) { + b.logger.Infof("Received new config %s, resolver state %s", pretty.ToJSON(cfg), pretty.ToJSON(state.ResolverState)) + } + + var newAddrs []resolver.Address + if endpoints := state.ResolverState.Endpoints; len(endpoints) != 0 { + // Perform the optional shuffling described in gRFC A62. The shuffling + // will change the order of endpoints but not touch the order of the + // addresses within each endpoint. - A61 + if cfg.ShuffleAddressList { + endpoints = append([]resolver.Endpoint{}, endpoints...) + internal.RandShuffle(len(endpoints), func(i, j int) { endpoints[i], endpoints[j] = endpoints[j], endpoints[i] }) + } + + // "Flatten the list by concatenating the ordered list of addresses for + // each of the endpoints, in order." - A61 + for _, endpoint := range endpoints { + // "In the flattened list, interleave addresses from the two address + // families, as per RFC-8305 section 4." - A61 + // TODO: support the above language. + newAddrs = append(newAddrs, endpoint.Addresses...) + } + } else { + // Endpoints not set, process addresses until we migrate resolver + // emissions fully to Endpoints. The top channel does wrap emitted + // addresses with endpoints, however some balancers such as weighted + // target do not forward the corresponding correct endpoints down/split + // endpoints properly. Once all balancers correctly forward endpoints + // down, can delete this else conditional. + newAddrs = state.ResolverState.Addresses + if cfg.ShuffleAddressList { + newAddrs = append([]resolver.Address{}, newAddrs...) + internal.RandShuffle(len(endpoints), func(i, j int) { endpoints[i], endpoints[j] = endpoints[j], endpoints[i] }) + } + } + + // If an address appears in multiple endpoints or in the same endpoint + // multiple times, we keep it only once. We will create only one SubConn + // for the address because an AddressMap is used to store SubConns. + // Not de-duplicating would result in attempting to connect to the same + // SubConn multiple times in the same pass. We don't want this. + newAddrs = deDupAddresses(newAddrs) + + // Since we have a new set of addresses, we are again at first pass. + b.firstPass = true + + // If the previous ready SubConn exists in new address list, + // keep this connection and don't create new SubConns. + prevAddr := b.addressList.currentAddress() + prevAddrsCount := b.addressList.size() + b.addressList.updateAddrs(newAddrs) + if b.state == connectivity.Ready && b.addressList.seekTo(prevAddr) { + return nil + } + + b.reconcileSubConnsLocked(newAddrs) + // If it's the first resolver update or the balancer was already READY + // (but the new address list does not contain the ready SubConn) or + // CONNECTING, enter CONNECTING. + // We may be in TRANSIENT_FAILURE due to a previous empty address list, + // we should still enter CONNECTING because the sticky TF behaviour + // mentioned in A62 applies only when the TRANSIENT_FAILURE is reported + // due to connectivity failures. + if b.state == connectivity.Ready || b.state == connectivity.Connecting || prevAddrsCount == 0 { + // Start connection attempt at first address. + b.state = connectivity.Connecting + b.cc.UpdateState(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + b.requestConnectionLocked() + } else if b.state == connectivity.TransientFailure { + // If we're in TRANSIENT_FAILURE, we stay in TRANSIENT_FAILURE until + // we're READY. See A62. + b.requestConnectionLocked() + } + return nil +} + +// UpdateSubConnState is unused as a StateListener is always registered when +// creating SubConns. +func (b *pickfirstBalancer) UpdateSubConnState(subConn balancer.SubConn, state balancer.SubConnState) { + b.logger.Errorf("UpdateSubConnState(%v, %+v) called unexpectedly", subConn, state) +} + +func (b *pickfirstBalancer) Close() { + b.mu.Lock() + defer b.mu.Unlock() + b.closeSubConnsLocked() + b.state = connectivity.Shutdown +} + +// ExitIdle moves the balancer out of idle state. It can be called concurrently +// by the idlePicker and clientConn so access to variables should be +// synchronized. +func (b *pickfirstBalancer) ExitIdle() { + b.mu.Lock() + defer b.mu.Unlock() + if b.state == connectivity.Idle && b.addressList.currentAddress() == b.addressList.first() { + b.firstPass = true + b.requestConnectionLocked() + } +} + +func (b *pickfirstBalancer) closeSubConnsLocked() { + for _, sd := range b.subConns.Values() { + sd.(*scData).subConn.Shutdown() + } + b.subConns = resolver.NewAddressMap() +} + +// deDupAddresses ensures that each address appears only once in the slice. +func deDupAddresses(addrs []resolver.Address) []resolver.Address { + seenAddrs := resolver.NewAddressMap() + retAddrs := []resolver.Address{} + + for _, addr := range addrs { + if _, ok := seenAddrs.Get(addr); ok { + continue + } + retAddrs = append(retAddrs, addr) + } + return retAddrs +} + +// reconcileSubConnsLocked updates the active subchannels based on a new address +// list from the resolver. It does this by: +// - closing subchannels: any existing subchannels associated with addresses +// that are no longer in the updated list are shut down. +// - removing subchannels: entries for these closed subchannels are removed +// from the subchannel map. +// +// This ensures that the subchannel map accurately reflects the current set of +// addresses received from the name resolver. +func (b *pickfirstBalancer) reconcileSubConnsLocked(newAddrs []resolver.Address) { + newAddrsMap := resolver.NewAddressMap() + for _, addr := range newAddrs { + newAddrsMap.Set(addr, true) + } + + for _, oldAddr := range b.subConns.Keys() { + if _, ok := newAddrsMap.Get(oldAddr); ok { + continue + } + val, _ := b.subConns.Get(oldAddr) + val.(*scData).subConn.Shutdown() + b.subConns.Delete(oldAddr) + } +} + +// shutdownRemainingLocked shuts down remaining subConns. Called when a subConn +// becomes ready, which means that all other subConn must be shutdown. +func (b *pickfirstBalancer) shutdownRemainingLocked(selected *scData) { + for _, v := range b.subConns.Values() { + sd := v.(*scData) + if sd.subConn != selected.subConn { + sd.subConn.Shutdown() + } + } + b.subConns = resolver.NewAddressMap() + b.subConns.Set(selected.addr, selected) +} + +// requestConnectionLocked starts connecting on the subchannel corresponding to +// the current address. If no subchannel exists, one is created. If the current +// subchannel is in TransientFailure, a connection to the next address is +// attempted until a subchannel is found. +func (b *pickfirstBalancer) requestConnectionLocked() { + if !b.addressList.isValid() { + return + } + var lastErr error + for valid := true; valid; valid = b.addressList.increment() { + curAddr := b.addressList.currentAddress() + sd, ok := b.subConns.Get(curAddr) + if !ok { + var err error + // We want to assign the new scData to sd from the outer scope, + // hence we can't use := below. + sd, err = b.newSCData(curAddr) + if err != nil { + // This should never happen, unless the clientConn is being shut + // down. + if b.logger.V(2) { + b.logger.Infof("Failed to create a subConn for address %v: %v", curAddr.String(), err) + } + // Do nothing, the LB policy will be closed soon. + return + } + b.subConns.Set(curAddr, sd) + } + + scd := sd.(*scData) + switch scd.state { + case connectivity.Idle: + scd.subConn.Connect() + case connectivity.TransientFailure: + // Try the next address. + lastErr = scd.lastErr + continue + case connectivity.Ready: + // Should never happen. + b.logger.Errorf("Requesting a connection even though we have a READY SubConn") + case connectivity.Shutdown: + // Should never happen. + b.logger.Errorf("SubConn with state SHUTDOWN present in SubConns map") + case connectivity.Connecting: + // Wait for the SubConn to report success or failure. + } + return + } + // All the remaining addresses in the list are in TRANSIENT_FAILURE, end the + // first pass. + b.endFirstPassLocked(lastErr) +} + +func (b *pickfirstBalancer) updateSubConnState(sd *scData, newState balancer.SubConnState) { + b.mu.Lock() + defer b.mu.Unlock() + oldState := sd.state + sd.state = newState.ConnectivityState + // Previously relevant SubConns can still callback with state updates. + // To prevent pickers from returning these obsolete SubConns, this logic + // is included to check if the current list of active SubConns includes this + // SubConn. + if activeSD, found := b.subConns.Get(sd.addr); !found || activeSD != sd { + return + } + if newState.ConnectivityState == connectivity.Shutdown { + return + } + + if newState.ConnectivityState == connectivity.Ready { + b.shutdownRemainingLocked(sd) + if !b.addressList.seekTo(sd.addr) { + // This should not fail as we should have only one SubConn after + // entering READY. The SubConn should be present in the addressList. + b.logger.Errorf("Address %q not found address list in %v", sd.addr, b.addressList.addresses) + return + } + b.state = connectivity.Ready + b.cc.UpdateState(balancer.State{ + ConnectivityState: connectivity.Ready, + Picker: &picker{result: balancer.PickResult{SubConn: sd.subConn}}, + }) + return + } + + // If the LB policy is READY, and it receives a subchannel state change, + // it means that the READY subchannel has failed. + // A SubConn can also transition from CONNECTING directly to IDLE when + // a transport is successfully created, but the connection fails + // before the SubConn can send the notification for READY. We treat + // this as a successful connection and transition to IDLE. + if (b.state == connectivity.Ready && newState.ConnectivityState != connectivity.Ready) || (oldState == connectivity.Connecting && newState.ConnectivityState == connectivity.Idle) { + // Once a transport fails, the balancer enters IDLE and starts from + // the first address when the picker is used. + b.shutdownRemainingLocked(sd) + b.state = connectivity.Idle + b.addressList.reset() + b.cc.UpdateState(balancer.State{ + ConnectivityState: connectivity.Idle, + Picker: &idlePicker{exitIdle: sync.OnceFunc(b.ExitIdle)}, + }) + return + } + + if b.firstPass { + switch newState.ConnectivityState { + case connectivity.Connecting: + // The balancer can be in either IDLE, CONNECTING or + // TRANSIENT_FAILURE. If it's in TRANSIENT_FAILURE, stay in + // TRANSIENT_FAILURE until it's READY. See A62. + // If the balancer is already in CONNECTING, no update is needed. + if b.state == connectivity.Idle { + b.state = connectivity.Connecting + b.cc.UpdateState(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + } + case connectivity.TransientFailure: + sd.lastErr = newState.ConnectionError + // Since we're re-using common SubConns while handling resolver + // updates, we could receive an out of turn TRANSIENT_FAILURE from + // a pass over the previous address list. We ignore such updates. + + if curAddr := b.addressList.currentAddress(); !equalAddressIgnoringBalAttributes(&curAddr, &sd.addr) { + return + } + if b.addressList.increment() { + b.requestConnectionLocked() + return + } + // End of the first pass. + b.endFirstPassLocked(newState.ConnectionError) + } + return + } + + // We have finished the first pass, keep re-connecting failing SubConns. + switch newState.ConnectivityState { + case connectivity.TransientFailure: + b.numTF = (b.numTF + 1) % b.subConns.Len() + sd.lastErr = newState.ConnectionError + if b.numTF%b.subConns.Len() == 0 { + b.cc.UpdateState(balancer.State{ + ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: newState.ConnectionError}, + }) + } + // We don't need to request re-resolution since the SubConn already + // does that before reporting TRANSIENT_FAILURE. + // TODO: #7534 - Move re-resolution requests from SubConn into + // pick_first. + case connectivity.Idle: + sd.subConn.Connect() + } +} + +func (b *pickfirstBalancer) endFirstPassLocked(lastErr error) { + b.firstPass = false + b.numTF = 0 + b.state = connectivity.TransientFailure + + b.cc.UpdateState(balancer.State{ + ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: lastErr}, + }) + // Start re-connecting all the SubConns that are already in IDLE. + for _, v := range b.subConns.Values() { + sd := v.(*scData) + if sd.state == connectivity.Idle { + sd.subConn.Connect() + } + } +} + +type picker struct { + result balancer.PickResult + err error +} + +func (p *picker) Pick(balancer.PickInfo) (balancer.PickResult, error) { + return p.result, p.err +} + +// idlePicker is used when the SubConn is IDLE and kicks the SubConn into +// CONNECTING when Pick is called. +type idlePicker struct { + exitIdle func() +} + +func (i *idlePicker) Pick(balancer.PickInfo) (balancer.PickResult, error) { + i.exitIdle() + return balancer.PickResult{}, balancer.ErrNoSubConnAvailable +} + +// addressList manages sequentially iterating over addresses present in a list +// of endpoints. It provides a 1 dimensional view of the addresses present in +// the endpoints. +// This type is not safe for concurrent access. +type addressList struct { + addresses []resolver.Address + idx int +} + +func (al *addressList) isValid() bool { + return al.idx < len(al.addresses) +} + +func (al *addressList) size() int { + return len(al.addresses) +} + +// increment moves to the next index in the address list. +// This method returns false if it went off the list, true otherwise. +func (al *addressList) increment() bool { + if !al.isValid() { + return false + } + al.idx++ + return al.idx < len(al.addresses) +} + +// currentAddress returns the current address pointed to in the addressList. +// If the list is in an invalid state, it returns an empty address instead. +func (al *addressList) currentAddress() resolver.Address { + if !al.isValid() { + return resolver.Address{} + } + return al.addresses[al.idx] +} + +// first returns the first address in the list. If the list is empty, it returns +// an empty address instead. +func (al *addressList) first() resolver.Address { + if len(al.addresses) == 0 { + return resolver.Address{} + } + return al.addresses[0] +} + +func (al *addressList) reset() { + al.idx = 0 +} + +func (al *addressList) updateAddrs(addrs []resolver.Address) { + al.addresses = addrs + al.reset() +} + +// seekTo returns false if the needle was not found and the current index was +// left unchanged. +func (al *addressList) seekTo(needle resolver.Address) bool { + for ai, addr := range al.addresses { + if !equalAddressIgnoringBalAttributes(&addr, &needle) { + continue + } + al.idx = ai + return true + } + return false +} + +// equalAddressIgnoringBalAttributes returns true is a and b are considered +// equal. This is different from the Equal method on the resolver.Address type +// which considers all fields to determine equality. Here, we only consider +// fields that are meaningful to the SubConn. +func equalAddressIgnoringBalAttributes(a, b *resolver.Address) bool { + return a.Addr == b.Addr && a.ServerName == b.ServerName && + a.Attributes.Equal(b.Attributes) && + a.Metadata == b.Metadata +} diff --git a/vendor/google.golang.org/grpc/balancer_wrapper.go b/vendor/google.golang.org/grpc/balancer_wrapper.go index 8ad6ce2f095..2a4f2878aef 100644 --- a/vendor/google.golang.org/grpc/balancer_wrapper.go +++ b/vendor/google.golang.org/grpc/balancer_wrapper.go @@ -24,12 +24,14 @@ import ( "sync" "google.golang.org/grpc/balancer" + "google.golang.org/grpc/codes" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/balancer/gracefulswitch" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/resolver" + "google.golang.org/grpc/status" ) var setConnectedAddress = internal.SetConnectedAddress.(func(*balancer.SubConnState, resolver.Address)) @@ -256,8 +258,8 @@ type acBalancerWrapper struct { ccb *ccBalancerWrapper // read-only stateListener func(balancer.SubConnState) - mu sync.Mutex - producers map[balancer.ProducerBuilder]*refCountedProducer + producersMu sync.Mutex + producers map[balancer.ProducerBuilder]*refCountedProducer } // updateState is invoked by grpc to push a subConn state update to the @@ -267,6 +269,9 @@ func (acbw *acBalancerWrapper) updateState(s connectivity.State, curAddr resolve if ctx.Err() != nil || acbw.ccb.balancer == nil { return } + // Invalidate all producers on any state change. + acbw.closeProducers() + // Even though it is optional for balancers, gracefulswitch ensures // opts.StateListener is set, so this cannot ever be nil. // TODO: delete this comment when UpdateSubConnState is removed. @@ -275,16 +280,6 @@ func (acbw *acBalancerWrapper) updateState(s connectivity.State, curAddr resolve setConnectedAddress(&scs, curAddr) } acbw.stateListener(scs) - acbw.ac.mu.Lock() - defer acbw.ac.mu.Unlock() - if s == connectivity.Ready { - // When changing states to READY, reset stateReadyChan. Wait until - // after we notify the LB policy's listener(s) in order to prevent - // ac.getTransport() from unblocking before the LB policy starts - // tracking the subchannel as READY. - close(acbw.ac.stateReadyChan) - acbw.ac.stateReadyChan = make(chan struct{}) - } }) } @@ -301,6 +296,7 @@ func (acbw *acBalancerWrapper) Connect() { } func (acbw *acBalancerWrapper) Shutdown() { + acbw.closeProducers() acbw.ccb.cc.removeAddrConn(acbw.ac, errConnDrain) } @@ -308,9 +304,10 @@ func (acbw *acBalancerWrapper) Shutdown() { // ready, blocks until it is or ctx expires. Returns an error when the context // expires or the addrConn is shut down. func (acbw *acBalancerWrapper) NewStream(ctx context.Context, desc *StreamDesc, method string, opts ...CallOption) (ClientStream, error) { - transport, err := acbw.ac.getTransport(ctx) - if err != nil { - return nil, err + transport := acbw.ac.getReadyTransport() + if transport == nil { + return nil, status.Errorf(codes.Unavailable, "SubConn state is not Ready") + } return newNonRetryClientStream(ctx, desc, method, transport, acbw.ac, opts...) } @@ -335,8 +332,8 @@ type refCountedProducer struct { } func (acbw *acBalancerWrapper) GetOrBuildProducer(pb balancer.ProducerBuilder) (balancer.Producer, func()) { - acbw.mu.Lock() - defer acbw.mu.Unlock() + acbw.producersMu.Lock() + defer acbw.producersMu.Unlock() // Look up existing producer from this builder. pData := acbw.producers[pb] @@ -353,13 +350,26 @@ func (acbw *acBalancerWrapper) GetOrBuildProducer(pb balancer.ProducerBuilder) ( // and delete the refCountedProducer from the map if the total reference // count goes to zero. unref := func() { - acbw.mu.Lock() + acbw.producersMu.Lock() + // If closeProducers has already closed this producer instance, refs is + // set to 0, so the check after decrementing will never pass, and the + // producer will not be double-closed. pData.refs-- if pData.refs == 0 { defer pData.close() // Run outside the acbw mutex delete(acbw.producers, pb) } - acbw.mu.Unlock() + acbw.producersMu.Unlock() } return pData.producer, grpcsync.OnceFunc(unref) } + +func (acbw *acBalancerWrapper) closeProducers() { + acbw.producersMu.Lock() + defer acbw.producersMu.Unlock() + for pb, pData := range acbw.producers { + pData.refs = 0 + pData.close() + delete(acbw.producers, pb) + } +} diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go index 9c8850e3fdd..19763f8eddf 100644 --- a/vendor/google.golang.org/grpc/clientconn.go +++ b/vendor/google.golang.org/grpc/clientconn.go @@ -825,14 +825,13 @@ func (cc *ClientConn) newAddrConnLocked(addrs []resolver.Address, opts balancer. } ac := &addrConn{ - state: connectivity.Idle, - cc: cc, - addrs: copyAddresses(addrs), - scopts: opts, - dopts: cc.dopts, - channelz: channelz.RegisterSubChannel(cc.channelz, ""), - resetBackoff: make(chan struct{}), - stateReadyChan: make(chan struct{}), + state: connectivity.Idle, + cc: cc, + addrs: copyAddresses(addrs), + scopts: opts, + dopts: cc.dopts, + channelz: channelz.RegisterSubChannel(cc.channelz, ""), + resetBackoff: make(chan struct{}), } ac.ctx, ac.cancel = context.WithCancel(cc.ctx) // Start with our address set to the first address; this may be updated if @@ -1141,10 +1140,15 @@ func (cc *ClientConn) Close() error { <-cc.resolverWrapper.serializer.Done() <-cc.balancerWrapper.serializer.Done() - + var wg sync.WaitGroup for ac := range conns { - ac.tearDown(ErrClientConnClosing) + wg.Add(1) + go func(ac *addrConn) { + defer wg.Done() + ac.tearDown(ErrClientConnClosing) + }(ac) } + wg.Wait() cc.addTraceEvent("deleted") // TraceEvent needs to be called before RemoveEntry, as TraceEvent may add // trace reference to the entity being deleted, and thus prevent it from being @@ -1179,8 +1183,7 @@ type addrConn struct { addrs []resolver.Address // All addresses that the resolver resolved to. // Use updateConnectivityState for updating addrConn's connectivity state. - state connectivity.State - stateReadyChan chan struct{} // closed and recreated on every READY state change. + state connectivity.State backoffIdx int // Needs to be stateful for resetConnectBackoff. resetBackoff chan struct{} @@ -1251,6 +1254,8 @@ func (ac *addrConn) resetTransportAndUnlock() { ac.mu.Unlock() if err := ac.tryAllAddrs(acCtx, addrs, connectDeadline); err != nil { + // TODO: #7534 - Move re-resolution requests into the pick_first LB policy + // to ensure one resolution request per pass instead of per subconn failure. ac.cc.resolveNow(resolver.ResolveNowOptions{}) ac.mu.Lock() if acCtx.Err() != nil { @@ -1292,7 +1297,7 @@ func (ac *addrConn) resetTransportAndUnlock() { ac.mu.Unlock() } -// tryAllAddrs tries to creates a connection to the addresses, and stop when at +// tryAllAddrs tries to create a connection to the addresses, and stop when at // the first successful one. It returns an error if no address was successfully // connected, or updates ac appropriately with the new transport. func (ac *addrConn) tryAllAddrs(ctx context.Context, addrs []resolver.Address, connectDeadline time.Time) error { @@ -1504,29 +1509,6 @@ func (ac *addrConn) getReadyTransport() transport.ClientTransport { return nil } -// getTransport waits until the addrconn is ready and returns the transport. -// If the context expires first, returns an appropriate status. If the -// addrConn is stopped first, returns an Unavailable status error. -func (ac *addrConn) getTransport(ctx context.Context) (transport.ClientTransport, error) { - for ctx.Err() == nil { - ac.mu.Lock() - t, state, sc := ac.transport, ac.state, ac.stateReadyChan - ac.mu.Unlock() - if state == connectivity.Ready { - return t, nil - } - if state == connectivity.Shutdown { - return nil, status.Errorf(codes.Unavailable, "SubConn shutting down") - } - - select { - case <-ctx.Done(): - case <-sc: - } - } - return nil, status.FromContextError(ctx.Err()).Err() -} - // tearDown starts to tear down the addrConn. // // Note that tearDown doesn't remove ac from ac.cc.conns, so the addrConn struct diff --git a/vendor/google.golang.org/grpc/credentials/tls.go b/vendor/google.golang.org/grpc/credentials/tls.go index 4114358545e..e163a473df9 100644 --- a/vendor/google.golang.org/grpc/credentials/tls.go +++ b/vendor/google.golang.org/grpc/credentials/tls.go @@ -200,25 +200,40 @@ var tls12ForbiddenCipherSuites = map[uint16]struct{}{ // NewTLS uses c to construct a TransportCredentials based on TLS. func NewTLS(c *tls.Config) TransportCredentials { - tc := &tlsCreds{credinternal.CloneTLSConfig(c)} - tc.config.NextProtos = credinternal.AppendH2ToNextProtos(tc.config.NextProtos) + config := applyDefaults(c) + if config.GetConfigForClient != nil { + oldFn := config.GetConfigForClient + config.GetConfigForClient = func(hello *tls.ClientHelloInfo) (*tls.Config, error) { + cfgForClient, err := oldFn(hello) + if err != nil || cfgForClient == nil { + return cfgForClient, err + } + return applyDefaults(cfgForClient), nil + } + } + return &tlsCreds{config: config} +} + +func applyDefaults(c *tls.Config) *tls.Config { + config := credinternal.CloneTLSConfig(c) + config.NextProtos = credinternal.AppendH2ToNextProtos(config.NextProtos) // If the user did not configure a MinVersion and did not configure a // MaxVersion < 1.2, use MinVersion=1.2, which is required by // https://datatracker.ietf.org/doc/html/rfc7540#section-9.2 - if tc.config.MinVersion == 0 && (tc.config.MaxVersion == 0 || tc.config.MaxVersion >= tls.VersionTLS12) { - tc.config.MinVersion = tls.VersionTLS12 + if config.MinVersion == 0 && (config.MaxVersion == 0 || config.MaxVersion >= tls.VersionTLS12) { + config.MinVersion = tls.VersionTLS12 } // If the user did not configure CipherSuites, use all "secure" cipher // suites reported by the TLS package, but remove some explicitly forbidden // by https://datatracker.ietf.org/doc/html/rfc7540#appendix-A - if tc.config.CipherSuites == nil { + if config.CipherSuites == nil { for _, cs := range tls.CipherSuites() { if _, ok := tls12ForbiddenCipherSuites[cs.ID]; !ok { - tc.config.CipherSuites = append(tc.config.CipherSuites, cs.ID) + config.CipherSuites = append(config.CipherSuites, cs.ID) } } } - return tc + return config } // NewClientTLSFromCert constructs TLS credentials from the provided root diff --git a/vendor/google.golang.org/grpc/dialoptions.go b/vendor/google.golang.org/grpc/dialoptions.go index 2b285beee37..518692c3afb 100644 --- a/vendor/google.golang.org/grpc/dialoptions.go +++ b/vendor/google.golang.org/grpc/dialoptions.go @@ -436,7 +436,7 @@ func WithTimeout(d time.Duration) DialOption { // option to true from the Control field. For a concrete example of how to do // this, see internal.NetDialerWithTCPKeepalive(). // -// For more information, please see [issue 23459] in the Go github repo. +// For more information, please see [issue 23459] in the Go GitHub repo. // // [issue 23459]: https://github.com/golang/go/issues/23459 func WithContextDialer(f func(context.Context, string) (net.Conn, error)) DialOption { diff --git a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go index 13821a92660..85540f86a73 100644 --- a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go +++ b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go @@ -33,6 +33,8 @@ type lbConfig struct { childConfig serviceconfig.LoadBalancingConfig } +// ChildName returns the name of the child balancer of the gracefulswitch +// Balancer. func ChildName(l serviceconfig.LoadBalancingConfig) string { return l.(*lbConfig).childBuilder.Name() } diff --git a/vendor/google.golang.org/grpc/internal/channelz/channel.go b/vendor/google.golang.org/grpc/internal/channelz/channel.go index d7e9e1d54ec..3ec662799a8 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/channel.go +++ b/vendor/google.golang.org/grpc/internal/channelz/channel.go @@ -43,6 +43,8 @@ type Channel struct { // Non-zero traceRefCount means the trace of this channel cannot be deleted. traceRefCount int32 + // ChannelMetrics holds connectivity state, target and call metrics for the + // channel within channelz. ChannelMetrics ChannelMetrics } @@ -50,6 +52,8 @@ type Channel struct { // nesting. func (c *Channel) channelzIdentifier() {} +// String returns a string representation of the Channel, including its parent +// entity and ID. func (c *Channel) String() string { if c.Parent == nil { return fmt.Sprintf("Channel #%d", c.ID) @@ -61,24 +65,31 @@ func (c *Channel) id() int64 { return c.ID } +// SubChans returns a copy of the map of sub-channels associated with the +// Channel. func (c *Channel) SubChans() map[int64]string { db.mu.RLock() defer db.mu.RUnlock() return copyMap(c.subChans) } +// NestedChans returns a copy of the map of nested channels associated with the +// Channel. func (c *Channel) NestedChans() map[int64]string { db.mu.RLock() defer db.mu.RUnlock() return copyMap(c.nestedChans) } +// Trace returns a copy of the Channel's trace data. func (c *Channel) Trace() *ChannelTrace { db.mu.RLock() defer db.mu.RUnlock() return c.trace.copy() } +// ChannelMetrics holds connectivity state, target and call metrics for the +// channel within channelz. type ChannelMetrics struct { // The current connectivity state of the channel. State atomic.Pointer[connectivity.State] @@ -136,12 +147,16 @@ func strFromPointer(s *string) string { return *s } +// String returns a string representation of the ChannelMetrics, including its +// state, target, and call metrics. func (c *ChannelMetrics) String() string { return fmt.Sprintf("State: %v, Target: %s, CallsStarted: %v, CallsSucceeded: %v, CallsFailed: %v, LastCallStartedTimestamp: %v", c.State.Load(), strFromPointer(c.Target.Load()), c.CallsStarted.Load(), c.CallsSucceeded.Load(), c.CallsFailed.Load(), c.LastCallStartedTimestamp.Load(), ) } +// NewChannelMetricForTesting creates a new instance of ChannelMetrics with +// specified initial values for testing purposes. func NewChannelMetricForTesting(state connectivity.State, target string, started, succeeded, failed, timestamp int64) *ChannelMetrics { c := &ChannelMetrics{} c.State.Store(&state) diff --git a/vendor/google.golang.org/grpc/internal/channelz/server.go b/vendor/google.golang.org/grpc/internal/channelz/server.go index cdfc49d6eac..b5a82499299 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/server.go +++ b/vendor/google.golang.org/grpc/internal/channelz/server.go @@ -59,6 +59,8 @@ func NewServerMetricsForTesting(started, succeeded, failed, timestamp int64) *Se return sm } +// CopyFrom copies the metrics data from the provided ServerMetrics +// instance into the current instance. func (sm *ServerMetrics) CopyFrom(o *ServerMetrics) { sm.CallsStarted.Store(o.CallsStarted.Load()) sm.CallsSucceeded.Store(o.CallsSucceeded.Load()) diff --git a/vendor/google.golang.org/grpc/internal/channelz/socket.go b/vendor/google.golang.org/grpc/internal/channelz/socket.go index fa64834b25d..90103847c5f 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/socket.go +++ b/vendor/google.golang.org/grpc/internal/channelz/socket.go @@ -70,13 +70,18 @@ type EphemeralSocketMetrics struct { RemoteFlowControlWindow int64 } +// SocketType represents the type of socket. type SocketType string +// SocketType can be one of these. const ( SocketTypeNormal = "NormalSocket" SocketTypeListen = "ListenSocket" ) +// Socket represents a socket within channelz which includes socket +// metrics and data related to socket activity and provides methods +// for managing and interacting with sockets. type Socket struct { Entity SocketType SocketType @@ -100,6 +105,8 @@ type Socket struct { Security credentials.ChannelzSecurityValue } +// String returns a string representation of the Socket, including its parent +// entity, socket type, and ID. func (ls *Socket) String() string { return fmt.Sprintf("%s %s #%d", ls.Parent, ls.SocketType, ls.ID) } diff --git a/vendor/google.golang.org/grpc/internal/channelz/subchannel.go b/vendor/google.golang.org/grpc/internal/channelz/subchannel.go index 3b88e4cba8e..b20802e6e96 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/subchannel.go +++ b/vendor/google.golang.org/grpc/internal/channelz/subchannel.go @@ -47,12 +47,14 @@ func (sc *SubChannel) id() int64 { return sc.ID } +// Sockets returns a copy of the sockets map associated with the SubChannel. func (sc *SubChannel) Sockets() map[int64]string { db.mu.RLock() defer db.mu.RUnlock() return copyMap(sc.sockets) } +// Trace returns a copy of the ChannelTrace associated with the SubChannel. func (sc *SubChannel) Trace() *ChannelTrace { db.mu.RLock() defer db.mu.RUnlock() diff --git a/vendor/google.golang.org/grpc/internal/channelz/trace.go b/vendor/google.golang.org/grpc/internal/channelz/trace.go index 36b86740323..2bffe477768 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/trace.go +++ b/vendor/google.golang.org/grpc/internal/channelz/trace.go @@ -79,13 +79,21 @@ type TraceEvent struct { Parent *TraceEvent } +// ChannelTrace provides tracing information for a channel. +// It tracks various events and metadata related to the channel's lifecycle +// and operations. type ChannelTrace struct { - cm *channelMap - clearCalled bool + cm *channelMap + clearCalled bool + // The time when the trace was created. CreationTime time.Time - EventNum int64 - mu sync.Mutex - Events []*traceEvent + // A counter for the number of events recorded in the + // trace. + EventNum int64 + mu sync.Mutex + // A slice of traceEvent pointers representing the events recorded for + // this channel. + Events []*traceEvent } func (c *ChannelTrace) copy() *ChannelTrace { @@ -175,6 +183,7 @@ var refChannelTypeToString = map[RefChannelType]string{ RefNormalSocket: "NormalSocket", } +// String returns a string representation of the RefChannelType func (r RefChannelType) String() string { return refChannelTypeToString[r] } diff --git a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go index 452985f8d8f..6e7dd6b7727 100644 --- a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go +++ b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go @@ -50,6 +50,11 @@ var ( // xDS fallback is turned on. If this is unset or is false, only the first // xDS server in the list of server configs will be used. XDSFallbackSupport = boolFromEnv("GRPC_EXPERIMENTAL_XDS_FALLBACK", false) + // NewPickFirstEnabled is set if the new pickfirst leaf policy is to be used + // instead of the exiting pickfirst implementation. This can be enabled by + // setting the environment variable "GRPC_EXPERIMENTAL_ENABLE_NEW_PICK_FIRST" + // to "true". + NewPickFirstEnabled = boolFromEnv("GRPC_EXPERIMENTAL_ENABLE_NEW_PICK_FIRST", false) ) func boolFromEnv(envVar string, def bool) bool { diff --git a/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go b/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go index 19b9d639275..8e8e861280a 100644 --- a/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go +++ b/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go @@ -53,7 +53,7 @@ func NewCallbackSerializer(ctx context.Context) *CallbackSerializer { return cs } -// TrySchedule tries to schedules the provided callback function f to be +// TrySchedule tries to schedule the provided callback function f to be // executed in the order it was added. This is a best-effort operation. If the // context passed to NewCallbackSerializer was canceled before this method is // called, the callback will not be scheduled. diff --git a/vendor/google.golang.org/grpc/internal/grpcutil/method.go b/vendor/google.golang.org/grpc/internal/grpcutil/method.go index ec62b4775e5..683d1955c6a 100644 --- a/vendor/google.golang.org/grpc/internal/grpcutil/method.go +++ b/vendor/google.golang.org/grpc/internal/grpcutil/method.go @@ -39,7 +39,7 @@ func ParseMethod(methodName string) (service, method string, _ error) { } // baseContentType is the base content-type for gRPC. This is a valid -// content-type on it's own, but can also include a content-subtype such as +// content-type on its own, but can also include a content-subtype such as // "proto" as a suffix after "+" or ";". See // https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests // for more details. diff --git a/vendor/google.golang.org/grpc/internal/idle/idle.go b/vendor/google.golang.org/grpc/internal/idle/idle.go index fe49cb74c55..2c13ee9dac7 100644 --- a/vendor/google.golang.org/grpc/internal/idle/idle.go +++ b/vendor/google.golang.org/grpc/internal/idle/idle.go @@ -182,6 +182,7 @@ func (m *Manager) tryEnterIdleMode() bool { return true } +// EnterIdleModeForTesting instructs the channel to enter idle mode. func (m *Manager) EnterIdleModeForTesting() { m.tryEnterIdleMode() } @@ -225,7 +226,7 @@ func (m *Manager) ExitIdleMode() error { // came in and OnCallBegin() noticed that the calls count is negative. // - Channel is in idle mode, and multiple new RPCs come in at the same // time, all of them notice a negative calls count in OnCallBegin and get - // here. The first one to get the lock would got the channel to exit idle. + // here. The first one to get the lock would get the channel to exit idle. // - Channel is not in idle mode, and the user calls Connect which calls // m.ExitIdleMode. // @@ -266,6 +267,7 @@ func (m *Manager) isClosed() bool { return atomic.LoadInt32(&m.closed) == 1 } +// Close stops the timer associated with the Manager, if it exists. func (m *Manager) Close() { atomic.StoreInt32(&m.closed, 1) diff --git a/vendor/google.golang.org/grpc/internal/internal.go b/vendor/google.golang.org/grpc/internal/internal.go index 7aae9240ffc..20b4dc3d353 100644 --- a/vendor/google.golang.org/grpc/internal/internal.go +++ b/vendor/google.golang.org/grpc/internal/internal.go @@ -191,6 +191,8 @@ var ( // ExitIdleModeForTesting gets the ClientConn to exit IDLE mode. ExitIdleModeForTesting any // func(*grpc.ClientConn) error + // ChannelzTurnOffForTesting disables the Channelz service for testing + // purposes. ChannelzTurnOffForTesting func() // TriggerXDSResourceNotFoundForTesting causes the provided xDS Client to @@ -205,10 +207,6 @@ var ( // default resolver scheme. UserSetDefaultScheme = false - // ShuffleAddressListForTesting pseudo-randomizes the order of addresses. n - // is the number of elements. swap swaps the elements with indexes i and j. - ShuffleAddressListForTesting any // func(n int, swap func(i, j int)) - // ConnectedAddress returns the connected address for a SubConnState. The // address is only valid if the state is READY. ConnectedAddress any // func (scs SubConnState) resolver.Address @@ -235,7 +233,7 @@ var ( // // The implementation is expected to create a health checking RPC stream by // calling newStream(), watch for the health status of serviceName, and report -// it's health back by calling setConnectivityState(). +// its health back by calling setConnectivityState(). // // The health checking protocol is defined at: // https://github.com/grpc/grpc/blob/master/doc/health-checking.md diff --git a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go index 4552db16b02..374c12fb770 100644 --- a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go +++ b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go @@ -177,7 +177,7 @@ type dnsResolver struct { // finished. Otherwise, data race will be possible. [Race Example] in // dns_resolver_test we replace the real lookup functions with mocked ones to // facilitate testing. If Close() doesn't wait for watcher() goroutine - // finishes, race detector sometimes will warns lookup (READ the lookup + // finishes, race detector sometimes will warn lookup (READ the lookup // function pointers) inside watcher() goroutine has data race with // replaceNetFunc (WRITE the lookup function pointers). wg sync.WaitGroup @@ -237,7 +237,9 @@ func (d *dnsResolver) watcher() { } func (d *dnsResolver) lookupSRV(ctx context.Context) ([]resolver.Address, error) { - if !EnableSRVLookups { + // Skip this particular host to avoid timeouts with some versions of + // systemd-resolved. + if !EnableSRVLookups || d.host == "metadata.google.internal." { return nil, nil } var newAddrs []resolver.Address diff --git a/vendor/google.golang.org/grpc/internal/stats/metrics_recorder_list.go b/vendor/google.golang.org/grpc/internal/stats/metrics_recorder_list.go index be110d41f9a..79044657be1 100644 --- a/vendor/google.golang.org/grpc/internal/stats/metrics_recorder_list.go +++ b/vendor/google.golang.org/grpc/internal/stats/metrics_recorder_list.go @@ -54,6 +54,8 @@ func verifyLabels(desc *estats.MetricDescriptor, labelsRecv ...string) { } } +// RecordInt64Count records the measurement alongside labels on the int +// count associated with the provided handle. func (l *MetricsRecorderList) RecordInt64Count(handle *estats.Int64CountHandle, incr int64, labels ...string) { verifyLabels(handle.Descriptor(), labels...) @@ -62,6 +64,8 @@ func (l *MetricsRecorderList) RecordInt64Count(handle *estats.Int64CountHandle, } } +// RecordFloat64Count records the measurement alongside labels on the float +// count associated with the provided handle. func (l *MetricsRecorderList) RecordFloat64Count(handle *estats.Float64CountHandle, incr float64, labels ...string) { verifyLabels(handle.Descriptor(), labels...) @@ -70,6 +74,8 @@ func (l *MetricsRecorderList) RecordFloat64Count(handle *estats.Float64CountHand } } +// RecordInt64Histo records the measurement alongside labels on the int +// histo associated with the provided handle. func (l *MetricsRecorderList) RecordInt64Histo(handle *estats.Int64HistoHandle, incr int64, labels ...string) { verifyLabels(handle.Descriptor(), labels...) @@ -78,6 +84,8 @@ func (l *MetricsRecorderList) RecordInt64Histo(handle *estats.Int64HistoHandle, } } +// RecordFloat64Histo records the measurement alongside labels on the float +// histo associated with the provided handle. func (l *MetricsRecorderList) RecordFloat64Histo(handle *estats.Float64HistoHandle, incr float64, labels ...string) { verifyLabels(handle.Descriptor(), labels...) @@ -86,6 +94,8 @@ func (l *MetricsRecorderList) RecordFloat64Histo(handle *estats.Float64HistoHand } } +// RecordInt64Gauge records the measurement alongside labels on the int +// gauge associated with the provided handle. func (l *MetricsRecorderList) RecordInt64Gauge(handle *estats.Int64GaugeHandle, incr int64, labels ...string) { verifyLabels(handle.Descriptor(), labels...) diff --git a/vendor/google.golang.org/grpc/internal/status/status.go b/vendor/google.golang.org/grpc/internal/status/status.go index 757925381fe..1186f1e9a9a 100644 --- a/vendor/google.golang.org/grpc/internal/status/status.go +++ b/vendor/google.golang.org/grpc/internal/status/status.go @@ -149,6 +149,8 @@ func (s *Status) WithDetails(details ...protoadapt.MessageV1) (*Status, error) { // Details returns a slice of details messages attached to the status. // If a detail cannot be decoded, the error is returned in place of the detail. +// If the detail can be decoded, the proto message returned is of the same +// type that was given to WithDetails(). func (s *Status) Details() []any { if s == nil || s.s == nil { return nil @@ -160,7 +162,38 @@ func (s *Status) Details() []any { details = append(details, err) continue } - details = append(details, detail) + // The call to MessageV1Of is required to unwrap the proto message if + // it implemented only the MessageV1 API. The proto message would have + // been wrapped in a V2 wrapper in Status.WithDetails. V2 messages are + // added to a global registry used by any.UnmarshalNew(). + // MessageV1Of has the following behaviour: + // 1. If the given message is a wrapped MessageV1, it returns the + // unwrapped value. + // 2. If the given message already implements MessageV1, it returns it + // as is. + // 3. Else, it wraps the MessageV2 in a MessageV1 wrapper. + // + // Since the Status.WithDetails() API only accepts MessageV1, calling + // MessageV1Of ensures we return the same type that was given to + // WithDetails: + // * If the give type implemented only MessageV1, the unwrapping from + // point 1 above will restore the type. + // * If the given type implemented both MessageV1 and MessageV2, point 2 + // above will ensure no wrapping is performed. + // * If the given type implemented only MessageV2 and was wrapped using + // MessageV1Of before passing to WithDetails(), it would be unwrapped + // in WithDetails by calling MessageV2Of(). Point 3 above will ensure + // that the type is wrapped in a MessageV1 wrapper again before + // returning. Note that protoc-gen-go doesn't generate code which + // implements ONLY MessageV2 at the time of writing. + // + // NOTE: Status details can also be added using the FromProto method. + // This could theoretically allow passing a Detail message that only + // implements the V2 API. In such a case the message will be wrapped in + // a MessageV1 wrapper when fetched using Details(). + // Since protoc-gen-go generates only code that implements both V1 and + // V2 APIs for backward compatibility, this is not a concern. + details = append(details, protoadapt.MessageV1Of(detail)) } return details } diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_client.go b/vendor/google.golang.org/grpc/internal/transport/http2_client.go index c769deab53c..62b81885d8e 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_client.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_client.go @@ -86,9 +86,9 @@ type http2Client struct { writerDone chan struct{} // sync point to enable testing. // goAway is closed to notify the upper layer (i.e., addrConn.transportMonitor) // that the server sent GoAway on this transport. - goAway chan struct{} - - framer *framer + goAway chan struct{} + keepaliveDone chan struct{} // Closed when the keepalive goroutine exits. + framer *framer // controlBuf delivers all the control related tasks (e.g., window // updates, reset streams, and various settings) to the controller. // Do not access controlBuf with mu held. @@ -335,6 +335,7 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts readerDone: make(chan struct{}), writerDone: make(chan struct{}), goAway: make(chan struct{}), + keepaliveDone: make(chan struct{}), framer: newFramer(conn, writeBufSize, readBufSize, opts.SharedWriteBuffer, maxHeaderListSize), fc: &trInFlow{limit: uint32(icwz)}, scheme: scheme, @@ -527,8 +528,9 @@ func (t *http2Client) getPeer() *peer.Peer { // to be the last frame loopy writes to the transport. func (t *http2Client) outgoingGoAwayHandler(g *goAway) (bool, error) { t.mu.Lock() - defer t.mu.Unlock() - if err := t.framer.fr.WriteGoAway(t.nextID-2, http2.ErrCodeNo, g.debugData); err != nil { + maxStreamID := t.nextID - 2 + t.mu.Unlock() + if err := t.framer.fr.WriteGoAway(maxStreamID, http2.ErrCodeNo, g.debugData); err != nil { return false, err } return false, g.closeConn @@ -1008,6 +1010,9 @@ func (t *http2Client) Close(err error) { // should unblock it so that the goroutine eventually exits. t.kpDormancyCond.Signal() } + // Append info about previous goaways if there were any, since this may be important + // for understanding the root cause for this connection to be closed. + goAwayDebugMessage := t.goAwayDebugMessage t.mu.Unlock() // Per HTTP/2 spec, a GOAWAY frame must be sent before closing the @@ -1025,11 +1030,13 @@ func (t *http2Client) Close(err error) { } t.cancel() t.conn.Close() + // Waits for the reader and keepalive goroutines to exit before returning to + // ensure all resources are cleaned up before Close can return. + <-t.readerDone + if t.keepaliveEnabled { + <-t.keepaliveDone + } channelz.RemoveEntry(t.channelz.ID) - // Append info about previous goaways if there were any, since this may be important - // for understanding the root cause for this connection to be closed. - _, goAwayDebugMessage := t.GetGoAwayReason() - var st *status.Status if len(goAwayDebugMessage) > 0 { st = status.Newf(codes.Unavailable, "closing transport due to: %v, received prior goaway: %v", err, goAwayDebugMessage) @@ -1316,11 +1323,11 @@ func (t *http2Client) handlePing(f *http2.PingFrame) { t.controlBuf.put(pingAck) } -func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { +func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) error { t.mu.Lock() if t.state == closing { t.mu.Unlock() - return + return nil } if f.ErrCode == http2.ErrCodeEnhanceYourCalm && string(f.DebugData()) == "too_many_pings" { // When a client receives a GOAWAY with error code ENHANCE_YOUR_CALM and debug @@ -1332,8 +1339,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { id := f.LastStreamID if id > 0 && id%2 == 0 { t.mu.Unlock() - t.Close(connectionErrorf(true, nil, "received goaway with non-zero even-numbered stream id: %v", id)) - return + return connectionErrorf(true, nil, "received goaway with non-zero even-numbered stream id: %v", id) } // A client can receive multiple GoAways from the server (see // https://github.com/grpc/grpc-go/issues/1387). The idea is that the first @@ -1350,8 +1356,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { // If there are multiple GoAways the first one should always have an ID greater than the following ones. if id > t.prevGoAwayID { t.mu.Unlock() - t.Close(connectionErrorf(true, nil, "received goaway with stream id: %v, which exceeds stream id of previous goaway: %v", id, t.prevGoAwayID)) - return + return connectionErrorf(true, nil, "received goaway with stream id: %v, which exceeds stream id of previous goaway: %v", id, t.prevGoAwayID) } default: t.setGoAwayReason(f) @@ -1375,8 +1380,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { t.prevGoAwayID = id if len(t.activeStreams) == 0 { t.mu.Unlock() - t.Close(connectionErrorf(true, nil, "received goaway and there are no active streams")) - return + return connectionErrorf(true, nil, "received goaway and there are no active streams") } streamsToClose := make([]*Stream, 0) @@ -1393,6 +1397,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { for _, stream := range streamsToClose { t.closeStream(stream, errStreamDrain, false, http2.ErrCodeNo, statusGoAway, nil, false) } + return nil } // setGoAwayReason sets the value of t.goAwayReason based @@ -1628,7 +1633,13 @@ func (t *http2Client) readServerPreface() error { // network connection. If the server preface is not read successfully, an // error is pushed to errCh; otherwise errCh is closed with no error. func (t *http2Client) reader(errCh chan<- error) { - defer close(t.readerDone) + var errClose error + defer func() { + close(t.readerDone) + if errClose != nil { + t.Close(errClose) + } + }() if err := t.readServerPreface(); err != nil { errCh <- err @@ -1669,7 +1680,7 @@ func (t *http2Client) reader(errCh chan<- error) { continue } // Transport error. - t.Close(connectionErrorf(true, err, "error reading from server: %v", err)) + errClose = connectionErrorf(true, err, "error reading from server: %v", err) return } switch frame := frame.(type) { @@ -1684,7 +1695,7 @@ func (t *http2Client) reader(errCh chan<- error) { case *http2.PingFrame: t.handlePing(frame) case *http2.GoAwayFrame: - t.handleGoAway(frame) + errClose = t.handleGoAway(frame) case *http2.WindowUpdateFrame: t.handleWindowUpdate(frame) default: @@ -1697,6 +1708,13 @@ func (t *http2Client) reader(errCh chan<- error) { // keepalive running in a separate goroutine makes sure the connection is alive by sending pings. func (t *http2Client) keepalive() { + var err error + defer func() { + close(t.keepaliveDone) + if err != nil { + t.Close(err) + } + }() p := &ping{data: [8]byte{}} // True iff a ping has been sent, and no data has been received since then. outstandingPing := false @@ -1720,7 +1738,7 @@ func (t *http2Client) keepalive() { continue } if outstandingPing && timeoutLeft <= 0 { - t.Close(connectionErrorf(true, nil, "keepalive ping failed to receive ACK within timeout")) + err = connectionErrorf(true, nil, "keepalive ping failed to receive ACK within timeout") return } t.mu.Lock() diff --git a/vendor/google.golang.org/grpc/internal/transport/transport.go b/vendor/google.golang.org/grpc/internal/transport/transport.go index 924ba4f3653..e12cb0bc914 100644 --- a/vendor/google.golang.org/grpc/internal/transport/transport.go +++ b/vendor/google.golang.org/grpc/internal/transport/transport.go @@ -547,6 +547,15 @@ func (s *Stream) write(m recvMsg) { s.buf.put(m) } +// ReadHeader reads data into the provided header slice from the stream. It +// first checks if there was an error during a previous read operation and +// returns it if present. It then requests a read operation for the length of +// the header. It continues to read from the stream until the entire header +// slice is filled or an error occurs. If an `io.EOF` error is encountered +// with partially read data, it is converted to `io.ErrUnexpectedEOF` to +// indicate an unexpected end of the stream. The method returns any error +// encountered during the read process or nil if the header was successfully +// read. func (s *Stream) ReadHeader(header []byte) (err error) { // Don't request a read if there was an error earlier if er := s.trReader.er; er != nil { diff --git a/vendor/google.golang.org/grpc/mem/buffers.go b/vendor/google.golang.org/grpc/mem/buffers.go index 4d66b2ccc2b..ecbf0b9a73e 100644 --- a/vendor/google.golang.org/grpc/mem/buffers.go +++ b/vendor/google.golang.org/grpc/mem/buffers.go @@ -65,6 +65,9 @@ var ( refObjectPool = sync.Pool{New: func() any { return new(atomic.Int32) }} ) +// IsBelowBufferPoolingThreshold returns true if the given size is less than or +// equal to the threshold for buffer pooling. This is used to determine whether +// to pool buffers or allocate them directly. func IsBelowBufferPoolingThreshold(size int) bool { return size <= bufferPoolingThreshold } @@ -89,7 +92,11 @@ func newBuffer() *buffer { // // Note that the backing array of the given data is not copied. func NewBuffer(data *[]byte, pool BufferPool) Buffer { - if pool == nil || IsBelowBufferPoolingThreshold(len(*data)) { + // Use the buffer's capacity instead of the length, otherwise buffers may + // not be reused under certain conditions. For example, if a large buffer + // is acquired from the pool, but fewer bytes than the buffering threshold + // are written to it, the buffer will not be returned to the pool. + if pool == nil || IsBelowBufferPoolingThreshold(cap(*data)) { return (SliceBuffer)(*data) } b := newBuffer() @@ -194,19 +201,19 @@ func (b *buffer) read(buf []byte) (int, Buffer) { return n, b } -// String returns a string representation of the buffer. May be used for -// debugging purposes. func (b *buffer) String() string { return fmt.Sprintf("mem.Buffer(%p, data: %p, length: %d)", b, b.ReadOnlyData(), len(b.ReadOnlyData())) } +// ReadUnsafe reads bytes from the given Buffer into the provided slice. +// It does not perform safety checks. func ReadUnsafe(dst []byte, buf Buffer) (int, Buffer) { return buf.read(dst) } // SplitUnsafe modifies the receiver to point to the first n bytes while it -// returns a new reference to the remaining bytes. The returned Buffer functions -// just like a normal reference acquired using Ref(). +// returns a new reference to the remaining bytes. The returned Buffer +// functions just like a normal reference acquired using Ref(). func SplitUnsafe(buf Buffer, n int) (left, right Buffer) { return buf.split(n) } @@ -232,12 +239,21 @@ func (e emptyBuffer) read([]byte) (int, Buffer) { return 0, e } +// SliceBuffer is a Buffer implementation that wraps a byte slice. It provides +// methods for reading, splitting, and managing the byte slice. type SliceBuffer []byte +// ReadOnlyData returns the byte slice. func (s SliceBuffer) ReadOnlyData() []byte { return s } -func (s SliceBuffer) Ref() {} -func (s SliceBuffer) Free() {} -func (s SliceBuffer) Len() int { return len(s) } + +// Ref is a noop implementation of Ref. +func (s SliceBuffer) Ref() {} + +// Free is a noop implementation of Free. +func (s SliceBuffer) Free() {} + +// Len is a noop implementation of Len. +func (s SliceBuffer) Len() int { return len(s) } func (s SliceBuffer) split(n int) (left, right Buffer) { return s[:n], s[n:] diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go index 2d96f1405e8..aba1ae3e678 100644 --- a/vendor/google.golang.org/grpc/rpc_util.go +++ b/vendor/google.golang.org/grpc/rpc_util.go @@ -791,9 +791,8 @@ func checkRecvPayload(pf payloadFormat, recvCompress string, haveCompressor bool if !haveCompressor { if isServer { return status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", recvCompress) - } else { - return status.Newf(codes.Internal, "grpc: Decompressor is not installed for grpc-encoding %q", recvCompress) } + return status.Newf(codes.Internal, "grpc: Decompressor is not installed for grpc-encoding %q", recvCompress) } default: return status.Newf(codes.Internal, "grpc: received unexpected payload format %d", pf) diff --git a/vendor/google.golang.org/grpc/version.go b/vendor/google.golang.org/grpc/version.go index a96b6a6bff8..5a47094ae87 100644 --- a/vendor/google.golang.org/grpc/version.go +++ b/vendor/google.golang.org/grpc/version.go @@ -19,4 +19,4 @@ package grpc // Version is the current grpc version. -const Version = "1.67.1" +const Version = "1.68.1" diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go index 4b177c8206f..e9fe1039437 100644 --- a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go +++ b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go @@ -348,7 +348,11 @@ func (d decoder) unmarshalAnyValue(unmarshal unmarshalFunc, m protoreflect.Messa switch tok.Kind() { case json.ObjectClose: if !found { - return d.newError(tok.Pos(), `missing "value" field`) + // We tolerate an omitted `value` field with the google.protobuf.Empty Well-Known-Type, + // for compatibility with other proto runtimes that have interpreted the spec differently. + if m.Descriptor().FullName() != genid.Empty_message_fullname { + return d.newError(tok.Pos(), `missing "value" field`) + } } return nil diff --git a/vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb b/vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb index ff6a38360add36f53d48bb0863b701696e0d7b2d..2c0693d7abbf532f021dafc96e7568f57214b8e7 100644 GIT binary patch literal 99 zcmd;*m3YRk#C*w)K}(o}QGiK;Nr72|(SYfa9SaAe1S6NM#B;bblK@aefe9$h2$E(1 dOTS=O5(H{Ql40Ut&|548XQ literal 93 zcmd;*mUzal#C*w)K}(Q>QGiK;Nr72|(SYfa9TNv5m$bxlxFnMRqXeS@6Ht;7B*_4j Ve8H{+(u69m1u{(G8N0>{b^xZ!4_5#H diff --git a/vendor/google.golang.org/protobuf/internal/editionssupport/editions.go b/vendor/google.golang.org/protobuf/internal/editionssupport/editions.go index 08dad7692c6..bf1aba0e851 100644 --- a/vendor/google.golang.org/protobuf/internal/editionssupport/editions.go +++ b/vendor/google.golang.org/protobuf/internal/editionssupport/editions.go @@ -10,4 +10,9 @@ import "google.golang.org/protobuf/types/descriptorpb" const ( Minimum = descriptorpb.Edition_EDITION_PROTO2 Maximum = descriptorpb.Edition_EDITION_2023 + + // MaximumKnown is the maximum edition that is known to Go Protobuf, but not + // declared as supported. In other words: end users cannot use it, but + // testprotos inside Go Protobuf can. + MaximumKnown = descriptorpb.Edition_EDITION_2024 ) diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go index fa790e0ff19..f3252985641 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go @@ -32,6 +32,7 @@ const ( EditionProto2 Edition = 998 EditionProto3 Edition = 999 Edition2023 Edition = 1000 + Edition2024 Edition = 1001 EditionUnsupported Edition = 100000 ) @@ -77,28 +78,42 @@ type ( Locations SourceLocations } + // EditionFeatures is a frequently-instantiated struct, so please take care + // to minimize padding when adding new fields to this struct (add them in + // the right place/order). EditionFeatures struct { + // StripEnumPrefix determines if the plugin generates enum value + // constants as-is, with their prefix stripped, or both variants. + StripEnumPrefix int + // IsFieldPresence is true if field_presence is EXPLICIT // https://protobuf.dev/editions/features/#field_presence IsFieldPresence bool + // IsFieldPresence is true if field_presence is LEGACY_REQUIRED // https://protobuf.dev/editions/features/#field_presence IsLegacyRequired bool + // IsOpenEnum is true if enum_type is OPEN // https://protobuf.dev/editions/features/#enum_type IsOpenEnum bool + // IsPacked is true if repeated_field_encoding is PACKED // https://protobuf.dev/editions/features/#repeated_field_encoding IsPacked bool + // IsUTF8Validated is true if utf_validation is VERIFY // https://protobuf.dev/editions/features/#utf8_validation IsUTF8Validated bool + // IsDelimitedEncoded is true if message_encoding is DELIMITED // https://protobuf.dev/editions/features/#message_encoding IsDelimitedEncoded bool + // IsJSONCompliant is true if json_format is ALLOW // https://protobuf.dev/editions/features/#json_format IsJSONCompliant bool + // GenerateLegacyUnmarshalJSON determines if the plugin generates the // UnmarshalJSON([]byte) error method for enums. GenerateLegacyUnmarshalJSON bool diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/editions.go b/vendor/google.golang.org/protobuf/internal/filedesc/editions.go index fd4d0c83d25..7611796e86c 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/editions.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/editions.go @@ -32,6 +32,10 @@ func unmarshalGoFeature(b []byte, parent EditionFeatures) EditionFeatures { v, m := protowire.ConsumeVarint(b) b = b[m:] parent.GenerateLegacyUnmarshalJSON = protowire.DecodeBool(v) + case genid.GoFeatures_StripEnumPrefix_field_number: + v, m := protowire.ConsumeVarint(b) + b = b[m:] + parent.StripEnumPrefix = int(v) default: panic(fmt.Sprintf("unkown field number %d while unmarshalling GoFeatures", num)) } diff --git a/vendor/google.golang.org/protobuf/internal/genid/go_features_gen.go b/vendor/google.golang.org/protobuf/internal/genid/go_features_gen.go index 7f67cbb6e97..09792d96f6b 100644 --- a/vendor/google.golang.org/protobuf/internal/genid/go_features_gen.go +++ b/vendor/google.golang.org/protobuf/internal/genid/go_features_gen.go @@ -21,13 +21,30 @@ const ( // Field names for pb.GoFeatures. const ( GoFeatures_LegacyUnmarshalJsonEnum_field_name protoreflect.Name = "legacy_unmarshal_json_enum" + GoFeatures_StripEnumPrefix_field_name protoreflect.Name = "strip_enum_prefix" GoFeatures_LegacyUnmarshalJsonEnum_field_fullname protoreflect.FullName = "pb.GoFeatures.legacy_unmarshal_json_enum" + GoFeatures_StripEnumPrefix_field_fullname protoreflect.FullName = "pb.GoFeatures.strip_enum_prefix" ) // Field numbers for pb.GoFeatures. const ( GoFeatures_LegacyUnmarshalJsonEnum_field_number protoreflect.FieldNumber = 1 + GoFeatures_StripEnumPrefix_field_number protoreflect.FieldNumber = 3 +) + +// Full and short names for pb.GoFeatures.StripEnumPrefix. +const ( + GoFeatures_StripEnumPrefix_enum_fullname = "pb.GoFeatures.StripEnumPrefix" + GoFeatures_StripEnumPrefix_enum_name = "StripEnumPrefix" +) + +// Enum values for pb.GoFeatures.StripEnumPrefix. +const ( + GoFeatures_STRIP_ENUM_PREFIX_UNSPECIFIED_enum_value = 0 + GoFeatures_STRIP_ENUM_PREFIX_KEEP_enum_value = 1 + GoFeatures_STRIP_ENUM_PREFIX_GENERATE_BOTH_enum_value = 2 + GoFeatures_STRIP_ENUM_PREFIX_STRIP_enum_value = 3 ) // Extension numbers diff --git a/vendor/google.golang.org/protobuf/internal/version/version.go b/vendor/google.golang.org/protobuf/internal/version/version.go index fb8e15e8dad..62a52a40a31 100644 --- a/vendor/google.golang.org/protobuf/internal/version/version.go +++ b/vendor/google.golang.org/protobuf/internal/version/version.go @@ -52,7 +52,7 @@ import ( const ( Major = 1 Minor = 35 - Patch = 1 + Patch = 2 PreRelease = "" ) diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go index 8fbecb4f58d..69a05050917 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go @@ -13,6 +13,8 @@ package protodesc import ( + "strings" + "google.golang.org/protobuf/internal/editionssupport" "google.golang.org/protobuf/internal/errors" "google.golang.org/protobuf/internal/filedesc" @@ -102,13 +104,17 @@ func (o FileOptions) New(fd *descriptorpb.FileDescriptorProto, r Resolver) (prot default: return nil, errors.New("invalid syntax: %q", fd.GetSyntax()) } - if f.L1.Syntax == protoreflect.Editions && (fd.GetEdition() < editionssupport.Minimum || fd.GetEdition() > editionssupport.Maximum) { - return nil, errors.New("use of edition %v not yet supported by the Go Protobuf runtime", fd.GetEdition()) - } f.L1.Path = fd.GetName() if f.L1.Path == "" { return nil, errors.New("file path must be populated") } + if f.L1.Syntax == protoreflect.Editions && (fd.GetEdition() < editionssupport.Minimum || fd.GetEdition() > editionssupport.Maximum) { + // Allow cmd/protoc-gen-go/testdata to use any edition for easier + // testing of upcoming edition features. + if !strings.HasPrefix(fd.GetName(), "cmd/protoc-gen-go/testdata/") { + return nil, errors.New("use of edition %v not yet supported by the Go Protobuf runtime", fd.GetEdition()) + } + } f.L1.Package = protoreflect.FullName(fd.GetPackage()) if !f.L1.Package.IsValid() && f.L1.Package != "" { return nil, errors.New("invalid package: %q", f.L1.Package) diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go b/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go index 002e0047aea..d0aeab9585f 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go @@ -43,6 +43,8 @@ func toEditionProto(ed filedesc.Edition) descriptorpb.Edition { return descriptorpb.Edition_EDITION_PROTO3 case filedesc.Edition2023: return descriptorpb.Edition_EDITION_2023 + case filedesc.Edition2024: + return descriptorpb.Edition_EDITION_2024 default: panic(fmt.Sprintf("unknown value for edition: %v", ed)) } @@ -127,6 +129,9 @@ func mergeEditionFeatures(parentDesc protoreflect.Descriptor, child *descriptorp if luje := goFeatures.LegacyUnmarshalJsonEnum; luje != nil { parentFS.GenerateLegacyUnmarshalJSON = *luje } + if sep := goFeatures.StripEnumPrefix; sep != nil { + parentFS.StripEnumPrefix = int(*sep) + } } return parentFS diff --git a/vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.pb.go b/vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.pb.go index c7e860fcd6d..5067b89e906 100644 --- a/vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.pb.go +++ b/vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.pb.go @@ -18,13 +18,76 @@ import ( sync "sync" ) +type GoFeatures_StripEnumPrefix int32 + +const ( + GoFeatures_STRIP_ENUM_PREFIX_UNSPECIFIED GoFeatures_StripEnumPrefix = 0 + GoFeatures_STRIP_ENUM_PREFIX_KEEP GoFeatures_StripEnumPrefix = 1 + GoFeatures_STRIP_ENUM_PREFIX_GENERATE_BOTH GoFeatures_StripEnumPrefix = 2 + GoFeatures_STRIP_ENUM_PREFIX_STRIP GoFeatures_StripEnumPrefix = 3 +) + +// Enum value maps for GoFeatures_StripEnumPrefix. +var ( + GoFeatures_StripEnumPrefix_name = map[int32]string{ + 0: "STRIP_ENUM_PREFIX_UNSPECIFIED", + 1: "STRIP_ENUM_PREFIX_KEEP", + 2: "STRIP_ENUM_PREFIX_GENERATE_BOTH", + 3: "STRIP_ENUM_PREFIX_STRIP", + } + GoFeatures_StripEnumPrefix_value = map[string]int32{ + "STRIP_ENUM_PREFIX_UNSPECIFIED": 0, + "STRIP_ENUM_PREFIX_KEEP": 1, + "STRIP_ENUM_PREFIX_GENERATE_BOTH": 2, + "STRIP_ENUM_PREFIX_STRIP": 3, + } +) + +func (x GoFeatures_StripEnumPrefix) Enum() *GoFeatures_StripEnumPrefix { + p := new(GoFeatures_StripEnumPrefix) + *p = x + return p +} + +func (x GoFeatures_StripEnumPrefix) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GoFeatures_StripEnumPrefix) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_go_features_proto_enumTypes[0].Descriptor() +} + +func (GoFeatures_StripEnumPrefix) Type() protoreflect.EnumType { + return &file_google_protobuf_go_features_proto_enumTypes[0] +} + +func (x GoFeatures_StripEnumPrefix) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *GoFeatures_StripEnumPrefix) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = GoFeatures_StripEnumPrefix(num) + return nil +} + +// Deprecated: Use GoFeatures_StripEnumPrefix.Descriptor instead. +func (GoFeatures_StripEnumPrefix) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_go_features_proto_rawDescGZIP(), []int{0, 0} +} + type GoFeatures struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Whether or not to generate the deprecated UnmarshalJSON method for enums. - LegacyUnmarshalJsonEnum *bool `protobuf:"varint,1,opt,name=legacy_unmarshal_json_enum,json=legacyUnmarshalJsonEnum" json:"legacy_unmarshal_json_enum,omitempty"` + LegacyUnmarshalJsonEnum *bool `protobuf:"varint,1,opt,name=legacy_unmarshal_json_enum,json=legacyUnmarshalJsonEnum" json:"legacy_unmarshal_json_enum,omitempty"` + StripEnumPrefix *GoFeatures_StripEnumPrefix `protobuf:"varint,3,opt,name=strip_enum_prefix,json=stripEnumPrefix,enum=pb.GoFeatures_StripEnumPrefix" json:"strip_enum_prefix,omitempty"` } func (x *GoFeatures) Reset() { @@ -64,6 +127,13 @@ func (x *GoFeatures) GetLegacyUnmarshalJsonEnum() bool { return false } +func (x *GoFeatures) GetStripEnumPrefix() GoFeatures_StripEnumPrefix { + if x != nil && x.StripEnumPrefix != nil { + return *x.StripEnumPrefix + } + return GoFeatures_STRIP_ENUM_PREFIX_UNSPECIFIED +} + var file_google_protobuf_go_features_proto_extTypes = []protoimpl.ExtensionInfo{ { ExtendedType: (*descriptorpb.FeatureSet)(nil), @@ -88,7 +158,7 @@ var file_google_protobuf_go_features_proto_rawDesc = []byte{ 0x66, 0x2f, 0x67, 0x6f, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcd, 0x01, 0x0a, 0x0a, 0x47, 0x6f, + 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe0, 0x03, 0x0a, 0x0a, 0x47, 0x6f, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0xbe, 0x01, 0x0a, 0x1a, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x75, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x80, 0x01, @@ -101,14 +171,31 @@ var file_google_protobuf_go_features_proto_rawDesc = []byte{ 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x17, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, - 0x6c, 0x4a, 0x73, 0x6f, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x3c, 0x0a, 0x02, 0x67, 0x6f, 0x12, - 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x18, 0xea, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6f, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x52, 0x02, 0x67, 0x6f, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x67, 0x6f, 0x66, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x70, 0x62, + 0x6c, 0x4a, 0x73, 0x6f, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x7c, 0x0a, 0x11, 0x73, 0x74, 0x72, + 0x69, 0x70, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6f, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x70, 0x45, 0x6e, 0x75, 0x6d, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x42, 0x30, 0x88, 0x01, 0x01, 0x98, 0x01, 0x06, 0x98, 0x01, 0x07, 0x98, + 0x01, 0x01, 0xa2, 0x01, 0x1b, 0x12, 0x16, 0x53, 0x54, 0x52, 0x49, 0x50, 0x5f, 0x45, 0x4e, 0x55, + 0x4d, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x5f, 0x4b, 0x45, 0x45, 0x50, 0x18, 0x84, 0x07, + 0xb2, 0x01, 0x03, 0x08, 0xe9, 0x07, 0x52, 0x0f, 0x73, 0x74, 0x72, 0x69, 0x70, 0x45, 0x6e, 0x75, + 0x6d, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x92, 0x01, 0x0a, 0x0f, 0x53, 0x74, 0x72, 0x69, + 0x70, 0x45, 0x6e, 0x75, 0x6d, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x21, 0x0a, 0x1d, 0x53, + 0x54, 0x52, 0x49, 0x50, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, + 0x0a, 0x16, 0x53, 0x54, 0x52, 0x49, 0x50, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x50, 0x52, 0x45, + 0x46, 0x49, 0x58, 0x5f, 0x4b, 0x45, 0x45, 0x50, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x54, + 0x52, 0x49, 0x50, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x5f, + 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x42, 0x4f, 0x54, 0x48, 0x10, 0x02, 0x12, + 0x1b, 0x0a, 0x17, 0x53, 0x54, 0x52, 0x49, 0x50, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x50, 0x52, + 0x45, 0x46, 0x49, 0x58, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x50, 0x10, 0x03, 0x3a, 0x3c, 0x0a, 0x02, + 0x67, 0x6f, 0x12, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x18, + 0xea, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6f, 0x46, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x02, 0x67, 0x6f, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x67, + 0x6f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x70, 0x62, } var ( @@ -123,19 +210,22 @@ func file_google_protobuf_go_features_proto_rawDescGZIP() []byte { return file_google_protobuf_go_features_proto_rawDescData } +var file_google_protobuf_go_features_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_google_protobuf_go_features_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_google_protobuf_go_features_proto_goTypes = []any{ - (*GoFeatures)(nil), // 0: pb.GoFeatures - (*descriptorpb.FeatureSet)(nil), // 1: google.protobuf.FeatureSet + (GoFeatures_StripEnumPrefix)(0), // 0: pb.GoFeatures.StripEnumPrefix + (*GoFeatures)(nil), // 1: pb.GoFeatures + (*descriptorpb.FeatureSet)(nil), // 2: google.protobuf.FeatureSet } var file_google_protobuf_go_features_proto_depIdxs = []int32{ - 1, // 0: pb.go:extendee -> google.protobuf.FeatureSet - 0, // 1: pb.go:type_name -> pb.GoFeatures - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 1, // [1:2] is the sub-list for extension type_name - 0, // [0:1] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 0, // 0: pb.GoFeatures.strip_enum_prefix:type_name -> pb.GoFeatures.StripEnumPrefix + 2, // 1: pb.go:extendee -> google.protobuf.FeatureSet + 1, // 2: pb.go:type_name -> pb.GoFeatures + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 2, // [2:3] is the sub-list for extension type_name + 1, // [1:2] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { file_google_protobuf_go_features_proto_init() } @@ -148,13 +238,14 @@ func file_google_protobuf_go_features_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_protobuf_go_features_proto_rawDesc, - NumEnums: 0, + NumEnums: 1, NumMessages: 1, NumExtensions: 1, NumServices: 0, }, GoTypes: file_google_protobuf_go_features_proto_goTypes, DependencyIndexes: file_google_protobuf_go_features_proto_depIdxs, + EnumInfos: file_google_protobuf_go_features_proto_enumTypes, MessageInfos: file_google_protobuf_go_features_proto_msgTypes, ExtensionInfos: file_google_protobuf_go_features_proto_extTypes, }.Build() diff --git a/vendor/modules.txt b/vendor/modules.txt index 54387b3eee1..88a4500bcc6 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -493,15 +493,15 @@ golang.org/x/text/unicode/rangetable # golang.org/x/time v0.8.0 ## explicit; go 1.18 golang.org/x/time/rate -# google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd +# google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 ## explicit; go 1.21 google.golang.org/genproto/googleapis/api/httpbody -# google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd +# google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 ## explicit; go 1.21 google.golang.org/genproto/googleapis/rpc/errdetails google.golang.org/genproto/googleapis/rpc/status -# google.golang.org/grpc v1.67.1 -## explicit; go 1.21 +# google.golang.org/grpc v1.68.1 +## explicit; go 1.22 google.golang.org/grpc google.golang.org/grpc/attributes google.golang.org/grpc/backoff @@ -509,6 +509,8 @@ google.golang.org/grpc/balancer google.golang.org/grpc/balancer/base google.golang.org/grpc/balancer/grpclb/state google.golang.org/grpc/balancer/pickfirst +google.golang.org/grpc/balancer/pickfirst/internal +google.golang.org/grpc/balancer/pickfirst/pickfirstleaf google.golang.org/grpc/balancer/roundrobin google.golang.org/grpc/binarylog/grpc_binarylog_v1 google.golang.org/grpc/channelz @@ -564,7 +566,7 @@ google.golang.org/grpc/stats google.golang.org/grpc/status google.golang.org/grpc/tap google.golang.org/grpc/test/bufconn -# google.golang.org/protobuf v1.35.1 +# google.golang.org/protobuf v1.35.2 ## explicit; go 1.21 google.golang.org/protobuf/encoding/protojson google.golang.org/protobuf/encoding/prototext