mirror of https://github.com/knative/pkg.git
[master] Auto-update dependencies (#1578)
Produced via: `./hack/update-deps.sh --upgrade && ./hack/update-codegen.sh` /assign n3wscott vagababov /cc n3wscott vagababov
This commit is contained in:
parent
6940870178
commit
33faa4a540
10
go.mod
10
go.mod
|
@ -3,7 +3,7 @@ module knative.dev/pkg
|
||||||
go 1.14
|
go 1.14
|
||||||
|
|
||||||
require (
|
require (
|
||||||
cloud.google.com/go v0.61.0
|
cloud.google.com/go v0.62.0
|
||||||
cloud.google.com/go/storage v1.10.0
|
cloud.google.com/go/storage v1.10.0
|
||||||
contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200615190824-f8c219d2d895
|
contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200615190824-f8c219d2d895
|
||||||
contrib.go.opencensus.io/exporter/prometheus v0.2.1-0.20200609204449-6bcf6f8577f0
|
contrib.go.opencensus.io/exporter/prometheus v0.2.1-0.20200609204449-6bcf6f8577f0
|
||||||
|
@ -47,8 +47,8 @@ require (
|
||||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208
|
||||||
gomodules.xyz/jsonpatch/v2 v2.1.0
|
gomodules.xyz/jsonpatch/v2 v2.1.0
|
||||||
google.golang.org/api v0.29.0
|
google.golang.org/api v0.29.0
|
||||||
google.golang.org/genproto v0.0.0-20200728010541-3dc8dca74b7b
|
google.golang.org/genproto v0.0.0-20200731012542-8145dea6a485
|
||||||
google.golang.org/grpc v1.30.0
|
google.golang.org/grpc v1.31.0
|
||||||
gopkg.in/yaml.v2 v2.3.0
|
gopkg.in/yaml.v2 v2.3.0
|
||||||
gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22
|
gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22
|
||||||
k8s.io/api v0.17.6
|
k8s.io/api v0.17.6
|
||||||
|
@ -59,8 +59,8 @@ require (
|
||||||
k8s.io/gengo v0.0.0-20200205140755-e0e292d8aa12
|
k8s.io/gengo v0.0.0-20200205140755-e0e292d8aa12
|
||||||
k8s.io/klog v1.0.0
|
k8s.io/klog v1.0.0
|
||||||
k8s.io/utils v0.0.0-20200124190032-861946025e34 // indirect
|
k8s.io/utils v0.0.0-20200124190032-861946025e34 // indirect
|
||||||
knative.dev/test-infra v0.0.0-20200729161259-d21e6ed450cb
|
knative.dev/test-infra v0.0.0-20200731141600-8bb2015c65e2
|
||||||
sigs.k8s.io/boskos v0.0.0-20200717180850-7299d535c033
|
sigs.k8s.io/boskos v0.0.0-20200729174948-794df80db9c9
|
||||||
)
|
)
|
||||||
|
|
||||||
replace (
|
replace (
|
||||||
|
|
30
go.sum
30
go.sum
|
@ -23,6 +23,8 @@ cloud.google.com/go v0.60.0 h1:R+tDlceO7Ss+zyvtsdhTxacDyZ1k99xwskQ4FT7ruoM=
|
||||||
cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU=
|
cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU=
|
||||||
cloud.google.com/go v0.61.0 h1:NLQf5e1OMspfNT1RAHOB3ublr1TW3YTXO8OiWwVjK2U=
|
cloud.google.com/go v0.61.0 h1:NLQf5e1OMspfNT1RAHOB3ublr1TW3YTXO8OiWwVjK2U=
|
||||||
cloud.google.com/go v0.61.0/go.mod h1:XukKJg4Y7QsUu0Hxg3qQKUWR4VuWivmyMK2+rUyxAqw=
|
cloud.google.com/go v0.61.0/go.mod h1:XukKJg4Y7QsUu0Hxg3qQKUWR4VuWivmyMK2+rUyxAqw=
|
||||||
|
cloud.google.com/go v0.62.0 h1:RmDygqvj27Zf3fCQjQRtLyC7KwFcHkeJitcO0OoGOcA=
|
||||||
|
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
|
||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||||
cloud.google.com/go/bigquery v1.4.0 h1:xE3CPsOgttP4ACBePh79zTKALtXwn/Edhcr16R5hMWU=
|
cloud.google.com/go/bigquery v1.4.0 h1:xE3CPsOgttP4ACBePh79zTKALtXwn/Edhcr16R5hMWU=
|
||||||
|
@ -1126,8 +1128,8 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh
|
||||||
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg=
|
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
|
||||||
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
@ -1400,8 +1402,9 @@ golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roY
|
||||||
golang.org/x/tools v0.0.0-20200709181711-e327e1019dfe/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
golang.org/x/tools v0.0.0-20200709181711-e327e1019dfe/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/tools v0.0.0-20200725200936-102e7d357031/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
golang.org/x/tools v0.0.0-20200725200936-102e7d357031/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/tools v0.0.0-20200727233628-55644ead90ce h1:HEwYEPqqa3/M0N2Q6IgtBaf2CaxvmRiVdAhX6LR7uE4=
|
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/tools v0.0.0-20200727233628-55644ead90ce/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6 h1:qKpj8TpV+LEhel7H/fR788J+KvhWZ3o3V6N2fU/iuLU=
|
||||||
|
golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||||
|
@ -1492,8 +1495,9 @@ google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6D
|
||||||
google.golang.org/genproto v0.0.0-20200709005830-7a2ca40e9dc3/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200709005830-7a2ca40e9dc3/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20200711021454-869866162049/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200711021454-869866162049/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20200726014623-da3ae01ef02d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200726014623-da3ae01ef02d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20200728010541-3dc8dca74b7b h1:FWkel6k8GbR7SbBY200Cz8tA58/KtMrfpVZwOOSjOvQ=
|
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20200728010541-3dc8dca74b7b/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200731012542-8145dea6a485 h1:wTk5DQB3+1darAz4Ldomo0r5bUOCKX7gilxQ4sb2kno=
|
||||||
|
google.golang.org/genproto v0.0.0-20200731012542-8145dea6a485/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
|
@ -1515,6 +1519,8 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa
|
||||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||||
google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE=
|
google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE=
|
||||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
|
google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI=
|
||||||
|
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
@ -1633,16 +1639,16 @@ k8s.io/metrics v0.17.2/go.mod h1:3TkNHET4ROd+NfzNxkjoVfQ0Ob4iZnaHmSEA4vYpwLw=
|
||||||
k8s.io/test-infra v0.0.0-20200514184223-ba32c8aae783 h1:dLB5TiQVoLcFkj1TPQSahZiJFP8NL+63tawMlX5aV8w=
|
k8s.io/test-infra v0.0.0-20200514184223-ba32c8aae783 h1:dLB5TiQVoLcFkj1TPQSahZiJFP8NL+63tawMlX5aV8w=
|
||||||
k8s.io/test-infra v0.0.0-20200514184223-ba32c8aae783/go.mod h1:bW6thaPZfL2hW7ecjx2WYwlP9KQLM47/xIJyttkVk5s=
|
k8s.io/test-infra v0.0.0-20200514184223-ba32c8aae783/go.mod h1:bW6thaPZfL2hW7ecjx2WYwlP9KQLM47/xIJyttkVk5s=
|
||||||
k8s.io/test-infra v0.0.0-20200617221206-ea73eaeab7ff/go.mod h1:L3+cRvwftUq8IW1TrHji5m3msnc4uck/7LsE/GR/aZk=
|
k8s.io/test-infra v0.0.0-20200617221206-ea73eaeab7ff/go.mod h1:L3+cRvwftUq8IW1TrHji5m3msnc4uck/7LsE/GR/aZk=
|
||||||
k8s.io/test-infra v0.0.0-20200728085909-4407d8aec1ee h1:cXFCjf/ifcTaAC+mc3ameW3clKpfUwVk0Jd/oLoBaOA=
|
k8s.io/test-infra v0.0.0-20200731093307-ac6260b71531 h1:HwqMThJax/gu73gws63uQT5dXIQ8n1sbr5LoCziaM9o=
|
||||||
k8s.io/test-infra v0.0.0-20200728085909-4407d8aec1ee/go.mod h1:4cRZlOy5Ka3Ym/orCmNWL2dsE39pN0xHFT0WFrZe2HQ=
|
k8s.io/test-infra v0.0.0-20200731093307-ac6260b71531/go.mod h1:4cRZlOy5Ka3Ym/orCmNWL2dsE39pN0xHFT0WFrZe2HQ=
|
||||||
k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
|
k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
|
||||||
k8s.io/utils v0.0.0-20200124190032-861946025e34 h1:HjlUD6M0K3P8nRXmr2B9o4F9dUy9TCj/aEpReeyi6+k=
|
k8s.io/utils v0.0.0-20200124190032-861946025e34 h1:HjlUD6M0K3P8nRXmr2B9o4F9dUy9TCj/aEpReeyi6+k=
|
||||||
k8s.io/utils v0.0.0-20200124190032-861946025e34/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
|
k8s.io/utils v0.0.0-20200124190032-861946025e34/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
|
||||||
knative.dev/caching v0.0.0-20200116200605-67bca2c83dfa/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg=
|
knative.dev/caching v0.0.0-20200116200605-67bca2c83dfa/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg=
|
||||||
knative.dev/eventing-contrib v0.11.2/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g=
|
knative.dev/eventing-contrib v0.11.2/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g=
|
||||||
knative.dev/pkg v0.0.0-20200207155214-fef852970f43/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
|
knative.dev/pkg v0.0.0-20200207155214-fef852970f43/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
|
||||||
knative.dev/test-infra v0.0.0-20200729161259-d21e6ed450cb h1:fwkMDaKklHbKrZpMvjIHrLfk8AXAhiiB1VNEpXrBFZI=
|
knative.dev/test-infra v0.0.0-20200731141600-8bb2015c65e2 h1:ZDnuJquEqHdirUQ/tFDIeaXOyzoGMTBVe6gbUZ6iu24=
|
||||||
knative.dev/test-infra v0.0.0-20200729161259-d21e6ed450cb/go.mod h1:AfEfWe/Z/DIA2vQSbSTxMVlF+ErBD7Oqc4/K/x1no90=
|
knative.dev/test-infra v0.0.0-20200731141600-8bb2015c65e2/go.mod h1:0le/boMbbcshz6ffNQRYyTkL7xubokot4dKcO/1daIc=
|
||||||
modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
|
modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
|
||||||
modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
|
modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
|
||||||
modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
|
modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
|
||||||
|
@ -1660,8 +1666,8 @@ rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY=
|
||||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
sigs.k8s.io/boskos v0.0.0-20200526191642-45fc818e2d00/go.mod h1:L1ubP7d1CCMSQSjKiZv6dGbh7b4kfoG+dFPj8cfYDnI=
|
sigs.k8s.io/boskos v0.0.0-20200526191642-45fc818e2d00/go.mod h1:L1ubP7d1CCMSQSjKiZv6dGbh7b4kfoG+dFPj8cfYDnI=
|
||||||
sigs.k8s.io/boskos v0.0.0-20200717180850-7299d535c033 h1:HzSEp0ziQqHe6D4N09xTrP/F5H5qF8HkyVDcOlDLj9o=
|
sigs.k8s.io/boskos v0.0.0-20200729174948-794df80db9c9 h1:7NmcxK+xm/9QtUQbkJySnXtY2EqISsCCODjy9mw+YWM=
|
||||||
sigs.k8s.io/boskos v0.0.0-20200717180850-7299d535c033/go.mod h1:ZO5RV+VxJS9mb6DvZ1yAjywoyq/wQ8b0vDoZxcIA5kE=
|
sigs.k8s.io/boskos v0.0.0-20200729174948-794df80db9c9/go.mod h1:ZO5RV+VxJS9mb6DvZ1yAjywoyq/wQ8b0vDoZxcIA5kE=
|
||||||
sigs.k8s.io/controller-runtime v0.5.0/go.mod h1:REiJzC7Y00U+2YkMbT8wxgrsX5USpXKGhb2sCtAXiT8=
|
sigs.k8s.io/controller-runtime v0.5.0/go.mod h1:REiJzC7Y00U+2YkMbT8wxgrsX5USpXKGhb2sCtAXiT8=
|
||||||
sigs.k8s.io/controller-runtime v0.5.4/go.mod h1:JZUwSMVbxDupo0lTJSSFP5pimEyxGynROImSsqIOx1A=
|
sigs.k8s.io/controller-runtime v0.5.4/go.mod h1:JZUwSMVbxDupo0lTJSSFP5pimEyxGynROImSsqIOx1A=
|
||||||
sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=
|
sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=
|
||||||
|
|
|
@ -1,5 +1,32 @@
|
||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
|
## v0.62.0
|
||||||
|
|
||||||
|
### Announcements
|
||||||
|
|
||||||
|
- There was a breaking change to `cloud.google.com/go/dataproc/apiv1` that was
|
||||||
|
merged in [this PR](https://github.com/googleapis/google-cloud-go/pull/2606).
|
||||||
|
This fixed a broken API response for `DiagnoseCluster`. When polling on the
|
||||||
|
Long Running Operation(LRO), the API now returns
|
||||||
|
`(*dataprocpb.DiagnoseClusterResults, error)` whereas it only returned an
|
||||||
|
`error` before.
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
- all:
|
||||||
|
- Updated all direct dependencies.
|
||||||
|
- Updated contributing guidelines to suggest allowing edits from maintainers.
|
||||||
|
- billing/budgets:
|
||||||
|
- Start generating client for apiv1beta1.
|
||||||
|
- functions:
|
||||||
|
- Start generating client for apiv1.
|
||||||
|
- notebooks:
|
||||||
|
- Start generating client apiv1beta1.
|
||||||
|
- profiler:
|
||||||
|
- update proftest to support parsing floating-point backoff durations.
|
||||||
|
- Fix the regexp used to parse backoff duration.
|
||||||
|
- Various updates to autogenerated clients.
|
||||||
|
|
||||||
## v0.61.0
|
## v0.61.0
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
|
|
|
@ -21,21 +21,25 @@
|
||||||
`cd google-cloud-go`
|
`cd google-cloud-go`
|
||||||
|
|
||||||
1. Fork the repo.
|
1. Fork the repo.
|
||||||
|
|
||||||
1. Set your fork as a remote:
|
1. Set your fork as a remote:
|
||||||
`git remote add fork git@github.com:GITHUB_USERNAME/google-cloud-go.git`
|
`git remote add fork git@github.com:GITHUB_USERNAME/google-cloud-go.git`
|
||||||
|
|
||||||
1. Make changes (see [Formatting](#formatting) and [Style](#style)), commit to
|
1. Make changes, commit to your fork.
|
||||||
your fork.
|
|
||||||
|
|
||||||
Commit messages should follow the
|
Commit messages should follow the
|
||||||
[Go project style](https://github.com/golang/go/wiki/CommitMessage). For example:
|
[Conventional Commits Style](https://www.conventionalcommits.org). The scope
|
||||||
|
portion should always be filled with the name of the package affected by the
|
||||||
|
changes being made. For example:
|
||||||
```
|
```
|
||||||
functions: add gophers codelab
|
feat(functions): add gophers codelab
|
||||||
```
|
```
|
||||||
|
|
||||||
1. Send a pull request with your changes.
|
1. Send a pull request with your changes.
|
||||||
|
|
||||||
|
To minimize friction, consider setting `Allow edits from maintainers` on the
|
||||||
|
PR, which will enable project committers and automation to update your PR.
|
||||||
|
|
||||||
1. A maintainer will review the pull request and make comments.
|
1. A maintainer will review the pull request and make comments.
|
||||||
|
|
||||||
Prefer adding additional commits over amending and force-pushing since it can
|
Prefer adding additional commits over amending and force-pushing since it can
|
||||||
|
|
|
@ -47,7 +47,7 @@ import (
|
||||||
type clientHookParams struct{}
|
type clientHookParams struct{}
|
||||||
type clientHook func(context.Context, clientHookParams) ([]option.ClientOption, error)
|
type clientHook func(context.Context, clientHookParams) ([]option.ClientOption, error)
|
||||||
|
|
||||||
const versionClient = "20200713"
|
const versionClient = "20200730"
|
||||||
|
|
||||||
func insertMetadata(ctx context.Context, mds ...metadata.MD) context.Context {
|
func insertMetadata(ctx context.Context, mds ...metadata.MD) context.Context {
|
||||||
out, _ := metadata.FromOutgoingContext(ctx)
|
out, _ := metadata.FromOutgoingContext(ctx)
|
||||||
|
|
|
@ -6,7 +6,7 @@ require (
|
||||||
cloud.google.com/go/storage v1.10.0
|
cloud.google.com/go/storage v1.10.0
|
||||||
github.com/golang/mock v1.4.3
|
github.com/golang/mock v1.4.3
|
||||||
github.com/golang/protobuf v1.4.2
|
github.com/golang/protobuf v1.4.2
|
||||||
github.com/google/go-cmp v0.5.0
|
github.com/google/go-cmp v0.5.1
|
||||||
github.com/google/martian/v3 v3.0.0
|
github.com/google/martian/v3 v3.0.0
|
||||||
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99
|
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5
|
github.com/googleapis/gax-go/v2 v2.0.5
|
||||||
|
@ -16,9 +16,9 @@ require (
|
||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381
|
golang.org/x/net v0.0.0-20200707034311-ab3426394381
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
|
||||||
golang.org/x/text v0.3.3
|
golang.org/x/text v0.3.3
|
||||||
golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed
|
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7
|
||||||
google.golang.org/api v0.29.0
|
google.golang.org/api v0.29.0
|
||||||
google.golang.org/genproto v0.0.0-20200711021454-869866162049
|
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f
|
||||||
google.golang.org/grpc v1.30.0
|
google.golang.org/grpc v1.30.0
|
||||||
google.golang.org/protobuf v1.25.0 // indirect
|
google.golang.org/protobuf v1.25.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
@ -111,6 +111,8 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||||
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
|
github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
|
||||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
|
||||||
|
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
|
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
github.com/google/martian/v3 v3.0.0 h1:pMen7vLs8nvgEYhywH3KDWJIJTeEr2ULsVWHWYHQyBs=
|
github.com/google/martian/v3 v3.0.0 h1:pMen7vLs8nvgEYhywH3KDWJIJTeEr2ULsVWHWYHQyBs=
|
||||||
|
@ -351,8 +353,8 @@ golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88 h1:4j84u0sokprDu3IdSYHJMmo
|
||||||
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed h1:+qzWo37K31KxduIYaBeMqJ8MUOyTayOQKpH9aDPLMSY=
|
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7 h1:LHW24ah7B+uV/OePwNP0p/t889F3QSyLvY8Sg/bK0SY=
|
||||||
golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||||
|
@ -423,8 +425,8 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG
|
||||||
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
|
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||||
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
||||||
google.golang.org/genproto v0.0.0-20200711021454-869866162049 h1:YFTFpQhgvrLrmxtiIncJxFXeCyq84ixuKWVCaCAi9Oc=
|
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f h1:ohwtWcCwB/fZUxh/vjazHorYmBnua3NmY3CAjwC7mEA=
|
||||||
google.golang.org/genproto v0.0.0-20200711021454-869866162049/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8=
|
google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU=
|
google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU=
|
||||||
|
|
|
@ -143,6 +143,14 @@
|
||||||
"docs_url": "https://pkg.go.dev/cloud.google.com/go/billing/apiv1",
|
"docs_url": "https://pkg.go.dev/cloud.google.com/go/billing/apiv1",
|
||||||
"release_level": "ga"
|
"release_level": "ga"
|
||||||
},
|
},
|
||||||
|
"cloud.google.com/go/billing/budgets/apiv1beta1": {
|
||||||
|
"distribution_name": "cloud.google.com/go/billing/budgets/apiv1beta1",
|
||||||
|
"description": "",
|
||||||
|
"language": "Go",
|
||||||
|
"client_library_type": "generated",
|
||||||
|
"docs_url": "https://pkg.go.dev/cloud.google.com/go/billing/budgets/apiv1beta1",
|
||||||
|
"release_level": "beta"
|
||||||
|
},
|
||||||
"cloud.google.com/go/cloudbuild/apiv1/v2": {
|
"cloud.google.com/go/cloudbuild/apiv1/v2": {
|
||||||
"distribution_name": "cloud.google.com/go/cloudbuild/apiv1/v2",
|
"distribution_name": "cloud.google.com/go/cloudbuild/apiv1/v2",
|
||||||
"description": "Cloud Build API",
|
"description": "Cloud Build API",
|
||||||
|
@ -303,6 +311,14 @@
|
||||||
"docs_url": "https://pkg.go.dev/cloud.google.com/go/firestore/apiv1/admin",
|
"docs_url": "https://pkg.go.dev/cloud.google.com/go/firestore/apiv1/admin",
|
||||||
"release_level": "ga"
|
"release_level": "ga"
|
||||||
},
|
},
|
||||||
|
"cloud.google.com/go/functions/apiv1": {
|
||||||
|
"distribution_name": "cloud.google.com/go/functions/apiv1",
|
||||||
|
"description": "",
|
||||||
|
"language": "Go",
|
||||||
|
"client_library_type": "generated",
|
||||||
|
"docs_url": "https://pkg.go.dev/cloud.google.com/go/functions/apiv1",
|
||||||
|
"release_level": "beta"
|
||||||
|
},
|
||||||
"cloud.google.com/go/gaming/apiv1beta": {
|
"cloud.google.com/go/gaming/apiv1beta": {
|
||||||
"distribution_name": "cloud.google.com/go/gaming/apiv1beta",
|
"distribution_name": "cloud.google.com/go/gaming/apiv1beta",
|
||||||
"description": "",
|
"description": "",
|
||||||
|
@ -407,6 +423,14 @@
|
||||||
"docs_url": "https://pkg.go.dev/cloud.google.com/go/monitoring/dashboard/apiv1",
|
"docs_url": "https://pkg.go.dev/cloud.google.com/go/monitoring/dashboard/apiv1",
|
||||||
"release_level": "beta"
|
"release_level": "beta"
|
||||||
},
|
},
|
||||||
|
"cloud.google.com/go/notebooks/apiv1beta1": {
|
||||||
|
"distribution_name": "cloud.google.com/go/notebooks/apiv1beta1",
|
||||||
|
"description": "Notebooks API",
|
||||||
|
"language": "Go",
|
||||||
|
"client_library_type": "generated",
|
||||||
|
"docs_url": "https://pkg.go.dev/cloud.google.com/go/notebooks/apiv1beta1",
|
||||||
|
"release_level": "beta"
|
||||||
|
},
|
||||||
"cloud.google.com/go/osconfig/agentendpoint/apiv1": {
|
"cloud.google.com/go/osconfig/agentendpoint/apiv1": {
|
||||||
"distribution_name": "cloud.google.com/go/osconfig/agentendpoint/apiv1",
|
"distribution_name": "cloud.google.com/go/osconfig/agentendpoint/apiv1",
|
||||||
"description": "Cloud OS Config API",
|
"description": "Cloud OS Config API",
|
||||||
|
@ -585,7 +609,7 @@
|
||||||
},
|
},
|
||||||
"cloud.google.com/go/securitycenter/apiv1beta1": {
|
"cloud.google.com/go/securitycenter/apiv1beta1": {
|
||||||
"distribution_name": "cloud.google.com/go/securitycenter/apiv1beta1",
|
"distribution_name": "cloud.google.com/go/securitycenter/apiv1beta1",
|
||||||
"description": "Cloud Security Command Center API",
|
"description": "Security Command Center API",
|
||||||
"language": "Go",
|
"language": "Go",
|
||||||
"client_library_type": "generated",
|
"client_library_type": "generated",
|
||||||
"docs_url": "https://pkg.go.dev/cloud.google.com/go/securitycenter/apiv1beta1",
|
"docs_url": "https://pkg.go.dev/cloud.google.com/go/securitycenter/apiv1beta1",
|
||||||
|
|
|
@ -26,7 +26,7 @@ import (
|
||||||
|
|
||||||
// Repo is the current version of the client libraries in this
|
// Repo is the current version of the client libraries in this
|
||||||
// repo. It should be a date in YYYYMMDD format.
|
// repo. It should be a date in YYYYMMDD format.
|
||||||
const Repo = "20200706"
|
const Repo = "20200727"
|
||||||
|
|
||||||
// Go returns the Go runtime version. The returned string
|
// Go returns the Go runtime version. The returned string
|
||||||
// has no whitespace.
|
// has no whitespace.
|
||||||
|
|
|
@ -50,7 +50,7 @@ import (
|
||||||
type clientHookParams struct{}
|
type clientHookParams struct{}
|
||||||
type clientHook func(context.Context, clientHookParams) ([]option.ClientOption, error)
|
type clientHook func(context.Context, clientHookParams) ([]option.ClientOption, error)
|
||||||
|
|
||||||
const versionClient = "20200713"
|
const versionClient = "20200730"
|
||||||
|
|
||||||
func insertMetadata(ctx context.Context, mds ...metadata.MD) context.Context {
|
func insertMetadata(ctx context.Context, mds ...metadata.MD) context.Context {
|
||||||
out, _ := metadata.FromOutgoingContext(ctx)
|
out, _ := metadata.FromOutgoingContext(ctx)
|
||||||
|
|
|
@ -1,65 +1,53 @@
|
||||||
# gRPC-Go
|
# gRPC-Go
|
||||||
|
|
||||||
[](https://travis-ci.org/grpc/grpc-go)
|
[](https://travis-ci.org/grpc/grpc-go)
|
||||||
[](https://godoc.org/google.golang.org/grpc)
|
[][API]
|
||||||
[](https://goreportcard.com/report/github.com/grpc/grpc-go)
|
[](https://goreportcard.com/report/github.com/grpc/grpc-go)
|
||||||
|
|
||||||
The Go implementation of [gRPC](https://grpc.io/): A high performance, open
|
The [Go][] implementation of [gRPC][]: A high performance, open source, general
|
||||||
source, general RPC framework that puts mobile and HTTP/2 first. For more
|
RPC framework that puts mobile and HTTP/2 first. For more information see the
|
||||||
information see the [gRPC Quick Start:
|
[Go gRPC docs][], or jump directly into the [quick start][].
|
||||||
Go](https://grpc.io/docs/languages/go/quickstart/) guide.
|
|
||||||
|
|
||||||
Installation
|
## Prerequisites
|
||||||
------------
|
|
||||||
|
|
||||||
To install this package, you need to install Go and setup your Go workspace on
|
- **[Go][]**: any one of the **three latest major** [releases][go-releases].
|
||||||
your computer. The simplest way to install the library is to run:
|
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
With [Go module][] support (Go 1.11+), simply add the following import
|
||||||
|
|
||||||
|
```go
|
||||||
|
import "google.golang.org/grpc"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
to your code, and then `go [build|run|test]` will automatically fetch the
|
||||||
|
necessary dependencies.
|
||||||
|
|
||||||
|
Otherwise, to install the `grpc-go` package, run the following command:
|
||||||
|
|
||||||
|
```console
|
||||||
$ go get -u google.golang.org/grpc
|
$ go get -u google.golang.org/grpc
|
||||||
```
|
```
|
||||||
|
|
||||||
With Go module support (Go 1.11+), simply `import "google.golang.org/grpc"` in
|
> **Note:** If you are trying to access `grpc-go` from **China**, see the
|
||||||
your source code and `go [build|run|test]` will automatically download the
|
> [FAQ](#FAQ) below.
|
||||||
necessary dependencies ([Go modules
|
|
||||||
ref](https://github.com/golang/go/wiki/Modules)).
|
|
||||||
|
|
||||||
If you are trying to access grpc-go from within China, please see the
|
## Learn more
|
||||||
[FAQ](#FAQ) below.
|
|
||||||
|
|
||||||
Prerequisites
|
- [Go gRPC docs][], which include a [quick start][] and [API
|
||||||
-------------
|
reference][API] among other resources
|
||||||
gRPC-Go officially supports the
|
- [Low-level technical docs](Documentation) from this repository
|
||||||
[three latest major releases of Go](https://golang.org/doc/devel/release.html).
|
- [Performance benchmark][]
|
||||||
|
- [Examples](examples)
|
||||||
|
|
||||||
Documentation
|
## FAQ
|
||||||
-------------
|
|
||||||
- See [godoc](https://godoc.org/google.golang.org/grpc) for package and API
|
|
||||||
descriptions.
|
|
||||||
- Documentation on specific topics can be found in the [Documentation
|
|
||||||
directory](Documentation/).
|
|
||||||
- Examples can be found in the [examples directory](examples/).
|
|
||||||
|
|
||||||
Performance
|
### I/O Timeout Errors
|
||||||
-----------
|
|
||||||
Performance benchmark data for grpc-go and other languages is maintained in
|
|
||||||
[this
|
|
||||||
dashboard](https://performance-dot-grpc-testing.appspot.com/explore?dashboard=5652536396611584&widget=490377658&container=1286539696).
|
|
||||||
|
|
||||||
Status
|
The `golang.org` domain may be blocked from some countries. `go get` usually
|
||||||
------
|
|
||||||
General Availability [Google Cloud Platform Launch
|
|
||||||
Stages](https://cloud.google.com/terms/launch-stages).
|
|
||||||
|
|
||||||
FAQ
|
|
||||||
---
|
|
||||||
|
|
||||||
#### I/O Timeout Errors
|
|
||||||
|
|
||||||
The `golang.org` domain may be blocked from some countries. `go get` usually
|
|
||||||
produces an error like the following when this happens:
|
produces an error like the following when this happens:
|
||||||
|
|
||||||
```
|
```console
|
||||||
$ go get -u google.golang.org/grpc
|
$ go get -u google.golang.org/grpc
|
||||||
package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc" (https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
|
package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc" (https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
|
||||||
```
|
```
|
||||||
|
@ -70,7 +58,7 @@ To build Go code, there are several options:
|
||||||
|
|
||||||
- Without Go module support: `git clone` the repo manually:
|
- Without Go module support: `git clone` the repo manually:
|
||||||
|
|
||||||
```
|
```sh
|
||||||
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
|
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -80,7 +68,7 @@ To build Go code, there are several options:
|
||||||
- With Go module support: it is possible to use the `replace` feature of `go
|
- With Go module support: it is possible to use the `replace` feature of `go
|
||||||
mod` to create aliases for golang.org packages. In your project's directory:
|
mod` to create aliases for golang.org packages. In your project's directory:
|
||||||
|
|
||||||
```
|
```sh
|
||||||
go mod edit -replace=google.golang.org/grpc=github.com/grpc/grpc-go@latest
|
go mod edit -replace=google.golang.org/grpc=github.com/grpc/grpc-go@latest
|
||||||
go mod tidy
|
go mod tidy
|
||||||
go mod vendor
|
go mod vendor
|
||||||
|
@ -88,19 +76,17 @@ To build Go code, there are several options:
|
||||||
```
|
```
|
||||||
|
|
||||||
Again, this will need to be done for all transitive dependencies hosted on
|
Again, this will need to be done for all transitive dependencies hosted on
|
||||||
golang.org as well. Please refer to [this
|
golang.org as well. For details, refer to [golang/go issue #28652](https://github.com/golang/go/issues/28652).
|
||||||
issue](https://github.com/golang/go/issues/28652) in the golang repo regarding
|
|
||||||
this concern.
|
|
||||||
|
|
||||||
#### Compiling error, undefined: grpc.SupportPackageIsVersion
|
### Compiling error, undefined: grpc.SupportPackageIsVersion
|
||||||
|
|
||||||
##### If you are using Go modules:
|
#### If you are using Go modules:
|
||||||
|
|
||||||
Please ensure your gRPC-Go version is `require`d at the appropriate version in
|
Ensure your gRPC-Go version is `require`d at the appropriate version in
|
||||||
the same module containing the generated `.pb.go` files. For example,
|
the same module containing the generated `.pb.go` files. For example,
|
||||||
`SupportPackageIsVersion6` needs `v1.27.0`, so in your `go.mod` file:
|
`SupportPackageIsVersion6` needs `v1.27.0`, so in your `go.mod` file:
|
||||||
|
|
||||||
```
|
```go
|
||||||
module <your module name>
|
module <your module name>
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
@ -108,23 +94,27 @@ require (
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
##### If you are *not* using Go modules:
|
#### If you are *not* using Go modules:
|
||||||
|
|
||||||
Please update proto package, gRPC package and rebuild the proto files:
|
Update the `proto` package, gRPC package, and rebuild the `.proto` files:
|
||||||
- `go get -u github.com/golang/protobuf/{proto,protoc-gen-go}`
|
|
||||||
- `go get -u google.golang.org/grpc`
|
|
||||||
- `protoc --go_out=plugins=grpc:. *.proto`
|
|
||||||
|
|
||||||
#### How to turn on logging
|
```sh
|
||||||
|
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
|
||||||
The default logger is controlled by the environment variables. Turn everything
|
go get -u google.golang.org/grpc
|
||||||
on by setting:
|
protoc --go_out=plugins=grpc:. *.proto
|
||||||
|
|
||||||
```
|
|
||||||
GRPC_GO_LOG_VERBOSITY_LEVEL=99 GRPC_GO_LOG_SEVERITY_LEVEL=info
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### The RPC failed with error `"code = Unavailable desc = transport is closing"`
|
### How to turn on logging
|
||||||
|
|
||||||
|
The default logger is controlled by environment variables. Turn everything on
|
||||||
|
like this:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ export GRPC_GO_LOG_VERBOSITY_LEVEL=99
|
||||||
|
$ export GRPC_GO_LOG_SEVERITY_LEVEL=info
|
||||||
|
```
|
||||||
|
|
||||||
|
### The RPC failed with error `"code = Unavailable desc = transport is closing"`
|
||||||
|
|
||||||
This error means the connection the RPC is using was closed, and there are many
|
This error means the connection the RPC is using was closed, and there are many
|
||||||
possible reasons, including:
|
possible reasons, including:
|
||||||
|
@ -140,3 +130,12 @@ It can be tricky to debug this because the error happens on the client side but
|
||||||
the root cause of the connection being closed is on the server side. Turn on
|
the root cause of the connection being closed is on the server side. Turn on
|
||||||
logging on __both client and server__, and see if there are any transport
|
logging on __both client and server__, and see if there are any transport
|
||||||
errors.
|
errors.
|
||||||
|
|
||||||
|
[API]: https://grpc.io/docs/languages/go/api
|
||||||
|
[Go]: https://golang.org
|
||||||
|
[Go module]: https://github.com/golang/go/wiki/Modules
|
||||||
|
[gRPC]: https://grpc.io
|
||||||
|
[Go gRPC docs]: https://grpc.io/docs/languages/go
|
||||||
|
[Performance benchmark]: https://performance-dot-grpc-testing.appspot.com/explore?dashboard=5652536396611584&widget=490377658&container=1286539696
|
||||||
|
[quick start]: https://grpc.io/docs/languages/go/quickstart
|
||||||
|
[go-releases]: https://golang.org/doc/devel/release.html
|
||||||
|
|
|
@ -312,16 +312,6 @@ type Balancer interface {
|
||||||
Close()
|
Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
// V2Balancer is temporarily defined for backward compatibility reasons.
|
|
||||||
//
|
|
||||||
// Deprecated: use Balancer directly instead.
|
|
||||||
type V2Balancer = Balancer
|
|
||||||
|
|
||||||
// V2Picker is temporarily defined for backward compatibility reasons.
|
|
||||||
//
|
|
||||||
// Deprecated: use Picker directly instead.
|
|
||||||
type V2Picker = Picker
|
|
||||||
|
|
||||||
// SubConnState describes the state of a SubConn.
|
// SubConnState describes the state of a SubConn.
|
||||||
type SubConnState struct {
|
type SubConnState struct {
|
||||||
// ConnectivityState is the connectivity state of the SubConn.
|
// ConnectivityState is the connectivity state of the SubConn.
|
||||||
|
|
|
@ -28,6 +28,8 @@ import (
|
||||||
"google.golang.org/grpc/resolver"
|
"google.golang.org/grpc/resolver"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var logger = grpclog.Component("balancer")
|
||||||
|
|
||||||
type baseBuilder struct {
|
type baseBuilder struct {
|
||||||
name string
|
name string
|
||||||
pickerBuilder PickerBuilder
|
pickerBuilder PickerBuilder
|
||||||
|
@ -91,8 +93,8 @@ func (b *baseBalancer) ResolverError(err error) {
|
||||||
|
|
||||||
func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error {
|
func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error {
|
||||||
// TODO: handle s.ResolverState.ServiceConfig?
|
// TODO: handle s.ResolverState.ServiceConfig?
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Infoln("base.baseBalancer: got new ClientConn state: ", s)
|
logger.Info("base.baseBalancer: got new ClientConn state: ", s)
|
||||||
}
|
}
|
||||||
// Successful resolution; clear resolver error and ensure we return nil.
|
// Successful resolution; clear resolver error and ensure we return nil.
|
||||||
b.resolverErr = nil
|
b.resolverErr = nil
|
||||||
|
@ -104,7 +106,7 @@ func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error {
|
||||||
// a is a new address (not existing in b.subConns).
|
// a is a new address (not existing in b.subConns).
|
||||||
sc, err := b.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{HealthCheckEnabled: b.config.HealthCheck})
|
sc, err := b.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{HealthCheckEnabled: b.config.HealthCheck})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Warningf("base.baseBalancer: failed to create new SubConn: %v", err)
|
logger.Warningf("base.baseBalancer: failed to create new SubConn: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
b.subConns[a] = sc
|
b.subConns[a] = sc
|
||||||
|
@ -168,13 +170,13 @@ func (b *baseBalancer) regeneratePicker() {
|
||||||
|
|
||||||
func (b *baseBalancer) UpdateSubConnState(sc balancer.SubConn, state balancer.SubConnState) {
|
func (b *baseBalancer) UpdateSubConnState(sc balancer.SubConn, state balancer.SubConnState) {
|
||||||
s := state.ConnectivityState
|
s := state.ConnectivityState
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Infof("base.baseBalancer: handle SubConn state change: %p, %v", sc, s)
|
logger.Infof("base.baseBalancer: handle SubConn state change: %p, %v", sc, s)
|
||||||
}
|
}
|
||||||
oldS, ok := b.scStates[sc]
|
oldS, ok := b.scStates[sc]
|
||||||
if !ok {
|
if !ok {
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Infof("base.baseBalancer: got state changes for an unknown SubConn: %p, %v", sc, s)
|
logger.Infof("base.baseBalancer: got state changes for an unknown SubConn: %p, %v", sc, s)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,14 +69,3 @@ func NewBalancerBuilder(name string, pb PickerBuilder, config Config) balancer.B
|
||||||
config: config,
|
config: config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewBalancerBuilderV2 is temporarily defined for backward compatibility
|
|
||||||
// reasons.
|
|
||||||
//
|
|
||||||
// Deprecated: use NewBalancerBuilder instead.
|
|
||||||
var NewBalancerBuilderV2 = NewBalancerBuilder
|
|
||||||
|
|
||||||
// V2PickerBuilder is temporarily defined for backward compatibility reasons.
|
|
||||||
//
|
|
||||||
// Deprecated: use PickerBuilder instead.
|
|
||||||
type V2PickerBuilder = PickerBuilder
|
|
||||||
|
|
|
@ -50,6 +50,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var errServerTerminatedConnection = errors.New("grpclb: failed to recv server list: server terminated connection")
|
var errServerTerminatedConnection = errors.New("grpclb: failed to recv server list: server terminated connection")
|
||||||
|
var logger = grpclog.Component("grpclb")
|
||||||
|
|
||||||
func convertDuration(d *durationpb.Duration) time.Duration {
|
func convertDuration(d *durationpb.Duration) time.Duration {
|
||||||
if d == nil {
|
if d == nil {
|
||||||
|
@ -150,11 +151,11 @@ func (b *lbBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) bal
|
||||||
if opt.CredsBundle != nil {
|
if opt.CredsBundle != nil {
|
||||||
lb.grpclbClientConnCreds, err = opt.CredsBundle.NewWithMode(internal.CredsBundleModeBalancer)
|
lb.grpclbClientConnCreds, err = opt.CredsBundle.NewWithMode(internal.CredsBundleModeBalancer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Warningf("lbBalancer: client connection creds NewWithMode failed: %v", err)
|
logger.Warningf("lbBalancer: client connection creds NewWithMode failed: %v", err)
|
||||||
}
|
}
|
||||||
lb.grpclbBackendCreds, err = opt.CredsBundle.NewWithMode(internal.CredsBundleModeBackendFromBalancer)
|
lb.grpclbBackendCreds, err = opt.CredsBundle.NewWithMode(internal.CredsBundleModeBackendFromBalancer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Warningf("lbBalancer: backend creds NewWithMode failed: %v", err)
|
logger.Warningf("lbBalancer: backend creds NewWithMode failed: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -310,16 +311,16 @@ func (lb *lbBalancer) aggregateSubConnStates() connectivity.State {
|
||||||
|
|
||||||
func (lb *lbBalancer) UpdateSubConnState(sc balancer.SubConn, scs balancer.SubConnState) {
|
func (lb *lbBalancer) UpdateSubConnState(sc balancer.SubConn, scs balancer.SubConnState) {
|
||||||
s := scs.ConnectivityState
|
s := scs.ConnectivityState
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Infof("lbBalancer: handle SubConn state change: %p, %v", sc, s)
|
logger.Infof("lbBalancer: handle SubConn state change: %p, %v", sc, s)
|
||||||
}
|
}
|
||||||
lb.mu.Lock()
|
lb.mu.Lock()
|
||||||
defer lb.mu.Unlock()
|
defer lb.mu.Unlock()
|
||||||
|
|
||||||
oldS, ok := lb.scStates[sc]
|
oldS, ok := lb.scStates[sc]
|
||||||
if !ok {
|
if !ok {
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Infof("lbBalancer: got state changes for an unknown SubConn: %p, %v", sc, s)
|
logger.Infof("lbBalancer: got state changes for an unknown SubConn: %p, %v", sc, s)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -393,8 +394,8 @@ func (lb *lbBalancer) handleServiceConfig(gc *grpclbServiceConfig) {
|
||||||
if lb.usePickFirst == newUsePickFirst {
|
if lb.usePickFirst == newUsePickFirst {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Infof("lbBalancer: switching mode, new usePickFirst: %+v", newUsePickFirst)
|
logger.Infof("lbBalancer: switching mode, new usePickFirst: %+v", newUsePickFirst)
|
||||||
}
|
}
|
||||||
lb.refreshSubConns(lb.backendAddrs, lb.inFallback, newUsePickFirst)
|
lb.refreshSubConns(lb.backendAddrs, lb.inFallback, newUsePickFirst)
|
||||||
}
|
}
|
||||||
|
@ -405,8 +406,8 @@ func (lb *lbBalancer) ResolverError(error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lb *lbBalancer) UpdateClientConnState(ccs balancer.ClientConnState) error {
|
func (lb *lbBalancer) UpdateClientConnState(ccs balancer.ClientConnState) error {
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Infof("lbBalancer: UpdateClientConnState: %+v", ccs)
|
logger.Infof("lbBalancer: UpdateClientConnState: %+v", ccs)
|
||||||
}
|
}
|
||||||
gc, _ := ccs.BalancerConfig.(*grpclbServiceConfig)
|
gc, _ := ccs.BalancerConfig.(*grpclbServiceConfig)
|
||||||
lb.handleServiceConfig(gc)
|
lb.handleServiceConfig(gc)
|
||||||
|
|
|
@ -33,7 +33,6 @@ import (
|
||||||
"google.golang.org/grpc/balancer"
|
"google.golang.org/grpc/balancer"
|
||||||
lbpb "google.golang.org/grpc/balancer/grpclb/grpc_lb_v1"
|
lbpb "google.golang.org/grpc/balancer/grpclb/grpc_lb_v1"
|
||||||
"google.golang.org/grpc/connectivity"
|
"google.golang.org/grpc/connectivity"
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
"google.golang.org/grpc/internal/backoff"
|
"google.golang.org/grpc/internal/backoff"
|
||||||
"google.golang.org/grpc/internal/channelz"
|
"google.golang.org/grpc/internal/channelz"
|
||||||
"google.golang.org/grpc/keepalive"
|
"google.golang.org/grpc/keepalive"
|
||||||
|
@ -44,8 +43,8 @@ import (
|
||||||
// processServerList updates balancer's internal state, create/remove SubConns
|
// processServerList updates balancer's internal state, create/remove SubConns
|
||||||
// and regenerates picker using the received serverList.
|
// and regenerates picker using the received serverList.
|
||||||
func (lb *lbBalancer) processServerList(l *lbpb.ServerList) {
|
func (lb *lbBalancer) processServerList(l *lbpb.ServerList) {
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Infof("lbBalancer: processing server list: %+v", l)
|
logger.Infof("lbBalancer: processing server list: %+v", l)
|
||||||
}
|
}
|
||||||
lb.mu.Lock()
|
lb.mu.Lock()
|
||||||
defer lb.mu.Unlock()
|
defer lb.mu.Unlock()
|
||||||
|
@ -56,8 +55,8 @@ func (lb *lbBalancer) processServerList(l *lbpb.ServerList) {
|
||||||
|
|
||||||
// If the new server list == old server list, do nothing.
|
// If the new server list == old server list, do nothing.
|
||||||
if cmp.Equal(lb.fullServerList, l.Servers, cmp.Comparer(proto.Equal)) {
|
if cmp.Equal(lb.fullServerList, l.Servers, cmp.Comparer(proto.Equal)) {
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Infof("lbBalancer: new serverlist same as the previous one, ignoring")
|
logger.Infof("lbBalancer: new serverlist same as the previous one, ignoring")
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -81,8 +80,8 @@ func (lb *lbBalancer) processServerList(l *lbpb.ServerList) {
|
||||||
Addr: fmt.Sprintf("%s:%d", ipStr, s.Port),
|
Addr: fmt.Sprintf("%s:%d", ipStr, s.Port),
|
||||||
Metadata: &md,
|
Metadata: &md,
|
||||||
}
|
}
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Infof("lbBalancer: server list entry[%d]: ipStr:|%s|, port:|%d|, load balancer token:|%v|",
|
logger.Infof("lbBalancer: server list entry[%d]: ipStr:|%s|, port:|%d|, load balancer token:|%v|",
|
||||||
i, ipStr, s.Port, s.LoadBalanceToken)
|
i, ipStr, s.Port, s.LoadBalanceToken)
|
||||||
}
|
}
|
||||||
backendAddrs = append(backendAddrs, addr)
|
backendAddrs = append(backendAddrs, addr)
|
||||||
|
@ -150,7 +149,7 @@ func (lb *lbBalancer) refreshSubConns(backendAddrs []resolver.Address, fallback
|
||||||
// This bypasses the cc wrapper with SubConn cache.
|
// This bypasses the cc wrapper with SubConn cache.
|
||||||
sc, err := lb.cc.cc.NewSubConn(backendAddrs, opts)
|
sc, err := lb.cc.cc.NewSubConn(backendAddrs, opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Warningf("grpclb: failed to create new SubConn: %v", err)
|
logger.Warningf("grpclb: failed to create new SubConn: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
sc.Connect()
|
sc.Connect()
|
||||||
|
@ -173,7 +172,7 @@ func (lb *lbBalancer) refreshSubConns(backendAddrs []resolver.Address, fallback
|
||||||
// Use addrWithMD to create the SubConn.
|
// Use addrWithMD to create the SubConn.
|
||||||
sc, err := lb.cc.NewSubConn([]resolver.Address{addr}, opts)
|
sc, err := lb.cc.NewSubConn([]resolver.Address{addr}, opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Warningf("grpclb: failed to create new SubConn: %v", err)
|
logger.Warningf("grpclb: failed to create new SubConn: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
lb.subConns[addrWithoutMD] = sc // Use the addr without MD as key for the map.
|
lb.subConns[addrWithoutMD] = sc // Use the addr without MD as key for the map.
|
||||||
|
@ -245,7 +244,7 @@ func (lb *lbBalancer) newRemoteBalancerCCWrapper() {
|
||||||
// receive ServerName as authority.
|
// receive ServerName as authority.
|
||||||
cc, err := grpc.DialContext(context.Background(), lb.manualResolver.Scheme()+":///grpclb.subClientConn", dopts...)
|
cc, err := grpc.DialContext(context.Background(), lb.manualResolver.Scheme()+":///grpclb.subClientConn", dopts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Fatalf("failed to dial: %v", err)
|
logger.Fatalf("failed to dial: %v", err)
|
||||||
}
|
}
|
||||||
ccw := &remoteBalancerCCWrapper{
|
ccw := &remoteBalancerCCWrapper{
|
||||||
cc: cc,
|
cc: cc,
|
||||||
|
@ -373,9 +372,9 @@ func (ccw *remoteBalancerCCWrapper) watchRemoteBalancer() {
|
||||||
default:
|
default:
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == errServerTerminatedConnection {
|
if err == errServerTerminatedConnection {
|
||||||
grpclog.Info(err)
|
logger.Info(err)
|
||||||
} else {
|
} else {
|
||||||
grpclog.Warning(err)
|
logger.Warning(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,8 @@ import (
|
||||||
// Name is the name of round_robin balancer.
|
// Name is the name of round_robin balancer.
|
||||||
const Name = "round_robin"
|
const Name = "round_robin"
|
||||||
|
|
||||||
|
var logger = grpclog.Component("roundrobin")
|
||||||
|
|
||||||
// newBuilder creates a new roundrobin balancer builder.
|
// newBuilder creates a new roundrobin balancer builder.
|
||||||
func newBuilder() balancer.Builder {
|
func newBuilder() balancer.Builder {
|
||||||
return base.NewBalancerBuilder(Name, &rrPickerBuilder{}, base.Config{HealthCheck: true})
|
return base.NewBalancerBuilder(Name, &rrPickerBuilder{}, base.Config{HealthCheck: true})
|
||||||
|
@ -45,7 +47,7 @@ func init() {
|
||||||
type rrPickerBuilder struct{}
|
type rrPickerBuilder struct{}
|
||||||
|
|
||||||
func (*rrPickerBuilder) Build(info base.PickerBuildInfo) balancer.Picker {
|
func (*rrPickerBuilder) Build(info base.PickerBuildInfo) balancer.Picker {
|
||||||
grpclog.Infof("roundrobinPicker: newPicker called with info: %v", info)
|
logger.Infof("roundrobinPicker: newPicker called with info: %v", info)
|
||||||
if len(info.ReadySCs) == 0 {
|
if len(info.ReadySCs) == 0 {
|
||||||
return base.NewErrPicker(balancer.ErrNoSubConnAvailable)
|
return base.NewErrPicker(balancer.ErrNoSubConnAvailable)
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,7 +220,7 @@ func (acbw *acBalancerWrapper) UpdateAddresses(addrs []resolver.Address) {
|
||||||
|
|
||||||
ac, err := cc.newAddrConn(addrs, opts)
|
ac, err := cc.newAddrConn(addrs, opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
channelz.Warningf(acbw.ac.channelzID, "acBalancerWrapper: UpdateAddresses: failed to newAddrConn: %v", err)
|
channelz.Warningf(logger, acbw.ac.channelzID, "acBalancerWrapper: UpdateAddresses: failed to newAddrConn: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
acbw.ac = ac
|
acbw.ac = ac
|
||||||
|
|
|
@ -149,7 +149,7 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
|
||||||
if channelz.IsOn() {
|
if channelz.IsOn() {
|
||||||
if cc.dopts.channelzParentID != 0 {
|
if cc.dopts.channelzParentID != 0 {
|
||||||
cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, cc.dopts.channelzParentID, target)
|
cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, cc.dopts.channelzParentID, target)
|
||||||
channelz.AddTraceEvent(cc.channelzID, 0, &channelz.TraceEventDesc{
|
channelz.AddTraceEvent(logger, cc.channelzID, 0, &channelz.TraceEventDesc{
|
||||||
Desc: "Channel Created",
|
Desc: "Channel Created",
|
||||||
Severity: channelz.CtINFO,
|
Severity: channelz.CtINFO,
|
||||||
Parent: &channelz.TraceEventDesc{
|
Parent: &channelz.TraceEventDesc{
|
||||||
|
@ -159,7 +159,7 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, 0, target)
|
cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, 0, target)
|
||||||
channelz.Info(cc.channelzID, "Channel Created")
|
channelz.Info(logger, cc.channelzID, "Channel Created")
|
||||||
}
|
}
|
||||||
cc.csMgr.channelzID = cc.channelzID
|
cc.csMgr.channelzID = cc.channelzID
|
||||||
}
|
}
|
||||||
|
@ -245,13 +245,14 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
|
||||||
|
|
||||||
// Determine the resolver to use.
|
// Determine the resolver to use.
|
||||||
cc.parsedTarget = grpcutil.ParseTarget(cc.target)
|
cc.parsedTarget = grpcutil.ParseTarget(cc.target)
|
||||||
channelz.Infof(cc.channelzID, "parsed scheme: %q", cc.parsedTarget.Scheme)
|
unixScheme := strings.HasPrefix(cc.target, "unix:")
|
||||||
|
channelz.Infof(logger, cc.channelzID, "parsed scheme: %q", cc.parsedTarget.Scheme)
|
||||||
resolverBuilder := cc.getResolver(cc.parsedTarget.Scheme)
|
resolverBuilder := cc.getResolver(cc.parsedTarget.Scheme)
|
||||||
if resolverBuilder == nil {
|
if resolverBuilder == nil {
|
||||||
// If resolver builder is still nil, the parsed target's scheme is
|
// If resolver builder is still nil, the parsed target's scheme is
|
||||||
// not registered. Fallback to default resolver and set Endpoint to
|
// not registered. Fallback to default resolver and set Endpoint to
|
||||||
// the original target.
|
// the original target.
|
||||||
channelz.Infof(cc.channelzID, "scheme %q not registered, fallback to default scheme", cc.parsedTarget.Scheme)
|
channelz.Infof(logger, cc.channelzID, "scheme %q not registered, fallback to default scheme", cc.parsedTarget.Scheme)
|
||||||
cc.parsedTarget = resolver.Target{
|
cc.parsedTarget = resolver.Target{
|
||||||
Scheme: resolver.GetDefaultScheme(),
|
Scheme: resolver.GetDefaultScheme(),
|
||||||
Endpoint: target,
|
Endpoint: target,
|
||||||
|
@ -267,6 +268,8 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
|
||||||
cc.authority = creds.Info().ServerName
|
cc.authority = creds.Info().ServerName
|
||||||
} else if cc.dopts.insecure && cc.dopts.authority != "" {
|
} else if cc.dopts.insecure && cc.dopts.authority != "" {
|
||||||
cc.authority = cc.dopts.authority
|
cc.authority = cc.dopts.authority
|
||||||
|
} else if unixScheme {
|
||||||
|
cc.authority = "localhost"
|
||||||
} else {
|
} else {
|
||||||
// Use endpoint from "scheme://authority/endpoint" as the default
|
// Use endpoint from "scheme://authority/endpoint" as the default
|
||||||
// authority for ClientConn.
|
// authority for ClientConn.
|
||||||
|
@ -422,7 +425,7 @@ func (csm *connectivityStateManager) updateState(state connectivity.State) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
csm.state = state
|
csm.state = state
|
||||||
channelz.Infof(csm.channelzID, "Channel Connectivity change to %v", state)
|
channelz.Infof(logger, csm.channelzID, "Channel Connectivity change to %v", state)
|
||||||
if csm.notifyChan != nil {
|
if csm.notifyChan != nil {
|
||||||
// There are other goroutines waiting on this channel.
|
// There are other goroutines waiting on this channel.
|
||||||
close(csm.notifyChan)
|
close(csm.notifyChan)
|
||||||
|
@ -675,9 +678,9 @@ func (cc *ClientConn) switchBalancer(name string) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
channelz.Infof(cc.channelzID, "ClientConn switching balancer to %q", name)
|
channelz.Infof(logger, cc.channelzID, "ClientConn switching balancer to %q", name)
|
||||||
if cc.dopts.balancerBuilder != nil {
|
if cc.dopts.balancerBuilder != nil {
|
||||||
channelz.Info(cc.channelzID, "ignoring balancer switching: Balancer DialOption used instead")
|
channelz.Info(logger, cc.channelzID, "ignoring balancer switching: Balancer DialOption used instead")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if cc.balancerWrapper != nil {
|
if cc.balancerWrapper != nil {
|
||||||
|
@ -686,11 +689,11 @@ func (cc *ClientConn) switchBalancer(name string) {
|
||||||
|
|
||||||
builder := balancer.Get(name)
|
builder := balancer.Get(name)
|
||||||
if builder == nil {
|
if builder == nil {
|
||||||
channelz.Warningf(cc.channelzID, "Channel switches to new LB policy %q due to fallback from invalid balancer name", PickFirstBalancerName)
|
channelz.Warningf(logger, cc.channelzID, "Channel switches to new LB policy %q due to fallback from invalid balancer name", PickFirstBalancerName)
|
||||||
channelz.Infof(cc.channelzID, "failed to get balancer builder for: %v, using pick_first instead", name)
|
channelz.Infof(logger, cc.channelzID, "failed to get balancer builder for: %v, using pick_first instead", name)
|
||||||
builder = newPickfirstBuilder()
|
builder = newPickfirstBuilder()
|
||||||
} else {
|
} else {
|
||||||
channelz.Infof(cc.channelzID, "Channel switches to new LB policy %q", name)
|
channelz.Infof(logger, cc.channelzID, "Channel switches to new LB policy %q", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
cc.curBalancerName = builder.Name()
|
cc.curBalancerName = builder.Name()
|
||||||
|
@ -731,7 +734,7 @@ func (cc *ClientConn) newAddrConn(addrs []resolver.Address, opts balancer.NewSub
|
||||||
}
|
}
|
||||||
if channelz.IsOn() {
|
if channelz.IsOn() {
|
||||||
ac.channelzID = channelz.RegisterSubChannel(ac, cc.channelzID, "")
|
ac.channelzID = channelz.RegisterSubChannel(ac, cc.channelzID, "")
|
||||||
channelz.AddTraceEvent(ac.channelzID, 0, &channelz.TraceEventDesc{
|
channelz.AddTraceEvent(logger, ac.channelzID, 0, &channelz.TraceEventDesc{
|
||||||
Desc: "Subchannel Created",
|
Desc: "Subchannel Created",
|
||||||
Severity: channelz.CtINFO,
|
Severity: channelz.CtINFO,
|
||||||
Parent: &channelz.TraceEventDesc{
|
Parent: &channelz.TraceEventDesc{
|
||||||
|
@ -829,7 +832,7 @@ func (ac *addrConn) connect() error {
|
||||||
func (ac *addrConn) tryUpdateAddrs(addrs []resolver.Address) bool {
|
func (ac *addrConn) tryUpdateAddrs(addrs []resolver.Address) bool {
|
||||||
ac.mu.Lock()
|
ac.mu.Lock()
|
||||||
defer ac.mu.Unlock()
|
defer ac.mu.Unlock()
|
||||||
channelz.Infof(ac.channelzID, "addrConn: tryUpdateAddrs curAddr: %v, addrs: %v", ac.curAddr, addrs)
|
channelz.Infof(logger, ac.channelzID, "addrConn: tryUpdateAddrs curAddr: %v, addrs: %v", ac.curAddr, addrs)
|
||||||
if ac.state == connectivity.Shutdown ||
|
if ac.state == connectivity.Shutdown ||
|
||||||
ac.state == connectivity.TransientFailure ||
|
ac.state == connectivity.TransientFailure ||
|
||||||
ac.state == connectivity.Idle {
|
ac.state == connectivity.Idle {
|
||||||
|
@ -849,7 +852,7 @@ func (ac *addrConn) tryUpdateAddrs(addrs []resolver.Address) bool {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
channelz.Infof(ac.channelzID, "addrConn: tryUpdateAddrs curAddrFound: %v", curAddrFound)
|
channelz.Infof(logger, ac.channelzID, "addrConn: tryUpdateAddrs curAddrFound: %v", curAddrFound)
|
||||||
if curAddrFound {
|
if curAddrFound {
|
||||||
ac.addrs = addrs
|
ac.addrs = addrs
|
||||||
}
|
}
|
||||||
|
@ -860,9 +863,10 @@ func (ac *addrConn) tryUpdateAddrs(addrs []resolver.Address) bool {
|
||||||
// GetMethodConfig gets the method config of the input method.
|
// GetMethodConfig gets the method config of the input method.
|
||||||
// If there's an exact match for input method (i.e. /service/method), we return
|
// If there's an exact match for input method (i.e. /service/method), we return
|
||||||
// the corresponding MethodConfig.
|
// the corresponding MethodConfig.
|
||||||
// If there isn't an exact match for the input method, we look for the default config
|
// If there isn't an exact match for the input method, we look for the service's default
|
||||||
// under the service (i.e /service/). If there is a default MethodConfig for
|
// config under the service (i.e /service/) and then for the default for all services (empty string).
|
||||||
// the service, we return it.
|
//
|
||||||
|
// If there is a default MethodConfig for the service, we return it.
|
||||||
// Otherwise, we return an empty MethodConfig.
|
// Otherwise, we return an empty MethodConfig.
|
||||||
func (cc *ClientConn) GetMethodConfig(method string) MethodConfig {
|
func (cc *ClientConn) GetMethodConfig(method string) MethodConfig {
|
||||||
// TODO: Avoid the locking here.
|
// TODO: Avoid the locking here.
|
||||||
|
@ -871,12 +875,14 @@ func (cc *ClientConn) GetMethodConfig(method string) MethodConfig {
|
||||||
if cc.sc == nil {
|
if cc.sc == nil {
|
||||||
return MethodConfig{}
|
return MethodConfig{}
|
||||||
}
|
}
|
||||||
m, ok := cc.sc.Methods[method]
|
if m, ok := cc.sc.Methods[method]; ok {
|
||||||
if !ok {
|
return m
|
||||||
i := strings.LastIndex(method, "/")
|
|
||||||
m = cc.sc.Methods[method[:i+1]]
|
|
||||||
}
|
}
|
||||||
return m
|
i := strings.LastIndex(method, "/")
|
||||||
|
if m, ok := cc.sc.Methods[method[:i+1]]; ok {
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
return cc.sc.Methods[""]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cc *ClientConn) healthCheckConfig() *healthCheckConfig {
|
func (cc *ClientConn) healthCheckConfig() *healthCheckConfig {
|
||||||
|
@ -1020,7 +1026,7 @@ func (cc *ClientConn) Close() error {
|
||||||
Severity: channelz.CtINFO,
|
Severity: channelz.CtINFO,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
channelz.AddTraceEvent(cc.channelzID, 0, ted)
|
channelz.AddTraceEvent(logger, cc.channelzID, 0, ted)
|
||||||
// TraceEvent needs to be called before RemoveEntry, as TraceEvent may add trace reference to
|
// TraceEvent needs to be called before RemoveEntry, as TraceEvent may add trace reference to
|
||||||
// the entity being deleted, and thus prevent it from being deleted right away.
|
// the entity being deleted, and thus prevent it from being deleted right away.
|
||||||
channelz.RemoveEntry(cc.channelzID)
|
channelz.RemoveEntry(cc.channelzID)
|
||||||
|
@ -1064,7 +1070,7 @@ func (ac *addrConn) updateConnectivityState(s connectivity.State, lastErr error)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ac.state = s
|
ac.state = s
|
||||||
channelz.Infof(ac.channelzID, "Subchannel Connectivity change to %v", s)
|
channelz.Infof(logger, ac.channelzID, "Subchannel Connectivity change to %v", s)
|
||||||
ac.cc.handleSubConnStateChange(ac.acbw, s, lastErr)
|
ac.cc.handleSubConnStateChange(ac.acbw, s, lastErr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1201,7 +1207,7 @@ func (ac *addrConn) tryAllAddrs(addrs []resolver.Address, connectDeadline time.T
|
||||||
}
|
}
|
||||||
ac.mu.Unlock()
|
ac.mu.Unlock()
|
||||||
|
|
||||||
channelz.Infof(ac.channelzID, "Subchannel picks a new address %q to connect", addr.Addr)
|
channelz.Infof(logger, ac.channelzID, "Subchannel picks a new address %q to connect", addr.Addr)
|
||||||
|
|
||||||
newTr, reconnect, err := ac.createTransport(addr, copts, connectDeadline)
|
newTr, reconnect, err := ac.createTransport(addr, copts, connectDeadline)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
@ -1276,7 +1282,7 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne
|
||||||
newTr, err := transport.NewClientTransport(connectCtx, ac.cc.ctx, addr, copts, onPrefaceReceipt, onGoAway, onClose)
|
newTr, err := transport.NewClientTransport(connectCtx, ac.cc.ctx, addr, copts, onPrefaceReceipt, onGoAway, onClose)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// newTr is either nil, or closed.
|
// newTr is either nil, or closed.
|
||||||
channelz.Warningf(ac.channelzID, "grpc: addrConn.createTransport failed to connect to %v. Err: %v. Reconnecting...", addr, err)
|
channelz.Warningf(logger, ac.channelzID, "grpc: addrConn.createTransport failed to connect to %v. Err: %v. Reconnecting...", addr, err)
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1284,7 +1290,7 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne
|
||||||
case <-time.After(time.Until(connectDeadline)):
|
case <-time.After(time.Until(connectDeadline)):
|
||||||
// We didn't get the preface in time.
|
// We didn't get the preface in time.
|
||||||
newTr.Close()
|
newTr.Close()
|
||||||
channelz.Warningf(ac.channelzID, "grpc: addrConn.createTransport failed to connect to %v: didn't receive server preface in time. Reconnecting...", addr)
|
channelz.Warningf(logger, ac.channelzID, "grpc: addrConn.createTransport failed to connect to %v: didn't receive server preface in time. Reconnecting...", addr)
|
||||||
return nil, nil, errors.New("timed out waiting for server handshake")
|
return nil, nil, errors.New("timed out waiting for server handshake")
|
||||||
case <-prefaceReceived:
|
case <-prefaceReceived:
|
||||||
// We got the preface - huzzah! things are good.
|
// We got the preface - huzzah! things are good.
|
||||||
|
@ -1301,7 +1307,7 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne
|
||||||
//
|
//
|
||||||
// LB channel health checking is enabled when all requirements below are met:
|
// LB channel health checking is enabled when all requirements below are met:
|
||||||
// 1. it is not disabled by the user with the WithDisableHealthCheck DialOption
|
// 1. it is not disabled by the user with the WithDisableHealthCheck DialOption
|
||||||
// 2. internal.HealthCheckFunc is set by importing the grpc/healthcheck package
|
// 2. internal.HealthCheckFunc is set by importing the grpc/health package
|
||||||
// 3. a service config with non-empty healthCheckConfig field is provided
|
// 3. a service config with non-empty healthCheckConfig field is provided
|
||||||
// 4. the load balancer requests it
|
// 4. the load balancer requests it
|
||||||
//
|
//
|
||||||
|
@ -1331,7 +1337,7 @@ func (ac *addrConn) startHealthCheck(ctx context.Context) {
|
||||||
// The health package is not imported to set health check function.
|
// The health package is not imported to set health check function.
|
||||||
//
|
//
|
||||||
// TODO: add a link to the health check doc in the error message.
|
// TODO: add a link to the health check doc in the error message.
|
||||||
channelz.Error(ac.channelzID, "Health check is requested but health check function is not set.")
|
channelz.Error(logger, ac.channelzID, "Health check is requested but health check function is not set.")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1361,9 +1367,9 @@ func (ac *addrConn) startHealthCheck(ctx context.Context) {
|
||||||
err := ac.cc.dopts.healthCheckFunc(ctx, newStream, setConnectivityState, healthCheckConfig.ServiceName)
|
err := ac.cc.dopts.healthCheckFunc(ctx, newStream, setConnectivityState, healthCheckConfig.ServiceName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if status.Code(err) == codes.Unimplemented {
|
if status.Code(err) == codes.Unimplemented {
|
||||||
channelz.Error(ac.channelzID, "Subchannel health check is unimplemented at server side, thus health check is disabled")
|
channelz.Error(logger, ac.channelzID, "Subchannel health check is unimplemented at server side, thus health check is disabled")
|
||||||
} else {
|
} else {
|
||||||
channelz.Errorf(ac.channelzID, "HealthCheckFunc exits with unexpected error %v", err)
|
channelz.Errorf(logger, ac.channelzID, "HealthCheckFunc exits with unexpected error %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
@ -1428,7 +1434,7 @@ func (ac *addrConn) tearDown(err error) {
|
||||||
ac.mu.Lock()
|
ac.mu.Lock()
|
||||||
}
|
}
|
||||||
if channelz.IsOn() {
|
if channelz.IsOn() {
|
||||||
channelz.AddTraceEvent(ac.channelzID, 0, &channelz.TraceEventDesc{
|
channelz.AddTraceEvent(logger, ac.channelzID, 0, &channelz.TraceEventDesc{
|
||||||
Desc: "Subchannel Deleted",
|
Desc: "Subchannel Deleted",
|
||||||
Severity: channelz.CtINFO,
|
Severity: channelz.CtINFO,
|
||||||
Parent: &channelz.TraceEventDesc{
|
Parent: &channelz.TraceEventDesc{
|
||||||
|
|
|
@ -33,6 +33,9 @@ const (
|
||||||
OK Code = 0
|
OK Code = 0
|
||||||
|
|
||||||
// Canceled indicates the operation was canceled (typically by the caller).
|
// Canceled indicates the operation was canceled (typically by the caller).
|
||||||
|
//
|
||||||
|
// The gRPC framework will generate this error code when cancellation
|
||||||
|
// is requested.
|
||||||
Canceled Code = 1
|
Canceled Code = 1
|
||||||
|
|
||||||
// Unknown error. An example of where this error may be returned is
|
// Unknown error. An example of where this error may be returned is
|
||||||
|
@ -40,12 +43,17 @@ const (
|
||||||
// an error-space that is not known in this address space. Also
|
// an error-space that is not known in this address space. Also
|
||||||
// errors raised by APIs that do not return enough error information
|
// errors raised by APIs that do not return enough error information
|
||||||
// may be converted to this error.
|
// may be converted to this error.
|
||||||
|
//
|
||||||
|
// The gRPC framework will generate this error code in the above two
|
||||||
|
// mentioned cases.
|
||||||
Unknown Code = 2
|
Unknown Code = 2
|
||||||
|
|
||||||
// InvalidArgument indicates client specified an invalid argument.
|
// InvalidArgument indicates client specified an invalid argument.
|
||||||
// Note that this differs from FailedPrecondition. It indicates arguments
|
// Note that this differs from FailedPrecondition. It indicates arguments
|
||||||
// that are problematic regardless of the state of the system
|
// that are problematic regardless of the state of the system
|
||||||
// (e.g., a malformed file name).
|
// (e.g., a malformed file name).
|
||||||
|
//
|
||||||
|
// This error code will not be generated by the gRPC framework.
|
||||||
InvalidArgument Code = 3
|
InvalidArgument Code = 3
|
||||||
|
|
||||||
// DeadlineExceeded means operation expired before completion.
|
// DeadlineExceeded means operation expired before completion.
|
||||||
|
@ -53,14 +61,21 @@ const (
|
||||||
// returned even if the operation has completed successfully. For
|
// returned even if the operation has completed successfully. For
|
||||||
// example, a successful response from a server could have been delayed
|
// example, a successful response from a server could have been delayed
|
||||||
// long enough for the deadline to expire.
|
// long enough for the deadline to expire.
|
||||||
|
//
|
||||||
|
// The gRPC framework will generate this error code when the deadline is
|
||||||
|
// exceeded.
|
||||||
DeadlineExceeded Code = 4
|
DeadlineExceeded Code = 4
|
||||||
|
|
||||||
// NotFound means some requested entity (e.g., file or directory) was
|
// NotFound means some requested entity (e.g., file or directory) was
|
||||||
// not found.
|
// not found.
|
||||||
|
//
|
||||||
|
// This error code will not be generated by the gRPC framework.
|
||||||
NotFound Code = 5
|
NotFound Code = 5
|
||||||
|
|
||||||
// AlreadyExists means an attempt to create an entity failed because one
|
// AlreadyExists means an attempt to create an entity failed because one
|
||||||
// already exists.
|
// already exists.
|
||||||
|
//
|
||||||
|
// This error code will not be generated by the gRPC framework.
|
||||||
AlreadyExists Code = 6
|
AlreadyExists Code = 6
|
||||||
|
|
||||||
// PermissionDenied indicates the caller does not have permission to
|
// PermissionDenied indicates the caller does not have permission to
|
||||||
|
@ -69,10 +84,17 @@ const (
|
||||||
// instead for those errors). It must not be
|
// instead for those errors). It must not be
|
||||||
// used if the caller cannot be identified (use Unauthenticated
|
// used if the caller cannot be identified (use Unauthenticated
|
||||||
// instead for those errors).
|
// instead for those errors).
|
||||||
|
//
|
||||||
|
// This error code will not be generated by the gRPC core framework,
|
||||||
|
// but expect authentication middleware to use it.
|
||||||
PermissionDenied Code = 7
|
PermissionDenied Code = 7
|
||||||
|
|
||||||
// ResourceExhausted indicates some resource has been exhausted, perhaps
|
// ResourceExhausted indicates some resource has been exhausted, perhaps
|
||||||
// a per-user quota, or perhaps the entire file system is out of space.
|
// a per-user quota, or perhaps the entire file system is out of space.
|
||||||
|
//
|
||||||
|
// This error code will be generated by the gRPC framework in
|
||||||
|
// out-of-memory and server overload situations, or when a message is
|
||||||
|
// larger than the configured maximum size.
|
||||||
ResourceExhausted Code = 8
|
ResourceExhausted Code = 8
|
||||||
|
|
||||||
// FailedPrecondition indicates operation was rejected because the
|
// FailedPrecondition indicates operation was rejected because the
|
||||||
|
@ -94,6 +116,8 @@ const (
|
||||||
// REST Get/Update/Delete on a resource and the resource on the
|
// REST Get/Update/Delete on a resource and the resource on the
|
||||||
// server does not match the condition. E.g., conflicting
|
// server does not match the condition. E.g., conflicting
|
||||||
// read-modify-write on the same resource.
|
// read-modify-write on the same resource.
|
||||||
|
//
|
||||||
|
// This error code will not be generated by the gRPC framework.
|
||||||
FailedPrecondition Code = 9
|
FailedPrecondition Code = 9
|
||||||
|
|
||||||
// Aborted indicates the operation was aborted, typically due to a
|
// Aborted indicates the operation was aborted, typically due to a
|
||||||
|
@ -102,6 +126,8 @@ const (
|
||||||
//
|
//
|
||||||
// See litmus test above for deciding between FailedPrecondition,
|
// See litmus test above for deciding between FailedPrecondition,
|
||||||
// Aborted, and Unavailable.
|
// Aborted, and Unavailable.
|
||||||
|
//
|
||||||
|
// This error code will not be generated by the gRPC framework.
|
||||||
Aborted Code = 10
|
Aborted Code = 10
|
||||||
|
|
||||||
// OutOfRange means operation was attempted past the valid range.
|
// OutOfRange means operation was attempted past the valid range.
|
||||||
|
@ -119,15 +145,26 @@ const (
|
||||||
// error) when it applies so that callers who are iterating through
|
// error) when it applies so that callers who are iterating through
|
||||||
// a space can easily look for an OutOfRange error to detect when
|
// a space can easily look for an OutOfRange error to detect when
|
||||||
// they are done.
|
// they are done.
|
||||||
|
//
|
||||||
|
// This error code will not be generated by the gRPC framework.
|
||||||
OutOfRange Code = 11
|
OutOfRange Code = 11
|
||||||
|
|
||||||
// Unimplemented indicates operation is not implemented or not
|
// Unimplemented indicates operation is not implemented or not
|
||||||
// supported/enabled in this service.
|
// supported/enabled in this service.
|
||||||
|
//
|
||||||
|
// This error code will be generated by the gRPC framework. Most
|
||||||
|
// commonly, you will see this error code when a method implementation
|
||||||
|
// is missing on the server. It can also be generated for unknown
|
||||||
|
// compression algorithms or a disagreement as to whether an RPC should
|
||||||
|
// be streaming.
|
||||||
Unimplemented Code = 12
|
Unimplemented Code = 12
|
||||||
|
|
||||||
// Internal errors. Means some invariants expected by underlying
|
// Internal errors. Means some invariants expected by underlying
|
||||||
// system has been broken. If you see one of these errors,
|
// system has been broken. If you see one of these errors,
|
||||||
// something is very broken.
|
// something is very broken.
|
||||||
|
//
|
||||||
|
// This error code will be generated by the gRPC framework in several
|
||||||
|
// internal error conditions.
|
||||||
Internal Code = 13
|
Internal Code = 13
|
||||||
|
|
||||||
// Unavailable indicates the service is currently unavailable.
|
// Unavailable indicates the service is currently unavailable.
|
||||||
|
@ -137,13 +174,22 @@ const (
|
||||||
//
|
//
|
||||||
// See litmus test above for deciding between FailedPrecondition,
|
// See litmus test above for deciding between FailedPrecondition,
|
||||||
// Aborted, and Unavailable.
|
// Aborted, and Unavailable.
|
||||||
|
//
|
||||||
|
// This error code will be generated by the gRPC framework during
|
||||||
|
// abrupt shutdown of a server process or network connection.
|
||||||
Unavailable Code = 14
|
Unavailable Code = 14
|
||||||
|
|
||||||
// DataLoss indicates unrecoverable data loss or corruption.
|
// DataLoss indicates unrecoverable data loss or corruption.
|
||||||
|
//
|
||||||
|
// This error code will not be generated by the gRPC framework.
|
||||||
DataLoss Code = 15
|
DataLoss Code = 15
|
||||||
|
|
||||||
// Unauthenticated indicates the request does not have valid
|
// Unauthenticated indicates the request does not have valid
|
||||||
// authentication credentials for the operation.
|
// authentication credentials for the operation.
|
||||||
|
//
|
||||||
|
// The gRPC framework will generate this error code when the
|
||||||
|
// authentication metadata is invalid or a Credentials callback fails,
|
||||||
|
// but also expect authentication middleware to generate it.
|
||||||
Unauthenticated Code = 16
|
Unauthenticated Code = 16
|
||||||
|
|
||||||
_maxCode = 17
|
_maxCode = 17
|
||||||
|
|
|
@ -67,6 +67,7 @@ var (
|
||||||
// ServerHandshake is running on a platform where the trustworthiness of
|
// ServerHandshake is running on a platform where the trustworthiness of
|
||||||
// the handshaker service is not guaranteed.
|
// the handshaker service is not guaranteed.
|
||||||
ErrUntrustedPlatform = errors.New("ALTS: untrusted platform. ALTS is only supported on GCP")
|
ErrUntrustedPlatform = errors.New("ALTS: untrusted platform. ALTS is only supported on GCP")
|
||||||
|
logger = grpclog.Component("alts")
|
||||||
)
|
)
|
||||||
|
|
||||||
// AuthInfo exposes security information from the ALTS handshake to the
|
// AuthInfo exposes security information from the ALTS handshake to the
|
||||||
|
@ -307,7 +308,7 @@ func compareRPCVersions(v1, v2 *altspb.RpcProtocolVersions_Version) int {
|
||||||
// agreed on.
|
// agreed on.
|
||||||
func checkRPCVersions(local, peer *altspb.RpcProtocolVersions) (bool, *altspb.RpcProtocolVersions_Version) {
|
func checkRPCVersions(local, peer *altspb.RpcProtocolVersions) (bool, *altspb.RpcProtocolVersions_Version) {
|
||||||
if local == nil || peer == nil {
|
if local == nil || peer == nil {
|
||||||
grpclog.Error("invalid checkRPCVersions argument, either local or peer is nil.")
|
logger.Error("invalid checkRPCVersions argument, either local or peer is nil.")
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ func newAuthInfo(result *altspb.HandshakerResult) *altsAuthInfo {
|
||||||
PeerServiceAccount: result.GetPeerIdentity().GetServiceAccount(),
|
PeerServiceAccount: result.GetPeerIdentity().GetServiceAccount(),
|
||||||
LocalServiceAccount: result.GetLocalIdentity().GetServiceAccount(),
|
LocalServiceAccount: result.GetLocalIdentity().GetServiceAccount(),
|
||||||
PeerRpcVersions: result.GetPeerRpcVersions(),
|
PeerRpcVersions: result.GetPeerRpcVersions(),
|
||||||
|
PeerAttributes: result.GetPeerIdentity().GetAttributes(),
|
||||||
},
|
},
|
||||||
CommonAuthInfo: credentials.CommonAuthInfo{SecurityLevel: credentials.PrivacyAndIntegrity},
|
CommonAuthInfo: credentials.CommonAuthInfo{SecurityLevel: credentials.PrivacyAndIntegrity},
|
||||||
}
|
}
|
||||||
|
@ -87,3 +88,8 @@ func (s *altsAuthInfo) LocalServiceAccount() string {
|
||||||
func (s *altsAuthInfo) PeerRPCVersions() *altspb.RpcProtocolVersions {
|
func (s *altsAuthInfo) PeerRPCVersions() *altspb.RpcProtocolVersions {
|
||||||
return s.p.GetPeerRpcVersions()
|
return s.p.GetPeerRpcVersions()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PeerAttributes returns the context's peer attributes.
|
||||||
|
func (s *altsAuthInfo) PeerAttributes() map[string]string {
|
||||||
|
return s.p.GetPeerAttributes()
|
||||||
|
}
|
||||||
|
|
13
vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go
generated
vendored
13
vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go
generated
vendored
|
@ -27,9 +27,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// hsConn represents a connection to hypervisor handshaker service.
|
// mu guards hsConnMap and hsDialer.
|
||||||
hsConn *grpc.ClientConn
|
mu sync.Mutex
|
||||||
mu sync.Mutex
|
// hsConn represents a mapping from a hypervisor handshaker service address
|
||||||
|
// to a corresponding connection to a hypervisor handshaker service
|
||||||
|
// instance.
|
||||||
|
hsConnMap = make(map[string]*grpc.ClientConn)
|
||||||
// hsDialer will be reassigned in tests.
|
// hsDialer will be reassigned in tests.
|
||||||
hsDialer = grpc.Dial
|
hsDialer = grpc.Dial
|
||||||
)
|
)
|
||||||
|
@ -41,7 +44,8 @@ func Dial(hsAddress string) (*grpc.ClientConn, error) {
|
||||||
mu.Lock()
|
mu.Lock()
|
||||||
defer mu.Unlock()
|
defer mu.Unlock()
|
||||||
|
|
||||||
if hsConn == nil {
|
hsConn, ok := hsConnMap[hsAddress]
|
||||||
|
if !ok {
|
||||||
// Create a new connection to the handshaker service. Note that
|
// Create a new connection to the handshaker service. Note that
|
||||||
// this connection stays open until the application is closed.
|
// this connection stays open until the application is closed.
|
||||||
var err error
|
var err error
|
||||||
|
@ -49,6 +53,7 @@ func Dial(hsAddress string) (*grpc.ClientConn, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
hsConnMap[hsAddress] = hsConn
|
||||||
}
|
}
|
||||||
return hsConn, nil
|
return hsConn, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,8 +25,10 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
|
"net/url"
|
||||||
|
|
||||||
"google.golang.org/grpc/credentials/internal"
|
"google.golang.org/grpc/credentials/internal"
|
||||||
|
credinternal "google.golang.org/grpc/internal/credentials"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TLSInfo contains the auth information for a TLS authenticated connection.
|
// TLSInfo contains the auth information for a TLS authenticated connection.
|
||||||
|
@ -34,6 +36,8 @@ import (
|
||||||
type TLSInfo struct {
|
type TLSInfo struct {
|
||||||
State tls.ConnectionState
|
State tls.ConnectionState
|
||||||
CommonAuthInfo
|
CommonAuthInfo
|
||||||
|
// This API is experimental.
|
||||||
|
SPIFFEID *url.URL
|
||||||
}
|
}
|
||||||
|
|
||||||
// AuthType returns the type of TLSInfo as a string.
|
// AuthType returns the type of TLSInfo as a string.
|
||||||
|
@ -94,7 +98,17 @@ func (c *tlsCreds) ClientHandshake(ctx context.Context, authority string, rawCon
|
||||||
conn.Close()
|
conn.Close()
|
||||||
return nil, nil, ctx.Err()
|
return nil, nil, ctx.Err()
|
||||||
}
|
}
|
||||||
return internal.WrapSyscallConn(rawConn, conn), TLSInfo{conn.ConnectionState(), CommonAuthInfo{PrivacyAndIntegrity}}, nil
|
tlsInfo := TLSInfo{
|
||||||
|
State: conn.ConnectionState(),
|
||||||
|
CommonAuthInfo: CommonAuthInfo{
|
||||||
|
SecurityLevel: PrivacyAndIntegrity,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
id := credinternal.SPIFFEIDFromState(conn.ConnectionState())
|
||||||
|
if id != nil {
|
||||||
|
tlsInfo.SPIFFEID = id
|
||||||
|
}
|
||||||
|
return internal.WrapSyscallConn(rawConn, conn), tlsInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) {
|
func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) {
|
||||||
|
@ -103,7 +117,17 @@ func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error)
|
||||||
conn.Close()
|
conn.Close()
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
return internal.WrapSyscallConn(rawConn, conn), TLSInfo{conn.ConnectionState(), CommonAuthInfo{PrivacyAndIntegrity}}, nil
|
tlsInfo := TLSInfo{
|
||||||
|
State: conn.ConnectionState(),
|
||||||
|
CommonAuthInfo: CommonAuthInfo{
|
||||||
|
SecurityLevel: PrivacyAndIntegrity,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
id := credinternal.SPIFFEIDFromState(conn.ConnectionState())
|
||||||
|
if id != nil {
|
||||||
|
tlsInfo.SPIFFEID = id
|
||||||
|
}
|
||||||
|
return internal.WrapSyscallConn(rawConn, conn), tlsInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *tlsCreds) Clone() TransportCredentials {
|
func (c *tlsCreds) Clone() TransportCredentials {
|
||||||
|
|
|
@ -27,7 +27,6 @@ import (
|
||||||
"google.golang.org/grpc/backoff"
|
"google.golang.org/grpc/backoff"
|
||||||
"google.golang.org/grpc/balancer"
|
"google.golang.org/grpc/balancer"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
"google.golang.org/grpc/internal"
|
"google.golang.org/grpc/internal"
|
||||||
internalbackoff "google.golang.org/grpc/internal/backoff"
|
internalbackoff "google.golang.org/grpc/internal/backoff"
|
||||||
"google.golang.org/grpc/internal/envconfig"
|
"google.golang.org/grpc/internal/envconfig"
|
||||||
|
@ -423,7 +422,7 @@ func WithUserAgent(s string) DialOption {
|
||||||
// for the client transport.
|
// for the client transport.
|
||||||
func WithKeepaliveParams(kp keepalive.ClientParameters) DialOption {
|
func WithKeepaliveParams(kp keepalive.ClientParameters) DialOption {
|
||||||
if kp.Time < internal.KeepaliveMinPingTime {
|
if kp.Time < internal.KeepaliveMinPingTime {
|
||||||
grpclog.Warningf("Adjusting keepalive ping interval to minimum period of %v", internal.KeepaliveMinPingTime)
|
logger.Warningf("Adjusting keepalive ping interval to minimum period of %v", internal.KeepaliveMinPingTime)
|
||||||
kp.Time = internal.KeepaliveMinPingTime
|
kp.Time = internal.KeepaliveMinPingTime
|
||||||
}
|
}
|
||||||
return newFuncDialOption(func(o *dialOptions) {
|
return newFuncDialOption(func(o *dialOptions) {
|
||||||
|
|
|
@ -0,0 +1,117 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2020 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 grpclog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"google.golang.org/grpc/internal/grpclog"
|
||||||
|
)
|
||||||
|
|
||||||
|
// componentData records the settings for a component.
|
||||||
|
type componentData struct {
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
var cache = map[string]*componentData{}
|
||||||
|
|
||||||
|
func (c *componentData) InfoDepth(depth int, args ...interface{}) {
|
||||||
|
args = append([]interface{}{"[" + string(c.name) + "]"}, args...)
|
||||||
|
grpclog.InfoDepth(depth+1, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) WarningDepth(depth int, args ...interface{}) {
|
||||||
|
args = append([]interface{}{"[" + string(c.name) + "]"}, args...)
|
||||||
|
grpclog.WarningDepth(depth+1, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) ErrorDepth(depth int, args ...interface{}) {
|
||||||
|
args = append([]interface{}{"[" + string(c.name) + "]"}, args...)
|
||||||
|
grpclog.ErrorDepth(depth+1, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) FatalDepth(depth int, args ...interface{}) {
|
||||||
|
args = append([]interface{}{"[" + string(c.name) + "]"}, args...)
|
||||||
|
grpclog.FatalDepth(depth+1, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) Info(args ...interface{}) {
|
||||||
|
c.InfoDepth(1, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) Warning(args ...interface{}) {
|
||||||
|
c.WarningDepth(1, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) Error(args ...interface{}) {
|
||||||
|
c.ErrorDepth(1, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) Fatal(args ...interface{}) {
|
||||||
|
c.FatalDepth(1, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) Infof(format string, args ...interface{}) {
|
||||||
|
c.InfoDepth(1, fmt.Sprintf(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) Warningf(format string, args ...interface{}) {
|
||||||
|
c.WarningDepth(1, fmt.Sprintf(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) Errorf(format string, args ...interface{}) {
|
||||||
|
c.ErrorDepth(1, fmt.Sprintf(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) Fatalf(format string, args ...interface{}) {
|
||||||
|
c.FatalDepth(1, fmt.Sprintf(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) Infoln(args ...interface{}) {
|
||||||
|
c.InfoDepth(1, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) Warningln(args ...interface{}) {
|
||||||
|
c.WarningDepth(1, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) Errorln(args ...interface{}) {
|
||||||
|
c.ErrorDepth(1, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) Fatalln(args ...interface{}) {
|
||||||
|
c.FatalDepth(1, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *componentData) V(l int) bool {
|
||||||
|
return grpclog.Logger.V(l)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Component creates a new component and returns it for logging. If a component
|
||||||
|
// with the name already exists, nothing will be created and it will be
|
||||||
|
// returned. SetLoggerV2 will panic if it is called with a logger created by
|
||||||
|
// Component.
|
||||||
|
func Component(componentName string) DepthLoggerV2 {
|
||||||
|
if cData, ok := cache[componentName]; ok {
|
||||||
|
return cData
|
||||||
|
}
|
||||||
|
c := &componentData{componentName}
|
||||||
|
cache[componentName] = c
|
||||||
|
return c
|
||||||
|
}
|
|
@ -67,6 +67,9 @@ type LoggerV2 interface {
|
||||||
// SetLoggerV2 sets logger that is used in grpc to a V2 logger.
|
// SetLoggerV2 sets logger that is used in grpc to a V2 logger.
|
||||||
// Not mutex-protected, should be called before any gRPC functions.
|
// Not mutex-protected, should be called before any gRPC functions.
|
||||||
func SetLoggerV2(l LoggerV2) {
|
func SetLoggerV2(l LoggerV2) {
|
||||||
|
if _, ok := l.(*componentData); ok {
|
||||||
|
panic("cannot use component logger as grpclog logger")
|
||||||
|
}
|
||||||
grpclog.Logger = l
|
grpclog.Logger = l
|
||||||
grpclog.DepthLogger, _ = l.(grpclog.DepthLoggerV2)
|
grpclog.DepthLogger, _ = l.(grpclog.DepthLoggerV2)
|
||||||
}
|
}
|
||||||
|
@ -203,6 +206,7 @@ func (g *loggerT) V(l int) bool {
|
||||||
//
|
//
|
||||||
// This API is EXPERIMENTAL.
|
// This API is EXPERIMENTAL.
|
||||||
type DepthLoggerV2 interface {
|
type DepthLoggerV2 interface {
|
||||||
|
LoggerV2
|
||||||
// InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Print.
|
// InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Print.
|
||||||
InfoDepth(depth int, args ...interface{})
|
InfoDepth(depth int, args ...interface{})
|
||||||
// WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Print.
|
// WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Print.
|
||||||
|
|
|
@ -40,6 +40,8 @@ type Logger interface {
|
||||||
// It is used to get a methodLogger for each individual method.
|
// It is used to get a methodLogger for each individual method.
|
||||||
var binLogger Logger
|
var binLogger Logger
|
||||||
|
|
||||||
|
var grpclogLogger = grpclog.Component("binarylog")
|
||||||
|
|
||||||
// SetLogger sets the binarg logger.
|
// SetLogger sets the binarg logger.
|
||||||
//
|
//
|
||||||
// Only call this at init time.
|
// Only call this at init time.
|
||||||
|
@ -149,7 +151,7 @@ func (l *logger) setBlacklist(method string) error {
|
||||||
func (l *logger) getMethodLogger(methodName string) *MethodLogger {
|
func (l *logger) getMethodLogger(methodName string) *MethodLogger {
|
||||||
s, m, err := grpcutil.ParseMethod(methodName)
|
s, m, err := grpcutil.ParseMethod(methodName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Infof("binarylogging: failed to parse %q: %v", methodName, err)
|
grpclogLogger.Infof("binarylogging: failed to parse %q: %v", methodName, err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if ml, ok := l.methods[s+"/"+m]; ok {
|
if ml, ok := l.methods[s+"/"+m]; ok {
|
||||||
|
|
|
@ -24,8 +24,6 @@ import (
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewLoggerFromConfigString reads the string and build a logger. It can be used
|
// NewLoggerFromConfigString reads the string and build a logger. It can be used
|
||||||
|
@ -52,7 +50,7 @@ func NewLoggerFromConfigString(s string) Logger {
|
||||||
methods := strings.Split(s, ",")
|
methods := strings.Split(s, ",")
|
||||||
for _, method := range methods {
|
for _, method := range methods {
|
||||||
if err := l.fillMethodLoggerWithConfigString(method); err != nil {
|
if err := l.fillMethodLoggerWithConfigString(method); err != nil {
|
||||||
grpclog.Warningf("failed to parse binary log config: %v", err)
|
grpclogLogger.Warningf("failed to parse binary log config: %v", err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,6 @@ import (
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
"github.com/golang/protobuf/ptypes"
|
"github.com/golang/protobuf/ptypes"
|
||||||
pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1"
|
pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1"
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
)
|
)
|
||||||
|
@ -219,12 +218,12 @@ func (c *ClientMessage) toProto() *pb.GrpcLogEntry {
|
||||||
if m, ok := c.Message.(proto.Message); ok {
|
if m, ok := c.Message.(proto.Message); ok {
|
||||||
data, err = proto.Marshal(m)
|
data, err = proto.Marshal(m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Infof("binarylogging: failed to marshal proto message: %v", err)
|
grpclogLogger.Infof("binarylogging: failed to marshal proto message: %v", err)
|
||||||
}
|
}
|
||||||
} else if b, ok := c.Message.([]byte); ok {
|
} else if b, ok := c.Message.([]byte); ok {
|
||||||
data = b
|
data = b
|
||||||
} else {
|
} else {
|
||||||
grpclog.Infof("binarylogging: message to log is neither proto.message nor []byte")
|
grpclogLogger.Infof("binarylogging: message to log is neither proto.message nor []byte")
|
||||||
}
|
}
|
||||||
ret := &pb.GrpcLogEntry{
|
ret := &pb.GrpcLogEntry{
|
||||||
Type: pb.GrpcLogEntry_EVENT_TYPE_CLIENT_MESSAGE,
|
Type: pb.GrpcLogEntry_EVENT_TYPE_CLIENT_MESSAGE,
|
||||||
|
@ -259,12 +258,12 @@ func (c *ServerMessage) toProto() *pb.GrpcLogEntry {
|
||||||
if m, ok := c.Message.(proto.Message); ok {
|
if m, ok := c.Message.(proto.Message); ok {
|
||||||
data, err = proto.Marshal(m)
|
data, err = proto.Marshal(m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Infof("binarylogging: failed to marshal proto message: %v", err)
|
grpclogLogger.Infof("binarylogging: failed to marshal proto message: %v", err)
|
||||||
}
|
}
|
||||||
} else if b, ok := c.Message.([]byte); ok {
|
} else if b, ok := c.Message.([]byte); ok {
|
||||||
data = b
|
data = b
|
||||||
} else {
|
} else {
|
||||||
grpclog.Infof("binarylogging: message to log is neither proto.message nor []byte")
|
grpclogLogger.Infof("binarylogging: message to log is neither proto.message nor []byte")
|
||||||
}
|
}
|
||||||
ret := &pb.GrpcLogEntry{
|
ret := &pb.GrpcLogEntry{
|
||||||
Type: pb.GrpcLogEntry_EVENT_TYPE_SERVER_MESSAGE,
|
Type: pb.GrpcLogEntry_EVENT_TYPE_SERVER_MESSAGE,
|
||||||
|
@ -315,7 +314,7 @@ type ServerTrailer struct {
|
||||||
func (c *ServerTrailer) toProto() *pb.GrpcLogEntry {
|
func (c *ServerTrailer) toProto() *pb.GrpcLogEntry {
|
||||||
st, ok := status.FromError(c.Err)
|
st, ok := status.FromError(c.Err)
|
||||||
if !ok {
|
if !ok {
|
||||||
grpclog.Info("binarylogging: error in trailer is not a status error")
|
grpclogLogger.Info("binarylogging: error in trailer is not a status error")
|
||||||
}
|
}
|
||||||
var (
|
var (
|
||||||
detailsBytes []byte
|
detailsBytes []byte
|
||||||
|
@ -325,7 +324,7 @@ func (c *ServerTrailer) toProto() *pb.GrpcLogEntry {
|
||||||
if stProto != nil && len(stProto.Details) != 0 {
|
if stProto != nil && len(stProto.Details) != 0 {
|
||||||
detailsBytes, err = proto.Marshal(stProto)
|
detailsBytes, err = proto.Marshal(stProto)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Infof("binarylogging: failed to marshal status proto: %v", err)
|
grpclogLogger.Infof("binarylogging: failed to marshal status proto: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret := &pb.GrpcLogEntry{
|
ret := &pb.GrpcLogEntry{
|
||||||
|
|
|
@ -29,7 +29,6 @@ import (
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1"
|
pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1"
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -78,7 +77,7 @@ type writerSink struct {
|
||||||
func (ws *writerSink) Write(e *pb.GrpcLogEntry) error {
|
func (ws *writerSink) Write(e *pb.GrpcLogEntry) error {
|
||||||
b, err := proto.Marshal(e)
|
b, err := proto.Marshal(e)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Infof("binary logging: failed to marshal proto message: %v", err)
|
grpclogLogger.Infof("binary logging: failed to marshal proto message: %v", err)
|
||||||
}
|
}
|
||||||
hdr := make([]byte, 4)
|
hdr := make([]byte, 4)
|
||||||
binary.BigEndian.PutUint32(hdr, uint32(len(b)))
|
binary.BigEndian.PutUint32(hdr, uint32(len(b)))
|
||||||
|
|
|
@ -30,7 +30,7 @@ import (
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"google.golang.org/grpc/internal/grpclog"
|
"google.golang.org/grpc/grpclog"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -216,7 +216,7 @@ func RegisterChannel(c Channel, pid int64, ref string) int64 {
|
||||||
// by pid). It returns the unique channelz tracking id assigned to this subchannel.
|
// by pid). It returns the unique channelz tracking id assigned to this subchannel.
|
||||||
func RegisterSubChannel(c Channel, pid int64, ref string) int64 {
|
func RegisterSubChannel(c Channel, pid int64, ref string) int64 {
|
||||||
if pid == 0 {
|
if pid == 0 {
|
||||||
grpclog.ErrorDepth(0, "a SubChannel's parent id cannot be 0")
|
logger.Error("a SubChannel's parent id cannot be 0")
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
id := idGen.genID()
|
id := idGen.genID()
|
||||||
|
@ -253,7 +253,7 @@ func RegisterServer(s Server, ref string) int64 {
|
||||||
// this listen socket.
|
// this listen socket.
|
||||||
func RegisterListenSocket(s Socket, pid int64, ref string) int64 {
|
func RegisterListenSocket(s Socket, pid int64, ref string) int64 {
|
||||||
if pid == 0 {
|
if pid == 0 {
|
||||||
grpclog.ErrorDepth(0, "a ListenSocket's parent id cannot be 0")
|
logger.Error("a ListenSocket's parent id cannot be 0")
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
id := idGen.genID()
|
id := idGen.genID()
|
||||||
|
@ -268,7 +268,7 @@ func RegisterListenSocket(s Socket, pid int64, ref string) int64 {
|
||||||
// this normal socket.
|
// this normal socket.
|
||||||
func RegisterNormalSocket(s Socket, pid int64, ref string) int64 {
|
func RegisterNormalSocket(s Socket, pid int64, ref string) int64 {
|
||||||
if pid == 0 {
|
if pid == 0 {
|
||||||
grpclog.ErrorDepth(0, "a NormalSocket's parent id cannot be 0")
|
logger.Error("a NormalSocket's parent id cannot be 0")
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
id := idGen.genID()
|
id := idGen.genID()
|
||||||
|
@ -294,17 +294,17 @@ type TraceEventDesc struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddTraceEvent adds trace related to the entity with specified id, using the provided TraceEventDesc.
|
// AddTraceEvent adds trace related to the entity with specified id, using the provided TraceEventDesc.
|
||||||
func AddTraceEvent(id int64, depth int, desc *TraceEventDesc) {
|
func AddTraceEvent(l grpclog.DepthLoggerV2, id int64, depth int, desc *TraceEventDesc) {
|
||||||
for d := desc; d != nil; d = d.Parent {
|
for d := desc; d != nil; d = d.Parent {
|
||||||
switch d.Severity {
|
switch d.Severity {
|
||||||
case CtUNKNOWN:
|
case CtUNKNOWN:
|
||||||
grpclog.InfoDepth(depth+1, d.Desc)
|
l.InfoDepth(depth+1, d.Desc)
|
||||||
case CtINFO:
|
case CtINFO:
|
||||||
grpclog.InfoDepth(depth+1, d.Desc)
|
l.InfoDepth(depth+1, d.Desc)
|
||||||
case CtWarning:
|
case CtWarning:
|
||||||
grpclog.WarningDepth(depth+1, d.Desc)
|
l.WarningDepth(depth+1, d.Desc)
|
||||||
case CtError:
|
case CtError:
|
||||||
grpclog.ErrorDepth(depth+1, d.Desc)
|
l.ErrorDepth(depth+1, d.Desc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if getMaxTraceEntry() == 0 {
|
if getMaxTraceEntry() == 0 {
|
||||||
|
|
|
@ -21,80 +21,82 @@ package channelz
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"google.golang.org/grpc/internal/grpclog"
|
"google.golang.org/grpc/grpclog"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Info logs through grpclog.Info and adds a trace event if channelz is on.
|
var logger = grpclog.Component("channelz")
|
||||||
func Info(id int64, args ...interface{}) {
|
|
||||||
|
// Info logs and adds a trace event if channelz is on.
|
||||||
|
func Info(l grpclog.DepthLoggerV2, id int64, args ...interface{}) {
|
||||||
if IsOn() {
|
if IsOn() {
|
||||||
AddTraceEvent(id, 1, &TraceEventDesc{
|
AddTraceEvent(l, id, 1, &TraceEventDesc{
|
||||||
Desc: fmt.Sprint(args...),
|
Desc: fmt.Sprint(args...),
|
||||||
Severity: CtINFO,
|
Severity: CtINFO,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
grpclog.InfoDepth(1, args...)
|
l.InfoDepth(1, args...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Infof logs through grpclog.Infof and adds a trace event if channelz is on.
|
// Infof logs and adds a trace event if channelz is on.
|
||||||
func Infof(id int64, format string, args ...interface{}) {
|
func Infof(l grpclog.DepthLoggerV2, id int64, format string, args ...interface{}) {
|
||||||
msg := fmt.Sprintf(format, args...)
|
msg := fmt.Sprintf(format, args...)
|
||||||
if IsOn() {
|
if IsOn() {
|
||||||
AddTraceEvent(id, 1, &TraceEventDesc{
|
AddTraceEvent(l, id, 1, &TraceEventDesc{
|
||||||
Desc: msg,
|
Desc: msg,
|
||||||
Severity: CtINFO,
|
Severity: CtINFO,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
grpclog.InfoDepth(1, msg)
|
l.InfoDepth(1, msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warning logs through grpclog.Warning and adds a trace event if channelz is on.
|
// Warning logs and adds a trace event if channelz is on.
|
||||||
func Warning(id int64, args ...interface{}) {
|
func Warning(l grpclog.DepthLoggerV2, id int64, args ...interface{}) {
|
||||||
if IsOn() {
|
if IsOn() {
|
||||||
AddTraceEvent(id, 1, &TraceEventDesc{
|
AddTraceEvent(l, id, 1, &TraceEventDesc{
|
||||||
Desc: fmt.Sprint(args...),
|
Desc: fmt.Sprint(args...),
|
||||||
Severity: CtWarning,
|
Severity: CtWarning,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
grpclog.WarningDepth(1, args...)
|
l.WarningDepth(1, args...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warningf logs through grpclog.Warningf and adds a trace event if channelz is on.
|
// Warningf logs and adds a trace event if channelz is on.
|
||||||
func Warningf(id int64, format string, args ...interface{}) {
|
func Warningf(l grpclog.DepthLoggerV2, id int64, format string, args ...interface{}) {
|
||||||
msg := fmt.Sprintf(format, args...)
|
msg := fmt.Sprintf(format, args...)
|
||||||
if IsOn() {
|
if IsOn() {
|
||||||
AddTraceEvent(id, 1, &TraceEventDesc{
|
AddTraceEvent(l, id, 1, &TraceEventDesc{
|
||||||
Desc: msg,
|
Desc: msg,
|
||||||
Severity: CtWarning,
|
Severity: CtWarning,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
grpclog.WarningDepth(1, msg)
|
l.WarningDepth(1, msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error logs through grpclog.Error and adds a trace event if channelz is on.
|
// Error logs and adds a trace event if channelz is on.
|
||||||
func Error(id int64, args ...interface{}) {
|
func Error(l grpclog.DepthLoggerV2, id int64, args ...interface{}) {
|
||||||
if IsOn() {
|
if IsOn() {
|
||||||
AddTraceEvent(id, 1, &TraceEventDesc{
|
AddTraceEvent(l, id, 1, &TraceEventDesc{
|
||||||
Desc: fmt.Sprint(args...),
|
Desc: fmt.Sprint(args...),
|
||||||
Severity: CtError,
|
Severity: CtError,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
grpclog.ErrorDepth(1, args...)
|
l.ErrorDepth(1, args...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Errorf logs through grpclog.Errorf and adds a trace event if channelz is on.
|
// Errorf logs and adds a trace event if channelz is on.
|
||||||
func Errorf(id int64, format string, args ...interface{}) {
|
func Errorf(l grpclog.DepthLoggerV2, id int64, format string, args ...interface{}) {
|
||||||
msg := fmt.Sprintf(format, args...)
|
msg := fmt.Sprintf(format, args...)
|
||||||
if IsOn() {
|
if IsOn() {
|
||||||
AddTraceEvent(id, 1, &TraceEventDesc{
|
AddTraceEvent(l, id, 1, &TraceEventDesc{
|
||||||
Desc: msg,
|
Desc: msg,
|
||||||
Severity: CtError,
|
Severity: CtError,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
grpclog.ErrorDepth(1, msg)
|
l.ErrorDepth(1, msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,6 @@ import (
|
||||||
|
|
||||||
"google.golang.org/grpc/connectivity"
|
"google.golang.org/grpc/connectivity"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// entry represents a node in the channelz database.
|
// entry represents a node in the channelz database.
|
||||||
|
@ -60,17 +59,17 @@ func (d *dummyEntry) addChild(id int64, e entry) {
|
||||||
// the addrConn will create a new transport. And when registering the new transport in
|
// the addrConn will create a new transport. And when registering the new transport in
|
||||||
// channelz, its parent addrConn could have already been torn down and deleted
|
// channelz, its parent addrConn could have already been torn down and deleted
|
||||||
// from channelz tracking, and thus reach the code here.
|
// from channelz tracking, and thus reach the code here.
|
||||||
grpclog.Infof("attempt to add child of type %T with id %d to a parent (id=%d) that doesn't currently exist", e, id, d.idNotFound)
|
logger.Infof("attempt to add child of type %T with id %d to a parent (id=%d) that doesn't currently exist", e, id, d.idNotFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *dummyEntry) deleteChild(id int64) {
|
func (d *dummyEntry) deleteChild(id int64) {
|
||||||
// It is possible for a normal program to reach here under race condition.
|
// It is possible for a normal program to reach here under race condition.
|
||||||
// Refer to the example described in addChild().
|
// Refer to the example described in addChild().
|
||||||
grpclog.Infof("attempt to delete child with id %d from a parent (id=%d) that doesn't currently exist", id, d.idNotFound)
|
logger.Infof("attempt to delete child with id %d from a parent (id=%d) that doesn't currently exist", id, d.idNotFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *dummyEntry) triggerDelete() {
|
func (d *dummyEntry) triggerDelete() {
|
||||||
grpclog.Warningf("attempt to delete an entry (id=%d) that doesn't currently exist", d.idNotFound)
|
logger.Warningf("attempt to delete an entry (id=%d) that doesn't currently exist", d.idNotFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*dummyEntry) deleteSelfIfReady() {
|
func (*dummyEntry) deleteSelfIfReady() {
|
||||||
|
@ -215,7 +214,7 @@ func (c *channel) addChild(id int64, e entry) {
|
||||||
case *channel:
|
case *channel:
|
||||||
c.nestedChans[id] = v.refName
|
c.nestedChans[id] = v.refName
|
||||||
default:
|
default:
|
||||||
grpclog.Errorf("cannot add a child (id = %d) of type %T to a channel", id, e)
|
logger.Errorf("cannot add a child (id = %d) of type %T to a channel", id, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,7 +325,7 @@ func (sc *subChannel) addChild(id int64, e entry) {
|
||||||
if v, ok := e.(*normalSocket); ok {
|
if v, ok := e.(*normalSocket); ok {
|
||||||
sc.sockets[id] = v.refName
|
sc.sockets[id] = v.refName
|
||||||
} else {
|
} else {
|
||||||
grpclog.Errorf("cannot add a child (id = %d) of type %T to a subChannel", id, e)
|
logger.Errorf("cannot add a child (id = %d) of type %T to a subChannel", id, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -493,11 +492,11 @@ type listenSocket struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ls *listenSocket) addChild(id int64, e entry) {
|
func (ls *listenSocket) addChild(id int64, e entry) {
|
||||||
grpclog.Errorf("cannot add a child (id = %d) of type %T to a listen socket", id, e)
|
logger.Errorf("cannot add a child (id = %d) of type %T to a listen socket", id, e)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ls *listenSocket) deleteChild(id int64) {
|
func (ls *listenSocket) deleteChild(id int64) {
|
||||||
grpclog.Errorf("cannot delete a child (id = %d) from a listen socket", id)
|
logger.Errorf("cannot delete a child (id = %d) from a listen socket", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ls *listenSocket) triggerDelete() {
|
func (ls *listenSocket) triggerDelete() {
|
||||||
|
@ -506,7 +505,7 @@ func (ls *listenSocket) triggerDelete() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ls *listenSocket) deleteSelfIfReady() {
|
func (ls *listenSocket) deleteSelfIfReady() {
|
||||||
grpclog.Errorf("cannot call deleteSelfIfReady on a listen socket")
|
logger.Errorf("cannot call deleteSelfIfReady on a listen socket")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ls *listenSocket) getParentID() int64 {
|
func (ls *listenSocket) getParentID() int64 {
|
||||||
|
@ -522,11 +521,11 @@ type normalSocket struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ns *normalSocket) addChild(id int64, e entry) {
|
func (ns *normalSocket) addChild(id int64, e entry) {
|
||||||
grpclog.Errorf("cannot add a child (id = %d) of type %T to a normal socket", id, e)
|
logger.Errorf("cannot add a child (id = %d) of type %T to a normal socket", id, e)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ns *normalSocket) deleteChild(id int64) {
|
func (ns *normalSocket) deleteChild(id int64) {
|
||||||
grpclog.Errorf("cannot delete a child (id = %d) from a normal socket", id)
|
logger.Errorf("cannot delete a child (id = %d) from a normal socket", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ns *normalSocket) triggerDelete() {
|
func (ns *normalSocket) triggerDelete() {
|
||||||
|
@ -535,7 +534,7 @@ func (ns *normalSocket) triggerDelete() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ns *normalSocket) deleteSelfIfReady() {
|
func (ns *normalSocket) deleteSelfIfReady() {
|
||||||
grpclog.Errorf("cannot call deleteSelfIfReady on a normal socket")
|
logger.Errorf("cannot call deleteSelfIfReady on a normal socket")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ns *normalSocket) getParentID() int64 {
|
func (ns *normalSocket) getParentID() int64 {
|
||||||
|
@ -594,7 +593,7 @@ func (s *server) addChild(id int64, e entry) {
|
||||||
case *listenSocket:
|
case *listenSocket:
|
||||||
s.listenSockets[id] = v.refName
|
s.listenSockets[id] = v.refName
|
||||||
default:
|
default:
|
||||||
grpclog.Errorf("cannot add a child (id = %d) of type %T to a server", id, e)
|
logger.Errorf("cannot add a child (id = %d) of type %T to a server", id, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,6 @@ package channelz
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var once sync.Once
|
var once sync.Once
|
||||||
|
@ -39,6 +37,6 @@ type SocketOptionData struct {
|
||||||
// Windows OS doesn't support Socket Option
|
// Windows OS doesn't support Socket Option
|
||||||
func (s *SocketOptionData) Getsockopt(fd uintptr) {
|
func (s *SocketOptionData) Getsockopt(fd uintptr) {
|
||||||
once.Do(func() {
|
once.Do(func() {
|
||||||
grpclog.Warningln("Channelz: socket options are not supported on non-linux os and appengine.")
|
logger.Warning("Channelz: socket options are not supported on non-linux os and appengine.")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
// +build go1.10
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2020 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 credentials defines APIs for parsing SPIFFE ID.
|
||||||
|
//
|
||||||
|
// All APIs in this package are experimental.
|
||||||
|
package credentials
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"net/url"
|
||||||
|
|
||||||
|
"google.golang.org/grpc/grpclog"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SPIFFEIDFromState parses the SPIFFE ID from State. If the SPIFFE ID format
|
||||||
|
// is invalid, return nil with warning.
|
||||||
|
func SPIFFEIDFromState(state tls.ConnectionState) *url.URL {
|
||||||
|
if len(state.PeerCertificates) == 0 || len(state.PeerCertificates[0].URIs) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var spiffeID *url.URL
|
||||||
|
for _, uri := range state.PeerCertificates[0].URIs {
|
||||||
|
if uri == nil || uri.Scheme != "spiffe" || uri.Opaque != "" || (uri.User != nil && uri.User.Username() != "") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// From this point, we assume the uri is intended for a SPIFFE ID.
|
||||||
|
if len(uri.String()) > 2048 {
|
||||||
|
grpclog.Warning("invalid SPIFFE ID: total ID length larger than 2048 bytes")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if len(uri.Host) == 0 || len(uri.RawPath) == 0 || len(uri.Path) == 0 {
|
||||||
|
grpclog.Warning("invalid SPIFFE ID: domain or workload ID is empty")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if len(uri.Host) > 255 {
|
||||||
|
grpclog.Warning("invalid SPIFFE ID: domain length larger than 255 characters")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// A valid SPIFFE certificate can only have exactly one URI SAN field.
|
||||||
|
if len(state.PeerCertificates[0].URIs) > 1 {
|
||||||
|
grpclog.Warning("invalid SPIFFE ID: multiple URI SANs")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
spiffeID = uri
|
||||||
|
}
|
||||||
|
return spiffeID
|
||||||
|
}
|
|
@ -1,6 +1,8 @@
|
||||||
|
// +build !go1.10
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* Copyright 2017 gRPC authors.
|
* Copyright 2020 gRPC authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -16,29 +18,14 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// This file contains wrappers for grpclog functions.
|
package credentials
|
||||||
// The transport package only logs to verbose level 2 by default.
|
|
||||||
|
|
||||||
package transport
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"net/url"
|
||||||
|
)
|
||||||
|
|
||||||
import "google.golang.org/grpc/grpclog"
|
//TODO(ZhenLian): delete this file when we remove Go 1.9 tests.
|
||||||
|
func SPIFFEIDFromState(state tls.ConnectionState) *url.URL {
|
||||||
const logLevel = 2
|
return nil
|
||||||
|
|
||||||
func infof(format string, args ...interface{}) {
|
|
||||||
if grpclog.V(logLevel) {
|
|
||||||
grpclog.Infof(format, args...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func warningf(format string, args ...interface{}) {
|
|
||||||
if grpclog.V(logLevel) {
|
|
||||||
grpclog.Warningf(format, args...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func errorf(format string, args ...interface{}) {
|
|
||||||
if grpclog.V(logLevel) {
|
|
||||||
grpclog.Errorf(format, args...)
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -19,6 +19,10 @@
|
||||||
// Package grpclog (internal) defines depth logging for grpc.
|
// Package grpclog (internal) defines depth logging for grpc.
|
||||||
package grpclog
|
package grpclog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
// Logger is the logger used for the non-depth log functions.
|
// Logger is the logger used for the non-depth log functions.
|
||||||
var Logger LoggerV2
|
var Logger LoggerV2
|
||||||
|
|
||||||
|
@ -30,7 +34,7 @@ func InfoDepth(depth int, args ...interface{}) {
|
||||||
if DepthLogger != nil {
|
if DepthLogger != nil {
|
||||||
DepthLogger.InfoDepth(depth, args...)
|
DepthLogger.InfoDepth(depth, args...)
|
||||||
} else {
|
} else {
|
||||||
Logger.Info(args...)
|
Logger.Infoln(args...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +43,7 @@ func WarningDepth(depth int, args ...interface{}) {
|
||||||
if DepthLogger != nil {
|
if DepthLogger != nil {
|
||||||
DepthLogger.WarningDepth(depth, args...)
|
DepthLogger.WarningDepth(depth, args...)
|
||||||
} else {
|
} else {
|
||||||
Logger.Warning(args...)
|
Logger.Warningln(args...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +52,7 @@ func ErrorDepth(depth int, args ...interface{}) {
|
||||||
if DepthLogger != nil {
|
if DepthLogger != nil {
|
||||||
DepthLogger.ErrorDepth(depth, args...)
|
DepthLogger.ErrorDepth(depth, args...)
|
||||||
} else {
|
} else {
|
||||||
Logger.Error(args...)
|
Logger.Errorln(args...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,8 +61,9 @@ func FatalDepth(depth int, args ...interface{}) {
|
||||||
if DepthLogger != nil {
|
if DepthLogger != nil {
|
||||||
DepthLogger.FatalDepth(depth, args...)
|
DepthLogger.FatalDepth(depth, args...)
|
||||||
} else {
|
} else {
|
||||||
Logger.Fatal(args...)
|
Logger.Fatalln(args...)
|
||||||
}
|
}
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoggerV2 does underlying logging work for grpclog.
|
// LoggerV2 does underlying logging work for grpclog.
|
||||||
|
|
|
@ -18,10 +18,15 @@
|
||||||
|
|
||||||
package grpclog
|
package grpclog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
// PrefixLogger does logging with a prefix.
|
// PrefixLogger does logging with a prefix.
|
||||||
//
|
//
|
||||||
// Logging method on a nil logs without any prefix.
|
// Logging method on a nil logs without any prefix.
|
||||||
type PrefixLogger struct {
|
type PrefixLogger struct {
|
||||||
|
logger DepthLoggerV2
|
||||||
prefix string
|
prefix string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,34 +35,47 @@ func (pl *PrefixLogger) Infof(format string, args ...interface{}) {
|
||||||
if pl != nil {
|
if pl != nil {
|
||||||
// Handle nil, so the tests can pass in a nil logger.
|
// Handle nil, so the tests can pass in a nil logger.
|
||||||
format = pl.prefix + format
|
format = pl.prefix + format
|
||||||
|
pl.logger.InfoDepth(1, fmt.Sprintf(format, args...))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
Logger.Infof(format, args...)
|
InfoDepth(1, fmt.Sprintf(format, args...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warningf does warning logging.
|
// Warningf does warning logging.
|
||||||
func (pl *PrefixLogger) Warningf(format string, args ...interface{}) {
|
func (pl *PrefixLogger) Warningf(format string, args ...interface{}) {
|
||||||
if pl != nil {
|
if pl != nil {
|
||||||
format = pl.prefix + format
|
format = pl.prefix + format
|
||||||
|
pl.logger.WarningDepth(1, fmt.Sprintf(format, args...))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
Logger.Warningf(format, args...)
|
WarningDepth(1, fmt.Sprintf(format, args...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Errorf does error logging.
|
// Errorf does error logging.
|
||||||
func (pl *PrefixLogger) Errorf(format string, args ...interface{}) {
|
func (pl *PrefixLogger) Errorf(format string, args ...interface{}) {
|
||||||
if pl != nil {
|
if pl != nil {
|
||||||
format = pl.prefix + format
|
format = pl.prefix + format
|
||||||
|
pl.logger.ErrorDepth(1, fmt.Sprintf(format, args...))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
Logger.Errorf(format, args...)
|
ErrorDepth(1, fmt.Sprintf(format, args...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debugf does info logging at verbose level 2.
|
// Debugf does info logging at verbose level 2.
|
||||||
func (pl *PrefixLogger) Debugf(format string, args ...interface{}) {
|
func (pl *PrefixLogger) Debugf(format string, args ...interface{}) {
|
||||||
if Logger.V(2) {
|
if !Logger.V(2) {
|
||||||
pl.Infof(format, args...)
|
return
|
||||||
}
|
}
|
||||||
|
if pl != nil {
|
||||||
|
// Handle nil, so the tests can pass in a nil logger.
|
||||||
|
format = pl.prefix + format
|
||||||
|
pl.logger.InfoDepth(1, fmt.Sprintf(format, args...))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
InfoDepth(1, fmt.Sprintf(format, args...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewPrefixLogger creates a prefix logger with the given prefix.
|
// NewPrefixLogger creates a prefix logger with the given prefix.
|
||||||
func NewPrefixLogger(prefix string) *PrefixLogger {
|
func NewPrefixLogger(logger DepthLoggerV2, prefix string) *PrefixLogger {
|
||||||
return &PrefixLogger{prefix: prefix}
|
return &PrefixLogger{logger: logger, prefix: prefix}
|
||||||
}
|
}
|
||||||
|
|
63
vendor/google.golang.org/grpc/internal/grpcutil/encode_duration.go
generated
vendored
Normal file
63
vendor/google.golang.org/grpc/internal/grpcutil/encode_duration.go
generated
vendored
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2020 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 grpcutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const maxTimeoutValue int64 = 100000000 - 1
|
||||||
|
|
||||||
|
// div does integer division and round-up the result. Note that this is
|
||||||
|
// equivalent to (d+r-1)/r but has less chance to overflow.
|
||||||
|
func div(d, r time.Duration) int64 {
|
||||||
|
if d%r > 0 {
|
||||||
|
return int64(d/r + 1)
|
||||||
|
}
|
||||||
|
return int64(d / r)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EncodeDuration encodes the duration to the format grpc-timeout header
|
||||||
|
// accepts.
|
||||||
|
//
|
||||||
|
// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests
|
||||||
|
func EncodeDuration(t time.Duration) string {
|
||||||
|
// TODO: This is simplistic and not bandwidth efficient. Improve it.
|
||||||
|
if t <= 0 {
|
||||||
|
return "0n"
|
||||||
|
}
|
||||||
|
if d := div(t, time.Nanosecond); d <= maxTimeoutValue {
|
||||||
|
return strconv.FormatInt(d, 10) + "n"
|
||||||
|
}
|
||||||
|
if d := div(t, time.Microsecond); d <= maxTimeoutValue {
|
||||||
|
return strconv.FormatInt(d, 10) + "u"
|
||||||
|
}
|
||||||
|
if d := div(t, time.Millisecond); d <= maxTimeoutValue {
|
||||||
|
return strconv.FormatInt(d, 10) + "m"
|
||||||
|
}
|
||||||
|
if d := div(t, time.Second); d <= maxTimeoutValue {
|
||||||
|
return strconv.FormatInt(d, 10) + "S"
|
||||||
|
}
|
||||||
|
if d := div(t, time.Minute); d <= maxTimeoutValue {
|
||||||
|
return strconv.FormatInt(d, 10) + "M"
|
||||||
|
}
|
||||||
|
// Note that maxTimeoutValue * time.Hour > MaxInt64.
|
||||||
|
return strconv.FormatInt(div(t, time.Hour), 10) + "H"
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2020 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 grpcutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"google.golang.org/grpc/metadata"
|
||||||
|
)
|
||||||
|
|
||||||
|
type mdExtraKey struct{}
|
||||||
|
|
||||||
|
// WithExtraMetadata creates a new context with incoming md attached.
|
||||||
|
func WithExtraMetadata(ctx context.Context, md metadata.MD) context.Context {
|
||||||
|
return context.WithValue(ctx, mdExtraKey{}, md)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExtraMetadata returns the incoming metadata in ctx if it exists. The
|
||||||
|
// returned MD should not be modified. Writing to it may cause races.
|
||||||
|
// Modification should be made to copies of the returned MD.
|
||||||
|
func ExtraMetadata(ctx context.Context) (md metadata.MD, ok bool) {
|
||||||
|
md, ok = ctx.Value(mdExtraKey{}).(metadata.MD)
|
||||||
|
return
|
||||||
|
}
|
|
@ -38,3 +38,47 @@ func ParseMethod(methodName string) (service, method string, _ error) {
|
||||||
}
|
}
|
||||||
return methodName[:pos], methodName[pos+1:], nil
|
return methodName[:pos], methodName[pos+1:], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const baseContentType = "application/grpc"
|
||||||
|
|
||||||
|
// ContentSubtype returns the content-subtype for the given content-type. The
|
||||||
|
// given content-type must be a valid content-type that starts with
|
||||||
|
// "application/grpc". A content-subtype will follow "application/grpc" after a
|
||||||
|
// "+" or ";". See
|
||||||
|
// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for
|
||||||
|
// more details.
|
||||||
|
//
|
||||||
|
// If contentType is not a valid content-type for gRPC, the boolean
|
||||||
|
// will be false, otherwise true. If content-type == "application/grpc",
|
||||||
|
// "application/grpc+", or "application/grpc;", the boolean will be true,
|
||||||
|
// but no content-subtype will be returned.
|
||||||
|
//
|
||||||
|
// contentType is assumed to be lowercase already.
|
||||||
|
func ContentSubtype(contentType string) (string, bool) {
|
||||||
|
if contentType == baseContentType {
|
||||||
|
return "", true
|
||||||
|
}
|
||||||
|
if !strings.HasPrefix(contentType, baseContentType) {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
// guaranteed since != baseContentType and has baseContentType prefix
|
||||||
|
switch contentType[len(baseContentType)] {
|
||||||
|
case '+', ';':
|
||||||
|
// this will return true for "application/grpc+" or "application/grpc;"
|
||||||
|
// which the previous validContentType function tested to be valid, so we
|
||||||
|
// just say that no content-subtype is specified in this case
|
||||||
|
return contentType[len(baseContentType)+1:], true
|
||||||
|
default:
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ContentType builds full content type with the given sub-type.
|
||||||
|
//
|
||||||
|
// contentSubtype is assumed to be lowercase
|
||||||
|
func ContentType(contentSubtype string) string {
|
||||||
|
if contentSubtype == "" {
|
||||||
|
return baseContentType
|
||||||
|
}
|
||||||
|
return baseContentType + "+" + contentSubtype
|
||||||
|
}
|
||||||
|
|
|
@ -44,6 +44,8 @@ import (
|
||||||
// addresses from SRV records. Must not be changed after init time.
|
// addresses from SRV records. Must not be changed after init time.
|
||||||
var EnableSRVLookups = false
|
var EnableSRVLookups = false
|
||||||
|
|
||||||
|
var logger = grpclog.Component("dns")
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
resolver.Register(NewBuilder())
|
resolver.Register(NewBuilder())
|
||||||
}
|
}
|
||||||
|
@ -272,7 +274,7 @@ func handleDNSError(err error, lookupType string) error {
|
||||||
err = filterError(err)
|
err = filterError(err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fmt.Errorf("dns: %v record lookup error: %v", lookupType, err)
|
err = fmt.Errorf("dns: %v record lookup error: %v", lookupType, err)
|
||||||
grpclog.Infoln(err)
|
logger.Info(err)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -295,7 +297,7 @@ func (d *dnsResolver) lookupTXT() *serviceconfig.ParseResult {
|
||||||
|
|
||||||
// TXT record must have "grpc_config=" attribute in order to be used as service config.
|
// TXT record must have "grpc_config=" attribute in order to be used as service config.
|
||||||
if !strings.HasPrefix(res, txtAttribute) {
|
if !strings.HasPrefix(res, txtAttribute) {
|
||||||
grpclog.Warningf("dns: TXT record %v missing %v attribute", res, txtAttribute)
|
logger.Warningf("dns: TXT record %v missing %v attribute", res, txtAttribute)
|
||||||
// This is not an error; it is the equivalent of not having a service config.
|
// This is not an error; it is the equivalent of not having a service config.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -421,12 +423,12 @@ func canaryingSC(js string) string {
|
||||||
var rcs []rawChoice
|
var rcs []rawChoice
|
||||||
err := json.Unmarshal([]byte(js), &rcs)
|
err := json.Unmarshal([]byte(js), &rcs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Warningf("dns: error parsing service config json: %v", err)
|
logger.Warningf("dns: error parsing service config json: %v", err)
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
cliHostname, err := os.Hostname()
|
cliHostname, err := os.Hostname()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Warningf("dns: error getting client hostname: %v", err)
|
logger.Warningf("dns: error getting client hostname: %v", err)
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
var sc string
|
var sc string
|
||||||
|
|
|
@ -32,11 +32,13 @@ import (
|
||||||
"google.golang.org/grpc/grpclog"
|
"google.golang.org/grpc/grpclog"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var logger = grpclog.Component("core")
|
||||||
|
|
||||||
// GetCPUTime returns the how much CPU time has passed since the start of this process.
|
// GetCPUTime returns the how much CPU time has passed since the start of this process.
|
||||||
func GetCPUTime() int64 {
|
func GetCPUTime() int64 {
|
||||||
var ts unix.Timespec
|
var ts unix.Timespec
|
||||||
if err := unix.ClockGettime(unix.CLOCK_PROCESS_CPUTIME_ID, &ts); err != nil {
|
if err := unix.ClockGettime(unix.CLOCK_PROCESS_CPUTIME_ID, &ts); err != nil {
|
||||||
grpclog.Fatal(err)
|
logger.Fatal(err)
|
||||||
}
|
}
|
||||||
return ts.Nano()
|
return ts.Nano()
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,10 +31,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var once sync.Once
|
var once sync.Once
|
||||||
|
var logger = grpclog.Component("core")
|
||||||
|
|
||||||
func log() {
|
func log() {
|
||||||
once.Do(func() {
|
once.Do(func() {
|
||||||
grpclog.Info("CPU time info is unavailable on non-linux or appengine environment.")
|
logger.Info("CPU time info is unavailable on non-linux or appengine environment.")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -505,7 +505,9 @@ func (l *loopyWriter) run() (err error) {
|
||||||
// 1. When the connection is closed by some other known issue.
|
// 1. When the connection is closed by some other known issue.
|
||||||
// 2. User closed the connection.
|
// 2. User closed the connection.
|
||||||
// 3. A graceful close of connection.
|
// 3. A graceful close of connection.
|
||||||
infof("transport: loopyWriter.run returning. %v", err)
|
if logger.V(logLevel) {
|
||||||
|
logger.Infof("transport: loopyWriter.run returning. %v", err)
|
||||||
|
}
|
||||||
err = nil
|
err = nil
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
@ -605,7 +607,9 @@ func (l *loopyWriter) headerHandler(h *headerFrame) error {
|
||||||
if l.side == serverSide {
|
if l.side == serverSide {
|
||||||
str, ok := l.estdStreams[h.streamID]
|
str, ok := l.estdStreams[h.streamID]
|
||||||
if !ok {
|
if !ok {
|
||||||
warningf("transport: loopy doesn't recognize the stream: %d", h.streamID)
|
if logger.V(logLevel) {
|
||||||
|
logger.Warningf("transport: loopy doesn't recognize the stream: %d", h.streamID)
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// Case 1.A: Server is responding back with headers.
|
// Case 1.A: Server is responding back with headers.
|
||||||
|
@ -658,7 +662,9 @@ func (l *loopyWriter) writeHeader(streamID uint32, endStream bool, hf []hpack.He
|
||||||
l.hBuf.Reset()
|
l.hBuf.Reset()
|
||||||
for _, f := range hf {
|
for _, f := range hf {
|
||||||
if err := l.hEnc.WriteField(f); err != nil {
|
if err := l.hEnc.WriteField(f); err != nil {
|
||||||
warningf("transport: loopyWriter.writeHeader encountered error while encoding headers:", err)
|
if logger.V(logLevel) {
|
||||||
|
logger.Warningf("transport: loopyWriter.writeHeader encountered error while encoding headers: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var (
|
var (
|
||||||
|
|
|
@ -39,6 +39,7 @@ import (
|
||||||
"golang.org/x/net/http2"
|
"golang.org/x/net/http2"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
|
"google.golang.org/grpc/internal/grpcutil"
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
"google.golang.org/grpc/peer"
|
"google.golang.org/grpc/peer"
|
||||||
"google.golang.org/grpc/stats"
|
"google.golang.org/grpc/stats"
|
||||||
|
@ -57,7 +58,7 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats sta
|
||||||
}
|
}
|
||||||
contentType := r.Header.Get("Content-Type")
|
contentType := r.Header.Get("Content-Type")
|
||||||
// TODO: do we assume contentType is lowercase? we did before
|
// TODO: do we assume contentType is lowercase? we did before
|
||||||
contentSubtype, validContentType := contentSubtype(contentType)
|
contentSubtype, validContentType := grpcutil.ContentSubtype(contentType)
|
||||||
if !validContentType {
|
if !validContentType {
|
||||||
return nil, errors.New("invalid gRPC request content-type")
|
return nil, errors.New("invalid gRPC request content-type")
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ import (
|
||||||
|
|
||||||
"golang.org/x/net/http2"
|
"golang.org/x/net/http2"
|
||||||
"golang.org/x/net/http2/hpack"
|
"golang.org/x/net/http2/hpack"
|
||||||
|
"google.golang.org/grpc/internal/grpcutil"
|
||||||
|
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
|
@ -354,7 +355,9 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts
|
||||||
t.loopy = newLoopyWriter(clientSide, t.framer, t.controlBuf, t.bdpEst)
|
t.loopy = newLoopyWriter(clientSide, t.framer, t.controlBuf, t.bdpEst)
|
||||||
err := t.loopy.run()
|
err := t.loopy.run()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errorf("transport: loopyWriter.run returning. Err: %v", err)
|
if logger.V(logLevel) {
|
||||||
|
logger.Errorf("transport: loopyWriter.run returning. Err: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// If it's a connection error, let reader goroutine handle it
|
// If it's a connection error, let reader goroutine handle it
|
||||||
// since there might be data in the buffers.
|
// since there might be data in the buffers.
|
||||||
|
@ -434,7 +437,7 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr)
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: ":scheme", Value: t.scheme})
|
headerFields = append(headerFields, hpack.HeaderField{Name: ":scheme", Value: t.scheme})
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: ":path", Value: callHdr.Method})
|
headerFields = append(headerFields, hpack.HeaderField{Name: ":path", Value: callHdr.Method})
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: ":authority", Value: callHdr.Host})
|
headerFields = append(headerFields, hpack.HeaderField{Name: ":authority", Value: callHdr.Host})
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: "content-type", Value: contentType(callHdr.ContentSubtype)})
|
headerFields = append(headerFields, hpack.HeaderField{Name: "content-type", Value: grpcutil.ContentType(callHdr.ContentSubtype)})
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: "user-agent", Value: t.userAgent})
|
headerFields = append(headerFields, hpack.HeaderField{Name: "user-agent", Value: t.userAgent})
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: "te", Value: "trailers"})
|
headerFields = append(headerFields, hpack.HeaderField{Name: "te", Value: "trailers"})
|
||||||
if callHdr.PreviousAttempts > 0 {
|
if callHdr.PreviousAttempts > 0 {
|
||||||
|
@ -449,7 +452,7 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr)
|
||||||
// Send out timeout regardless its value. The server can detect timeout context by itself.
|
// Send out timeout regardless its value. The server can detect timeout context by itself.
|
||||||
// TODO(mmukhi): Perhaps this field should be updated when actually writing out to the wire.
|
// TODO(mmukhi): Perhaps this field should be updated when actually writing out to the wire.
|
||||||
timeout := time.Until(dl)
|
timeout := time.Until(dl)
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-timeout", Value: encodeTimeout(timeout)})
|
headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-timeout", Value: grpcutil.EncodeDuration(timeout)})
|
||||||
}
|
}
|
||||||
for k, v := range authData {
|
for k, v := range authData {
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
|
headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
|
||||||
|
@ -1013,7 +1016,9 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) {
|
||||||
}
|
}
|
||||||
statusCode, ok := http2ErrConvTab[f.ErrCode]
|
statusCode, ok := http2ErrConvTab[f.ErrCode]
|
||||||
if !ok {
|
if !ok {
|
||||||
warningf("transport: http2Client.handleRSTStream found no mapped gRPC status for the received http2 error %v", f.ErrCode)
|
if logger.V(logLevel) {
|
||||||
|
logger.Warningf("transport: http2Client.handleRSTStream found no mapped gRPC status for the received http2 error %v", f.ErrCode)
|
||||||
|
}
|
||||||
statusCode = codes.Unknown
|
statusCode = codes.Unknown
|
||||||
}
|
}
|
||||||
if statusCode == codes.Canceled {
|
if statusCode == codes.Canceled {
|
||||||
|
@ -1095,7 +1100,9 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if f.ErrCode == http2.ErrCodeEnhanceYourCalm {
|
if f.ErrCode == http2.ErrCodeEnhanceYourCalm {
|
||||||
infof("Client received GoAway with http2.ErrCodeEnhanceYourCalm.")
|
if logger.V(logLevel) {
|
||||||
|
logger.Infof("Client received GoAway with http2.ErrCodeEnhanceYourCalm.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
id := f.LastStreamID
|
id := f.LastStreamID
|
||||||
if id > 0 && id%2 != 1 {
|
if id > 0 && id%2 != 1 {
|
||||||
|
@ -1325,7 +1332,9 @@ func (t *http2Client) reader() {
|
||||||
case *http2.WindowUpdateFrame:
|
case *http2.WindowUpdateFrame:
|
||||||
t.handleWindowUpdate(frame)
|
t.handleWindowUpdate(frame)
|
||||||
default:
|
default:
|
||||||
errorf("transport: http2Client.reader got unhandled frame type %v.", frame)
|
if logger.V(logLevel) {
|
||||||
|
logger.Errorf("transport: http2Client.reader got unhandled frame type %v.", frame)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,10 +34,10 @@ import (
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
"golang.org/x/net/http2"
|
"golang.org/x/net/http2"
|
||||||
"golang.org/x/net/http2/hpack"
|
"golang.org/x/net/http2/hpack"
|
||||||
|
"google.golang.org/grpc/internal/grpcutil"
|
||||||
|
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
"google.golang.org/grpc/internal/channelz"
|
"google.golang.org/grpc/internal/channelz"
|
||||||
"google.golang.org/grpc/internal/grpcrand"
|
"google.golang.org/grpc/internal/grpcrand"
|
||||||
"google.golang.org/grpc/keepalive"
|
"google.golang.org/grpc/keepalive"
|
||||||
|
@ -289,7 +289,9 @@ func newHTTP2Server(conn net.Conn, config *ServerConfig) (_ ServerTransport, err
|
||||||
t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst)
|
t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst)
|
||||||
t.loopy.ssGoAwayHandler = t.outgoingGoAwayHandler
|
t.loopy.ssGoAwayHandler = t.outgoingGoAwayHandler
|
||||||
if err := t.loopy.run(); err != nil {
|
if err := t.loopy.run(); err != nil {
|
||||||
errorf("transport: loopyWriter.run returning. Err: %v", err)
|
if logger.V(logLevel) {
|
||||||
|
logger.Errorf("transport: loopyWriter.run returning. Err: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
t.conn.Close()
|
t.conn.Close()
|
||||||
close(t.writerDone)
|
close(t.writerDone)
|
||||||
|
@ -360,7 +362,9 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
|
||||||
}
|
}
|
||||||
s.ctx, err = t.inTapHandle(s.ctx, info)
|
s.ctx, err = t.inTapHandle(s.ctx, info)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
warningf("transport: http2Server.operateHeaders got an error from InTapHandle: %v", err)
|
if logger.V(logLevel) {
|
||||||
|
logger.Warningf("transport: http2Server.operateHeaders got an error from InTapHandle: %v", err)
|
||||||
|
}
|
||||||
t.controlBuf.put(&cleanupStream{
|
t.controlBuf.put(&cleanupStream{
|
||||||
streamID: s.id,
|
streamID: s.id,
|
||||||
rst: true,
|
rst: true,
|
||||||
|
@ -391,7 +395,9 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
|
||||||
if streamID%2 != 1 || streamID <= t.maxStreamID {
|
if streamID%2 != 1 || streamID <= t.maxStreamID {
|
||||||
t.mu.Unlock()
|
t.mu.Unlock()
|
||||||
// illegal gRPC stream id.
|
// illegal gRPC stream id.
|
||||||
errorf("transport: http2Server.HandleStreams received an illegal stream id: %v", streamID)
|
if logger.V(logLevel) {
|
||||||
|
logger.Errorf("transport: http2Server.HandleStreams received an illegal stream id: %v", streamID)
|
||||||
|
}
|
||||||
s.cancel()
|
s.cancel()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -454,7 +460,9 @@ func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context.
|
||||||
atomic.StoreInt64(&t.lastRead, time.Now().UnixNano())
|
atomic.StoreInt64(&t.lastRead, time.Now().UnixNano())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if se, ok := err.(http2.StreamError); ok {
|
if se, ok := err.(http2.StreamError); ok {
|
||||||
warningf("transport: http2Server.HandleStreams encountered http2.StreamError: %v", se)
|
if logger.V(logLevel) {
|
||||||
|
logger.Warningf("transport: http2Server.HandleStreams encountered http2.StreamError: %v", se)
|
||||||
|
}
|
||||||
t.mu.Lock()
|
t.mu.Lock()
|
||||||
s := t.activeStreams[se.StreamID]
|
s := t.activeStreams[se.StreamID]
|
||||||
t.mu.Unlock()
|
t.mu.Unlock()
|
||||||
|
@ -474,7 +482,9 @@ func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context.
|
||||||
t.Close()
|
t.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
warningf("transport: http2Server.HandleStreams failed to read frame: %v", err)
|
if logger.V(logLevel) {
|
||||||
|
logger.Warningf("transport: http2Server.HandleStreams failed to read frame: %v", err)
|
||||||
|
}
|
||||||
t.Close()
|
t.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -497,7 +507,9 @@ func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context.
|
||||||
case *http2.GoAwayFrame:
|
case *http2.GoAwayFrame:
|
||||||
// TODO: Handle GoAway from the client appropriately.
|
// TODO: Handle GoAway from the client appropriately.
|
||||||
default:
|
default:
|
||||||
errorf("transport: http2Server.HandleStreams found unhandled frame type %v.", frame)
|
if logger.V(logLevel) {
|
||||||
|
logger.Errorf("transport: http2Server.HandleStreams found unhandled frame type %v.", frame)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -719,7 +731,9 @@ func (t *http2Server) handlePing(f *http2.PingFrame) {
|
||||||
|
|
||||||
if t.pingStrikes > maxPingStrikes {
|
if t.pingStrikes > maxPingStrikes {
|
||||||
// Send goaway and close the connection.
|
// Send goaway and close the connection.
|
||||||
errorf("transport: Got too many pings from the client, closing the connection.")
|
if logger.V(logLevel) {
|
||||||
|
logger.Errorf("transport: Got too many pings from the client, closing the connection.")
|
||||||
|
}
|
||||||
t.controlBuf.put(&goAway{code: http2.ErrCodeEnhanceYourCalm, debugData: []byte("too_many_pings"), closeConn: true})
|
t.controlBuf.put(&goAway{code: http2.ErrCodeEnhanceYourCalm, debugData: []byte("too_many_pings"), closeConn: true})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -752,7 +766,9 @@ func (t *http2Server) checkForHeaderListSize(it interface{}) bool {
|
||||||
var sz int64
|
var sz int64
|
||||||
for _, f := range hdrFrame.hf {
|
for _, f := range hdrFrame.hf {
|
||||||
if sz += int64(f.Size()); sz > int64(*t.maxSendHeaderListSize) {
|
if sz += int64(f.Size()); sz > int64(*t.maxSendHeaderListSize) {
|
||||||
errorf("header list size to send violates the maximum size (%d bytes) set by client", *t.maxSendHeaderListSize)
|
if logger.V(logLevel) {
|
||||||
|
logger.Errorf("header list size to send violates the maximum size (%d bytes) set by client", *t.maxSendHeaderListSize)
|
||||||
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -789,7 +805,7 @@ func (t *http2Server) writeHeaderLocked(s *Stream) error {
|
||||||
// first and create a slice of that exact size.
|
// first and create a slice of that exact size.
|
||||||
headerFields := make([]hpack.HeaderField, 0, 2) // at least :status, content-type will be there if none else.
|
headerFields := make([]hpack.HeaderField, 0, 2) // at least :status, content-type will be there if none else.
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: ":status", Value: "200"})
|
headerFields = append(headerFields, hpack.HeaderField{Name: ":status", Value: "200"})
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: "content-type", Value: contentType(s.contentSubtype)})
|
headerFields = append(headerFields, hpack.HeaderField{Name: "content-type", Value: grpcutil.ContentType(s.contentSubtype)})
|
||||||
if s.sendCompress != "" {
|
if s.sendCompress != "" {
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-encoding", Value: s.sendCompress})
|
headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-encoding", Value: s.sendCompress})
|
||||||
}
|
}
|
||||||
|
@ -839,7 +855,7 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error {
|
||||||
}
|
}
|
||||||
} else { // Send a trailer only response.
|
} else { // Send a trailer only response.
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: ":status", Value: "200"})
|
headerFields = append(headerFields, hpack.HeaderField{Name: ":status", Value: "200"})
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: "content-type", Value: contentType(s.contentSubtype)})
|
headerFields = append(headerFields, hpack.HeaderField{Name: "content-type", Value: grpcutil.ContentType(s.contentSubtype)})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-status", Value: strconv.Itoa(int(st.Code()))})
|
headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-status", Value: strconv.Itoa(int(st.Code()))})
|
||||||
|
@ -849,7 +865,7 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error {
|
||||||
stBytes, err := proto.Marshal(p)
|
stBytes, err := proto.Marshal(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// TODO: return error instead, when callers are able to handle it.
|
// TODO: return error instead, when callers are able to handle it.
|
||||||
grpclog.Errorf("transport: failed to marshal rpc status: %v, error: %v", p, err)
|
logger.Errorf("transport: failed to marshal rpc status: %v, error: %v", p, err)
|
||||||
} else {
|
} else {
|
||||||
headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-status-details-bin", Value: encodeBinHeader(stBytes)})
|
headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-status-details-bin", Value: encodeBinHeader(stBytes)})
|
||||||
}
|
}
|
||||||
|
@ -980,7 +996,9 @@ func (t *http2Server) keepalive() {
|
||||||
select {
|
select {
|
||||||
case <-ageTimer.C:
|
case <-ageTimer.C:
|
||||||
// Close the connection after grace period.
|
// Close the connection after grace period.
|
||||||
infof("transport: closing server transport due to maximum connection age.")
|
if logger.V(logLevel) {
|
||||||
|
logger.Infof("transport: closing server transport due to maximum connection age.")
|
||||||
|
}
|
||||||
t.Close()
|
t.Close()
|
||||||
case <-t.done:
|
case <-t.done:
|
||||||
}
|
}
|
||||||
|
@ -997,7 +1015,9 @@ func (t *http2Server) keepalive() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if outstandingPing && kpTimeoutLeft <= 0 {
|
if outstandingPing && kpTimeoutLeft <= 0 {
|
||||||
infof("transport: closing server transport due to idleness.")
|
if logger.V(logLevel) {
|
||||||
|
logger.Infof("transport: closing server transport due to idleness.")
|
||||||
|
}
|
||||||
t.Close()
|
t.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,8 @@ import (
|
||||||
"golang.org/x/net/http2/hpack"
|
"golang.org/x/net/http2/hpack"
|
||||||
spb "google.golang.org/genproto/googleapis/rpc/status"
|
spb "google.golang.org/genproto/googleapis/rpc/status"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
|
"google.golang.org/grpc/grpclog"
|
||||||
|
"google.golang.org/grpc/internal/grpcutil"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -50,7 +52,7 @@ const (
|
||||||
// "proto" as a suffix after "+" or ";". See
|
// "proto" as a suffix after "+" or ";". See
|
||||||
// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests
|
// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests
|
||||||
// for more details.
|
// for more details.
|
||||||
baseContentType = "application/grpc"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -97,6 +99,7 @@ var (
|
||||||
// 504 Gateway timeout - UNAVAILABLE.
|
// 504 Gateway timeout - UNAVAILABLE.
|
||||||
http.StatusGatewayTimeout: codes.Unavailable,
|
http.StatusGatewayTimeout: codes.Unavailable,
|
||||||
}
|
}
|
||||||
|
logger = grpclog.Component("transport")
|
||||||
)
|
)
|
||||||
|
|
||||||
type parsedHeaderData struct {
|
type parsedHeaderData struct {
|
||||||
|
@ -182,46 +185,6 @@ func isWhitelistedHeader(hdr string) bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// contentSubtype returns the content-subtype for the given content-type. The
|
|
||||||
// given content-type must be a valid content-type that starts with
|
|
||||||
// "application/grpc". A content-subtype will follow "application/grpc" after a
|
|
||||||
// "+" or ";". See
|
|
||||||
// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// If contentType is not a valid content-type for gRPC, the boolean
|
|
||||||
// will be false, otherwise true. If content-type == "application/grpc",
|
|
||||||
// "application/grpc+", or "application/grpc;", the boolean will be true,
|
|
||||||
// but no content-subtype will be returned.
|
|
||||||
//
|
|
||||||
// contentType is assumed to be lowercase already.
|
|
||||||
func contentSubtype(contentType string) (string, bool) {
|
|
||||||
if contentType == baseContentType {
|
|
||||||
return "", true
|
|
||||||
}
|
|
||||||
if !strings.HasPrefix(contentType, baseContentType) {
|
|
||||||
return "", false
|
|
||||||
}
|
|
||||||
// guaranteed since != baseContentType and has baseContentType prefix
|
|
||||||
switch contentType[len(baseContentType)] {
|
|
||||||
case '+', ';':
|
|
||||||
// this will return true for "application/grpc+" or "application/grpc;"
|
|
||||||
// which the previous validContentType function tested to be valid, so we
|
|
||||||
// just say that no content-subtype is specified in this case
|
|
||||||
return contentType[len(baseContentType)+1:], true
|
|
||||||
default:
|
|
||||||
return "", false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// contentSubtype is assumed to be lowercase
|
|
||||||
func contentType(contentSubtype string) string {
|
|
||||||
if contentSubtype == "" {
|
|
||||||
return baseContentType
|
|
||||||
}
|
|
||||||
return baseContentType + "+" + contentSubtype
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decodeState) status() *status.Status {
|
func (d *decodeState) status() *status.Status {
|
||||||
if d.data.statusGen == nil {
|
if d.data.statusGen == nil {
|
||||||
// No status-details were provided; generate status using code/msg.
|
// No status-details were provided; generate status using code/msg.
|
||||||
|
@ -340,7 +303,7 @@ func (d *decodeState) addMetadata(k, v string) {
|
||||||
func (d *decodeState) processHeaderField(f hpack.HeaderField) {
|
func (d *decodeState) processHeaderField(f hpack.HeaderField) {
|
||||||
switch f.Name {
|
switch f.Name {
|
||||||
case "content-type":
|
case "content-type":
|
||||||
contentSubtype, validContentType := contentSubtype(f.Value)
|
contentSubtype, validContentType := grpcutil.ContentSubtype(f.Value)
|
||||||
if !validContentType {
|
if !validContentType {
|
||||||
d.data.contentTypeErr = fmt.Sprintf("transport: received the unexpected content-type %q", f.Value)
|
d.data.contentTypeErr = fmt.Sprintf("transport: received the unexpected content-type %q", f.Value)
|
||||||
return
|
return
|
||||||
|
@ -412,7 +375,9 @@ func (d *decodeState) processHeaderField(f hpack.HeaderField) {
|
||||||
}
|
}
|
||||||
v, err := decodeMetadataHeader(f.Name, f.Value)
|
v, err := decodeMetadataHeader(f.Name, f.Value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errorf("Failed to decode metadata header (%q, %q): %v", f.Name, f.Value, err)
|
if logger.V(logLevel) {
|
||||||
|
logger.Errorf("Failed to decode metadata header (%q, %q): %v", f.Name, f.Value, err)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
d.addMetadata(f.Name, v)
|
d.addMetadata(f.Name, v)
|
||||||
|
@ -449,41 +414,6 @@ func timeoutUnitToDuration(u timeoutUnit) (d time.Duration, ok bool) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const maxTimeoutValue int64 = 100000000 - 1
|
|
||||||
|
|
||||||
// div does integer division and round-up the result. Note that this is
|
|
||||||
// equivalent to (d+r-1)/r but has less chance to overflow.
|
|
||||||
func div(d, r time.Duration) int64 {
|
|
||||||
if m := d % r; m > 0 {
|
|
||||||
return int64(d/r + 1)
|
|
||||||
}
|
|
||||||
return int64(d / r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO(zhaoq): It is the simplistic and not bandwidth efficient. Improve it.
|
|
||||||
func encodeTimeout(t time.Duration) string {
|
|
||||||
if t <= 0 {
|
|
||||||
return "0n"
|
|
||||||
}
|
|
||||||
if d := div(t, time.Nanosecond); d <= maxTimeoutValue {
|
|
||||||
return strconv.FormatInt(d, 10) + "n"
|
|
||||||
}
|
|
||||||
if d := div(t, time.Microsecond); d <= maxTimeoutValue {
|
|
||||||
return strconv.FormatInt(d, 10) + "u"
|
|
||||||
}
|
|
||||||
if d := div(t, time.Millisecond); d <= maxTimeoutValue {
|
|
||||||
return strconv.FormatInt(d, 10) + "m"
|
|
||||||
}
|
|
||||||
if d := div(t, time.Second); d <= maxTimeoutValue {
|
|
||||||
return strconv.FormatInt(d, 10) + "S"
|
|
||||||
}
|
|
||||||
if d := div(t, time.Minute); d <= maxTimeoutValue {
|
|
||||||
return strconv.FormatInt(d, 10) + "M"
|
|
||||||
}
|
|
||||||
// Note that maxTimeoutValue * time.Hour > MaxInt64.
|
|
||||||
return strconv.FormatInt(div(t, time.Hour), 10) + "H"
|
|
||||||
}
|
|
||||||
|
|
||||||
func decodeTimeout(s string) (time.Duration, error) {
|
func decodeTimeout(s string) (time.Duration, error) {
|
||||||
size := len(s)
|
size := len(s)
|
||||||
if size < 2 {
|
if size < 2 {
|
||||||
|
|
|
@ -41,6 +41,8 @@ import (
|
||||||
"google.golang.org/grpc/tap"
|
"google.golang.org/grpc/tap"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const logLevel = 2
|
||||||
|
|
||||||
type bufferPool struct {
|
type bufferPool struct {
|
||||||
pool sync.Pool
|
pool sync.Pool
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,6 @@ import (
|
||||||
|
|
||||||
"google.golang.org/grpc/balancer"
|
"google.golang.org/grpc/balancer"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
"google.golang.org/grpc/internal/channelz"
|
"google.golang.org/grpc/internal/channelz"
|
||||||
"google.golang.org/grpc/internal/transport"
|
"google.golang.org/grpc/internal/transport"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
|
@ -145,7 +144,7 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer.
|
||||||
|
|
||||||
acw, ok := pickResult.SubConn.(*acBalancerWrapper)
|
acw, ok := pickResult.SubConn.(*acBalancerWrapper)
|
||||||
if !ok {
|
if !ok {
|
||||||
grpclog.Error("subconn returned from pick is not *acBalancerWrapper")
|
logger.Error("subconn returned from pick is not *acBalancerWrapper")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if t, ok := acw.getAddrConn().getReadyTransport(); ok {
|
if t, ok := acw.getAddrConn().getReadyTransport(); ok {
|
||||||
|
@ -159,7 +158,7 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer.
|
||||||
// DoneInfo with default value works.
|
// DoneInfo with default value works.
|
||||||
pickResult.Done(balancer.DoneInfo{})
|
pickResult.Done(balancer.DoneInfo{})
|
||||||
}
|
}
|
||||||
grpclog.Infof("blockingPicker: the picked transport is not ready, loop back to repick")
|
logger.Infof("blockingPicker: the picked transport is not ready, loop back to repick")
|
||||||
// If ok == false, ac.state is not READY.
|
// If ok == false, ac.state is not READY.
|
||||||
// A valid picker always returns READY subConn. This means the state of ac
|
// A valid picker always returns READY subConn. This means the state of ac
|
||||||
// just changed, and picker will be updated shortly.
|
// just changed, and picker will be updated shortly.
|
||||||
|
|
|
@ -24,7 +24,6 @@ import (
|
||||||
|
|
||||||
"google.golang.org/grpc/balancer"
|
"google.golang.org/grpc/balancer"
|
||||||
"google.golang.org/grpc/connectivity"
|
"google.golang.org/grpc/connectivity"
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// PickFirstBalancerName is the name of the pick_first balancer.
|
// PickFirstBalancerName is the name of the pick_first balancer.
|
||||||
|
@ -58,8 +57,8 @@ func (b *pickfirstBalancer) ResolverError(err error) {
|
||||||
Picker: &picker{err: fmt.Errorf("name resolver error: %v", err)},
|
Picker: &picker{err: fmt.Errorf("name resolver error: %v", err)},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Infof("pickfirstBalancer: ResolverError called with error %v", err)
|
logger.Infof("pickfirstBalancer: ResolverError called with error %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,8 +71,8 @@ func (b *pickfirstBalancer) UpdateClientConnState(cs balancer.ClientConnState) e
|
||||||
var err error
|
var err error
|
||||||
b.sc, err = b.cc.NewSubConn(cs.ResolverState.Addresses, balancer.NewSubConnOptions{})
|
b.sc, err = b.cc.NewSubConn(cs.ResolverState.Addresses, balancer.NewSubConnOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Errorf("pickfirstBalancer: failed to NewSubConn: %v", err)
|
logger.Errorf("pickfirstBalancer: failed to NewSubConn: %v", err)
|
||||||
}
|
}
|
||||||
b.state = connectivity.TransientFailure
|
b.state = connectivity.TransientFailure
|
||||||
b.cc.UpdateState(balancer.State{ConnectivityState: connectivity.TransientFailure,
|
b.cc.UpdateState(balancer.State{ConnectivityState: connectivity.TransientFailure,
|
||||||
|
@ -92,12 +91,12 @@ func (b *pickfirstBalancer) UpdateClientConnState(cs balancer.ClientConnState) e
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *pickfirstBalancer) UpdateSubConnState(sc balancer.SubConn, s balancer.SubConnState) {
|
func (b *pickfirstBalancer) UpdateSubConnState(sc balancer.SubConn, s balancer.SubConnState) {
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Infof("pickfirstBalancer: UpdateSubConnState: %p, %v", sc, s)
|
logger.Infof("pickfirstBalancer: UpdateSubConnState: %p, %v", sc, s)
|
||||||
}
|
}
|
||||||
if b.sc != sc {
|
if b.sc != sc {
|
||||||
if grpclog.V(2) {
|
if logger.V(2) {
|
||||||
grpclog.Infof("pickfirstBalancer: ignored state change because sc is not recognized")
|
logger.Infof("pickfirstBalancer: ignored state change because sc is not recognized")
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,7 +140,7 @@ func (ccr *ccResolverWrapper) UpdateState(s resolver.State) {
|
||||||
if ccr.done.HasFired() {
|
if ccr.done.HasFired() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
channelz.Infof(ccr.cc.channelzID, "ccResolverWrapper: sending update to cc: %v", s)
|
channelz.Infof(logger, ccr.cc.channelzID, "ccResolverWrapper: sending update to cc: %v", s)
|
||||||
if channelz.IsOn() {
|
if channelz.IsOn() {
|
||||||
ccr.addChannelzTraceEvent(s)
|
ccr.addChannelzTraceEvent(s)
|
||||||
}
|
}
|
||||||
|
@ -152,7 +152,7 @@ func (ccr *ccResolverWrapper) ReportError(err error) {
|
||||||
if ccr.done.HasFired() {
|
if ccr.done.HasFired() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
channelz.Warningf(ccr.cc.channelzID, "ccResolverWrapper: reporting error to cc: %v", err)
|
channelz.Warningf(logger, ccr.cc.channelzID, "ccResolverWrapper: reporting error to cc: %v", err)
|
||||||
ccr.poll(ccr.cc.updateResolverState(resolver.State{}, err))
|
ccr.poll(ccr.cc.updateResolverState(resolver.State{}, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ func (ccr *ccResolverWrapper) NewAddress(addrs []resolver.Address) {
|
||||||
if ccr.done.HasFired() {
|
if ccr.done.HasFired() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
channelz.Infof(ccr.cc.channelzID, "ccResolverWrapper: sending new addresses to cc: %v", addrs)
|
channelz.Infof(logger, ccr.cc.channelzID, "ccResolverWrapper: sending new addresses to cc: %v", addrs)
|
||||||
if channelz.IsOn() {
|
if channelz.IsOn() {
|
||||||
ccr.addChannelzTraceEvent(resolver.State{Addresses: addrs, ServiceConfig: ccr.curState.ServiceConfig})
|
ccr.addChannelzTraceEvent(resolver.State{Addresses: addrs, ServiceConfig: ccr.curState.ServiceConfig})
|
||||||
}
|
}
|
||||||
|
@ -175,14 +175,14 @@ func (ccr *ccResolverWrapper) NewServiceConfig(sc string) {
|
||||||
if ccr.done.HasFired() {
|
if ccr.done.HasFired() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
channelz.Infof(ccr.cc.channelzID, "ccResolverWrapper: got new service config: %v", sc)
|
channelz.Infof(logger, ccr.cc.channelzID, "ccResolverWrapper: got new service config: %v", sc)
|
||||||
if ccr.cc.dopts.disableServiceConfig {
|
if ccr.cc.dopts.disableServiceConfig {
|
||||||
channelz.Info(ccr.cc.channelzID, "Service config lookups disabled; ignoring config")
|
channelz.Info(logger, ccr.cc.channelzID, "Service config lookups disabled; ignoring config")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
scpr := parseServiceConfig(sc)
|
scpr := parseServiceConfig(sc)
|
||||||
if scpr.Err != nil {
|
if scpr.Err != nil {
|
||||||
channelz.Warningf(ccr.cc.channelzID, "ccResolverWrapper: error parsing service config: %v", scpr.Err)
|
channelz.Warningf(logger, ccr.cc.channelzID, "ccResolverWrapper: error parsing service config: %v", scpr.Err)
|
||||||
ccr.poll(balancer.ErrBadResolverState)
|
ccr.poll(balancer.ErrBadResolverState)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -215,7 +215,7 @@ func (ccr *ccResolverWrapper) addChannelzTraceEvent(s resolver.State) {
|
||||||
} else if len(ccr.curState.Addresses) == 0 && len(s.Addresses) > 0 {
|
} else if len(ccr.curState.Addresses) == 0 && len(s.Addresses) > 0 {
|
||||||
updates = append(updates, "resolver returned new addresses")
|
updates = append(updates, "resolver returned new addresses")
|
||||||
}
|
}
|
||||||
channelz.AddTraceEvent(ccr.cc.channelzID, 0, &channelz.TraceEventDesc{
|
channelz.AddTraceEvent(logger, ccr.cc.channelzID, 0, &channelz.TraceEventDesc{
|
||||||
Desc: fmt.Sprintf("Resolver state updated: %+v (%v)", s, strings.Join(updates, "; ")),
|
Desc: fmt.Sprintf("Resolver state updated: %+v (%v)", s, strings.Join(updates, "; ")),
|
||||||
Severity: channelz.CtINFO,
|
Severity: channelz.CtINFO,
|
||||||
})
|
})
|
||||||
|
|
|
@ -59,6 +59,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var statusOK = status.New(codes.OK, "")
|
var statusOK = status.New(codes.OK, "")
|
||||||
|
var logger = grpclog.Component("core")
|
||||||
|
|
||||||
type methodHandler func(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor UnaryServerInterceptor) (interface{}, error)
|
type methodHandler func(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor UnaryServerInterceptor) (interface{}, error)
|
||||||
|
|
||||||
|
@ -223,7 +224,7 @@ func InitialConnWindowSize(s int32) ServerOption {
|
||||||
// KeepaliveParams returns a ServerOption that sets keepalive and max-age parameters for the server.
|
// KeepaliveParams returns a ServerOption that sets keepalive and max-age parameters for the server.
|
||||||
func KeepaliveParams(kp keepalive.ServerParameters) ServerOption {
|
func KeepaliveParams(kp keepalive.ServerParameters) ServerOption {
|
||||||
if kp.Time > 0 && kp.Time < time.Second {
|
if kp.Time > 0 && kp.Time < time.Second {
|
||||||
grpclog.Warning("Adjusting keepalive ping interval to minimum period of 1s")
|
logger.Warning("Adjusting keepalive ping interval to minimum period of 1s")
|
||||||
kp.Time = time.Second
|
kp.Time = time.Second
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,6 +243,12 @@ func KeepaliveEnforcementPolicy(kep keepalive.EnforcementPolicy) ServerOption {
|
||||||
// CustomCodec returns a ServerOption that sets a codec for message marshaling and unmarshaling.
|
// CustomCodec returns a ServerOption that sets a codec for message marshaling and unmarshaling.
|
||||||
//
|
//
|
||||||
// This will override any lookups by content-subtype for Codecs registered with RegisterCodec.
|
// This will override any lookups by content-subtype for Codecs registered with RegisterCodec.
|
||||||
|
//
|
||||||
|
// Deprecated: register codecs using encoding.RegisterCodec. The server will
|
||||||
|
// automatically use registered codecs based on the incoming requests' headers.
|
||||||
|
// See also
|
||||||
|
// https://github.com/grpc/grpc-go/blob/master/Documentation/encoding.md#using-a-codec.
|
||||||
|
// Will be supported throughout 1.x.
|
||||||
func CustomCodec(codec Codec) ServerOption {
|
func CustomCodec(codec Codec) ServerOption {
|
||||||
return newFuncServerOption(func(o *serverOptions) {
|
return newFuncServerOption(func(o *serverOptions) {
|
||||||
o.codec = codec
|
o.codec = codec
|
||||||
|
@ -254,7 +261,8 @@ func CustomCodec(codec Codec) ServerOption {
|
||||||
// default, server messages will be sent using the same compressor with which
|
// default, server messages will be sent using the same compressor with which
|
||||||
// request messages were sent.
|
// request messages were sent.
|
||||||
//
|
//
|
||||||
// Deprecated: use encoding.RegisterCompressor instead.
|
// Deprecated: use encoding.RegisterCompressor instead. Will be supported
|
||||||
|
// throughout 1.x.
|
||||||
func RPCCompressor(cp Compressor) ServerOption {
|
func RPCCompressor(cp Compressor) ServerOption {
|
||||||
return newFuncServerOption(func(o *serverOptions) {
|
return newFuncServerOption(func(o *serverOptions) {
|
||||||
o.cp = cp
|
o.cp = cp
|
||||||
|
@ -265,7 +273,8 @@ func RPCCompressor(cp Compressor) ServerOption {
|
||||||
// messages. It has higher priority than decompressors registered via
|
// messages. It has higher priority than decompressors registered via
|
||||||
// encoding.RegisterCompressor.
|
// encoding.RegisterCompressor.
|
||||||
//
|
//
|
||||||
// Deprecated: use encoding.RegisterCompressor instead.
|
// Deprecated: use encoding.RegisterCompressor instead. Will be supported
|
||||||
|
// throughout 1.x.
|
||||||
func RPCDecompressor(dc Decompressor) ServerOption {
|
func RPCDecompressor(dc Decompressor) ServerOption {
|
||||||
return newFuncServerOption(func(o *serverOptions) {
|
return newFuncServerOption(func(o *serverOptions) {
|
||||||
o.dc = dc
|
o.dc = dc
|
||||||
|
@ -275,7 +284,7 @@ func RPCDecompressor(dc Decompressor) ServerOption {
|
||||||
// MaxMsgSize returns a ServerOption to set the max message size in bytes the server can receive.
|
// MaxMsgSize returns a ServerOption to set the max message size in bytes the server can receive.
|
||||||
// If this is not set, gRPC uses the default limit.
|
// If this is not set, gRPC uses the default limit.
|
||||||
//
|
//
|
||||||
// Deprecated: use MaxRecvMsgSize instead.
|
// Deprecated: use MaxRecvMsgSize instead. Will be supported throughout 1.x.
|
||||||
func MaxMsgSize(m int) ServerOption {
|
func MaxMsgSize(m int) ServerOption {
|
||||||
return MaxRecvMsgSize(m)
|
return MaxRecvMsgSize(m)
|
||||||
}
|
}
|
||||||
|
@ -537,7 +546,7 @@ func (s *Server) RegisterService(sd *ServiceDesc, ss interface{}) {
|
||||||
ht := reflect.TypeOf(sd.HandlerType).Elem()
|
ht := reflect.TypeOf(sd.HandlerType).Elem()
|
||||||
st := reflect.TypeOf(ss)
|
st := reflect.TypeOf(ss)
|
||||||
if !st.Implements(ht) {
|
if !st.Implements(ht) {
|
||||||
grpclog.Fatalf("grpc: Server.RegisterService found the handler of type %v that does not satisfy %v", st, ht)
|
logger.Fatalf("grpc: Server.RegisterService found the handler of type %v that does not satisfy %v", st, ht)
|
||||||
}
|
}
|
||||||
s.register(sd, ss)
|
s.register(sd, ss)
|
||||||
}
|
}
|
||||||
|
@ -547,10 +556,10 @@ func (s *Server) register(sd *ServiceDesc, ss interface{}) {
|
||||||
defer s.mu.Unlock()
|
defer s.mu.Unlock()
|
||||||
s.printf("RegisterService(%q)", sd.ServiceName)
|
s.printf("RegisterService(%q)", sd.ServiceName)
|
||||||
if s.serve {
|
if s.serve {
|
||||||
grpclog.Fatalf("grpc: Server.RegisterService after Server.Serve for %q", sd.ServiceName)
|
logger.Fatalf("grpc: Server.RegisterService after Server.Serve for %q", sd.ServiceName)
|
||||||
}
|
}
|
||||||
if _, ok := s.m[sd.ServiceName]; ok {
|
if _, ok := s.m[sd.ServiceName]; ok {
|
||||||
grpclog.Fatalf("grpc: Server.RegisterService found duplicate service registration for %q", sd.ServiceName)
|
logger.Fatalf("grpc: Server.RegisterService found duplicate service registration for %q", sd.ServiceName)
|
||||||
}
|
}
|
||||||
srv := &service{
|
srv := &service{
|
||||||
server: ss,
|
server: ss,
|
||||||
|
@ -756,7 +765,7 @@ func (s *Server) handleRawConn(rawConn net.Conn) {
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
s.errorf("ServerHandshake(%q) failed: %v", rawConn.RemoteAddr(), err)
|
s.errorf("ServerHandshake(%q) failed: %v", rawConn.RemoteAddr(), err)
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
channelz.Warningf(s.channelzID, "grpc: Server.Serve failed to complete security handshake from %q: %v", rawConn.RemoteAddr(), err)
|
channelz.Warningf(logger, s.channelzID, "grpc: Server.Serve failed to complete security handshake from %q: %v", rawConn.RemoteAddr(), err)
|
||||||
rawConn.Close()
|
rawConn.Close()
|
||||||
}
|
}
|
||||||
rawConn.SetDeadline(time.Time{})
|
rawConn.SetDeadline(time.Time{})
|
||||||
|
@ -803,7 +812,7 @@ func (s *Server) newHTTP2Transport(c net.Conn, authInfo credentials.AuthInfo) tr
|
||||||
s.errorf("NewServerTransport(%q) failed: %v", c.RemoteAddr(), err)
|
s.errorf("NewServerTransport(%q) failed: %v", c.RemoteAddr(), err)
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
c.Close()
|
c.Close()
|
||||||
channelz.Warning(s.channelzID, "grpc: Server.Serve failed to create ServerTransport: ", err)
|
channelz.Warning(logger, s.channelzID, "grpc: Server.Serve failed to create ServerTransport: ", err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -957,12 +966,12 @@ func (s *Server) incrCallsFailed() {
|
||||||
func (s *Server) sendResponse(t transport.ServerTransport, stream *transport.Stream, msg interface{}, cp Compressor, opts *transport.Options, comp encoding.Compressor) error {
|
func (s *Server) sendResponse(t transport.ServerTransport, stream *transport.Stream, msg interface{}, cp Compressor, opts *transport.Options, comp encoding.Compressor) error {
|
||||||
data, err := encode(s.getCodec(stream.ContentSubtype()), msg)
|
data, err := encode(s.getCodec(stream.ContentSubtype()), msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
channelz.Error(s.channelzID, "grpc: server failed to encode response: ", err)
|
channelz.Error(logger, s.channelzID, "grpc: server failed to encode response: ", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
compData, err := compress(data, cp, comp)
|
compData, err := compress(data, cp, comp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
channelz.Error(s.channelzID, "grpc: server failed to compress response: ", err)
|
channelz.Error(logger, s.channelzID, "grpc: server failed to compress response: ", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
hdr, payload := msgHeader(data, compData)
|
hdr, payload := msgHeader(data, compData)
|
||||||
|
@ -1136,7 +1145,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if st, ok := status.FromError(err); ok {
|
if st, ok := status.FromError(err); ok {
|
||||||
if e := t.WriteStatus(stream, st); e != nil {
|
if e := t.WriteStatus(stream, st); e != nil {
|
||||||
channelz.Warningf(s.channelzID, "grpc: Server.processUnaryRPC failed to write status %v", e)
|
channelz.Warningf(logger, s.channelzID, "grpc: Server.processUnaryRPC failed to write status %v", e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
@ -1181,7 +1190,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.
|
||||||
trInfo.tr.SetError()
|
trInfo.tr.SetError()
|
||||||
}
|
}
|
||||||
if e := t.WriteStatus(stream, appStatus); e != nil {
|
if e := t.WriteStatus(stream, appStatus); e != nil {
|
||||||
channelz.Warningf(s.channelzID, "grpc: Server.processUnaryRPC failed to write status: %v", e)
|
channelz.Warningf(logger, s.channelzID, "grpc: Server.processUnaryRPC failed to write status: %v", e)
|
||||||
}
|
}
|
||||||
if binlog != nil {
|
if binlog != nil {
|
||||||
if h, _ := stream.Header(); h.Len() > 0 {
|
if h, _ := stream.Header(); h.Len() > 0 {
|
||||||
|
@ -1210,7 +1219,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.
|
||||||
}
|
}
|
||||||
if sts, ok := status.FromError(err); ok {
|
if sts, ok := status.FromError(err); ok {
|
||||||
if e := t.WriteStatus(stream, sts); e != nil {
|
if e := t.WriteStatus(stream, sts); e != nil {
|
||||||
channelz.Warningf(s.channelzID, "grpc: Server.processUnaryRPC failed to write status: %v", e)
|
channelz.Warningf(logger, s.channelzID, "grpc: Server.processUnaryRPC failed to write status: %v", e)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch st := err.(type) {
|
switch st := err.(type) {
|
||||||
|
@ -1478,7 +1487,7 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str
|
||||||
trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true)
|
trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true)
|
||||||
trInfo.tr.SetError()
|
trInfo.tr.SetError()
|
||||||
}
|
}
|
||||||
channelz.Warningf(s.channelzID, "grpc: Server.handleStream failed to write status: %v", err)
|
channelz.Warningf(logger, s.channelzID, "grpc: Server.handleStream failed to write status: %v", err)
|
||||||
}
|
}
|
||||||
if trInfo != nil {
|
if trInfo != nil {
|
||||||
trInfo.tr.Finish()
|
trInfo.tr.Finish()
|
||||||
|
@ -1519,7 +1528,7 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str
|
||||||
trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true)
|
trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true)
|
||||||
trInfo.tr.SetError()
|
trInfo.tr.SetError()
|
||||||
}
|
}
|
||||||
channelz.Warningf(s.channelzID, "grpc: Server.handleStream failed to write status: %v", err)
|
channelz.Warningf(logger, s.channelzID, "grpc: Server.handleStream failed to write status: %v", err)
|
||||||
}
|
}
|
||||||
if trInfo != nil {
|
if trInfo != nil {
|
||||||
trInfo.tr.Finish()
|
trInfo.tr.Finish()
|
||||||
|
|
|
@ -20,6 +20,7 @@ package grpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -27,7 +28,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
"google.golang.org/grpc/internal"
|
"google.golang.org/grpc/internal"
|
||||||
internalserviceconfig "google.golang.org/grpc/internal/serviceconfig"
|
internalserviceconfig "google.golang.org/grpc/internal/serviceconfig"
|
||||||
"google.golang.org/grpc/serviceconfig"
|
"google.golang.org/grpc/serviceconfig"
|
||||||
|
@ -225,19 +225,27 @@ func parseDuration(s *string) (*time.Duration, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
type jsonName struct {
|
type jsonName struct {
|
||||||
Service *string
|
Service string
|
||||||
Method *string
|
Method string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j jsonName) generatePath() (string, bool) {
|
var (
|
||||||
if j.Service == nil {
|
errDuplicatedName = errors.New("duplicated name")
|
||||||
return "", false
|
errEmptyServiceNonEmptyMethod = errors.New("cannot combine empty 'service' and non-empty 'method'")
|
||||||
|
)
|
||||||
|
|
||||||
|
func (j jsonName) generatePath() (string, error) {
|
||||||
|
if j.Service == "" {
|
||||||
|
if j.Method != "" {
|
||||||
|
return "", errEmptyServiceNonEmptyMethod
|
||||||
|
}
|
||||||
|
return "", nil
|
||||||
}
|
}
|
||||||
res := "/" + *j.Service + "/"
|
res := "/" + j.Service + "/"
|
||||||
if j.Method != nil {
|
if j.Method != "" {
|
||||||
res += *j.Method
|
res += j.Method
|
||||||
}
|
}
|
||||||
return res, true
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(lyuxuan): delete this struct after cleaning up old service config implementation.
|
// TODO(lyuxuan): delete this struct after cleaning up old service config implementation.
|
||||||
|
@ -269,7 +277,7 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult {
|
||||||
var rsc jsonSC
|
var rsc jsonSC
|
||||||
err := json.Unmarshal([]byte(js), &rsc)
|
err := json.Unmarshal([]byte(js), &rsc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err)
|
logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err)
|
||||||
return &serviceconfig.ParseResult{Err: err}
|
return &serviceconfig.ParseResult{Err: err}
|
||||||
}
|
}
|
||||||
sc := ServiceConfig{
|
sc := ServiceConfig{
|
||||||
|
@ -289,13 +297,15 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult {
|
||||||
if rsc.MethodConfig == nil {
|
if rsc.MethodConfig == nil {
|
||||||
return &serviceconfig.ParseResult{Config: &sc}
|
return &serviceconfig.ParseResult{Config: &sc}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
paths := map[string]struct{}{}
|
||||||
for _, m := range *rsc.MethodConfig {
|
for _, m := range *rsc.MethodConfig {
|
||||||
if m.Name == nil {
|
if m.Name == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
d, err := parseDuration(m.Timeout)
|
d, err := parseDuration(m.Timeout)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err)
|
logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err)
|
||||||
return &serviceconfig.ParseResult{Err: err}
|
return &serviceconfig.ParseResult{Err: err}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -304,7 +314,7 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult {
|
||||||
Timeout: d,
|
Timeout: d,
|
||||||
}
|
}
|
||||||
if mc.retryPolicy, err = convertRetryPolicy(m.RetryPolicy); err != nil {
|
if mc.retryPolicy, err = convertRetryPolicy(m.RetryPolicy); err != nil {
|
||||||
grpclog.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err)
|
logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err)
|
||||||
return &serviceconfig.ParseResult{Err: err}
|
return &serviceconfig.ParseResult{Err: err}
|
||||||
}
|
}
|
||||||
if m.MaxRequestMessageBytes != nil {
|
if m.MaxRequestMessageBytes != nil {
|
||||||
|
@ -321,10 +331,20 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult {
|
||||||
mc.MaxRespSize = newInt(int(*m.MaxResponseMessageBytes))
|
mc.MaxRespSize = newInt(int(*m.MaxResponseMessageBytes))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, n := range *m.Name {
|
for i, n := range *m.Name {
|
||||||
if path, valid := n.generatePath(); valid {
|
path, err := n.generatePath()
|
||||||
sc.Methods[path] = mc
|
if err != nil {
|
||||||
|
logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to methodConfig[%d]: %v", js, i, err)
|
||||||
|
return &serviceconfig.ParseResult{Err: err}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if _, ok := paths[path]; ok {
|
||||||
|
err = errDuplicatedName
|
||||||
|
logger.Warningf("grpc: parseServiceConfig error unmarshaling %s due to methodConfig[%d]: %v", js, i, err)
|
||||||
|
return &serviceconfig.ParseResult{Err: err}
|
||||||
|
}
|
||||||
|
paths[path] = struct{}{}
|
||||||
|
sc.Methods[path] = mc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,7 +377,7 @@ func convertRetryPolicy(jrp *jsonRetryPolicy) (p *retryPolicy, err error) {
|
||||||
*mb <= 0 ||
|
*mb <= 0 ||
|
||||||
jrp.BackoffMultiplier <= 0 ||
|
jrp.BackoffMultiplier <= 0 ||
|
||||||
len(jrp.RetryableStatusCodes) == 0 {
|
len(jrp.RetryableStatusCodes) == 0 {
|
||||||
grpclog.Warningf("grpc: ignoring retry policy %v due to illegal configuration", jrp)
|
logger.Warningf("grpc: ignoring retry policy %v due to illegal configuration", jrp)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ import (
|
||||||
"google.golang.org/grpc/internal/binarylog"
|
"google.golang.org/grpc/internal/binarylog"
|
||||||
"google.golang.org/grpc/internal/channelz"
|
"google.golang.org/grpc/internal/channelz"
|
||||||
"google.golang.org/grpc/internal/grpcrand"
|
"google.golang.org/grpc/internal/grpcrand"
|
||||||
|
"google.golang.org/grpc/internal/grpcutil"
|
||||||
"google.golang.org/grpc/internal/transport"
|
"google.golang.org/grpc/internal/transport"
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
"google.golang.org/grpc/peer"
|
"google.golang.org/grpc/peer"
|
||||||
|
@ -346,7 +347,16 @@ func (cs *clientStream) newAttemptLocked(sh stats.Handler, trInfo *traceInfo) (r
|
||||||
if err := cs.ctx.Err(); err != nil {
|
if err := cs.ctx.Err(); err != nil {
|
||||||
return toRPCErr(err)
|
return toRPCErr(err)
|
||||||
}
|
}
|
||||||
t, done, err := cs.cc.getTransport(cs.ctx, cs.callInfo.failFast, cs.callHdr.Method)
|
|
||||||
|
ctx := cs.ctx
|
||||||
|
if cs.cc.parsedTarget.Scheme == "xds" {
|
||||||
|
// Add extra metadata (metadata that will be added by transport) to context
|
||||||
|
// so the balancer can see them.
|
||||||
|
ctx = grpcutil.WithExtraMetadata(cs.ctx, metadata.Pairs(
|
||||||
|
"content-type", grpcutil.ContentType(cs.callHdr.ContentSubtype),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
t, done, err := cs.cc.getTransport(ctx, cs.callInfo.failFast, cs.callHdr.Method)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -510,13 +520,13 @@ func (cs *clientStream) shouldRetry(err error) error {
|
||||||
if len(sps) == 1 {
|
if len(sps) == 1 {
|
||||||
var e error
|
var e error
|
||||||
if pushback, e = strconv.Atoi(sps[0]); e != nil || pushback < 0 {
|
if pushback, e = strconv.Atoi(sps[0]); e != nil || pushback < 0 {
|
||||||
channelz.Infof(cs.cc.channelzID, "Server retry pushback specified to abort (%q).", sps[0])
|
channelz.Infof(logger, cs.cc.channelzID, "Server retry pushback specified to abort (%q).", sps[0])
|
||||||
cs.retryThrottler.throttle() // This counts as a failure for throttling.
|
cs.retryThrottler.throttle() // This counts as a failure for throttling.
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
hasPushback = true
|
hasPushback = true
|
||||||
} else if len(sps) > 1 {
|
} else if len(sps) > 1 {
|
||||||
channelz.Warningf(cs.cc.channelzID, "Server retry pushback specified multiple values (%q); not retrying.", sps)
|
channelz.Warningf(logger, cs.cc.channelzID, "Server retry pushback specified multiple values (%q); not retrying.", sps)
|
||||||
cs.retryThrottler.throttle() // This counts as a failure for throttling.
|
cs.retryThrottler.throttle() // This counts as a failure for throttling.
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,4 +19,4 @@
|
||||||
package grpc
|
package grpc
|
||||||
|
|
||||||
// Version is the current grpc version.
|
// Version is the current grpc version.
|
||||||
const Version = "1.30.0"
|
const Version = "1.31.0"
|
||||||
|
|
|
@ -108,10 +108,10 @@ if [[ -z "${VET_SKIP_PROTO}" ]]; then
|
||||||
(git status; git --no-pager diff; exit 1)
|
(git status; git --no-pager diff; exit 1)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# - Check that our module is tidy.
|
# - Check that our modules are tidy.
|
||||||
if go help mod >& /dev/null; then
|
if go help mod >& /dev/null; then
|
||||||
go mod tidy && \
|
find . -name 'go.mod' | xargs -IXXX bash -c 'cd $(dirname XXX); go mod tidy'
|
||||||
git status --porcelain 2>&1 | fail_on_output || \
|
git status --porcelain 2>&1 | fail_on_output || \
|
||||||
(git status; git --no-pager diff; exit 1)
|
(git status; git --no-pager diff; exit 1)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -135,6 +135,7 @@ balancer.Picker
|
||||||
grpc.CallCustomCodec
|
grpc.CallCustomCodec
|
||||||
grpc.Code
|
grpc.Code
|
||||||
grpc.Compressor
|
grpc.Compressor
|
||||||
|
grpc.CustomCodec
|
||||||
grpc.Decompressor
|
grpc.Decompressor
|
||||||
grpc.MaxMsgSize
|
grpc.MaxMsgSize
|
||||||
grpc.MethodConfig
|
grpc.MethodConfig
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# cloud.google.com/go v0.61.0
|
# cloud.google.com/go v0.62.0
|
||||||
## explicit
|
## explicit
|
||||||
cloud.google.com/go
|
cloud.google.com/go
|
||||||
cloud.google.com/go/compute/metadata
|
cloud.google.com/go/compute/metadata
|
||||||
|
@ -311,7 +311,7 @@ go.uber.org/zap/internal/exit
|
||||||
go.uber.org/zap/internal/ztest
|
go.uber.org/zap/internal/ztest
|
||||||
go.uber.org/zap/zapcore
|
go.uber.org/zap/zapcore
|
||||||
go.uber.org/zap/zaptest
|
go.uber.org/zap/zaptest
|
||||||
# golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899
|
# golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de
|
||||||
golang.org/x/crypto/cast5
|
golang.org/x/crypto/cast5
|
||||||
golang.org/x/crypto/openpgp
|
golang.org/x/crypto/openpgp
|
||||||
golang.org/x/crypto/openpgp/armor
|
golang.org/x/crypto/openpgp/armor
|
||||||
|
@ -362,7 +362,7 @@ golang.org/x/text/unicode/norm
|
||||||
golang.org/x/text/width
|
golang.org/x/text/width
|
||||||
# golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e
|
# golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e
|
||||||
golang.org/x/time/rate
|
golang.org/x/time/rate
|
||||||
# golang.org/x/tools v0.0.0-20200727233628-55644ead90ce
|
# golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6
|
||||||
golang.org/x/tools/cmd/goimports
|
golang.org/x/tools/cmd/goimports
|
||||||
golang.org/x/tools/go/ast/astutil
|
golang.org/x/tools/go/ast/astutil
|
||||||
golang.org/x/tools/go/gcexportdata
|
golang.org/x/tools/go/gcexportdata
|
||||||
|
@ -437,7 +437,7 @@ google.golang.org/appengine/internal/socket
|
||||||
google.golang.org/appengine/internal/urlfetch
|
google.golang.org/appengine/internal/urlfetch
|
||||||
google.golang.org/appengine/socket
|
google.golang.org/appengine/socket
|
||||||
google.golang.org/appengine/urlfetch
|
google.golang.org/appengine/urlfetch
|
||||||
# google.golang.org/genproto v0.0.0-20200728010541-3dc8dca74b7b
|
# google.golang.org/genproto v0.0.0-20200731012542-8145dea6a485
|
||||||
## explicit
|
## explicit
|
||||||
google.golang.org/genproto/googleapis/api
|
google.golang.org/genproto/googleapis/api
|
||||||
google.golang.org/genproto/googleapis/api/annotations
|
google.golang.org/genproto/googleapis/api/annotations
|
||||||
|
@ -455,7 +455,7 @@ google.golang.org/genproto/googleapis/rpc/status
|
||||||
google.golang.org/genproto/googleapis/type/calendarperiod
|
google.golang.org/genproto/googleapis/type/calendarperiod
|
||||||
google.golang.org/genproto/googleapis/type/expr
|
google.golang.org/genproto/googleapis/type/expr
|
||||||
google.golang.org/genproto/protobuf/field_mask
|
google.golang.org/genproto/protobuf/field_mask
|
||||||
# google.golang.org/grpc v1.30.0
|
# google.golang.org/grpc v1.31.0
|
||||||
## explicit
|
## explicit
|
||||||
google.golang.org/grpc
|
google.golang.org/grpc
|
||||||
google.golang.org/grpc/attributes
|
google.golang.org/grpc/attributes
|
||||||
|
@ -489,6 +489,7 @@ google.golang.org/grpc/internal/balancerload
|
||||||
google.golang.org/grpc/internal/binarylog
|
google.golang.org/grpc/internal/binarylog
|
||||||
google.golang.org/grpc/internal/buffer
|
google.golang.org/grpc/internal/buffer
|
||||||
google.golang.org/grpc/internal/channelz
|
google.golang.org/grpc/internal/channelz
|
||||||
|
google.golang.org/grpc/internal/credentials
|
||||||
google.golang.org/grpc/internal/envconfig
|
google.golang.org/grpc/internal/envconfig
|
||||||
google.golang.org/grpc/internal/grpclog
|
google.golang.org/grpc/internal/grpclog
|
||||||
google.golang.org/grpc/internal/grpcrand
|
google.golang.org/grpc/internal/grpcrand
|
||||||
|
@ -944,7 +945,7 @@ k8s.io/kube-openapi/pkg/generators
|
||||||
k8s.io/kube-openapi/pkg/generators/rules
|
k8s.io/kube-openapi/pkg/generators/rules
|
||||||
k8s.io/kube-openapi/pkg/util/proto
|
k8s.io/kube-openapi/pkg/util/proto
|
||||||
k8s.io/kube-openapi/pkg/util/sets
|
k8s.io/kube-openapi/pkg/util/sets
|
||||||
# k8s.io/test-infra v0.0.0-20200728085909-4407d8aec1ee
|
# k8s.io/test-infra v0.0.0-20200731093307-ac6260b71531
|
||||||
k8s.io/test-infra/prow/config/secret
|
k8s.io/test-infra/prow/config/secret
|
||||||
k8s.io/test-infra/prow/logrusutil
|
k8s.io/test-infra/prow/logrusutil
|
||||||
k8s.io/test-infra/prow/version
|
k8s.io/test-infra/prow/version
|
||||||
|
@ -954,10 +955,10 @@ k8s.io/utils/buffer
|
||||||
k8s.io/utils/integer
|
k8s.io/utils/integer
|
||||||
k8s.io/utils/pointer
|
k8s.io/utils/pointer
|
||||||
k8s.io/utils/trace
|
k8s.io/utils/trace
|
||||||
# knative.dev/test-infra v0.0.0-20200729161259-d21e6ed450cb
|
# knative.dev/test-infra v0.0.0-20200731141600-8bb2015c65e2
|
||||||
## explicit
|
## explicit
|
||||||
knative.dev/test-infra/scripts
|
knative.dev/test-infra/scripts
|
||||||
# sigs.k8s.io/boskos v0.0.0-20200717180850-7299d535c033
|
# sigs.k8s.io/boskos v0.0.0-20200729174948-794df80db9c9
|
||||||
## explicit
|
## explicit
|
||||||
sigs.k8s.io/boskos/client
|
sigs.k8s.io/boskos/client
|
||||||
sigs.k8s.io/boskos/common
|
sigs.k8s.io/boskos/common
|
||||||
|
|
Loading…
Reference in New Issue