Merge pull request #71020 from saad-ali/updateCSI10
Bump CSI Spec to 1.0.0 and gRPC to 1.13.0
This commit is contained in:
132
Godeps/Godeps.json
generated
132
Godeps/Godeps.json
generated
@@ -811,9 +811,9 @@
|
|||||||
"Rev": "20e2ce2cf8852dc78bd42b76698dcd8dcd77b7b1"
|
"Rev": "20e2ce2cf8852dc78bd42b76698dcd8dcd77b7b1"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/container-storage-interface/spec/lib/go/csi/v0",
|
"ImportPath": "github.com/container-storage-interface/spec/lib/go/csi",
|
||||||
"Comment": "v0.3.0",
|
"Comment": "v1.0.0",
|
||||||
"Rev": "2178fdeea87f1150a17a63252eee28d4d8141f72"
|
"Rev": "ed0bb0e1557548aa028307f48728767cfe8f6345"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/containerd/console",
|
"ImportPath": "github.com/containerd/console",
|
||||||
@@ -1807,6 +1807,11 @@
|
|||||||
"Comment": "v1.1.0",
|
"Comment": "v1.1.0",
|
||||||
"Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265"
|
"Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "github.com/golang/protobuf/protoc-gen-go/descriptor",
|
||||||
|
"Comment": "v1.1.0",
|
||||||
|
"Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/golang/protobuf/ptypes",
|
"ImportPath": "github.com/golang/protobuf/ptypes",
|
||||||
"Comment": "v1.1.0",
|
"Comment": "v1.1.0",
|
||||||
@@ -3747,98 +3752,143 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc",
|
"ImportPath": "google.golang.org/grpc",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/balancer",
|
"ImportPath": "google.golang.org/grpc/balancer",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/balancer/base",
|
||||||
|
"Comment": "v1.13.0",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/balancer/roundrobin",
|
||||||
|
"Comment": "v1.13.0",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/codes",
|
"ImportPath": "google.golang.org/grpc/codes",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/connectivity",
|
"ImportPath": "google.golang.org/grpc/connectivity",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/credentials",
|
"ImportPath": "google.golang.org/grpc/credentials",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/encoding",
|
||||||
|
"Comment": "v1.13.0",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/encoding/proto",
|
||||||
|
"Comment": "v1.13.0",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/grpclb/grpc_lb_v1/messages",
|
"ImportPath": "google.golang.org/grpc/grpclb/grpc_lb_v1/messages",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/grpclog",
|
"ImportPath": "google.golang.org/grpc/grpclog",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/health",
|
"ImportPath": "google.golang.org/grpc/health",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/health/grpc_health_v1",
|
"ImportPath": "google.golang.org/grpc/health/grpc_health_v1",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/internal",
|
"ImportPath": "google.golang.org/grpc/internal",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/backoff",
|
||||||
|
"Comment": "v1.13.0",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/channelz",
|
||||||
|
"Comment": "v1.13.0",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/grpcrand",
|
||||||
|
"Comment": "v1.13.0",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/keepalive",
|
"ImportPath": "google.golang.org/grpc/keepalive",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/metadata",
|
"ImportPath": "google.golang.org/grpc/metadata",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/naming",
|
"ImportPath": "google.golang.org/grpc/naming",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/peer",
|
"ImportPath": "google.golang.org/grpc/peer",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/resolver",
|
"ImportPath": "google.golang.org/grpc/resolver",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/resolver/dns",
|
||||||
|
"Comment": "v1.13.0",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/resolver/passthrough",
|
||||||
|
"Comment": "v1.13.0",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/stats",
|
"ImportPath": "google.golang.org/grpc/stats",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/status",
|
"ImportPath": "google.golang.org/grpc/status",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/tap",
|
"ImportPath": "google.golang.org/grpc/tap",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/transport",
|
"ImportPath": "google.golang.org/grpc/transport",
|
||||||
"Comment": "v1.7.5",
|
"Comment": "v1.13.0",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "gopkg.in/gcfg.v1",
|
"ImportPath": "gopkg.in/gcfg.v1",
|
||||||
|
1931
Godeps/LICENSES
generated
1931
Godeps/LICENSES
generated
File diff suppressed because it is too large
Load Diff
@@ -30,7 +30,7 @@ go_library(
|
|||||||
"//staging/src/k8s.io/csi-api/pkg/client/informers/externalversions:go_default_library",
|
"//staging/src/k8s.io/csi-api/pkg/client/informers/externalversions:go_default_library",
|
||||||
"//staging/src/k8s.io/csi-api/pkg/client/informers/externalversions/csi/v1alpha1:go_default_library",
|
"//staging/src/k8s.io/csi-api/pkg/client/informers/externalversions/csi/v1alpha1:go_default_library",
|
||||||
"//staging/src/k8s.io/csi-api/pkg/client/listers/csi/v1alpha1:go_default_library",
|
"//staging/src/k8s.io/csi-api/pkg/client/listers/csi/v1alpha1:go_default_library",
|
||||||
"//vendor/github.com/container-storage-interface/spec/lib/go/csi/v0:go_default_library",
|
"//vendor/github.com/container-storage-interface/spec/lib/go/csi:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc:go_default_library",
|
"//vendor/google.golang.org/grpc:go_default_library",
|
||||||
"//vendor/k8s.io/klog:go_default_library",
|
"//vendor/k8s.io/klog:go_default_library",
|
||||||
],
|
],
|
||||||
@@ -69,7 +69,7 @@ go_test(
|
|||||||
"//staging/src/k8s.io/client-go/util/testing:go_default_library",
|
"//staging/src/k8s.io/client-go/util/testing:go_default_library",
|
||||||
"//staging/src/k8s.io/csi-api/pkg/apis/csi/v1alpha1:go_default_library",
|
"//staging/src/k8s.io/csi-api/pkg/apis/csi/v1alpha1:go_default_library",
|
||||||
"//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned/fake:go_default_library",
|
"//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned/fake:go_default_library",
|
||||||
"//vendor/github.com/container-storage-interface/spec/lib/go/csi/v0:go_default_library",
|
"//vendor/github.com/container-storage-interface/spec/lib/go/csi:go_default_library",
|
||||||
"//vendor/k8s.io/klog:go_default_library",
|
"//vendor/k8s.io/klog:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@@ -29,7 +29,7 @@ import (
|
|||||||
|
|
||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
|
|
||||||
csipb "github.com/container-storage-interface/spec/lib/go/csi/v0"
|
csipb "github.com/container-storage-interface/spec/lib/go/csi"
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
storage "k8s.io/api/storage/v1beta1"
|
storage "k8s.io/api/storage/v1beta1"
|
||||||
apierrs "k8s.io/apimachinery/pkg/api/errors"
|
apierrs "k8s.io/apimachinery/pkg/api/errors"
|
||||||
|
@@ -24,7 +24,7 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
csipb "github.com/container-storage-interface/spec/lib/go/csi/v0"
|
csipb "github.com/container-storage-interface/spec/lib/go/csi"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
api "k8s.io/api/core/v1"
|
api "k8s.io/api/core/v1"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
@@ -46,8 +46,8 @@ type csiClient interface {
|
|||||||
targetPath string,
|
targetPath string,
|
||||||
accessMode api.PersistentVolumeAccessMode,
|
accessMode api.PersistentVolumeAccessMode,
|
||||||
volumeInfo map[string]string,
|
volumeInfo map[string]string,
|
||||||
volumeAttribs map[string]string,
|
volumeContext map[string]string,
|
||||||
nodePublishSecrets map[string]string,
|
secrets map[string]string,
|
||||||
fsType string,
|
fsType string,
|
||||||
mountOptions []string,
|
mountOptions []string,
|
||||||
) error
|
) error
|
||||||
@@ -62,8 +62,8 @@ type csiClient interface {
|
|||||||
stagingTargetPath string,
|
stagingTargetPath string,
|
||||||
fsType string,
|
fsType string,
|
||||||
accessMode api.PersistentVolumeAccessMode,
|
accessMode api.PersistentVolumeAccessMode,
|
||||||
nodeStageSecrets map[string]string,
|
secrets map[string]string,
|
||||||
volumeAttribs map[string]string,
|
volumeContext map[string]string,
|
||||||
) error
|
) error
|
||||||
NodeUnstageVolume(ctx context.Context, volID, stagingTargetPath string) error
|
NodeUnstageVolume(ctx context.Context, volID, stagingTargetPath string) error
|
||||||
NodeGetCapabilities(ctx context.Context) ([]*csipb.NodeServiceCapability, error)
|
NodeGetCapabilities(ctx context.Context) ([]*csipb.NodeServiceCapability, error)
|
||||||
@@ -136,8 +136,8 @@ func (c *csiDriverClient) NodePublishVolume(
|
|||||||
targetPath string,
|
targetPath string,
|
||||||
accessMode api.PersistentVolumeAccessMode,
|
accessMode api.PersistentVolumeAccessMode,
|
||||||
volumeInfo map[string]string,
|
volumeInfo map[string]string,
|
||||||
volumeAttribs map[string]string,
|
volumeContext map[string]string,
|
||||||
nodePublishSecrets map[string]string,
|
secrets map[string]string,
|
||||||
fsType string,
|
fsType string,
|
||||||
mountOptions []string,
|
mountOptions []string,
|
||||||
) error {
|
) error {
|
||||||
@@ -159,9 +159,9 @@ func (c *csiDriverClient) NodePublishVolume(
|
|||||||
VolumeId: volID,
|
VolumeId: volID,
|
||||||
TargetPath: targetPath,
|
TargetPath: targetPath,
|
||||||
Readonly: readOnly,
|
Readonly: readOnly,
|
||||||
PublishInfo: volumeInfo,
|
PublishContext: volumeInfo,
|
||||||
VolumeAttributes: volumeAttribs,
|
VolumeContext: volumeContext,
|
||||||
NodePublishSecrets: nodePublishSecrets,
|
Secrets: secrets,
|
||||||
VolumeCapability: &csipb.VolumeCapability{
|
VolumeCapability: &csipb.VolumeCapability{
|
||||||
AccessMode: &csipb.VolumeCapability_AccessMode{
|
AccessMode: &csipb.VolumeCapability_AccessMode{
|
||||||
Mode: asCSIAccessMode(accessMode),
|
Mode: asCSIAccessMode(accessMode),
|
||||||
@@ -215,12 +215,12 @@ func (c *csiDriverClient) NodeUnpublishVolume(ctx context.Context, volID string,
|
|||||||
|
|
||||||
func (c *csiDriverClient) NodeStageVolume(ctx context.Context,
|
func (c *csiDriverClient) NodeStageVolume(ctx context.Context,
|
||||||
volID string,
|
volID string,
|
||||||
publishInfo map[string]string,
|
publishContext map[string]string,
|
||||||
stagingTargetPath string,
|
stagingTargetPath string,
|
||||||
fsType string,
|
fsType string,
|
||||||
accessMode api.PersistentVolumeAccessMode,
|
accessMode api.PersistentVolumeAccessMode,
|
||||||
nodeStageSecrets map[string]string,
|
secrets map[string]string,
|
||||||
volumeAttribs map[string]string,
|
volumeContext map[string]string,
|
||||||
) error {
|
) error {
|
||||||
klog.V(4).Info(log("calling NodeStageVolume rpc [volid=%s,staging_target_path=%s]", volID, stagingTargetPath))
|
klog.V(4).Info(log("calling NodeStageVolume rpc [volid=%s,staging_target_path=%s]", volID, stagingTargetPath))
|
||||||
if volID == "" {
|
if volID == "" {
|
||||||
@@ -238,15 +238,15 @@ func (c *csiDriverClient) NodeStageVolume(ctx context.Context,
|
|||||||
|
|
||||||
req := &csipb.NodeStageVolumeRequest{
|
req := &csipb.NodeStageVolumeRequest{
|
||||||
VolumeId: volID,
|
VolumeId: volID,
|
||||||
PublishInfo: publishInfo,
|
PublishContext: publishContext,
|
||||||
StagingTargetPath: stagingTargetPath,
|
StagingTargetPath: stagingTargetPath,
|
||||||
VolumeCapability: &csipb.VolumeCapability{
|
VolumeCapability: &csipb.VolumeCapability{
|
||||||
AccessMode: &csipb.VolumeCapability_AccessMode{
|
AccessMode: &csipb.VolumeCapability_AccessMode{
|
||||||
Mode: asCSIAccessMode(accessMode),
|
Mode: asCSIAccessMode(accessMode),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
NodeStageSecrets: nodeStageSecrets,
|
Secrets: secrets,
|
||||||
VolumeAttributes: volumeAttribs,
|
VolumeContext: volumeContext,
|
||||||
}
|
}
|
||||||
|
|
||||||
if fsType == fsTypeBlockName {
|
if fsType == fsTypeBlockName {
|
||||||
|
@@ -23,7 +23,7 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
csipb "github.com/container-storage-interface/spec/lib/go/csi/v0"
|
csipb "github.com/container-storage-interface/spec/lib/go/csi"
|
||||||
api "k8s.io/api/core/v1"
|
api "k8s.io/api/core/v1"
|
||||||
"k8s.io/kubernetes/pkg/volume/csi/fake"
|
"k8s.io/kubernetes/pkg/volume/csi/fake"
|
||||||
)
|
)
|
||||||
@@ -57,8 +57,8 @@ func (c *fakeCsiDriverClient) NodePublishVolume(
|
|||||||
targetPath string,
|
targetPath string,
|
||||||
accessMode api.PersistentVolumeAccessMode,
|
accessMode api.PersistentVolumeAccessMode,
|
||||||
volumeInfo map[string]string,
|
volumeInfo map[string]string,
|
||||||
volumeAttribs map[string]string,
|
volumeContext map[string]string,
|
||||||
nodePublishSecrets map[string]string,
|
secrets map[string]string,
|
||||||
fsType string,
|
fsType string,
|
||||||
mountOptions []string,
|
mountOptions []string,
|
||||||
) error {
|
) error {
|
||||||
@@ -67,9 +67,9 @@ func (c *fakeCsiDriverClient) NodePublishVolume(
|
|||||||
VolumeId: volID,
|
VolumeId: volID,
|
||||||
TargetPath: targetPath,
|
TargetPath: targetPath,
|
||||||
Readonly: readOnly,
|
Readonly: readOnly,
|
||||||
PublishInfo: volumeInfo,
|
PublishContext: volumeInfo,
|
||||||
VolumeAttributes: volumeAttribs,
|
VolumeContext: volumeContext,
|
||||||
NodePublishSecrets: nodePublishSecrets,
|
Secrets: secrets,
|
||||||
VolumeCapability: &csipb.VolumeCapability{
|
VolumeCapability: &csipb.VolumeCapability{
|
||||||
AccessMode: &csipb.VolumeCapability_AccessMode{
|
AccessMode: &csipb.VolumeCapability_AccessMode{
|
||||||
Mode: asCSIAccessMode(accessMode),
|
Mode: asCSIAccessMode(accessMode),
|
||||||
@@ -100,17 +100,17 @@ func (c *fakeCsiDriverClient) NodeUnpublishVolume(ctx context.Context, volID str
|
|||||||
|
|
||||||
func (c *fakeCsiDriverClient) NodeStageVolume(ctx context.Context,
|
func (c *fakeCsiDriverClient) NodeStageVolume(ctx context.Context,
|
||||||
volID string,
|
volID string,
|
||||||
publishInfo map[string]string,
|
publishContext map[string]string,
|
||||||
stagingTargetPath string,
|
stagingTargetPath string,
|
||||||
fsType string,
|
fsType string,
|
||||||
accessMode api.PersistentVolumeAccessMode,
|
accessMode api.PersistentVolumeAccessMode,
|
||||||
nodeStageSecrets map[string]string,
|
secrets map[string]string,
|
||||||
volumeAttribs map[string]string,
|
volumeContext map[string]string,
|
||||||
) error {
|
) error {
|
||||||
c.t.Log("calling fake.NodeStageVolume...")
|
c.t.Log("calling fake.NodeStageVolume...")
|
||||||
req := &csipb.NodeStageVolumeRequest{
|
req := &csipb.NodeStageVolumeRequest{
|
||||||
VolumeId: volID,
|
VolumeId: volID,
|
||||||
PublishInfo: publishInfo,
|
PublishContext: publishContext,
|
||||||
StagingTargetPath: stagingTargetPath,
|
StagingTargetPath: stagingTargetPath,
|
||||||
VolumeCapability: &csipb.VolumeCapability{
|
VolumeCapability: &csipb.VolumeCapability{
|
||||||
AccessMode: &csipb.VolumeCapability_AccessMode{
|
AccessMode: &csipb.VolumeCapability_AccessMode{
|
||||||
@@ -122,8 +122,8 @@ func (c *fakeCsiDriverClient) NodeStageVolume(ctx context.Context,
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
NodeStageSecrets: nodeStageSecrets,
|
Secrets: secrets,
|
||||||
VolumeAttributes: volumeAttribs,
|
VolumeContext: volumeContext,
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := c.nodeClient.NodeStageVolume(ctx, req)
|
_, err := c.nodeClient.NodeStageVolume(ctx, req)
|
||||||
@@ -321,7 +321,7 @@ func TestClientNodeStageVolume(t *testing.T) {
|
|||||||
volID string
|
volID string
|
||||||
stagingTargetPath string
|
stagingTargetPath string
|
||||||
fsType string
|
fsType string
|
||||||
secret map[string]string
|
secrets map[string]string
|
||||||
mustFail bool
|
mustFail bool
|
||||||
err error
|
err error
|
||||||
}{
|
}{
|
||||||
@@ -351,7 +351,7 @@ func TestClientNodeStageVolume(t *testing.T) {
|
|||||||
tc.stagingTargetPath,
|
tc.stagingTargetPath,
|
||||||
tc.fsType,
|
tc.fsType,
|
||||||
api.ReadWriteOnce,
|
api.ReadWriteOnce,
|
||||||
tc.secret,
|
tc.secrets,
|
||||||
map[string]string{"attr0": "val0"},
|
map[string]string{"attr0": "val0"},
|
||||||
)
|
)
|
||||||
checkErr(t, tc.mustFail, err)
|
checkErr(t, tc.mustFail, err)
|
||||||
|
@@ -100,45 +100,44 @@ func MounterSetUpTests(t *testing.T, podInfoEnabled bool) {
|
|||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
driver string
|
driver string
|
||||||
attributes map[string]string
|
volumeContext map[string]string
|
||||||
|
expectedVolumeContext map[string]string
|
||||||
expectedAttributes map[string]string
|
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "no pod info",
|
name: "no pod info",
|
||||||
driver: "no-info",
|
driver: "no-info",
|
||||||
attributes: nil,
|
volumeContext: nil,
|
||||||
expectedAttributes: nil,
|
expectedVolumeContext: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "no CSIDriver -> no pod info",
|
name: "no CSIDriver -> no pod info",
|
||||||
driver: "unknown-driver",
|
driver: "unknown-driver",
|
||||||
attributes: nil,
|
volumeContext: nil,
|
||||||
expectedAttributes: nil,
|
expectedVolumeContext: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "CSIDriver with PodInfoRequiredOnMount=nil -> no pod info",
|
name: "CSIDriver with PodInfoRequiredOnMount=nil -> no pod info",
|
||||||
driver: "nil",
|
driver: "nil",
|
||||||
attributes: nil,
|
volumeContext: nil,
|
||||||
expectedAttributes: nil,
|
expectedVolumeContext: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "no pod info -> keep existing attributes",
|
name: "no pod info -> keep existing volumeContext",
|
||||||
driver: "no-info",
|
driver: "no-info",
|
||||||
attributes: map[string]string{"foo": "bar"},
|
volumeContext: map[string]string{"foo": "bar"},
|
||||||
expectedAttributes: map[string]string{"foo": "bar"},
|
expectedVolumeContext: map[string]string{"foo": "bar"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "add pod info",
|
name: "add pod info",
|
||||||
driver: "info",
|
driver: "info",
|
||||||
attributes: nil,
|
volumeContext: nil,
|
||||||
expectedAttributes: map[string]string{"csi.storage.k8s.io/pod.uid": "test-pod", "csi.storage.k8s.io/serviceAccount.name": "test-service-account", "csi.storage.k8s.io/pod.name": "test-pod", "csi.storage.k8s.io/pod.namespace": "test-ns"},
|
expectedVolumeContext: map[string]string{"csi.storage.k8s.io/pod.uid": "test-pod", "csi.storage.k8s.io/serviceAccount.name": "test-service-account", "csi.storage.k8s.io/pod.name": "test-pod", "csi.storage.k8s.io/pod.namespace": "test-ns"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "add pod info -> keep existing attributes",
|
name: "add pod info -> keep existing volumeContext",
|
||||||
driver: "info",
|
driver: "info",
|
||||||
attributes: map[string]string{"foo": "bar"},
|
volumeContext: map[string]string{"foo": "bar"},
|
||||||
expectedAttributes: map[string]string{"foo": "bar", "csi.storage.k8s.io/pod.uid": "test-pod", "csi.storage.k8s.io/serviceAccount.name": "test-service-account", "csi.storage.k8s.io/pod.name": "test-pod", "csi.storage.k8s.io/pod.namespace": "test-ns"},
|
expectedVolumeContext: map[string]string{"foo": "bar", "csi.storage.k8s.io/pod.uid": "test-pod", "csi.storage.k8s.io/serviceAccount.name": "test-service-account", "csi.storage.k8s.io/pod.name": "test-pod", "csi.storage.k8s.io/pod.namespace": "test-ns"},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,7 +162,7 @@ func MounterSetUpTests(t *testing.T, podInfoEnabled bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pv := makeTestPV("test-pv", 10, test.driver, testVol)
|
pv := makeTestPV("test-pv", 10, test.driver, testVol)
|
||||||
pv.Spec.CSI.VolumeAttributes = test.attributes
|
pv.Spec.CSI.VolumeAttributes = test.volumeContext
|
||||||
pv.Spec.MountOptions = []string{"foo=bar", "baz=qux"}
|
pv.Spec.MountOptions = []string{"foo=bar", "baz=qux"}
|
||||||
pvName := pv.GetName()
|
pvName := pv.GetName()
|
||||||
|
|
||||||
@@ -245,13 +244,13 @@ func MounterSetUpTests(t *testing.T, podInfoEnabled bool) {
|
|||||||
t.Errorf("csi server expected mount options %v, got %v", pv.Spec.MountOptions, vol.MountFlags)
|
t.Errorf("csi server expected mount options %v, got %v", pv.Spec.MountOptions, vol.MountFlags)
|
||||||
}
|
}
|
||||||
if podInfoEnabled {
|
if podInfoEnabled {
|
||||||
if !reflect.DeepEqual(vol.Attributes, test.expectedAttributes) {
|
if !reflect.DeepEqual(vol.VolumeContext, test.expectedVolumeContext) {
|
||||||
t.Errorf("csi server expected attributes %+v, got %+v", test.expectedAttributes, vol.Attributes)
|
t.Errorf("csi server expected volumeContext %+v, got %+v", test.expectedVolumeContext, vol.VolumeContext)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// CSIPodInfo feature is disabled, we expect no modifications to attributes.
|
// CSIPodInfo feature is disabled, we expect no modifications to volumeContext.
|
||||||
if !reflect.DeepEqual(vol.Attributes, test.attributes) {
|
if !reflect.DeepEqual(vol.VolumeContext, test.volumeContext) {
|
||||||
t.Errorf("csi server expected attributes %+v, got %+v", test.attributes, vol.Attributes)
|
t.Errorf("csi server expected volumeContext %+v, got %+v", test.volumeContext, vol.VolumeContext)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@@ -9,7 +9,7 @@ go_library(
|
|||||||
importpath = "k8s.io/kubernetes/pkg/volume/csi/fake",
|
importpath = "k8s.io/kubernetes/pkg/volume/csi/fake",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
"//vendor/github.com/container-storage-interface/spec/lib/go/csi/v0:go_default_library",
|
"//vendor/github.com/container-storage-interface/spec/lib/go/csi:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc:go_default_library",
|
"//vendor/google.golang.org/grpc:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@@ -23,7 +23,7 @@ import (
|
|||||||
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
|
|
||||||
csipb "github.com/container-storage-interface/spec/lib/go/csi/v0"
|
csipb "github.com/container-storage-interface/spec/lib/go/csi"
|
||||||
)
|
)
|
||||||
|
|
||||||
// IdentityClient is a CSI identity client used for testing
|
// IdentityClient is a CSI identity client used for testing
|
||||||
@@ -57,7 +57,7 @@ func (f *IdentityClient) Probe(ctx context.Context, in *csipb.ProbeRequest, opts
|
|||||||
}
|
}
|
||||||
|
|
||||||
type CSIVolume struct {
|
type CSIVolume struct {
|
||||||
Attributes map[string]string
|
VolumeContext map[string]string
|
||||||
Path string
|
Path string
|
||||||
MountFlags []string
|
MountFlags []string
|
||||||
}
|
}
|
||||||
@@ -99,10 +99,10 @@ func (f *NodeClient) GetNodeStagedVolumes() map[string]CSIVolume {
|
|||||||
return f.nodeStagedVolumes
|
return f.nodeStagedVolumes
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *NodeClient) AddNodeStagedVolume(volID, deviceMountPath string, attributes map[string]string) {
|
func (f *NodeClient) AddNodeStagedVolume(volID, deviceMountPath string, volumeContext map[string]string) {
|
||||||
f.nodeStagedVolumes[volID] = CSIVolume{
|
f.nodeStagedVolumes[volID] = CSIVolume{
|
||||||
Path: deviceMountPath,
|
Path: deviceMountPath,
|
||||||
Attributes: attributes,
|
VolumeContext: volumeContext,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,7 +126,7 @@ func (f *NodeClient) NodePublishVolume(ctx context.Context, req *csipb.NodePubli
|
|||||||
}
|
}
|
||||||
f.nodePublishedVolumes[req.GetVolumeId()] = CSIVolume{
|
f.nodePublishedVolumes[req.GetVolumeId()] = CSIVolume{
|
||||||
Path: req.GetTargetPath(),
|
Path: req.GetTargetPath(),
|
||||||
Attributes: req.GetVolumeAttributes(),
|
VolumeContext: req.GetVolumeContext(),
|
||||||
MountFlags: req.GetVolumeCapability().GetMount().MountFlags,
|
MountFlags: req.GetVolumeCapability().GetMount().MountFlags,
|
||||||
}
|
}
|
||||||
return &csipb.NodePublishVolumeResponse{}, nil
|
return &csipb.NodePublishVolumeResponse{}, nil
|
||||||
@@ -173,7 +173,7 @@ func (f *NodeClient) NodeStageVolume(ctx context.Context, req *csipb.NodeStageVo
|
|||||||
|
|
||||||
f.nodeStagedVolumes[req.GetVolumeId()] = CSIVolume{
|
f.nodeStagedVolumes[req.GetVolumeId()] = CSIVolume{
|
||||||
Path: req.GetStagingTargetPath(),
|
Path: req.GetStagingTargetPath(),
|
||||||
Attributes: req.GetVolumeAttributes(),
|
VolumeContext: req.GetVolumeContext(),
|
||||||
}
|
}
|
||||||
return &csipb.NodeStageVolumeResponse{}, nil
|
return &csipb.NodeStageVolumeResponse{}, nil
|
||||||
}
|
}
|
||||||
@@ -195,11 +195,6 @@ func (f *NodeClient) NodeUnstageVolume(ctx context.Context, req *csipb.NodeUnsta
|
|||||||
return &csipb.NodeUnstageVolumeResponse{}, nil
|
return &csipb.NodeUnstageVolumeResponse{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeGetId implements method
|
|
||||||
func (f *NodeClient) NodeGetId(ctx context.Context, in *csipb.NodeGetIdRequest, opts ...grpc.CallOption) (*csipb.NodeGetIdResponse, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeGetId implements csi method
|
// NodeGetId implements csi method
|
||||||
func (f *NodeClient) NodeGetInfo(ctx context.Context, in *csipb.NodeGetInfoRequest, opts ...grpc.CallOption) (*csipb.NodeGetInfoResponse, error) {
|
func (f *NodeClient) NodeGetInfo(ctx context.Context, in *csipb.NodeGetInfoRequest, opts ...grpc.CallOption) (*csipb.NodeGetInfoResponse, error) {
|
||||||
if f.nextErr != nil {
|
if f.nextErr != nil {
|
||||||
@@ -227,6 +222,11 @@ func (f *NodeClient) NodeGetCapabilities(ctx context.Context, in *csipb.NodeGetC
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NodeGetVolumeStats implements csi method
|
||||||
|
func (f *NodeClient) NodeGetVolumeStats(ctx context.Context, in *csipb.NodeGetVolumeStatsRequest, opts ...grpc.CallOption) (*csipb.NodeGetVolumeStatsResponse, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
// ControllerClient represents a CSI Controller client
|
// ControllerClient represents a CSI Controller client
|
||||||
type ControllerClient struct {
|
type ControllerClient struct {
|
||||||
nextCapabilities []*csipb.ControllerServiceCapability
|
nextCapabilities []*csipb.ControllerServiceCapability
|
||||||
|
@@ -19,7 +19,7 @@ go_library(
|
|||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/util/retry:go_default_library",
|
"//staging/src/k8s.io/client-go/util/retry:go_default_library",
|
||||||
"//staging/src/k8s.io/csi-api/pkg/apis/csi/v1alpha1:go_default_library",
|
"//staging/src/k8s.io/csi-api/pkg/apis/csi/v1alpha1:go_default_library",
|
||||||
"//vendor/github.com/container-storage-interface/spec/lib/go/csi/v0:go_default_library",
|
"//vendor/github.com/container-storage-interface/spec/lib/go/csi:go_default_library",
|
||||||
"//vendor/k8s.io/klog:go_default_library",
|
"//vendor/k8s.io/klog:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
@@ -61,7 +61,7 @@ go_test(
|
|||||||
"//staging/src/k8s.io/client-go/util/testing:go_default_library",
|
"//staging/src/k8s.io/client-go/util/testing:go_default_library",
|
||||||
"//staging/src/k8s.io/csi-api/pkg/apis/csi/v1alpha1:go_default_library",
|
"//staging/src/k8s.io/csi-api/pkg/apis/csi/v1alpha1:go_default_library",
|
||||||
"//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned/fake:go_default_library",
|
"//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned/fake:go_default_library",
|
||||||
"//vendor/github.com/container-storage-interface/spec/lib/go/csi/v0:go_default_library",
|
"//vendor/github.com/container-storage-interface/spec/lib/go/csi:go_default_library",
|
||||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@@ -23,7 +23,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
csipb "github.com/container-storage-interface/spec/lib/go/csi/v0"
|
csipb "github.com/container-storage-interface/spec/lib/go/csi"
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
|
@@ -21,7 +21,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/container-storage-interface/spec/lib/go/csi/v0"
|
"github.com/container-storage-interface/spec/lib/go/csi"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
|
@@ -820,79 +820,111 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc",
|
"ImportPath": "google.golang.org/grpc",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/balancer",
|
"ImportPath": "google.golang.org/grpc/balancer",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/balancer/base",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/balancer/roundrobin",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/codes",
|
"ImportPath": "google.golang.org/grpc/codes",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/connectivity",
|
"ImportPath": "google.golang.org/grpc/connectivity",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/credentials",
|
"ImportPath": "google.golang.org/grpc/credentials",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/grpclb/grpc_lb_v1/messages",
|
"ImportPath": "google.golang.org/grpc/encoding",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/encoding/proto",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/grpclog",
|
"ImportPath": "google.golang.org/grpc/grpclog",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/health",
|
"ImportPath": "google.golang.org/grpc/health",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/health/grpc_health_v1",
|
"ImportPath": "google.golang.org/grpc/health/grpc_health_v1",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/internal",
|
"ImportPath": "google.golang.org/grpc/internal",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/backoff",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/channelz",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/grpcrand",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/keepalive",
|
"ImportPath": "google.golang.org/grpc/keepalive",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/metadata",
|
"ImportPath": "google.golang.org/grpc/metadata",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/naming",
|
"ImportPath": "google.golang.org/grpc/naming",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/peer",
|
"ImportPath": "google.golang.org/grpc/peer",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/resolver",
|
"ImportPath": "google.golang.org/grpc/resolver",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/resolver/dns",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/resolver/passthrough",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/stats",
|
"ImportPath": "google.golang.org/grpc/stats",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/status",
|
"ImportPath": "google.golang.org/grpc/status",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/tap",
|
"ImportPath": "google.golang.org/grpc/tap",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/transport",
|
"ImportPath": "google.golang.org/grpc/transport",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "gopkg.in/inf.v0",
|
"ImportPath": "gopkg.in/inf.v0",
|
||||||
|
72
staging/src/k8s.io/apiserver/Godeps/Godeps.json
generated
72
staging/src/k8s.io/apiserver/Godeps/Godeps.json
generated
@@ -812,79 +812,111 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc",
|
"ImportPath": "google.golang.org/grpc",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/balancer",
|
"ImportPath": "google.golang.org/grpc/balancer",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/balancer/base",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/balancer/roundrobin",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/codes",
|
"ImportPath": "google.golang.org/grpc/codes",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/connectivity",
|
"ImportPath": "google.golang.org/grpc/connectivity",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/credentials",
|
"ImportPath": "google.golang.org/grpc/credentials",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/grpclb/grpc_lb_v1/messages",
|
"ImportPath": "google.golang.org/grpc/encoding",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/encoding/proto",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/grpclog",
|
"ImportPath": "google.golang.org/grpc/grpclog",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/health",
|
"ImportPath": "google.golang.org/grpc/health",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/health/grpc_health_v1",
|
"ImportPath": "google.golang.org/grpc/health/grpc_health_v1",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/internal",
|
"ImportPath": "google.golang.org/grpc/internal",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/backoff",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/channelz",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/grpcrand",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/keepalive",
|
"ImportPath": "google.golang.org/grpc/keepalive",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/metadata",
|
"ImportPath": "google.golang.org/grpc/metadata",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/naming",
|
"ImportPath": "google.golang.org/grpc/naming",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/peer",
|
"ImportPath": "google.golang.org/grpc/peer",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/resolver",
|
"ImportPath": "google.golang.org/grpc/resolver",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/resolver/dns",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/resolver/passthrough",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/stats",
|
"ImportPath": "google.golang.org/grpc/stats",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/status",
|
"ImportPath": "google.golang.org/grpc/status",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/tap",
|
"ImportPath": "google.golang.org/grpc/tap",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/transport",
|
"ImportPath": "google.golang.org/grpc/transport",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "gopkg.in/inf.v0",
|
"ImportPath": "gopkg.in/inf.v0",
|
||||||
|
@@ -416,75 +416,107 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc",
|
"ImportPath": "google.golang.org/grpc",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/balancer",
|
"ImportPath": "google.golang.org/grpc/balancer",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/balancer/base",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/balancer/roundrobin",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/codes",
|
"ImportPath": "google.golang.org/grpc/codes",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/connectivity",
|
"ImportPath": "google.golang.org/grpc/connectivity",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/credentials",
|
"ImportPath": "google.golang.org/grpc/credentials",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/grpclb/grpc_lb_v1/messages",
|
"ImportPath": "google.golang.org/grpc/encoding",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/encoding/proto",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/grpclog",
|
"ImportPath": "google.golang.org/grpc/grpclog",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/health/grpc_health_v1",
|
"ImportPath": "google.golang.org/grpc/health/grpc_health_v1",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/internal",
|
"ImportPath": "google.golang.org/grpc/internal",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/backoff",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/channelz",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/grpcrand",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/keepalive",
|
"ImportPath": "google.golang.org/grpc/keepalive",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/metadata",
|
"ImportPath": "google.golang.org/grpc/metadata",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/naming",
|
"ImportPath": "google.golang.org/grpc/naming",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/peer",
|
"ImportPath": "google.golang.org/grpc/peer",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/resolver",
|
"ImportPath": "google.golang.org/grpc/resolver",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/resolver/dns",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/resolver/passthrough",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/stats",
|
"ImportPath": "google.golang.org/grpc/stats",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/status",
|
"ImportPath": "google.golang.org/grpc/status",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/tap",
|
"ImportPath": "google.golang.org/grpc/tap",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/transport",
|
"ImportPath": "google.golang.org/grpc/transport",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "gopkg.in/inf.v0",
|
"ImportPath": "gopkg.in/inf.v0",
|
||||||
|
@@ -388,75 +388,107 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc",
|
"ImportPath": "google.golang.org/grpc",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/balancer",
|
"ImportPath": "google.golang.org/grpc/balancer",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/balancer/base",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/balancer/roundrobin",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/codes",
|
"ImportPath": "google.golang.org/grpc/codes",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/connectivity",
|
"ImportPath": "google.golang.org/grpc/connectivity",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/credentials",
|
"ImportPath": "google.golang.org/grpc/credentials",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/grpclb/grpc_lb_v1/messages",
|
"ImportPath": "google.golang.org/grpc/encoding",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/encoding/proto",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/grpclog",
|
"ImportPath": "google.golang.org/grpc/grpclog",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/health/grpc_health_v1",
|
"ImportPath": "google.golang.org/grpc/health/grpc_health_v1",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/internal",
|
"ImportPath": "google.golang.org/grpc/internal",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/backoff",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/channelz",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/internal/grpcrand",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/keepalive",
|
"ImportPath": "google.golang.org/grpc/keepalive",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/metadata",
|
"ImportPath": "google.golang.org/grpc/metadata",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/naming",
|
"ImportPath": "google.golang.org/grpc/naming",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/peer",
|
"ImportPath": "google.golang.org/grpc/peer",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/resolver",
|
"ImportPath": "google.golang.org/grpc/resolver",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/resolver/dns",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "google.golang.org/grpc/resolver/passthrough",
|
||||||
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/stats",
|
"ImportPath": "google.golang.org/grpc/stats",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/status",
|
"ImportPath": "google.golang.org/grpc/status",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/tap",
|
"ImportPath": "google.golang.org/grpc/tap",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc/transport",
|
"ImportPath": "google.golang.org/grpc/transport",
|
||||||
"Rev": "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e"
|
"Rev": "168a6198bcb0ef175f7dacec0b8691fc141dc9b8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "gopkg.in/inf.v0",
|
"ImportPath": "gopkg.in/inf.v0",
|
||||||
|
@@ -147,7 +147,7 @@ var _ DynamicPVTestDriver = &gcePDCSIDriver{}
|
|||||||
func InitGcePDCSIDriver() TestDriver {
|
func InitGcePDCSIDriver() TestDriver {
|
||||||
return &gcePDCSIDriver{
|
return &gcePDCSIDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: DriverInfo{
|
||||||
Name: "com.google.csi.gcepd",
|
Name: "pd.csi.storage.gke.io",
|
||||||
FeatureTag: "[Serial]",
|
FeatureTag: "[Serial]",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
SupportedFsType: sets.NewString(
|
SupportedFsType: sets.NewString(
|
||||||
@@ -237,7 +237,7 @@ var _ DynamicPVTestDriver = &gcePDExternalCSIDriver{}
|
|||||||
func InitGcePDExternalCSIDriver() TestDriver {
|
func InitGcePDExternalCSIDriver() TestDriver {
|
||||||
return &gcePDExternalCSIDriver{
|
return &gcePDExternalCSIDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: DriverInfo{
|
||||||
Name: "com.google.csi.gcepd",
|
Name: "pd.csi.storage.gke.io",
|
||||||
// TODO(#70258): this is temporary until we can figure out how to make e2e tests a library
|
// TODO(#70258): this is temporary until we can figure out how to make e2e tests a library
|
||||||
FeatureTag: "[Feature: gcePD-external]",
|
FeatureTag: "[Feature: gcePD-external]",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
|
@@ -342,7 +342,7 @@ func testVolumeModeSuccessForDynamicPV(input *volumeModeTestInput) {
|
|||||||
var err error
|
var err error
|
||||||
|
|
||||||
// TODO: This skip should be removed once #70760 is fixed
|
// TODO: This skip should be removed once #70760 is fixed
|
||||||
skipTestUntilBugfix("70760", input.driverName, []string{"com.google.csi.gcepd"})
|
skipTestUntilBugfix("70760", input.driverName, []string{"pd.csi.storage.gke.io"})
|
||||||
|
|
||||||
By("Creating sc")
|
By("Creating sc")
|
||||||
input.sc, err = cs.StorageV1().StorageClasses().Create(input.sc)
|
input.sc, err = cs.StorageV1().StorageClasses().Create(input.sc)
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: ServiceAccount
|
kind: ServiceAccount
|
||||||
metadata:
|
metadata:
|
||||||
name: csi-driver-registrar
|
name: csi-node-sa
|
||||||
# replace with non-default namespace name
|
# replace with non-default namespace name
|
||||||
namespace: default
|
namespace: default
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ metadata:
|
|||||||
name: csi-driver-registrar-role
|
name: csi-driver-registrar-role
|
||||||
subjects:
|
subjects:
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: csi-driver-registrar
|
name: csi-node-sa
|
||||||
# replace with non-default namespace name
|
# replace with non-default namespace name
|
||||||
namespace: default
|
namespace: default
|
||||||
roleRef:
|
roleRef:
|
||||||
|
@@ -1,54 +1,51 @@
|
|||||||
kind: StatefulSet
|
kind: StatefulSet
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
metadata:
|
metadata:
|
||||||
name: csi-gce-controller
|
name: csi-gce-pd-controller
|
||||||
spec:
|
spec:
|
||||||
serviceName: "csi-gce-pd"
|
serviceName: "csi-gce-pd"
|
||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: csi-gce-pd-driver
|
app: gcp-compute-persistent-disk-csi-driver
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: csi-gce-pd-driver
|
app: gcp-compute-persistent-disk-csi-driver
|
||||||
spec:
|
spec:
|
||||||
serviceAccountName: csi-controller
|
serviceAccountName: csi-controller-sa
|
||||||
containers:
|
containers:
|
||||||
- name: csi-external-provisioner
|
- name: csi-provisioner
|
||||||
imagePullPolicy: Always
|
image: gcr.io/gke-release/csi-provisioner:v1.0.0-gke.0
|
||||||
image: gcr.io/gke-release/csi-provisioner:v0.4.1-gke.0
|
|
||||||
args:
|
args:
|
||||||
- "--v=5"
|
- "--v=5"
|
||||||
- "--provisioner=com.google.csi.gcepd"
|
- "--provisioner=pd.csi.storage.gke.io"
|
||||||
- "--csi-address=/csi/csi.sock"
|
- "--csi-address=/csi/csi.sock"
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: socket-dir
|
- name: socket-dir
|
||||||
mountPath: /csi
|
mountPath: /csi
|
||||||
- name: csi-attacher
|
- name: csi-attacher
|
||||||
imagePullPolicy: Always
|
image: gcr.io/gke-release/csi-attacher:v1.0.0-gke.0
|
||||||
image: gcr.io/gke-release/csi-attacher:v0.4.1-gke.0
|
|
||||||
args:
|
args:
|
||||||
- "--v=5"
|
- "--v=5"
|
||||||
- "--csi-address=/csi/csi.sock"
|
- "--csi-address=/csi/csi.sock"
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: socket-dir
|
- name: socket-dir
|
||||||
mountPath: /csi
|
mountPath: /csi
|
||||||
- name: gce-driver
|
- name: gce-pd-driver
|
||||||
imagePullPolicy: Always
|
image: gcr.io/gke-release/gcp-compute-persistent-disk-csi-driver:v0.3.0-gke.0
|
||||||
image: gcr.io/gke-release/gcp-compute-persistent-disk-csi-driver:v0.2.0-gke.0
|
|
||||||
args:
|
args:
|
||||||
- "--v=5"
|
- "--v=5"
|
||||||
- "--endpoint=unix:///csi/csi.sock"
|
- "--endpoint=unix:/csi/csi.sock"
|
||||||
env:
|
env:
|
||||||
- name: GOOGLE_APPLICATION_CREDENTIALS
|
- name: GOOGLE_APPLICATION_CREDENTIALS
|
||||||
value: "/etc/service-account/cloud-sa.json"
|
value: "/etc/cloud-sa/cloud-sa.json"
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: socket-dir
|
- name: socket-dir
|
||||||
mountPath: /csi
|
mountPath: /csi
|
||||||
- name: cloud-sa-volume
|
- name: cloud-sa-volume
|
||||||
readOnly: true
|
readOnly: true
|
||||||
mountPath: "/etc/service-account"
|
mountPath: "/etc/cloud-sa"
|
||||||
volumes:
|
volumes:
|
||||||
- name: socket-dir
|
- name: socket-dir
|
||||||
emptyDir: {}
|
emptyDir: {}
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: ServiceAccount
|
kind: ServiceAccount
|
||||||
metadata:
|
metadata:
|
||||||
name: csi-controller
|
name: csi-controller-sa
|
||||||
|
|
||||||
---
|
---
|
||||||
kind: ClusterRoleBinding
|
kind: ClusterRoleBinding
|
||||||
@@ -10,7 +10,7 @@ metadata:
|
|||||||
name: csi-controller-attacher-role
|
name: csi-controller-attacher-role
|
||||||
subjects:
|
subjects:
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: csi-controller
|
name: csi-controller-sa
|
||||||
namespace: default
|
namespace: default
|
||||||
roleRef:
|
roleRef:
|
||||||
kind: ClusterRole
|
kind: ClusterRole
|
||||||
@@ -25,7 +25,7 @@ metadata:
|
|||||||
namespace: default
|
namespace: default
|
||||||
subjects:
|
subjects:
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: csi-controller
|
name: csi-controller-sa
|
||||||
namespace: default
|
namespace: default
|
||||||
roleRef:
|
roleRef:
|
||||||
kind: Role
|
kind: Role
|
||||||
@@ -38,7 +38,7 @@ metadata:
|
|||||||
name: csi-controller-provisioner-role
|
name: csi-controller-provisioner-role
|
||||||
subjects:
|
subjects:
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: csi-controller
|
name: csi-controller-sa
|
||||||
namespace: default
|
namespace: default
|
||||||
roleRef:
|
roleRef:
|
||||||
kind: ClusterRole
|
kind: ClusterRole
|
||||||
@@ -53,7 +53,7 @@ metadata:
|
|||||||
namespace: default
|
namespace: default
|
||||||
subjects:
|
subjects:
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: csi-controller
|
name: csi-controller-sa
|
||||||
namespace: default
|
namespace: default
|
||||||
roleRef:
|
roleRef:
|
||||||
kind: Role
|
kind: Role
|
||||||
@@ -67,10 +67,10 @@ metadata:
|
|||||||
name: psp-csi-controller-driver-registrar-role
|
name: psp-csi-controller-driver-registrar-role
|
||||||
subjects:
|
subjects:
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: csi-controller
|
name: csi-controller-sa
|
||||||
namespace: default
|
namespace: default
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: csi-driver-registrar
|
name: csi-node-sa
|
||||||
namespace: default
|
namespace: default
|
||||||
roleRef:
|
roleRef:
|
||||||
kind: ClusterRole
|
kind: ClusterRole
|
||||||
|
@@ -1,26 +1,28 @@
|
|||||||
kind: DaemonSet
|
kind: DaemonSet
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
metadata:
|
metadata:
|
||||||
name: csi-gce-node
|
name: csi-gce-pd-node
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: csi-gce-driver
|
app: gcp-compute-persistent-disk-csi-driver
|
||||||
serviceName: csi-gce
|
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: csi-gce-driver
|
app: gcp-compute-persistent-disk-csi-driver
|
||||||
spec:
|
spec:
|
||||||
serviceAccountName: csi-driver-registrar
|
serviceAccountName: csi-node-sa
|
||||||
containers:
|
containers:
|
||||||
- name: csi-driver-registrar
|
- name: csi-driver-registrar
|
||||||
imagePullPolicy: Always
|
image: gcr.io/gke-release/csi-driver-registrar:v1.0.0-gke.0
|
||||||
image: gcr.io/gke-release/csi-driver-registrar:v0.4.1-gke.0
|
|
||||||
args:
|
args:
|
||||||
- "--v=5"
|
- "--v=5"
|
||||||
- "--csi-address=/csi/csi.sock"
|
- "--csi-address=/var/lib/kubelet/plugins/pd.csi.storage.gke.io/csi.sock"
|
||||||
- "--kubelet-registration-path=/var/lib/kubelet/plugins/com.google.csi.gcepd/csi.sock"
|
- "--kubelet-registration-path=/var/lib/kubelet/plugins/pd.csi.storage.gke.io/csi.sock"
|
||||||
|
lifecycle:
|
||||||
|
preStop:
|
||||||
|
exec:
|
||||||
|
command: ["/bin/sh", "-c", "rm -rf /registration/pd.csi.storage.gke.io /registration/pd.csi.storage.gke.io-reg.sock"]
|
||||||
env:
|
env:
|
||||||
- name: KUBE_NODE_NAME
|
- name: KUBE_NODE_NAME
|
||||||
valueFrom:
|
valueFrom:
|
||||||
@@ -28,17 +30,16 @@ spec:
|
|||||||
fieldPath: spec.nodeName
|
fieldPath: spec.nodeName
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: plugin-dir
|
- name: plugin-dir
|
||||||
mountPath: /csi
|
mountPath: /var/lib/kubelet/plugins/pd.csi.storage.gke.io/
|
||||||
- name: registration-dir
|
- name: registration-dir
|
||||||
mountPath: /registration
|
mountPath: /registration
|
||||||
- name: gce-driver
|
- name: gce-pd-driver
|
||||||
securityContext:
|
securityContext:
|
||||||
privileged: true
|
privileged: true
|
||||||
imagePullPolicy: Always
|
image: gcr.io/gke-release/gcp-compute-persistent-disk-csi-driver:v0.3.0-gke.0
|
||||||
image: gcr.io/gke-release/gcp-compute-persistent-disk-csi-driver:v0.2.0-gke.0
|
|
||||||
args:
|
args:
|
||||||
- "--v=5"
|
- "--v=5"
|
||||||
- "--endpoint=unix:///csi/csi.sock"
|
- "--endpoint=unix:/csi/csi.sock"
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: kubelet-dir
|
- name: kubelet-dir
|
||||||
mountPath: /var/lib/kubelet
|
mountPath: /var/lib/kubelet
|
||||||
@@ -67,7 +68,7 @@ spec:
|
|||||||
type: Directory
|
type: Directory
|
||||||
- name: plugin-dir
|
- name: plugin-dir
|
||||||
hostPath:
|
hostPath:
|
||||||
path: /var/lib/kubelet/plugins/com.google.csi.gcepd/
|
path: /var/lib/kubelet/plugins/pd.csi.storage.gke.io/
|
||||||
type: DirectoryOrCreate
|
type: DirectoryOrCreate
|
||||||
- name: device-dir
|
- name: device-dir
|
||||||
hostPath:
|
hostPath:
|
||||||
@@ -90,4 +91,3 @@ spec:
|
|||||||
hostPath:
|
hostPath:
|
||||||
path: /sys
|
path: /sys
|
||||||
type: Directory
|
type: Directory
|
||||||
|
|
||||||
|
@@ -30,7 +30,7 @@ spec:
|
|||||||
serviceAccountName: csi-attacher
|
serviceAccountName: csi-attacher
|
||||||
containers:
|
containers:
|
||||||
- name: csi-attacher
|
- name: csi-attacher
|
||||||
image: quay.io/k8scsi/csi-attacher:v0.4.1
|
image: gcr.io/gke-release/csi-attacher:v1.0.0-gke.0
|
||||||
args:
|
args:
|
||||||
- --v=5
|
- --v=5
|
||||||
- --csi-address=$(ADDRESS)
|
- --csi-address=$(ADDRESS)
|
||||||
|
@@ -30,7 +30,7 @@ spec:
|
|||||||
serviceAccountName: csi-provisioner
|
serviceAccountName: csi-provisioner
|
||||||
containers:
|
containers:
|
||||||
- name: csi-provisioner
|
- name: csi-provisioner
|
||||||
image: quay.io/k8scsi/csi-provisioner:v0.4.1
|
image: gcr.io/gke-release/csi-provisioner:v1.0.0-gke.0
|
||||||
args:
|
args:
|
||||||
- "--provisioner=csi-hostpath"
|
- "--provisioner=csi-hostpath"
|
||||||
- "--csi-address=$(ADDRESS)"
|
- "--csi-address=$(ADDRESS)"
|
||||||
|
@@ -11,11 +11,11 @@ spec:
|
|||||||
labels:
|
labels:
|
||||||
app: csi-hostpathplugin
|
app: csi-hostpathplugin
|
||||||
spec:
|
spec:
|
||||||
serviceAccountName: csi-driver-registrar
|
serviceAccountName: csi-node-sa
|
||||||
hostNetwork: true
|
hostNetwork: true
|
||||||
containers:
|
containers:
|
||||||
- name: driver-registrar
|
- name: driver-registrar
|
||||||
image: quay.io/k8scsi/driver-registrar:v0.4.1
|
image: gcr.io/gke-release/csi-driver-registrar:v1.0.0-gke.0
|
||||||
args:
|
args:
|
||||||
- --v=5
|
- --v=5
|
||||||
- --csi-address=/csi/csi.sock
|
- --csi-address=/csi/csi.sock
|
||||||
@@ -33,7 +33,7 @@ spec:
|
|||||||
- mountPath: /registration
|
- mountPath: /registration
|
||||||
name: registration-dir
|
name: registration-dir
|
||||||
- name: hostpath
|
- name: hostpath
|
||||||
image: quay.io/k8scsi/hostpathplugin:v0.4.1
|
image: quay.io/k8scsi/hostpathplugin:v1.0.0
|
||||||
args:
|
args:
|
||||||
- "--v=5"
|
- "--v=5"
|
||||||
- "--endpoint=$(CSI_ENDPOINT)"
|
- "--endpoint=$(CSI_ENDPOINT)"
|
||||||
|
@@ -8,7 +8,7 @@ subjects:
|
|||||||
name: csi-attacher
|
name: csi-attacher
|
||||||
namespace: default
|
namespace: default
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: csi-driver-registrar
|
name: csi-node-sa
|
||||||
namespace: default
|
namespace: default
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: csi-provisioner
|
name: csi-provisioner
|
||||||
|
@@ -304,7 +304,7 @@ func TestObjectSizeResponses(t *testing.T) {
|
|||||||
const DeploymentTwoMegabyteSize = 1000000
|
const DeploymentTwoMegabyteSize = 1000000
|
||||||
|
|
||||||
expectedMsgFor1MB := `etcdserver: request is too large`
|
expectedMsgFor1MB := `etcdserver: request is too large`
|
||||||
expectedMsgFor2MB := `rpc error: code = ResourceExhausted desc = grpc: trying to send message larger than max`
|
expectedMsgFor2MB := `rpc error: code = ResourceExhausted desc = trying to send message larger than max`
|
||||||
expectedMsgForLargeAnnotation := `metadata.annotations: Too long: must have at most 262144 characters`
|
expectedMsgForLargeAnnotation := `metadata.annotations: Too long: must have at most 262144 characters`
|
||||||
|
|
||||||
deployment1 := constructBody("a", DeploymentMegabyteSize, "labels", t) // >1 MB file
|
deployment1 := constructBody("a", DeploymentMegabyteSize, "labels", t) // >1 MB file
|
||||||
|
3
vendor/BUILD
vendored
3
vendor/BUILD
vendored
@@ -94,7 +94,7 @@ filegroup(
|
|||||||
"//vendor/github.com/cloudflare/cfssl/ubiquity:all-srcs",
|
"//vendor/github.com/cloudflare/cfssl/ubiquity:all-srcs",
|
||||||
"//vendor/github.com/clusterhq/flocker-go:all-srcs",
|
"//vendor/github.com/clusterhq/flocker-go:all-srcs",
|
||||||
"//vendor/github.com/codedellemc/goscaleio:all-srcs",
|
"//vendor/github.com/codedellemc/goscaleio:all-srcs",
|
||||||
"//vendor/github.com/container-storage-interface/spec/lib/go/csi/v0:all-srcs",
|
"//vendor/github.com/container-storage-interface/spec/lib/go/csi:all-srcs",
|
||||||
"//vendor/github.com/containerd/console:all-srcs",
|
"//vendor/github.com/containerd/console:all-srcs",
|
||||||
"//vendor/github.com/containerd/containerd/api/services/containers/v1:all-srcs",
|
"//vendor/github.com/containerd/containerd/api/services/containers/v1:all-srcs",
|
||||||
"//vendor/github.com/containerd/containerd/api/services/tasks/v1:all-srcs",
|
"//vendor/github.com/containerd/containerd/api/services/tasks/v1:all-srcs",
|
||||||
@@ -239,6 +239,7 @@ filegroup(
|
|||||||
"//vendor/github.com/golang/mock/gomock:all-srcs",
|
"//vendor/github.com/golang/mock/gomock:all-srcs",
|
||||||
"//vendor/github.com/golang/protobuf/jsonpb:all-srcs",
|
"//vendor/github.com/golang/protobuf/jsonpb:all-srcs",
|
||||||
"//vendor/github.com/golang/protobuf/proto:all-srcs",
|
"//vendor/github.com/golang/protobuf/proto:all-srcs",
|
||||||
|
"//vendor/github.com/golang/protobuf/protoc-gen-go/descriptor:all-srcs",
|
||||||
"//vendor/github.com/golang/protobuf/ptypes:all-srcs",
|
"//vendor/github.com/golang/protobuf/ptypes:all-srcs",
|
||||||
"//vendor/github.com/google/btree:all-srcs",
|
"//vendor/github.com/google/btree:all-srcs",
|
||||||
"//vendor/github.com/google/cadvisor/accelerators:all-srcs",
|
"//vendor/github.com/google/cadvisor/accelerators:all-srcs",
|
||||||
|
@@ -3,11 +3,13 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
|||||||
go_library(
|
go_library(
|
||||||
name = "go_default_library",
|
name = "go_default_library",
|
||||||
srcs = ["csi.pb.go"],
|
srcs = ["csi.pb.go"],
|
||||||
importmap = "k8s.io/kubernetes/vendor/github.com/container-storage-interface/spec/lib/go/csi/v0",
|
importmap = "k8s.io/kubernetes/vendor/github.com/container-storage-interface/spec/lib/go/csi",
|
||||||
importpath = "github.com/container-storage-interface/spec/lib/go/csi/v0",
|
importpath = "github.com/container-storage-interface/spec/lib/go/csi",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
"//vendor/github.com/golang/protobuf/proto:go_default_library",
|
"//vendor/github.com/golang/protobuf/proto:go_default_library",
|
||||||
|
"//vendor/github.com/golang/protobuf/protoc-gen-go/descriptor:go_default_library",
|
||||||
|
"//vendor/github.com/golang/protobuf/ptypes/timestamp:go_default_library",
|
||||||
"//vendor/github.com/golang/protobuf/ptypes/wrappers:go_default_library",
|
"//vendor/github.com/golang/protobuf/ptypes/wrappers:go_default_library",
|
||||||
"//vendor/golang.org/x/net/context:go_default_library",
|
"//vendor/golang.org/x/net/context:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc:go_default_library",
|
"//vendor/google.golang.org/grpc:go_default_library",
|
File diff suppressed because it is too large
Load Diff
24
vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/BUILD
generated
vendored
Normal file
24
vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/BUILD
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["descriptor.pb.go"],
|
||||||
|
importmap = "k8s.io/kubernetes/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor",
|
||||||
|
importpath = "github.com/golang/protobuf/protoc-gen-go/descriptor",
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
2812
vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go
generated
vendored
Normal file
2812
vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
872
vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto
generated
vendored
Normal file
872
vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto
generated
vendored
Normal file
@@ -0,0 +1,872 @@
|
|||||||
|
// Protocol Buffers - Google's data interchange format
|
||||||
|
// Copyright 2008 Google Inc. All rights reserved.
|
||||||
|
// https://developers.google.com/protocol-buffers/
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda)
|
||||||
|
// Based on original Protocol Buffers design by
|
||||||
|
// Sanjay Ghemawat, Jeff Dean, and others.
|
||||||
|
//
|
||||||
|
// The messages in this file describe the definitions found in .proto files.
|
||||||
|
// A valid .proto file can be translated directly to a FileDescriptorProto
|
||||||
|
// without any other information (e.g. without reading its imports).
|
||||||
|
|
||||||
|
|
||||||
|
syntax = "proto2";
|
||||||
|
|
||||||
|
package google.protobuf;
|
||||||
|
option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor";
|
||||||
|
option java_package = "com.google.protobuf";
|
||||||
|
option java_outer_classname = "DescriptorProtos";
|
||||||
|
option csharp_namespace = "Google.Protobuf.Reflection";
|
||||||
|
option objc_class_prefix = "GPB";
|
||||||
|
option cc_enable_arenas = true;
|
||||||
|
|
||||||
|
// descriptor.proto must be optimized for speed because reflection-based
|
||||||
|
// algorithms don't work during bootstrapping.
|
||||||
|
option optimize_for = SPEED;
|
||||||
|
|
||||||
|
// The protocol compiler can output a FileDescriptorSet containing the .proto
|
||||||
|
// files it parses.
|
||||||
|
message FileDescriptorSet {
|
||||||
|
repeated FileDescriptorProto file = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes a complete .proto file.
|
||||||
|
message FileDescriptorProto {
|
||||||
|
optional string name = 1; // file name, relative to root of source tree
|
||||||
|
optional string package = 2; // e.g. "foo", "foo.bar", etc.
|
||||||
|
|
||||||
|
// Names of files imported by this file.
|
||||||
|
repeated string dependency = 3;
|
||||||
|
// Indexes of the public imported files in the dependency list above.
|
||||||
|
repeated int32 public_dependency = 10;
|
||||||
|
// Indexes of the weak imported files in the dependency list.
|
||||||
|
// For Google-internal migration only. Do not use.
|
||||||
|
repeated int32 weak_dependency = 11;
|
||||||
|
|
||||||
|
// All top-level definitions in this file.
|
||||||
|
repeated DescriptorProto message_type = 4;
|
||||||
|
repeated EnumDescriptorProto enum_type = 5;
|
||||||
|
repeated ServiceDescriptorProto service = 6;
|
||||||
|
repeated FieldDescriptorProto extension = 7;
|
||||||
|
|
||||||
|
optional FileOptions options = 8;
|
||||||
|
|
||||||
|
// This field contains optional information about the original source code.
|
||||||
|
// You may safely remove this entire field without harming runtime
|
||||||
|
// functionality of the descriptors -- the information is needed only by
|
||||||
|
// development tools.
|
||||||
|
optional SourceCodeInfo source_code_info = 9;
|
||||||
|
|
||||||
|
// The syntax of the proto file.
|
||||||
|
// The supported values are "proto2" and "proto3".
|
||||||
|
optional string syntax = 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes a message type.
|
||||||
|
message DescriptorProto {
|
||||||
|
optional string name = 1;
|
||||||
|
|
||||||
|
repeated FieldDescriptorProto field = 2;
|
||||||
|
repeated FieldDescriptorProto extension = 6;
|
||||||
|
|
||||||
|
repeated DescriptorProto nested_type = 3;
|
||||||
|
repeated EnumDescriptorProto enum_type = 4;
|
||||||
|
|
||||||
|
message ExtensionRange {
|
||||||
|
optional int32 start = 1;
|
||||||
|
optional int32 end = 2;
|
||||||
|
|
||||||
|
optional ExtensionRangeOptions options = 3;
|
||||||
|
}
|
||||||
|
repeated ExtensionRange extension_range = 5;
|
||||||
|
|
||||||
|
repeated OneofDescriptorProto oneof_decl = 8;
|
||||||
|
|
||||||
|
optional MessageOptions options = 7;
|
||||||
|
|
||||||
|
// Range of reserved tag numbers. Reserved tag numbers may not be used by
|
||||||
|
// fields or extension ranges in the same message. Reserved ranges may
|
||||||
|
// not overlap.
|
||||||
|
message ReservedRange {
|
||||||
|
optional int32 start = 1; // Inclusive.
|
||||||
|
optional int32 end = 2; // Exclusive.
|
||||||
|
}
|
||||||
|
repeated ReservedRange reserved_range = 9;
|
||||||
|
// Reserved field names, which may not be used by fields in the same message.
|
||||||
|
// A given name may only be reserved once.
|
||||||
|
repeated string reserved_name = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ExtensionRangeOptions {
|
||||||
|
// The parser stores options it doesn't recognize here. See above.
|
||||||
|
repeated UninterpretedOption uninterpreted_option = 999;
|
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above.
|
||||||
|
extensions 1000 to max;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes a field within a message.
|
||||||
|
message FieldDescriptorProto {
|
||||||
|
enum Type {
|
||||||
|
// 0 is reserved for errors.
|
||||||
|
// Order is weird for historical reasons.
|
||||||
|
TYPE_DOUBLE = 1;
|
||||||
|
TYPE_FLOAT = 2;
|
||||||
|
// Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if
|
||||||
|
// negative values are likely.
|
||||||
|
TYPE_INT64 = 3;
|
||||||
|
TYPE_UINT64 = 4;
|
||||||
|
// Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if
|
||||||
|
// negative values are likely.
|
||||||
|
TYPE_INT32 = 5;
|
||||||
|
TYPE_FIXED64 = 6;
|
||||||
|
TYPE_FIXED32 = 7;
|
||||||
|
TYPE_BOOL = 8;
|
||||||
|
TYPE_STRING = 9;
|
||||||
|
// Tag-delimited aggregate.
|
||||||
|
// Group type is deprecated and not supported in proto3. However, Proto3
|
||||||
|
// implementations should still be able to parse the group wire format and
|
||||||
|
// treat group fields as unknown fields.
|
||||||
|
TYPE_GROUP = 10;
|
||||||
|
TYPE_MESSAGE = 11; // Length-delimited aggregate.
|
||||||
|
|
||||||
|
// New in version 2.
|
||||||
|
TYPE_BYTES = 12;
|
||||||
|
TYPE_UINT32 = 13;
|
||||||
|
TYPE_ENUM = 14;
|
||||||
|
TYPE_SFIXED32 = 15;
|
||||||
|
TYPE_SFIXED64 = 16;
|
||||||
|
TYPE_SINT32 = 17; // Uses ZigZag encoding.
|
||||||
|
TYPE_SINT64 = 18; // Uses ZigZag encoding.
|
||||||
|
};
|
||||||
|
|
||||||
|
enum Label {
|
||||||
|
// 0 is reserved for errors
|
||||||
|
LABEL_OPTIONAL = 1;
|
||||||
|
LABEL_REQUIRED = 2;
|
||||||
|
LABEL_REPEATED = 3;
|
||||||
|
};
|
||||||
|
|
||||||
|
optional string name = 1;
|
||||||
|
optional int32 number = 3;
|
||||||
|
optional Label label = 4;
|
||||||
|
|
||||||
|
// If type_name is set, this need not be set. If both this and type_name
|
||||||
|
// are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
|
||||||
|
optional Type type = 5;
|
||||||
|
|
||||||
|
// For message and enum types, this is the name of the type. If the name
|
||||||
|
// starts with a '.', it is fully-qualified. Otherwise, C++-like scoping
|
||||||
|
// rules are used to find the type (i.e. first the nested types within this
|
||||||
|
// message are searched, then within the parent, on up to the root
|
||||||
|
// namespace).
|
||||||
|
optional string type_name = 6;
|
||||||
|
|
||||||
|
// For extensions, this is the name of the type being extended. It is
|
||||||
|
// resolved in the same manner as type_name.
|
||||||
|
optional string extendee = 2;
|
||||||
|
|
||||||
|
// For numeric types, contains the original text representation of the value.
|
||||||
|
// For booleans, "true" or "false".
|
||||||
|
// For strings, contains the default text contents (not escaped in any way).
|
||||||
|
// For bytes, contains the C escaped value. All bytes >= 128 are escaped.
|
||||||
|
// TODO(kenton): Base-64 encode?
|
||||||
|
optional string default_value = 7;
|
||||||
|
|
||||||
|
// If set, gives the index of a oneof in the containing type's oneof_decl
|
||||||
|
// list. This field is a member of that oneof.
|
||||||
|
optional int32 oneof_index = 9;
|
||||||
|
|
||||||
|
// JSON name of this field. The value is set by protocol compiler. If the
|
||||||
|
// user has set a "json_name" option on this field, that option's value
|
||||||
|
// will be used. Otherwise, it's deduced from the field's name by converting
|
||||||
|
// it to camelCase.
|
||||||
|
optional string json_name = 10;
|
||||||
|
|
||||||
|
optional FieldOptions options = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes a oneof.
|
||||||
|
message OneofDescriptorProto {
|
||||||
|
optional string name = 1;
|
||||||
|
optional OneofOptions options = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes an enum type.
|
||||||
|
message EnumDescriptorProto {
|
||||||
|
optional string name = 1;
|
||||||
|
|
||||||
|
repeated EnumValueDescriptorProto value = 2;
|
||||||
|
|
||||||
|
optional EnumOptions options = 3;
|
||||||
|
|
||||||
|
// Range of reserved numeric values. Reserved values may not be used by
|
||||||
|
// entries in the same enum. Reserved ranges may not overlap.
|
||||||
|
//
|
||||||
|
// Note that this is distinct from DescriptorProto.ReservedRange in that it
|
||||||
|
// is inclusive such that it can appropriately represent the entire int32
|
||||||
|
// domain.
|
||||||
|
message EnumReservedRange {
|
||||||
|
optional int32 start = 1; // Inclusive.
|
||||||
|
optional int32 end = 2; // Inclusive.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Range of reserved numeric values. Reserved numeric values may not be used
|
||||||
|
// by enum values in the same enum declaration. Reserved ranges may not
|
||||||
|
// overlap.
|
||||||
|
repeated EnumReservedRange reserved_range = 4;
|
||||||
|
|
||||||
|
// Reserved enum value names, which may not be reused. A given name may only
|
||||||
|
// be reserved once.
|
||||||
|
repeated string reserved_name = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes a value within an enum.
|
||||||
|
message EnumValueDescriptorProto {
|
||||||
|
optional string name = 1;
|
||||||
|
optional int32 number = 2;
|
||||||
|
|
||||||
|
optional EnumValueOptions options = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes a service.
|
||||||
|
message ServiceDescriptorProto {
|
||||||
|
optional string name = 1;
|
||||||
|
repeated MethodDescriptorProto method = 2;
|
||||||
|
|
||||||
|
optional ServiceOptions options = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes a method of a service.
|
||||||
|
message MethodDescriptorProto {
|
||||||
|
optional string name = 1;
|
||||||
|
|
||||||
|
// Input and output type names. These are resolved in the same way as
|
||||||
|
// FieldDescriptorProto.type_name, but must refer to a message type.
|
||||||
|
optional string input_type = 2;
|
||||||
|
optional string output_type = 3;
|
||||||
|
|
||||||
|
optional MethodOptions options = 4;
|
||||||
|
|
||||||
|
// Identifies if client streams multiple client messages
|
||||||
|
optional bool client_streaming = 5 [default=false];
|
||||||
|
// Identifies if server streams multiple server messages
|
||||||
|
optional bool server_streaming = 6 [default=false];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ===================================================================
|
||||||
|
// Options
|
||||||
|
|
||||||
|
// Each of the definitions above may have "options" attached. These are
|
||||||
|
// just annotations which may cause code to be generated slightly differently
|
||||||
|
// or may contain hints for code that manipulates protocol messages.
|
||||||
|
//
|
||||||
|
// Clients may define custom options as extensions of the *Options messages.
|
||||||
|
// These extensions may not yet be known at parsing time, so the parser cannot
|
||||||
|
// store the values in them. Instead it stores them in a field in the *Options
|
||||||
|
// message called uninterpreted_option. This field must have the same name
|
||||||
|
// across all *Options messages. We then use this field to populate the
|
||||||
|
// extensions when we build a descriptor, at which point all protos have been
|
||||||
|
// parsed and so all extensions are known.
|
||||||
|
//
|
||||||
|
// Extension numbers for custom options may be chosen as follows:
|
||||||
|
// * For options which will only be used within a single application or
|
||||||
|
// organization, or for experimental options, use field numbers 50000
|
||||||
|
// through 99999. It is up to you to ensure that you do not use the
|
||||||
|
// same number for multiple options.
|
||||||
|
// * For options which will be published and used publicly by multiple
|
||||||
|
// independent entities, e-mail protobuf-global-extension-registry@google.com
|
||||||
|
// to reserve extension numbers. Simply provide your project name (e.g.
|
||||||
|
// Objective-C plugin) and your project website (if available) -- there's no
|
||||||
|
// need to explain how you intend to use them. Usually you only need one
|
||||||
|
// extension number. You can declare multiple options with only one extension
|
||||||
|
// number by putting them in a sub-message. See the Custom Options section of
|
||||||
|
// the docs for examples:
|
||||||
|
// https://developers.google.com/protocol-buffers/docs/proto#options
|
||||||
|
// If this turns out to be popular, a web service will be set up
|
||||||
|
// to automatically assign option numbers.
|
||||||
|
|
||||||
|
|
||||||
|
message FileOptions {
|
||||||
|
|
||||||
|
// Sets the Java package where classes generated from this .proto will be
|
||||||
|
// placed. By default, the proto package is used, but this is often
|
||||||
|
// inappropriate because proto packages do not normally start with backwards
|
||||||
|
// domain names.
|
||||||
|
optional string java_package = 1;
|
||||||
|
|
||||||
|
|
||||||
|
// If set, all the classes from the .proto file are wrapped in a single
|
||||||
|
// outer class with the given name. This applies to both Proto1
|
||||||
|
// (equivalent to the old "--one_java_file" option) and Proto2 (where
|
||||||
|
// a .proto always translates to a single class, but you may want to
|
||||||
|
// explicitly choose the class name).
|
||||||
|
optional string java_outer_classname = 8;
|
||||||
|
|
||||||
|
// If set true, then the Java code generator will generate a separate .java
|
||||||
|
// file for each top-level message, enum, and service defined in the .proto
|
||||||
|
// file. Thus, these types will *not* be nested inside the outer class
|
||||||
|
// named by java_outer_classname. However, the outer class will still be
|
||||||
|
// generated to contain the file's getDescriptor() method as well as any
|
||||||
|
// top-level extensions defined in the file.
|
||||||
|
optional bool java_multiple_files = 10 [default=false];
|
||||||
|
|
||||||
|
// This option does nothing.
|
||||||
|
optional bool java_generate_equals_and_hash = 20 [deprecated=true];
|
||||||
|
|
||||||
|
// If set true, then the Java2 code generator will generate code that
|
||||||
|
// throws an exception whenever an attempt is made to assign a non-UTF-8
|
||||||
|
// byte sequence to a string field.
|
||||||
|
// Message reflection will do the same.
|
||||||
|
// However, an extension field still accepts non-UTF-8 byte sequences.
|
||||||
|
// This option has no effect on when used with the lite runtime.
|
||||||
|
optional bool java_string_check_utf8 = 27 [default=false];
|
||||||
|
|
||||||
|
|
||||||
|
// Generated classes can be optimized for speed or code size.
|
||||||
|
enum OptimizeMode {
|
||||||
|
SPEED = 1; // Generate complete code for parsing, serialization,
|
||||||
|
// etc.
|
||||||
|
CODE_SIZE = 2; // Use ReflectionOps to implement these methods.
|
||||||
|
LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime.
|
||||||
|
}
|
||||||
|
optional OptimizeMode optimize_for = 9 [default=SPEED];
|
||||||
|
|
||||||
|
// Sets the Go package where structs generated from this .proto will be
|
||||||
|
// placed. If omitted, the Go package will be derived from the following:
|
||||||
|
// - The basename of the package import path, if provided.
|
||||||
|
// - Otherwise, the package statement in the .proto file, if present.
|
||||||
|
// - Otherwise, the basename of the .proto file, without extension.
|
||||||
|
optional string go_package = 11;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Should generic services be generated in each language? "Generic" services
|
||||||
|
// are not specific to any particular RPC system. They are generated by the
|
||||||
|
// main code generators in each language (without additional plugins).
|
||||||
|
// Generic services were the only kind of service generation supported by
|
||||||
|
// early versions of google.protobuf.
|
||||||
|
//
|
||||||
|
// Generic services are now considered deprecated in favor of using plugins
|
||||||
|
// that generate code specific to your particular RPC system. Therefore,
|
||||||
|
// these default to false. Old code which depends on generic services should
|
||||||
|
// explicitly set them to true.
|
||||||
|
optional bool cc_generic_services = 16 [default=false];
|
||||||
|
optional bool java_generic_services = 17 [default=false];
|
||||||
|
optional bool py_generic_services = 18 [default=false];
|
||||||
|
optional bool php_generic_services = 42 [default=false];
|
||||||
|
|
||||||
|
// Is this file deprecated?
|
||||||
|
// Depending on the target platform, this can emit Deprecated annotations
|
||||||
|
// for everything in the file, or it will be completely ignored; in the very
|
||||||
|
// least, this is a formalization for deprecating files.
|
||||||
|
optional bool deprecated = 23 [default=false];
|
||||||
|
|
||||||
|
// Enables the use of arenas for the proto messages in this file. This applies
|
||||||
|
// only to generated classes for C++.
|
||||||
|
optional bool cc_enable_arenas = 31 [default=false];
|
||||||
|
|
||||||
|
|
||||||
|
// Sets the objective c class prefix which is prepended to all objective c
|
||||||
|
// generated classes from this .proto. There is no default.
|
||||||
|
optional string objc_class_prefix = 36;
|
||||||
|
|
||||||
|
// Namespace for generated classes; defaults to the package.
|
||||||
|
optional string csharp_namespace = 37;
|
||||||
|
|
||||||
|
// By default Swift generators will take the proto package and CamelCase it
|
||||||
|
// replacing '.' with underscore and use that to prefix the types/symbols
|
||||||
|
// defined. When this options is provided, they will use this value instead
|
||||||
|
// to prefix the types/symbols defined.
|
||||||
|
optional string swift_prefix = 39;
|
||||||
|
|
||||||
|
// Sets the php class prefix which is prepended to all php generated classes
|
||||||
|
// from this .proto. Default is empty.
|
||||||
|
optional string php_class_prefix = 40;
|
||||||
|
|
||||||
|
// Use this option to change the namespace of php generated classes. Default
|
||||||
|
// is empty. When this option is empty, the package name will be used for
|
||||||
|
// determining the namespace.
|
||||||
|
optional string php_namespace = 41;
|
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here.
|
||||||
|
// See the documentation for the "Options" section above.
|
||||||
|
repeated UninterpretedOption uninterpreted_option = 999;
|
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message.
|
||||||
|
// See the documentation for the "Options" section above.
|
||||||
|
extensions 1000 to max;
|
||||||
|
|
||||||
|
reserved 38;
|
||||||
|
}
|
||||||
|
|
||||||
|
message MessageOptions {
|
||||||
|
// Set true to use the old proto1 MessageSet wire format for extensions.
|
||||||
|
// This is provided for backwards-compatibility with the MessageSet wire
|
||||||
|
// format. You should not use this for any other reason: It's less
|
||||||
|
// efficient, has fewer features, and is more complicated.
|
||||||
|
//
|
||||||
|
// The message must be defined exactly as follows:
|
||||||
|
// message Foo {
|
||||||
|
// option message_set_wire_format = true;
|
||||||
|
// extensions 4 to max;
|
||||||
|
// }
|
||||||
|
// Note that the message cannot have any defined fields; MessageSets only
|
||||||
|
// have extensions.
|
||||||
|
//
|
||||||
|
// All extensions of your type must be singular messages; e.g. they cannot
|
||||||
|
// be int32s, enums, or repeated messages.
|
||||||
|
//
|
||||||
|
// Because this is an option, the above two restrictions are not enforced by
|
||||||
|
// the protocol compiler.
|
||||||
|
optional bool message_set_wire_format = 1 [default=false];
|
||||||
|
|
||||||
|
// Disables the generation of the standard "descriptor()" accessor, which can
|
||||||
|
// conflict with a field of the same name. This is meant to make migration
|
||||||
|
// from proto1 easier; new code should avoid fields named "descriptor".
|
||||||
|
optional bool no_standard_descriptor_accessor = 2 [default=false];
|
||||||
|
|
||||||
|
// Is this message deprecated?
|
||||||
|
// Depending on the target platform, this can emit Deprecated annotations
|
||||||
|
// for the message, or it will be completely ignored; in the very least,
|
||||||
|
// this is a formalization for deprecating messages.
|
||||||
|
optional bool deprecated = 3 [default=false];
|
||||||
|
|
||||||
|
// Whether the message is an automatically generated map entry type for the
|
||||||
|
// maps field.
|
||||||
|
//
|
||||||
|
// For maps fields:
|
||||||
|
// map<KeyType, ValueType> map_field = 1;
|
||||||
|
// The parsed descriptor looks like:
|
||||||
|
// message MapFieldEntry {
|
||||||
|
// option map_entry = true;
|
||||||
|
// optional KeyType key = 1;
|
||||||
|
// optional ValueType value = 2;
|
||||||
|
// }
|
||||||
|
// repeated MapFieldEntry map_field = 1;
|
||||||
|
//
|
||||||
|
// Implementations may choose not to generate the map_entry=true message, but
|
||||||
|
// use a native map in the target language to hold the keys and values.
|
||||||
|
// The reflection APIs in such implementions still need to work as
|
||||||
|
// if the field is a repeated message field.
|
||||||
|
//
|
||||||
|
// NOTE: Do not set the option in .proto files. Always use the maps syntax
|
||||||
|
// instead. The option should only be implicitly set by the proto compiler
|
||||||
|
// parser.
|
||||||
|
optional bool map_entry = 7;
|
||||||
|
|
||||||
|
reserved 8; // javalite_serializable
|
||||||
|
reserved 9; // javanano_as_lite
|
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above.
|
||||||
|
repeated UninterpretedOption uninterpreted_option = 999;
|
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above.
|
||||||
|
extensions 1000 to max;
|
||||||
|
}
|
||||||
|
|
||||||
|
message FieldOptions {
|
||||||
|
// The ctype option instructs the C++ code generator to use a different
|
||||||
|
// representation of the field than it normally would. See the specific
|
||||||
|
// options below. This option is not yet implemented in the open source
|
||||||
|
// release -- sorry, we'll try to include it in a future version!
|
||||||
|
optional CType ctype = 1 [default = STRING];
|
||||||
|
enum CType {
|
||||||
|
// Default mode.
|
||||||
|
STRING = 0;
|
||||||
|
|
||||||
|
CORD = 1;
|
||||||
|
|
||||||
|
STRING_PIECE = 2;
|
||||||
|
}
|
||||||
|
// The packed option can be enabled for repeated primitive fields to enable
|
||||||
|
// a more efficient representation on the wire. Rather than repeatedly
|
||||||
|
// writing the tag and type for each element, the entire array is encoded as
|
||||||
|
// a single length-delimited blob. In proto3, only explicit setting it to
|
||||||
|
// false will avoid using packed encoding.
|
||||||
|
optional bool packed = 2;
|
||||||
|
|
||||||
|
// The jstype option determines the JavaScript type used for values of the
|
||||||
|
// field. The option is permitted only for 64 bit integral and fixed types
|
||||||
|
// (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING
|
||||||
|
// is represented as JavaScript string, which avoids loss of precision that
|
||||||
|
// can happen when a large value is converted to a floating point JavaScript.
|
||||||
|
// Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
|
||||||
|
// use the JavaScript "number" type. The behavior of the default option
|
||||||
|
// JS_NORMAL is implementation dependent.
|
||||||
|
//
|
||||||
|
// This option is an enum to permit additional types to be added, e.g.
|
||||||
|
// goog.math.Integer.
|
||||||
|
optional JSType jstype = 6 [default = JS_NORMAL];
|
||||||
|
enum JSType {
|
||||||
|
// Use the default type.
|
||||||
|
JS_NORMAL = 0;
|
||||||
|
|
||||||
|
// Use JavaScript strings.
|
||||||
|
JS_STRING = 1;
|
||||||
|
|
||||||
|
// Use JavaScript numbers.
|
||||||
|
JS_NUMBER = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should this field be parsed lazily? Lazy applies only to message-type
|
||||||
|
// fields. It means that when the outer message is initially parsed, the
|
||||||
|
// inner message's contents will not be parsed but instead stored in encoded
|
||||||
|
// form. The inner message will actually be parsed when it is first accessed.
|
||||||
|
//
|
||||||
|
// This is only a hint. Implementations are free to choose whether to use
|
||||||
|
// eager or lazy parsing regardless of the value of this option. However,
|
||||||
|
// setting this option true suggests that the protocol author believes that
|
||||||
|
// using lazy parsing on this field is worth the additional bookkeeping
|
||||||
|
// overhead typically needed to implement it.
|
||||||
|
//
|
||||||
|
// This option does not affect the public interface of any generated code;
|
||||||
|
// all method signatures remain the same. Furthermore, thread-safety of the
|
||||||
|
// interface is not affected by this option; const methods remain safe to
|
||||||
|
// call from multiple threads concurrently, while non-const methods continue
|
||||||
|
// to require exclusive access.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Note that implementations may choose not to check required fields within
|
||||||
|
// a lazy sub-message. That is, calling IsInitialized() on the outer message
|
||||||
|
// may return true even if the inner message has missing required fields.
|
||||||
|
// This is necessary because otherwise the inner message would have to be
|
||||||
|
// parsed in order to perform the check, defeating the purpose of lazy
|
||||||
|
// parsing. An implementation which chooses not to check required fields
|
||||||
|
// must be consistent about it. That is, for any particular sub-message, the
|
||||||
|
// implementation must either *always* check its required fields, or *never*
|
||||||
|
// check its required fields, regardless of whether or not the message has
|
||||||
|
// been parsed.
|
||||||
|
optional bool lazy = 5 [default=false];
|
||||||
|
|
||||||
|
// Is this field deprecated?
|
||||||
|
// Depending on the target platform, this can emit Deprecated annotations
|
||||||
|
// for accessors, or it will be completely ignored; in the very least, this
|
||||||
|
// is a formalization for deprecating fields.
|
||||||
|
optional bool deprecated = 3 [default=false];
|
||||||
|
|
||||||
|
// For Google-internal migration only. Do not use.
|
||||||
|
optional bool weak = 10 [default=false];
|
||||||
|
|
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above.
|
||||||
|
repeated UninterpretedOption uninterpreted_option = 999;
|
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above.
|
||||||
|
extensions 1000 to max;
|
||||||
|
|
||||||
|
reserved 4; // removed jtype
|
||||||
|
}
|
||||||
|
|
||||||
|
message OneofOptions {
|
||||||
|
// The parser stores options it doesn't recognize here. See above.
|
||||||
|
repeated UninterpretedOption uninterpreted_option = 999;
|
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above.
|
||||||
|
extensions 1000 to max;
|
||||||
|
}
|
||||||
|
|
||||||
|
message EnumOptions {
|
||||||
|
|
||||||
|
// Set this option to true to allow mapping different tag names to the same
|
||||||
|
// value.
|
||||||
|
optional bool allow_alias = 2;
|
||||||
|
|
||||||
|
// Is this enum deprecated?
|
||||||
|
// Depending on the target platform, this can emit Deprecated annotations
|
||||||
|
// for the enum, or it will be completely ignored; in the very least, this
|
||||||
|
// is a formalization for deprecating enums.
|
||||||
|
optional bool deprecated = 3 [default=false];
|
||||||
|
|
||||||
|
reserved 5; // javanano_as_lite
|
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above.
|
||||||
|
repeated UninterpretedOption uninterpreted_option = 999;
|
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above.
|
||||||
|
extensions 1000 to max;
|
||||||
|
}
|
||||||
|
|
||||||
|
message EnumValueOptions {
|
||||||
|
// Is this enum value deprecated?
|
||||||
|
// Depending on the target platform, this can emit Deprecated annotations
|
||||||
|
// for the enum value, or it will be completely ignored; in the very least,
|
||||||
|
// this is a formalization for deprecating enum values.
|
||||||
|
optional bool deprecated = 1 [default=false];
|
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above.
|
||||||
|
repeated UninterpretedOption uninterpreted_option = 999;
|
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above.
|
||||||
|
extensions 1000 to max;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ServiceOptions {
|
||||||
|
|
||||||
|
// Note: Field numbers 1 through 32 are reserved for Google's internal RPC
|
||||||
|
// framework. We apologize for hoarding these numbers to ourselves, but
|
||||||
|
// we were already using them long before we decided to release Protocol
|
||||||
|
// Buffers.
|
||||||
|
|
||||||
|
// Is this service deprecated?
|
||||||
|
// Depending on the target platform, this can emit Deprecated annotations
|
||||||
|
// for the service, or it will be completely ignored; in the very least,
|
||||||
|
// this is a formalization for deprecating services.
|
||||||
|
optional bool deprecated = 33 [default=false];
|
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above.
|
||||||
|
repeated UninterpretedOption uninterpreted_option = 999;
|
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above.
|
||||||
|
extensions 1000 to max;
|
||||||
|
}
|
||||||
|
|
||||||
|
message MethodOptions {
|
||||||
|
|
||||||
|
// Note: Field numbers 1 through 32 are reserved for Google's internal RPC
|
||||||
|
// framework. We apologize for hoarding these numbers to ourselves, but
|
||||||
|
// we were already using them long before we decided to release Protocol
|
||||||
|
// Buffers.
|
||||||
|
|
||||||
|
// Is this method deprecated?
|
||||||
|
// Depending on the target platform, this can emit Deprecated annotations
|
||||||
|
// for the method, or it will be completely ignored; in the very least,
|
||||||
|
// this is a formalization for deprecating methods.
|
||||||
|
optional bool deprecated = 33 [default=false];
|
||||||
|
|
||||||
|
// Is this method side-effect-free (or safe in HTTP parlance), or idempotent,
|
||||||
|
// or neither? HTTP based RPC implementation may choose GET verb for safe
|
||||||
|
// methods, and PUT verb for idempotent methods instead of the default POST.
|
||||||
|
enum IdempotencyLevel {
|
||||||
|
IDEMPOTENCY_UNKNOWN = 0;
|
||||||
|
NO_SIDE_EFFECTS = 1; // implies idempotent
|
||||||
|
IDEMPOTENT = 2; // idempotent, but may have side effects
|
||||||
|
}
|
||||||
|
optional IdempotencyLevel idempotency_level =
|
||||||
|
34 [default=IDEMPOTENCY_UNKNOWN];
|
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above.
|
||||||
|
repeated UninterpretedOption uninterpreted_option = 999;
|
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above.
|
||||||
|
extensions 1000 to max;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// A message representing a option the parser does not recognize. This only
|
||||||
|
// appears in options protos created by the compiler::Parser class.
|
||||||
|
// DescriptorPool resolves these when building Descriptor objects. Therefore,
|
||||||
|
// options protos in descriptor objects (e.g. returned by Descriptor::options(),
|
||||||
|
// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
|
||||||
|
// in them.
|
||||||
|
message UninterpretedOption {
|
||||||
|
// The name of the uninterpreted option. Each string represents a segment in
|
||||||
|
// a dot-separated name. is_extension is true iff a segment represents an
|
||||||
|
// extension (denoted with parentheses in options specs in .proto files).
|
||||||
|
// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
|
||||||
|
// "foo.(bar.baz).qux".
|
||||||
|
message NamePart {
|
||||||
|
required string name_part = 1;
|
||||||
|
required bool is_extension = 2;
|
||||||
|
}
|
||||||
|
repeated NamePart name = 2;
|
||||||
|
|
||||||
|
// The value of the uninterpreted option, in whatever type the tokenizer
|
||||||
|
// identified it as during parsing. Exactly one of these should be set.
|
||||||
|
optional string identifier_value = 3;
|
||||||
|
optional uint64 positive_int_value = 4;
|
||||||
|
optional int64 negative_int_value = 5;
|
||||||
|
optional double double_value = 6;
|
||||||
|
optional bytes string_value = 7;
|
||||||
|
optional string aggregate_value = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===================================================================
|
||||||
|
// Optional source code info
|
||||||
|
|
||||||
|
// Encapsulates information about the original source file from which a
|
||||||
|
// FileDescriptorProto was generated.
|
||||||
|
message SourceCodeInfo {
|
||||||
|
// A Location identifies a piece of source code in a .proto file which
|
||||||
|
// corresponds to a particular definition. This information is intended
|
||||||
|
// to be useful to IDEs, code indexers, documentation generators, and similar
|
||||||
|
// tools.
|
||||||
|
//
|
||||||
|
// For example, say we have a file like:
|
||||||
|
// message Foo {
|
||||||
|
// optional string foo = 1;
|
||||||
|
// }
|
||||||
|
// Let's look at just the field definition:
|
||||||
|
// optional string foo = 1;
|
||||||
|
// ^ ^^ ^^ ^ ^^^
|
||||||
|
// a bc de f ghi
|
||||||
|
// We have the following locations:
|
||||||
|
// span path represents
|
||||||
|
// [a,i) [ 4, 0, 2, 0 ] The whole field definition.
|
||||||
|
// [a,b) [ 4, 0, 2, 0, 4 ] The label (optional).
|
||||||
|
// [c,d) [ 4, 0, 2, 0, 5 ] The type (string).
|
||||||
|
// [e,f) [ 4, 0, 2, 0, 1 ] The name (foo).
|
||||||
|
// [g,h) [ 4, 0, 2, 0, 3 ] The number (1).
|
||||||
|
//
|
||||||
|
// Notes:
|
||||||
|
// - A location may refer to a repeated field itself (i.e. not to any
|
||||||
|
// particular index within it). This is used whenever a set of elements are
|
||||||
|
// logically enclosed in a single code segment. For example, an entire
|
||||||
|
// extend block (possibly containing multiple extension definitions) will
|
||||||
|
// have an outer location whose path refers to the "extensions" repeated
|
||||||
|
// field without an index.
|
||||||
|
// - Multiple locations may have the same path. This happens when a single
|
||||||
|
// logical declaration is spread out across multiple places. The most
|
||||||
|
// obvious example is the "extend" block again -- there may be multiple
|
||||||
|
// extend blocks in the same scope, each of which will have the same path.
|
||||||
|
// - A location's span is not always a subset of its parent's span. For
|
||||||
|
// example, the "extendee" of an extension declaration appears at the
|
||||||
|
// beginning of the "extend" block and is shared by all extensions within
|
||||||
|
// the block.
|
||||||
|
// - Just because a location's span is a subset of some other location's span
|
||||||
|
// does not mean that it is a descendent. For example, a "group" defines
|
||||||
|
// both a type and a field in a single declaration. Thus, the locations
|
||||||
|
// corresponding to the type and field and their components will overlap.
|
||||||
|
// - Code which tries to interpret locations should probably be designed to
|
||||||
|
// ignore those that it doesn't understand, as more types of locations could
|
||||||
|
// be recorded in the future.
|
||||||
|
repeated Location location = 1;
|
||||||
|
message Location {
|
||||||
|
// Identifies which part of the FileDescriptorProto was defined at this
|
||||||
|
// location.
|
||||||
|
//
|
||||||
|
// Each element is a field number or an index. They form a path from
|
||||||
|
// the root FileDescriptorProto to the place where the definition. For
|
||||||
|
// example, this path:
|
||||||
|
// [ 4, 3, 2, 7, 1 ]
|
||||||
|
// refers to:
|
||||||
|
// file.message_type(3) // 4, 3
|
||||||
|
// .field(7) // 2, 7
|
||||||
|
// .name() // 1
|
||||||
|
// This is because FileDescriptorProto.message_type has field number 4:
|
||||||
|
// repeated DescriptorProto message_type = 4;
|
||||||
|
// and DescriptorProto.field has field number 2:
|
||||||
|
// repeated FieldDescriptorProto field = 2;
|
||||||
|
// and FieldDescriptorProto.name has field number 1:
|
||||||
|
// optional string name = 1;
|
||||||
|
//
|
||||||
|
// Thus, the above path gives the location of a field name. If we removed
|
||||||
|
// the last element:
|
||||||
|
// [ 4, 3, 2, 7 ]
|
||||||
|
// this path refers to the whole field declaration (from the beginning
|
||||||
|
// of the label to the terminating semicolon).
|
||||||
|
repeated int32 path = 1 [packed=true];
|
||||||
|
|
||||||
|
// Always has exactly three or four elements: start line, start column,
|
||||||
|
// end line (optional, otherwise assumed same as start line), end column.
|
||||||
|
// These are packed into a single field for efficiency. Note that line
|
||||||
|
// and column numbers are zero-based -- typically you will want to add
|
||||||
|
// 1 to each before displaying to a user.
|
||||||
|
repeated int32 span = 2 [packed=true];
|
||||||
|
|
||||||
|
// If this SourceCodeInfo represents a complete declaration, these are any
|
||||||
|
// comments appearing before and after the declaration which appear to be
|
||||||
|
// attached to the declaration.
|
||||||
|
//
|
||||||
|
// A series of line comments appearing on consecutive lines, with no other
|
||||||
|
// tokens appearing on those lines, will be treated as a single comment.
|
||||||
|
//
|
||||||
|
// leading_detached_comments will keep paragraphs of comments that appear
|
||||||
|
// before (but not connected to) the current element. Each paragraph,
|
||||||
|
// separated by empty lines, will be one comment element in the repeated
|
||||||
|
// field.
|
||||||
|
//
|
||||||
|
// Only the comment content is provided; comment markers (e.g. //) are
|
||||||
|
// stripped out. For block comments, leading whitespace and an asterisk
|
||||||
|
// will be stripped from the beginning of each line other than the first.
|
||||||
|
// Newlines are included in the output.
|
||||||
|
//
|
||||||
|
// Examples:
|
||||||
|
//
|
||||||
|
// optional int32 foo = 1; // Comment attached to foo.
|
||||||
|
// // Comment attached to bar.
|
||||||
|
// optional int32 bar = 2;
|
||||||
|
//
|
||||||
|
// optional string baz = 3;
|
||||||
|
// // Comment attached to baz.
|
||||||
|
// // Another line attached to baz.
|
||||||
|
//
|
||||||
|
// // Comment attached to qux.
|
||||||
|
// //
|
||||||
|
// // Another line attached to qux.
|
||||||
|
// optional double qux = 4;
|
||||||
|
//
|
||||||
|
// // Detached comment for corge. This is not leading or trailing comments
|
||||||
|
// // to qux or corge because there are blank lines separating it from
|
||||||
|
// // both.
|
||||||
|
//
|
||||||
|
// // Detached comment for corge paragraph 2.
|
||||||
|
//
|
||||||
|
// optional string corge = 5;
|
||||||
|
// /* Block comment attached
|
||||||
|
// * to corge. Leading asterisks
|
||||||
|
// * will be removed. */
|
||||||
|
// /* Block comment attached to
|
||||||
|
// * grault. */
|
||||||
|
// optional int32 grault = 6;
|
||||||
|
//
|
||||||
|
// // ignored detached comments.
|
||||||
|
optional string leading_comments = 3;
|
||||||
|
optional string trailing_comments = 4;
|
||||||
|
repeated string leading_detached_comments = 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describes the relationship between generated code and its original source
|
||||||
|
// file. A GeneratedCodeInfo message is associated with only one generated
|
||||||
|
// source file, but may contain references to different source .proto files.
|
||||||
|
message GeneratedCodeInfo {
|
||||||
|
// An Annotation connects some span of text in generated code to an element
|
||||||
|
// of its generating .proto file.
|
||||||
|
repeated Annotation annotation = 1;
|
||||||
|
message Annotation {
|
||||||
|
// Identifies the element in the original source .proto file. This field
|
||||||
|
// is formatted the same as SourceCodeInfo.Location.path.
|
||||||
|
repeated int32 path = 1 [packed=true];
|
||||||
|
|
||||||
|
// Identifies the filesystem path to the original source .proto.
|
||||||
|
optional string source_file = 2;
|
||||||
|
|
||||||
|
// Identifies the starting offset in bytes in the generated code
|
||||||
|
// that relates to the identified object.
|
||||||
|
optional int32 begin = 3;
|
||||||
|
|
||||||
|
// Identifies the ending offset in bytes in the generated code that
|
||||||
|
// relates to the identified offset. The end offset should be one past
|
||||||
|
// the last relevant byte (so the length of the text = end - begin).
|
||||||
|
optional int32 end = 4;
|
||||||
|
}
|
||||||
|
}
|
0
vendor/google.golang.org/grpc/.please-update
generated
vendored
0
vendor/google.golang.org/grpc/.please-update
generated
vendored
14
vendor/google.golang.org/grpc/.travis.yml
generated
vendored
14
vendor/google.golang.org/grpc/.travis.yml
generated
vendored
@@ -1,20 +1,24 @@
|
|||||||
language: go
|
language: go
|
||||||
|
|
||||||
go:
|
go:
|
||||||
|
- 1.6.x
|
||||||
- 1.7.x
|
- 1.7.x
|
||||||
- 1.8.x
|
- 1.8.x
|
||||||
- 1.9.x
|
- 1.9.x
|
||||||
|
- 1.10.x
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- go: 1.9.x
|
- go: 1.10.x
|
||||||
env: ARCH=386
|
env: RUN386=1
|
||||||
|
|
||||||
go_import_path: google.golang.org/grpc
|
go_import_path: google.golang.org/grpc
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- if [[ "$TRAVIS_GO_VERSION" = 1.9* && "$ARCH" != "386" ]]; then ./vet.sh -install || exit 1; fi
|
- if [[ -n "$RUN386" ]]; then export GOARCH=386; fi
|
||||||
|
- if [[ "$TRAVIS_GO_VERSION" = 1.10* && "$GOARCH" != "386" ]]; then ./vet.sh -install || exit 1; fi
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- if [[ "$TRAVIS_GO_VERSION" = 1.9* && "$ARCH" != "386" ]]; then ./vet.sh || exit 1; fi
|
- if [[ "$TRAVIS_GO_VERSION" = 1.10* && "$GOARCH" != "386" ]]; then ./vet.sh || exit 1; fi
|
||||||
- make test testrace
|
- make test || exit 1
|
||||||
|
- if [[ "$GOARCH" != "386" ]]; then make testrace; fi
|
||||||
|
17
vendor/google.golang.org/grpc/BUILD
generated
vendored
17
vendor/google.golang.org/grpc/BUILD
generated
vendored
@@ -11,7 +11,9 @@ go_library(
|
|||||||
"clientconn.go",
|
"clientconn.go",
|
||||||
"codec.go",
|
"codec.go",
|
||||||
"doc.go",
|
"doc.go",
|
||||||
"grpclb.go",
|
"envconfig.go",
|
||||||
|
"go16.go",
|
||||||
|
"go17.go",
|
||||||
"interceptor.go",
|
"interceptor.go",
|
||||||
"picker_wrapper.go",
|
"picker_wrapper.go",
|
||||||
"pickfirst.go",
|
"pickfirst.go",
|
||||||
@@ -19,29 +21,37 @@ go_library(
|
|||||||
"resolver_conn_wrapper.go",
|
"resolver_conn_wrapper.go",
|
||||||
"rpc_util.go",
|
"rpc_util.go",
|
||||||
"server.go",
|
"server.go",
|
||||||
|
"service_config.go",
|
||||||
|
"stickiness_linkedmap.go",
|
||||||
"stream.go",
|
"stream.go",
|
||||||
"trace.go",
|
"trace.go",
|
||||||
|
"version.go",
|
||||||
],
|
],
|
||||||
importmap = "k8s.io/kubernetes/vendor/google.golang.org/grpc",
|
importmap = "k8s.io/kubernetes/vendor/google.golang.org/grpc",
|
||||||
importpath = "google.golang.org/grpc",
|
importpath = "google.golang.org/grpc",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
"//vendor/github.com/golang/protobuf/proto:go_default_library",
|
|
||||||
"//vendor/golang.org/x/net/context:go_default_library",
|
"//vendor/golang.org/x/net/context:go_default_library",
|
||||||
"//vendor/golang.org/x/net/http2:go_default_library",
|
"//vendor/golang.org/x/net/http2:go_default_library",
|
||||||
"//vendor/golang.org/x/net/trace:go_default_library",
|
"//vendor/golang.org/x/net/trace:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/balancer:go_default_library",
|
"//vendor/google.golang.org/grpc/balancer:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/balancer/roundrobin:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/codes:go_default_library",
|
"//vendor/google.golang.org/grpc/codes:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/connectivity:go_default_library",
|
"//vendor/google.golang.org/grpc/connectivity:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/credentials:go_default_library",
|
"//vendor/google.golang.org/grpc/credentials:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages:go_default_library",
|
"//vendor/google.golang.org/grpc/encoding:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/encoding/proto:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/grpclog:go_default_library",
|
"//vendor/google.golang.org/grpc/grpclog:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/internal:go_default_library",
|
"//vendor/google.golang.org/grpc/internal:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/internal/backoff:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/internal/channelz:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/keepalive:go_default_library",
|
"//vendor/google.golang.org/grpc/keepalive:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/metadata:go_default_library",
|
"//vendor/google.golang.org/grpc/metadata:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/naming:go_default_library",
|
"//vendor/google.golang.org/grpc/naming:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/peer:go_default_library",
|
"//vendor/google.golang.org/grpc/peer:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/resolver:go_default_library",
|
"//vendor/google.golang.org/grpc/resolver:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/resolver/dns:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/resolver/passthrough:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/stats:go_default_library",
|
"//vendor/google.golang.org/grpc/stats:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/status:go_default_library",
|
"//vendor/google.golang.org/grpc/status:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/tap:go_default_library",
|
"//vendor/google.golang.org/grpc/tap:go_default_library",
|
||||||
@@ -64,6 +74,7 @@ filegroup(
|
|||||||
"//vendor/google.golang.org/grpc/codes:all-srcs",
|
"//vendor/google.golang.org/grpc/codes:all-srcs",
|
||||||
"//vendor/google.golang.org/grpc/connectivity:all-srcs",
|
"//vendor/google.golang.org/grpc/connectivity:all-srcs",
|
||||||
"//vendor/google.golang.org/grpc/credentials:all-srcs",
|
"//vendor/google.golang.org/grpc/credentials:all-srcs",
|
||||||
|
"//vendor/google.golang.org/grpc/encoding:all-srcs",
|
||||||
"//vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages:all-srcs",
|
"//vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages:all-srcs",
|
||||||
"//vendor/google.golang.org/grpc/grpclog:all-srcs",
|
"//vendor/google.golang.org/grpc/grpclog:all-srcs",
|
||||||
"//vendor/google.golang.org/grpc/health:all-srcs",
|
"//vendor/google.golang.org/grpc/health:all-srcs",
|
||||||
|
6
vendor/google.golang.org/grpc/CONTRIBUTING.md
generated
vendored
6
vendor/google.golang.org/grpc/CONTRIBUTING.md
generated
vendored
@@ -7,7 +7,7 @@ If you are new to github, please start by reading [Pull Request howto](https://h
|
|||||||
## Legal requirements
|
## Legal requirements
|
||||||
|
|
||||||
In order to protect both you and ourselves, you will need to sign the
|
In order to protect both you and ourselves, you will need to sign the
|
||||||
[Contributor License Agreement](https://cla.developers.google.com/clas).
|
[Contributor License Agreement](https://identity.linuxfoundation.org/projects/cncf).
|
||||||
|
|
||||||
## Guidelines for Pull Requests
|
## Guidelines for Pull Requests
|
||||||
How to get your contributions merged smoothly and quickly.
|
How to get your contributions merged smoothly and quickly.
|
||||||
@@ -27,6 +27,10 @@ How to get your contributions merged smoothly and quickly.
|
|||||||
- Keep your PR up to date with upstream/master (if there are merge conflicts, we can't really merge your change).
|
- Keep your PR up to date with upstream/master (if there are merge conflicts, we can't really merge your change).
|
||||||
|
|
||||||
- **All tests need to be passing** before your change can be merged. We recommend you **run tests locally** before creating your PR to catch breakages early on.
|
- **All tests need to be passing** before your change can be merged. We recommend you **run tests locally** before creating your PR to catch breakages early on.
|
||||||
|
- `make all` to test everything, OR
|
||||||
|
- `make vet` to catch vet errors
|
||||||
|
- `make test` to run the tests
|
||||||
|
- `make testrace` to run tests in race mode
|
||||||
|
|
||||||
- Exceptions to the rules can be made if there's a compelling reason for doing so.
|
- Exceptions to the rules can be made if there's a compelling reason for doing so.
|
||||||
|
|
||||||
|
13
vendor/google.golang.org/grpc/Makefile
generated
vendored
13
vendor/google.golang.org/grpc/Makefile
generated
vendored
@@ -1,4 +1,4 @@
|
|||||||
all: test testrace
|
all: vet test testrace
|
||||||
|
|
||||||
deps:
|
deps:
|
||||||
go get -d -v google.golang.org/grpc/...
|
go get -d -v google.golang.org/grpc/...
|
||||||
@@ -22,11 +22,14 @@ proto:
|
|||||||
fi
|
fi
|
||||||
go generate google.golang.org/grpc/...
|
go generate google.golang.org/grpc/...
|
||||||
|
|
||||||
|
vet:
|
||||||
|
./vet.sh
|
||||||
|
|
||||||
test: testdeps
|
test: testdeps
|
||||||
go test -cpu 1,4 google.golang.org/grpc/...
|
go test -cpu 1,4 -timeout 5m google.golang.org/grpc/...
|
||||||
|
|
||||||
testrace: testdeps
|
testrace: testdeps
|
||||||
go test -race -cpu 1,4 google.golang.org/grpc/...
|
go test -race -cpu 1,4 -timeout 7m google.golang.org/grpc/...
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
go clean -i google.golang.org/grpc/...
|
go clean -i google.golang.org/grpc/...
|
||||||
@@ -39,7 +42,7 @@ clean:
|
|||||||
updatetestdeps \
|
updatetestdeps \
|
||||||
build \
|
build \
|
||||||
proto \
|
proto \
|
||||||
|
vet \
|
||||||
test \
|
test \
|
||||||
testrace \
|
testrace \
|
||||||
clean \
|
clean
|
||||||
coverage
|
|
||||||
|
4
vendor/google.golang.org/grpc/README.md
generated
vendored
4
vendor/google.golang.org/grpc/README.md
generated
vendored
@@ -1,6 +1,6 @@
|
|||||||
# gRPC-Go
|
# gRPC-Go
|
||||||
|
|
||||||
[](https://travis-ci.org/grpc/grpc-go) [](https://godoc.org/google.golang.org/grpc)
|
[](https://travis-ci.org/grpc/grpc-go) [](https://godoc.org/google.golang.org/grpc) [](https://goreportcard.com/report/github.com/grpc/grpc-go)
|
||||||
|
|
||||||
The Go implementation of [gRPC](https://grpc.io/): A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. For more information see the [gRPC Quick Start: Go](https://grpc.io/docs/quickstart/go.html) guide.
|
The Go implementation of [gRPC](https://grpc.io/): A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. For more information see the [gRPC Quick Start: Go](https://grpc.io/docs/quickstart/go.html) guide.
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ $ go get -u google.golang.org/grpc
|
|||||||
Prerequisites
|
Prerequisites
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
This requires Go 1.7 or later.
|
This requires Go 1.6 or later. Go 1.7 will be required soon.
|
||||||
|
|
||||||
Constraints
|
Constraints
|
||||||
-----------
|
-----------
|
||||||
|
68
vendor/google.golang.org/grpc/backoff.go
generated
vendored
68
vendor/google.golang.org/grpc/backoff.go
generated
vendored
@@ -16,83 +16,23 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// See internal/backoff package for the backoff implementation. This file is
|
||||||
|
// kept for the exported types and API backward compatility.
|
||||||
|
|
||||||
package grpc
|
package grpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math/rand"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DefaultBackoffConfig uses values specified for backoff in
|
// DefaultBackoffConfig uses values specified for backoff in
|
||||||
// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md.
|
// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md.
|
||||||
var (
|
var DefaultBackoffConfig = BackoffConfig{
|
||||||
DefaultBackoffConfig = BackoffConfig{
|
|
||||||
MaxDelay: 120 * time.Second,
|
MaxDelay: 120 * time.Second,
|
||||||
baseDelay: 1.0 * time.Second,
|
|
||||||
factor: 1.6,
|
|
||||||
jitter: 0.2,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
// backoffStrategy defines the methodology for backing off after a grpc
|
|
||||||
// connection failure.
|
|
||||||
//
|
|
||||||
// This is unexported until the gRPC project decides whether or not to allow
|
|
||||||
// alternative backoff strategies. Once a decision is made, this type and its
|
|
||||||
// method may be exported.
|
|
||||||
type backoffStrategy interface {
|
|
||||||
// backoff returns the amount of time to wait before the next retry given
|
|
||||||
// the number of consecutive failures.
|
|
||||||
backoff(retries int) time.Duration
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// BackoffConfig defines the parameters for the default gRPC backoff strategy.
|
// BackoffConfig defines the parameters for the default gRPC backoff strategy.
|
||||||
type BackoffConfig struct {
|
type BackoffConfig struct {
|
||||||
// MaxDelay is the upper bound of backoff delay.
|
// MaxDelay is the upper bound of backoff delay.
|
||||||
MaxDelay time.Duration
|
MaxDelay time.Duration
|
||||||
|
|
||||||
// TODO(stevvooe): The following fields are not exported, as allowing
|
|
||||||
// changes would violate the current gRPC specification for backoff. If
|
|
||||||
// gRPC decides to allow more interesting backoff strategies, these fields
|
|
||||||
// may be opened up in the future.
|
|
||||||
|
|
||||||
// baseDelay is the amount of time to wait before retrying after the first
|
|
||||||
// failure.
|
|
||||||
baseDelay time.Duration
|
|
||||||
|
|
||||||
// factor is applied to the backoff after each retry.
|
|
||||||
factor float64
|
|
||||||
|
|
||||||
// jitter provides a range to randomize backoff delays.
|
|
||||||
jitter float64
|
|
||||||
}
|
|
||||||
|
|
||||||
func setDefaults(bc *BackoffConfig) {
|
|
||||||
md := bc.MaxDelay
|
|
||||||
*bc = DefaultBackoffConfig
|
|
||||||
|
|
||||||
if md > 0 {
|
|
||||||
bc.MaxDelay = md
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (bc BackoffConfig) backoff(retries int) time.Duration {
|
|
||||||
if retries == 0 {
|
|
||||||
return bc.baseDelay
|
|
||||||
}
|
|
||||||
backoff, max := float64(bc.baseDelay), float64(bc.MaxDelay)
|
|
||||||
for backoff < max && retries > 0 {
|
|
||||||
backoff *= bc.factor
|
|
||||||
retries--
|
|
||||||
}
|
|
||||||
if backoff > max {
|
|
||||||
backoff = max
|
|
||||||
}
|
|
||||||
// Randomize backoff delays so that if a cluster of requests start at
|
|
||||||
// the same time, they won't operate in lockstep.
|
|
||||||
backoff *= 1 + bc.jitter*(rand.Float64()*2-1)
|
|
||||||
if backoff < 0 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return time.Duration(backoff)
|
|
||||||
}
|
}
|
||||||
|
16
vendor/google.golang.org/grpc/balancer.go
generated
vendored
16
vendor/google.golang.org/grpc/balancer.go
generated
vendored
@@ -28,10 +28,12 @@ import (
|
|||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
"google.golang.org/grpc/grpclog"
|
"google.golang.org/grpc/grpclog"
|
||||||
"google.golang.org/grpc/naming"
|
"google.golang.org/grpc/naming"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Address represents a server the client connects to.
|
// Address represents a server the client connects to.
|
||||||
// This is the EXPERIMENTAL API and may be changed or extended in the future.
|
//
|
||||||
|
// Deprecated: please use package balancer.
|
||||||
type Address struct {
|
type Address struct {
|
||||||
// Addr is the server address on which a connection will be established.
|
// Addr is the server address on which a connection will be established.
|
||||||
Addr string
|
Addr string
|
||||||
@@ -41,6 +43,8 @@ type Address struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BalancerConfig specifies the configurations for Balancer.
|
// BalancerConfig specifies the configurations for Balancer.
|
||||||
|
//
|
||||||
|
// Deprecated: please use package balancer.
|
||||||
type BalancerConfig struct {
|
type BalancerConfig struct {
|
||||||
// DialCreds is the transport credential the Balancer implementation can
|
// DialCreds is the transport credential the Balancer implementation can
|
||||||
// use to dial to a remote load balancer server. The Balancer implementations
|
// use to dial to a remote load balancer server. The Balancer implementations
|
||||||
@@ -53,7 +57,8 @@ type BalancerConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BalancerGetOptions configures a Get call.
|
// BalancerGetOptions configures a Get call.
|
||||||
// This is the EXPERIMENTAL API and may be changed or extended in the future.
|
//
|
||||||
|
// Deprecated: please use package balancer.
|
||||||
type BalancerGetOptions struct {
|
type BalancerGetOptions struct {
|
||||||
// BlockingWait specifies whether Get should block when there is no
|
// BlockingWait specifies whether Get should block when there is no
|
||||||
// connected address.
|
// connected address.
|
||||||
@@ -61,7 +66,8 @@ type BalancerGetOptions struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Balancer chooses network addresses for RPCs.
|
// Balancer chooses network addresses for RPCs.
|
||||||
// This is the EXPERIMENTAL API and may be changed or extended in the future.
|
//
|
||||||
|
// Deprecated: please use package balancer.
|
||||||
type Balancer interface {
|
type Balancer interface {
|
||||||
// Start does the initialization work to bootstrap a Balancer. For example,
|
// Start does the initialization work to bootstrap a Balancer. For example,
|
||||||
// this function may start the name resolution and watch the updates. It will
|
// this function may start the name resolution and watch the updates. It will
|
||||||
@@ -134,6 +140,8 @@ func downErrorf(timeout, temporary bool, format string, a ...interface{}) downEr
|
|||||||
|
|
||||||
// RoundRobin returns a Balancer that selects addresses round-robin. It uses r to watch
|
// RoundRobin returns a Balancer that selects addresses round-robin. It uses r to watch
|
||||||
// the name resolution updates and updates the addresses available correspondingly.
|
// the name resolution updates and updates the addresses available correspondingly.
|
||||||
|
//
|
||||||
|
// Deprecated: please use package balancer/roundrobin.
|
||||||
func RoundRobin(r naming.Resolver) Balancer {
|
func RoundRobin(r naming.Resolver) Balancer {
|
||||||
return &roundRobin{r: r}
|
return &roundRobin{r: r}
|
||||||
}
|
}
|
||||||
@@ -310,7 +318,7 @@ func (rr *roundRobin) Get(ctx context.Context, opts BalancerGetOptions) (addr Ad
|
|||||||
if !opts.BlockingWait {
|
if !opts.BlockingWait {
|
||||||
if len(rr.addrs) == 0 {
|
if len(rr.addrs) == 0 {
|
||||||
rr.mu.Unlock()
|
rr.mu.Unlock()
|
||||||
err = Errorf(codes.Unavailable, "there is no address available")
|
err = status.Errorf(codes.Unavailable, "there is no address available")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Returns the next addr on rr.addrs for failfast RPCs.
|
// Returns the next addr on rr.addrs for failfast RPCs.
|
||||||
|
6
vendor/google.golang.org/grpc/balancer/BUILD
generated
vendored
6
vendor/google.golang.org/grpc/balancer/BUILD
generated
vendored
@@ -23,7 +23,11 @@ filegroup(
|
|||||||
|
|
||||||
filegroup(
|
filegroup(
|
||||||
name = "all-srcs",
|
name = "all-srcs",
|
||||||
srcs = [":package-srcs"],
|
srcs = [
|
||||||
|
":package-srcs",
|
||||||
|
"//vendor/google.golang.org/grpc/balancer/base:all-srcs",
|
||||||
|
"//vendor/google.golang.org/grpc/balancer/roundrobin:all-srcs",
|
||||||
|
],
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
)
|
)
|
||||||
|
86
vendor/google.golang.org/grpc/balancer/balancer.go
generated
vendored
86
vendor/google.golang.org/grpc/balancer/balancer.go
generated
vendored
@@ -23,6 +23,7 @@ package balancer
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"net"
|
"net"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"google.golang.org/grpc/connectivity"
|
"google.golang.org/grpc/connectivity"
|
||||||
@@ -33,24 +34,26 @@ import (
|
|||||||
var (
|
var (
|
||||||
// m is a map from name to balancer builder.
|
// m is a map from name to balancer builder.
|
||||||
m = make(map[string]Builder)
|
m = make(map[string]Builder)
|
||||||
// defaultBuilder is the default balancer to use.
|
|
||||||
defaultBuilder Builder // TODO(bar) install pickfirst as default.
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Register registers the balancer builder to the balancer map.
|
// Register registers the balancer builder to the balancer map. b.Name
|
||||||
// b.Name will be used as the name registered with this builder.
|
// (lowercased) will be used as the name registered with this builder.
|
||||||
|
//
|
||||||
|
// NOTE: this function must only be called during initialization time (i.e. in
|
||||||
|
// an init() function), and is not thread-safe. If multiple Balancers are
|
||||||
|
// registered with the same name, the one registered last will take effect.
|
||||||
func Register(b Builder) {
|
func Register(b Builder) {
|
||||||
m[b.Name()] = b
|
m[strings.ToLower(b.Name())] = b
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get returns the resolver builder registered with the given name.
|
// Get returns the resolver builder registered with the given name.
|
||||||
// If no builder is register with the name, the default pickfirst will
|
// Note that the compare is done in a case-insenstive fashion.
|
||||||
// be used.
|
// If no builder is register with the name, nil will be returned.
|
||||||
func Get(name string) Builder {
|
func Get(name string) Builder {
|
||||||
if b, ok := m[name]; ok {
|
if b, ok := m[strings.ToLower(name)]; ok {
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
return defaultBuilder
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SubConn represents a gRPC sub connection.
|
// SubConn represents a gRPC sub connection.
|
||||||
@@ -66,6 +69,11 @@ func Get(name string) Builder {
|
|||||||
// When the connection encounters an error, it will reconnect immediately.
|
// When the connection encounters an error, it will reconnect immediately.
|
||||||
// When the connection becomes IDLE, it will not reconnect unless Connect is
|
// When the connection becomes IDLE, it will not reconnect unless Connect is
|
||||||
// called.
|
// called.
|
||||||
|
//
|
||||||
|
// This interface is to be implemented by gRPC. Users should not need a
|
||||||
|
// brand new implementation of this interface. For the situations like
|
||||||
|
// testing, the new implementation should embed this interface. This allows
|
||||||
|
// gRPC to add new methods to this interface.
|
||||||
type SubConn interface {
|
type SubConn interface {
|
||||||
// UpdateAddresses updates the addresses used in this SubConn.
|
// UpdateAddresses updates the addresses used in this SubConn.
|
||||||
// gRPC checks if currently-connected address is still in the new list.
|
// gRPC checks if currently-connected address is still in the new list.
|
||||||
@@ -83,6 +91,11 @@ type SubConn interface {
|
|||||||
type NewSubConnOptions struct{}
|
type NewSubConnOptions struct{}
|
||||||
|
|
||||||
// ClientConn represents a gRPC ClientConn.
|
// ClientConn represents a gRPC ClientConn.
|
||||||
|
//
|
||||||
|
// This interface is to be implemented by gRPC. Users should not need a
|
||||||
|
// brand new implementation of this interface. For the situations like
|
||||||
|
// testing, the new implementation should embed this interface. This allows
|
||||||
|
// gRPC to add new methods to this interface.
|
||||||
type ClientConn interface {
|
type ClientConn interface {
|
||||||
// NewSubConn is called by balancer to create a new SubConn.
|
// NewSubConn is called by balancer to create a new SubConn.
|
||||||
// It doesn't block and wait for the connections to be established.
|
// It doesn't block and wait for the connections to be established.
|
||||||
@@ -99,6 +112,9 @@ type ClientConn interface {
|
|||||||
// on the new picker to pick new SubConn.
|
// on the new picker to pick new SubConn.
|
||||||
UpdateBalancerState(s connectivity.State, p Picker)
|
UpdateBalancerState(s connectivity.State, p Picker)
|
||||||
|
|
||||||
|
// ResolveNow is called by balancer to notify gRPC to do a name resolving.
|
||||||
|
ResolveNow(resolver.ResolveNowOption)
|
||||||
|
|
||||||
// Target returns the dial target for this ClientConn.
|
// Target returns the dial target for this ClientConn.
|
||||||
Target() string
|
Target() string
|
||||||
}
|
}
|
||||||
@@ -113,6 +129,8 @@ type BuildOptions struct {
|
|||||||
// to a remote load balancer server. The Balancer implementations
|
// to a remote load balancer server. The Balancer implementations
|
||||||
// can ignore this if it doesn't need to talk to remote balancer.
|
// can ignore this if it doesn't need to talk to remote balancer.
|
||||||
Dialer func(context.Context, string) (net.Conn, error)
|
Dialer func(context.Context, string) (net.Conn, error)
|
||||||
|
// ChannelzParentID is the entity parent's channelz unique identification number.
|
||||||
|
ChannelzParentID int64
|
||||||
}
|
}
|
||||||
|
|
||||||
// Builder creates a balancer.
|
// Builder creates a balancer.
|
||||||
@@ -131,6 +149,10 @@ type PickOptions struct{}
|
|||||||
type DoneInfo struct {
|
type DoneInfo struct {
|
||||||
// Err is the rpc error the RPC finished with. It could be nil.
|
// Err is the rpc error the RPC finished with. It could be nil.
|
||||||
Err error
|
Err error
|
||||||
|
// BytesSent indicates if any bytes have been sent to the server.
|
||||||
|
BytesSent bool
|
||||||
|
// BytesReceived indicates if any byte has been received from the server.
|
||||||
|
BytesReceived bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -143,7 +165,7 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Picker is used by gRPC to pick a SubConn to send an RPC.
|
// Picker is used by gRPC to pick a SubConn to send an RPC.
|
||||||
// Balancer is expected to generate a new picker from its snapshot everytime its
|
// Balancer is expected to generate a new picker from its snapshot every time its
|
||||||
// internal state has changed.
|
// internal state has changed.
|
||||||
//
|
//
|
||||||
// The pickers used by gRPC can be updated by ClientConn.UpdateBalancerState().
|
// The pickers used by gRPC can be updated by ClientConn.UpdateBalancerState().
|
||||||
@@ -161,7 +183,7 @@ type Picker interface {
|
|||||||
// If a SubConn is returned:
|
// If a SubConn is returned:
|
||||||
// - If it is READY, gRPC will send the RPC on it;
|
// - If it is READY, gRPC will send the RPC on it;
|
||||||
// - If it is not ready, or becomes not ready after it's returned, gRPC will block
|
// - If it is not ready, or becomes not ready after it's returned, gRPC will block
|
||||||
// this call until a new picker is updated and will call pick on the new picker.
|
// until UpdateBalancerState() is called and will call pick on the new picker.
|
||||||
//
|
//
|
||||||
// If the returned error is not nil:
|
// If the returned error is not nil:
|
||||||
// - If the error is ErrNoSubConnAvailable, gRPC will block until UpdateBalancerState()
|
// - If the error is ErrNoSubConnAvailable, gRPC will block until UpdateBalancerState()
|
||||||
@@ -204,3 +226,45 @@ type Balancer interface {
|
|||||||
// ClientConn.RemoveSubConn for its existing SubConns.
|
// ClientConn.RemoveSubConn for its existing SubConns.
|
||||||
Close()
|
Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConnectivityStateEvaluator takes the connectivity states of multiple SubConns
|
||||||
|
// and returns one aggregated connectivity state.
|
||||||
|
//
|
||||||
|
// It's not thread safe.
|
||||||
|
type ConnectivityStateEvaluator struct {
|
||||||
|
numReady uint64 // Number of addrConns in ready state.
|
||||||
|
numConnecting uint64 // Number of addrConns in connecting state.
|
||||||
|
numTransientFailure uint64 // Number of addrConns in transientFailure.
|
||||||
|
}
|
||||||
|
|
||||||
|
// RecordTransition records state change happening in subConn and based on that
|
||||||
|
// it evaluates what aggregated state should be.
|
||||||
|
//
|
||||||
|
// - If at least one SubConn in Ready, the aggregated state is Ready;
|
||||||
|
// - Else if at least one SubConn in Connecting, the aggregated state is Connecting;
|
||||||
|
// - Else the aggregated state is TransientFailure.
|
||||||
|
//
|
||||||
|
// Idle and Shutdown are not considered.
|
||||||
|
func (cse *ConnectivityStateEvaluator) RecordTransition(oldState, newState connectivity.State) connectivity.State {
|
||||||
|
// Update counters.
|
||||||
|
for idx, state := range []connectivity.State{oldState, newState} {
|
||||||
|
updateVal := 2*uint64(idx) - 1 // -1 for oldState and +1 for new.
|
||||||
|
switch state {
|
||||||
|
case connectivity.Ready:
|
||||||
|
cse.numReady += updateVal
|
||||||
|
case connectivity.Connecting:
|
||||||
|
cse.numConnecting += updateVal
|
||||||
|
case connectivity.TransientFailure:
|
||||||
|
cse.numTransientFailure += updateVal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Evaluate.
|
||||||
|
if cse.numReady > 0 {
|
||||||
|
return connectivity.Ready
|
||||||
|
}
|
||||||
|
if cse.numConnecting > 0 {
|
||||||
|
return connectivity.Connecting
|
||||||
|
}
|
||||||
|
return connectivity.TransientFailure
|
||||||
|
}
|
||||||
|
33
vendor/google.golang.org/grpc/balancer/base/BUILD
generated
vendored
Normal file
33
vendor/google.golang.org/grpc/balancer/base/BUILD
generated
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"balancer.go",
|
||||||
|
"base.go",
|
||||||
|
],
|
||||||
|
importmap = "k8s.io/kubernetes/vendor/google.golang.org/grpc/balancer/base",
|
||||||
|
importpath = "google.golang.org/grpc/balancer/base",
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
deps = [
|
||||||
|
"//vendor/golang.org/x/net/context:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/balancer:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/connectivity:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/grpclog:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/resolver:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
208
vendor/google.golang.org/grpc/balancer/base/balancer.go
generated
vendored
Normal file
208
vendor/google.golang.org/grpc/balancer/base/balancer.go
generated
vendored
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2017 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 base
|
||||||
|
|
||||||
|
import (
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
"google.golang.org/grpc/balancer"
|
||||||
|
"google.golang.org/grpc/connectivity"
|
||||||
|
"google.golang.org/grpc/grpclog"
|
||||||
|
"google.golang.org/grpc/resolver"
|
||||||
|
)
|
||||||
|
|
||||||
|
type baseBuilder struct {
|
||||||
|
name string
|
||||||
|
pickerBuilder PickerBuilder
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bb *baseBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer {
|
||||||
|
return &baseBalancer{
|
||||||
|
cc: cc,
|
||||||
|
pickerBuilder: bb.pickerBuilder,
|
||||||
|
|
||||||
|
subConns: make(map[resolver.Address]balancer.SubConn),
|
||||||
|
scStates: make(map[balancer.SubConn]connectivity.State),
|
||||||
|
csEvltr: &connectivityStateEvaluator{},
|
||||||
|
// Initialize picker to a picker that always return
|
||||||
|
// ErrNoSubConnAvailable, because when state of a SubConn changes, we
|
||||||
|
// may call UpdateBalancerState with this picker.
|
||||||
|
picker: NewErrPicker(balancer.ErrNoSubConnAvailable),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bb *baseBuilder) Name() string {
|
||||||
|
return bb.name
|
||||||
|
}
|
||||||
|
|
||||||
|
type baseBalancer struct {
|
||||||
|
cc balancer.ClientConn
|
||||||
|
pickerBuilder PickerBuilder
|
||||||
|
|
||||||
|
csEvltr *connectivityStateEvaluator
|
||||||
|
state connectivity.State
|
||||||
|
|
||||||
|
subConns map[resolver.Address]balancer.SubConn
|
||||||
|
scStates map[balancer.SubConn]connectivity.State
|
||||||
|
picker balancer.Picker
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *baseBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) {
|
||||||
|
if err != nil {
|
||||||
|
grpclog.Infof("base.baseBalancer: HandleResolvedAddrs called with error %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
grpclog.Infoln("base.baseBalancer: got new resolved addresses: ", addrs)
|
||||||
|
// addrsSet is the set converted from addrs, it's used for quick lookup of an address.
|
||||||
|
addrsSet := make(map[resolver.Address]struct{})
|
||||||
|
for _, a := range addrs {
|
||||||
|
addrsSet[a] = struct{}{}
|
||||||
|
if _, ok := b.subConns[a]; !ok {
|
||||||
|
// a is a new address (not existing in b.subConns).
|
||||||
|
sc, err := b.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{})
|
||||||
|
if err != nil {
|
||||||
|
grpclog.Warningf("base.baseBalancer: failed to create new SubConn: %v", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
b.subConns[a] = sc
|
||||||
|
b.scStates[sc] = connectivity.Idle
|
||||||
|
sc.Connect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for a, sc := range b.subConns {
|
||||||
|
// a was removed by resolver.
|
||||||
|
if _, ok := addrsSet[a]; !ok {
|
||||||
|
b.cc.RemoveSubConn(sc)
|
||||||
|
delete(b.subConns, a)
|
||||||
|
// Keep the state of this sc in b.scStates until sc's state becomes Shutdown.
|
||||||
|
// The entry will be deleted in HandleSubConnStateChange.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// regeneratePicker takes a snapshot of the balancer, and generates a picker
|
||||||
|
// from it. The picker is
|
||||||
|
// - errPicker with ErrTransientFailure if the balancer is in TransientFailure,
|
||||||
|
// - built by the pickerBuilder with all READY SubConns otherwise.
|
||||||
|
func (b *baseBalancer) regeneratePicker() {
|
||||||
|
if b.state == connectivity.TransientFailure {
|
||||||
|
b.picker = NewErrPicker(balancer.ErrTransientFailure)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
readySCs := make(map[resolver.Address]balancer.SubConn)
|
||||||
|
|
||||||
|
// Filter out all ready SCs from full subConn map.
|
||||||
|
for addr, sc := range b.subConns {
|
||||||
|
if st, ok := b.scStates[sc]; ok && st == connectivity.Ready {
|
||||||
|
readySCs[addr] = sc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b.picker = b.pickerBuilder.Build(readySCs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *baseBalancer) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
|
||||||
|
grpclog.Infof("base.baseBalancer: handle SubConn state change: %p, %v", sc, s)
|
||||||
|
oldS, ok := b.scStates[sc]
|
||||||
|
if !ok {
|
||||||
|
grpclog.Infof("base.baseBalancer: got state changes for an unknown SubConn: %p, %v", sc, s)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
b.scStates[sc] = s
|
||||||
|
switch s {
|
||||||
|
case connectivity.Idle:
|
||||||
|
sc.Connect()
|
||||||
|
case connectivity.Shutdown:
|
||||||
|
// When an address was removed by resolver, b called RemoveSubConn but
|
||||||
|
// kept the sc's state in scStates. Remove state for this sc here.
|
||||||
|
delete(b.scStates, sc)
|
||||||
|
}
|
||||||
|
|
||||||
|
oldAggrState := b.state
|
||||||
|
b.state = b.csEvltr.recordTransition(oldS, s)
|
||||||
|
|
||||||
|
// Regenerate picker when one of the following happens:
|
||||||
|
// - this sc became ready from not-ready
|
||||||
|
// - this sc became not-ready from ready
|
||||||
|
// - the aggregated state of balancer became TransientFailure from non-TransientFailure
|
||||||
|
// - the aggregated state of balancer became non-TransientFailure from TransientFailure
|
||||||
|
if (s == connectivity.Ready) != (oldS == connectivity.Ready) ||
|
||||||
|
(b.state == connectivity.TransientFailure) != (oldAggrState == connectivity.TransientFailure) {
|
||||||
|
b.regeneratePicker()
|
||||||
|
}
|
||||||
|
|
||||||
|
b.cc.UpdateBalancerState(b.state, b.picker)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close is a nop because base balancer doesn't have internal state to clean up,
|
||||||
|
// and it doesn't need to call RemoveSubConn for the SubConns.
|
||||||
|
func (b *baseBalancer) Close() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewErrPicker returns a picker that always returns err on Pick().
|
||||||
|
func NewErrPicker(err error) balancer.Picker {
|
||||||
|
return &errPicker{err: err}
|
||||||
|
}
|
||||||
|
|
||||||
|
type errPicker struct {
|
||||||
|
err error // Pick() always returns this err.
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *errPicker) Pick(ctx context.Context, opts balancer.PickOptions) (balancer.SubConn, func(balancer.DoneInfo), error) {
|
||||||
|
return nil, nil, p.err
|
||||||
|
}
|
||||||
|
|
||||||
|
// connectivityStateEvaluator gets updated by addrConns when their
|
||||||
|
// states transition, based on which it evaluates the state of
|
||||||
|
// ClientConn.
|
||||||
|
type connectivityStateEvaluator struct {
|
||||||
|
numReady uint64 // Number of addrConns in ready state.
|
||||||
|
numConnecting uint64 // Number of addrConns in connecting state.
|
||||||
|
numTransientFailure uint64 // Number of addrConns in transientFailure.
|
||||||
|
}
|
||||||
|
|
||||||
|
// recordTransition records state change happening in every subConn and based on
|
||||||
|
// that it evaluates what aggregated state should be.
|
||||||
|
// It can only transition between Ready, Connecting and TransientFailure. Other states,
|
||||||
|
// Idle and Shutdown are transitioned into by ClientConn; in the beginning of the connection
|
||||||
|
// before any subConn is created ClientConn is in idle state. In the end when ClientConn
|
||||||
|
// closes it is in Shutdown state.
|
||||||
|
//
|
||||||
|
// recordTransition should only be called synchronously from the same goroutine.
|
||||||
|
func (cse *connectivityStateEvaluator) recordTransition(oldState, newState connectivity.State) connectivity.State {
|
||||||
|
// Update counters.
|
||||||
|
for idx, state := range []connectivity.State{oldState, newState} {
|
||||||
|
updateVal := 2*uint64(idx) - 1 // -1 for oldState and +1 for new.
|
||||||
|
switch state {
|
||||||
|
case connectivity.Ready:
|
||||||
|
cse.numReady += updateVal
|
||||||
|
case connectivity.Connecting:
|
||||||
|
cse.numConnecting += updateVal
|
||||||
|
case connectivity.TransientFailure:
|
||||||
|
cse.numTransientFailure += updateVal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Evaluate.
|
||||||
|
if cse.numReady > 0 {
|
||||||
|
return connectivity.Ready
|
||||||
|
}
|
||||||
|
if cse.numConnecting > 0 {
|
||||||
|
return connectivity.Connecting
|
||||||
|
}
|
||||||
|
return connectivity.TransientFailure
|
||||||
|
}
|
52
vendor/google.golang.org/grpc/balancer/base/base.go
generated
vendored
Normal file
52
vendor/google.golang.org/grpc/balancer/base/base.go
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2017 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 base defines a balancer base that can be used to build balancers with
|
||||||
|
// different picking algorithms.
|
||||||
|
//
|
||||||
|
// The base balancer creates a new SubConn for each resolved address. The
|
||||||
|
// provided picker will only be notified about READY SubConns.
|
||||||
|
//
|
||||||
|
// This package is the base of round_robin balancer, its purpose is to be used
|
||||||
|
// to build round_robin like balancers with complex picking algorithms.
|
||||||
|
// Balancers with more complicated logic should try to implement a balancer
|
||||||
|
// builder from scratch.
|
||||||
|
//
|
||||||
|
// All APIs in this package are experimental.
|
||||||
|
package base
|
||||||
|
|
||||||
|
import (
|
||||||
|
"google.golang.org/grpc/balancer"
|
||||||
|
"google.golang.org/grpc/resolver"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PickerBuilder creates balancer.Picker.
|
||||||
|
type PickerBuilder interface {
|
||||||
|
// Build takes a slice of ready SubConns, and returns a picker that will be
|
||||||
|
// used by gRPC to pick a SubConn.
|
||||||
|
Build(readySCs map[resolver.Address]balancer.SubConn) balancer.Picker
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewBalancerBuilder returns a balancer builder. The balancers
|
||||||
|
// built by this builder will use the picker builder to build pickers.
|
||||||
|
func NewBalancerBuilder(name string, pb PickerBuilder) balancer.Builder {
|
||||||
|
return &baseBuilder{
|
||||||
|
name: name,
|
||||||
|
pickerBuilder: pb,
|
||||||
|
}
|
||||||
|
}
|
30
vendor/google.golang.org/grpc/balancer/roundrobin/BUILD
generated
vendored
Normal file
30
vendor/google.golang.org/grpc/balancer/roundrobin/BUILD
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["roundrobin.go"],
|
||||||
|
importmap = "k8s.io/kubernetes/vendor/google.golang.org/grpc/balancer/roundrobin",
|
||||||
|
importpath = "google.golang.org/grpc/balancer/roundrobin",
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
deps = [
|
||||||
|
"//vendor/golang.org/x/net/context:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/balancer:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/balancer/base:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/grpclog:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/resolver:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
79
vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go
generated
vendored
Normal file
79
vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go
generated
vendored
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2017 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 roundrobin defines a roundrobin balancer. Roundrobin balancer is
|
||||||
|
// installed as one of the default balancers in gRPC, users don't need to
|
||||||
|
// explicitly install this balancer.
|
||||||
|
package roundrobin
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
"google.golang.org/grpc/balancer"
|
||||||
|
"google.golang.org/grpc/balancer/base"
|
||||||
|
"google.golang.org/grpc/grpclog"
|
||||||
|
"google.golang.org/grpc/resolver"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Name is the name of round_robin balancer.
|
||||||
|
const Name = "round_robin"
|
||||||
|
|
||||||
|
// newBuilder creates a new roundrobin balancer builder.
|
||||||
|
func newBuilder() balancer.Builder {
|
||||||
|
return base.NewBalancerBuilder(Name, &rrPickerBuilder{})
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
balancer.Register(newBuilder())
|
||||||
|
}
|
||||||
|
|
||||||
|
type rrPickerBuilder struct{}
|
||||||
|
|
||||||
|
func (*rrPickerBuilder) Build(readySCs map[resolver.Address]balancer.SubConn) balancer.Picker {
|
||||||
|
grpclog.Infof("roundrobinPicker: newPicker called with readySCs: %v", readySCs)
|
||||||
|
var scs []balancer.SubConn
|
||||||
|
for _, sc := range readySCs {
|
||||||
|
scs = append(scs, sc)
|
||||||
|
}
|
||||||
|
return &rrPicker{
|
||||||
|
subConns: scs,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type rrPicker struct {
|
||||||
|
// subConns is the snapshot of the roundrobin balancer when this picker was
|
||||||
|
// created. The slice is immutable. Each Get() will do a round robin
|
||||||
|
// selection from it and return the selected SubConn.
|
||||||
|
subConns []balancer.SubConn
|
||||||
|
|
||||||
|
mu sync.Mutex
|
||||||
|
next int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *rrPicker) Pick(ctx context.Context, opts balancer.PickOptions) (balancer.SubConn, func(balancer.DoneInfo), error) {
|
||||||
|
if len(p.subConns) <= 0 {
|
||||||
|
return nil, nil, balancer.ErrNoSubConnAvailable
|
||||||
|
}
|
||||||
|
|
||||||
|
p.mu.Lock()
|
||||||
|
sc := p.subConns[p.next]
|
||||||
|
p.next = (p.next + 1) % len(p.subConns)
|
||||||
|
p.mu.Unlock()
|
||||||
|
return sc, nil, nil
|
||||||
|
}
|
68
vendor/google.golang.org/grpc/balancer_conn_wrappers.go
generated
vendored
68
vendor/google.golang.org/grpc/balancer_conn_wrappers.go
generated
vendored
@@ -19,6 +19,7 @@
|
|||||||
package grpc
|
package grpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"google.golang.org/grpc/balancer"
|
"google.golang.org/grpc/balancer"
|
||||||
@@ -73,7 +74,7 @@ func (b *scStateUpdateBuffer) load() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// get returns the channel that receives a recvMsg in the buffer.
|
// get returns the channel that the scStateUpdate will be sent to.
|
||||||
//
|
//
|
||||||
// Upon receiving, the caller should call load to send another
|
// Upon receiving, the caller should call load to send another
|
||||||
// scStateChangeTuple onto the channel if there is any.
|
// scStateChangeTuple onto the channel if there is any.
|
||||||
@@ -96,6 +97,9 @@ type ccBalancerWrapper struct {
|
|||||||
stateChangeQueue *scStateUpdateBuffer
|
stateChangeQueue *scStateUpdateBuffer
|
||||||
resolverUpdateCh chan *resolverUpdate
|
resolverUpdateCh chan *resolverUpdate
|
||||||
done chan struct{}
|
done chan struct{}
|
||||||
|
|
||||||
|
mu sync.Mutex
|
||||||
|
subConns map[*acBalancerWrapper]struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newCCBalancerWrapper(cc *ClientConn, b balancer.Builder, bopts balancer.BuildOptions) *ccBalancerWrapper {
|
func newCCBalancerWrapper(cc *ClientConn, b balancer.Builder, bopts balancer.BuildOptions) *ccBalancerWrapper {
|
||||||
@@ -104,21 +108,34 @@ func newCCBalancerWrapper(cc *ClientConn, b balancer.Builder, bopts balancer.Bui
|
|||||||
stateChangeQueue: newSCStateUpdateBuffer(),
|
stateChangeQueue: newSCStateUpdateBuffer(),
|
||||||
resolverUpdateCh: make(chan *resolverUpdate, 1),
|
resolverUpdateCh: make(chan *resolverUpdate, 1),
|
||||||
done: make(chan struct{}),
|
done: make(chan struct{}),
|
||||||
|
subConns: make(map[*acBalancerWrapper]struct{}),
|
||||||
}
|
}
|
||||||
go ccb.watcher()
|
go ccb.watcher()
|
||||||
ccb.balancer = b.Build(ccb, bopts)
|
ccb.balancer = b.Build(ccb, bopts)
|
||||||
return ccb
|
return ccb
|
||||||
}
|
}
|
||||||
|
|
||||||
// watcher balancer functions sequencially, so the balancer can be implemeneted
|
// watcher balancer functions sequentially, so the balancer can be implemented
|
||||||
// lock-free.
|
// lock-free.
|
||||||
func (ccb *ccBalancerWrapper) watcher() {
|
func (ccb *ccBalancerWrapper) watcher() {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case t := <-ccb.stateChangeQueue.get():
|
case t := <-ccb.stateChangeQueue.get():
|
||||||
ccb.stateChangeQueue.load()
|
ccb.stateChangeQueue.load()
|
||||||
|
select {
|
||||||
|
case <-ccb.done:
|
||||||
|
ccb.balancer.Close()
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
}
|
||||||
ccb.balancer.HandleSubConnStateChange(t.sc, t.state)
|
ccb.balancer.HandleSubConnStateChange(t.sc, t.state)
|
||||||
case t := <-ccb.resolverUpdateCh:
|
case t := <-ccb.resolverUpdateCh:
|
||||||
|
select {
|
||||||
|
case <-ccb.done:
|
||||||
|
ccb.balancer.Close()
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
}
|
||||||
ccb.balancer.HandleResolvedAddrs(t.addrs, t.err)
|
ccb.balancer.HandleResolvedAddrs(t.addrs, t.err)
|
||||||
case <-ccb.done:
|
case <-ccb.done:
|
||||||
}
|
}
|
||||||
@@ -126,6 +143,13 @@ func (ccb *ccBalancerWrapper) watcher() {
|
|||||||
select {
|
select {
|
||||||
case <-ccb.done:
|
case <-ccb.done:
|
||||||
ccb.balancer.Close()
|
ccb.balancer.Close()
|
||||||
|
ccb.mu.Lock()
|
||||||
|
scs := ccb.subConns
|
||||||
|
ccb.subConns = nil
|
||||||
|
ccb.mu.Unlock()
|
||||||
|
for acbw := range scs {
|
||||||
|
ccb.cc.removeAddrConn(acbw.getAddrConn(), errConnDrain)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
@@ -165,33 +189,54 @@ func (ccb *ccBalancerWrapper) handleResolvedAddrs(addrs []resolver.Address, err
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ccb *ccBalancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer.NewSubConnOptions) (balancer.SubConn, error) {
|
func (ccb *ccBalancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer.NewSubConnOptions) (balancer.SubConn, error) {
|
||||||
grpclog.Infof("ccBalancerWrapper: new subconn: %v", addrs)
|
if len(addrs) <= 0 {
|
||||||
|
return nil, fmt.Errorf("grpc: cannot create SubConn with empty address list")
|
||||||
|
}
|
||||||
|
ccb.mu.Lock()
|
||||||
|
defer ccb.mu.Unlock()
|
||||||
|
if ccb.subConns == nil {
|
||||||
|
return nil, fmt.Errorf("grpc: ClientConn balancer wrapper was closed")
|
||||||
|
}
|
||||||
ac, err := ccb.cc.newAddrConn(addrs)
|
ac, err := ccb.cc.newAddrConn(addrs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
acbw := &acBalancerWrapper{ac: ac}
|
acbw := &acBalancerWrapper{ac: ac}
|
||||||
ac.mu.Lock()
|
acbw.ac.mu.Lock()
|
||||||
ac.acbw = acbw
|
ac.acbw = acbw
|
||||||
ac.mu.Unlock()
|
acbw.ac.mu.Unlock()
|
||||||
|
ccb.subConns[acbw] = struct{}{}
|
||||||
return acbw, nil
|
return acbw, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ccb *ccBalancerWrapper) RemoveSubConn(sc balancer.SubConn) {
|
func (ccb *ccBalancerWrapper) RemoveSubConn(sc balancer.SubConn) {
|
||||||
grpclog.Infof("ccBalancerWrapper: removing subconn")
|
|
||||||
acbw, ok := sc.(*acBalancerWrapper)
|
acbw, ok := sc.(*acBalancerWrapper)
|
||||||
if !ok {
|
if !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
ccb.mu.Lock()
|
||||||
|
defer ccb.mu.Unlock()
|
||||||
|
if ccb.subConns == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
delete(ccb.subConns, acbw)
|
||||||
ccb.cc.removeAddrConn(acbw.getAddrConn(), errConnDrain)
|
ccb.cc.removeAddrConn(acbw.getAddrConn(), errConnDrain)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ccb *ccBalancerWrapper) UpdateBalancerState(s connectivity.State, p balancer.Picker) {
|
func (ccb *ccBalancerWrapper) UpdateBalancerState(s connectivity.State, p balancer.Picker) {
|
||||||
grpclog.Infof("ccBalancerWrapper: updating state and picker called by balancer: %v, %p", s, p)
|
ccb.mu.Lock()
|
||||||
|
defer ccb.mu.Unlock()
|
||||||
|
if ccb.subConns == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
ccb.cc.csMgr.updateState(s)
|
ccb.cc.csMgr.updateState(s)
|
||||||
ccb.cc.blockingpicker.updatePicker(p)
|
ccb.cc.blockingpicker.updatePicker(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ccb *ccBalancerWrapper) ResolveNow(o resolver.ResolveNowOption) {
|
||||||
|
ccb.cc.resolveNow(o)
|
||||||
|
}
|
||||||
|
|
||||||
func (ccb *ccBalancerWrapper) Target() string {
|
func (ccb *ccBalancerWrapper) Target() string {
|
||||||
return ccb.cc.target
|
return ccb.cc.target
|
||||||
}
|
}
|
||||||
@@ -204,9 +249,12 @@ type acBalancerWrapper struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (acbw *acBalancerWrapper) UpdateAddresses(addrs []resolver.Address) {
|
func (acbw *acBalancerWrapper) UpdateAddresses(addrs []resolver.Address) {
|
||||||
grpclog.Infof("acBalancerWrapper: UpdateAddresses called with %v", addrs)
|
|
||||||
acbw.mu.Lock()
|
acbw.mu.Lock()
|
||||||
defer acbw.mu.Unlock()
|
defer acbw.mu.Unlock()
|
||||||
|
if len(addrs) <= 0 {
|
||||||
|
acbw.ac.tearDown(errConnDrain)
|
||||||
|
return
|
||||||
|
}
|
||||||
if !acbw.ac.tryUpdateAddrs(addrs) {
|
if !acbw.ac.tryUpdateAddrs(addrs) {
|
||||||
cc := acbw.ac.cc
|
cc := acbw.ac.cc
|
||||||
acbw.ac.mu.Lock()
|
acbw.ac.mu.Lock()
|
||||||
@@ -234,7 +282,7 @@ func (acbw *acBalancerWrapper) UpdateAddresses(addrs []resolver.Address) {
|
|||||||
ac.acbw = acbw
|
ac.acbw = acbw
|
||||||
ac.mu.Unlock()
|
ac.mu.Unlock()
|
||||||
if acState != connectivity.Idle {
|
if acState != connectivity.Idle {
|
||||||
ac.connect(false)
|
ac.connect()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -242,7 +290,7 @@ func (acbw *acBalancerWrapper) UpdateAddresses(addrs []resolver.Address) {
|
|||||||
func (acbw *acBalancerWrapper) Connect() {
|
func (acbw *acBalancerWrapper) Connect() {
|
||||||
acbw.mu.Lock()
|
acbw.mu.Lock()
|
||||||
defer acbw.mu.Unlock()
|
defer acbw.mu.Unlock()
|
||||||
acbw.ac.connect(false)
|
acbw.ac.connect()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (acbw *acBalancerWrapper) getAddrConn() *addrConn {
|
func (acbw *acBalancerWrapper) getAddrConn() *addrConn {
|
||||||
|
83
vendor/google.golang.org/grpc/balancer_v1_wrapper.go
generated
vendored
83
vendor/google.golang.org/grpc/balancer_v1_wrapper.go
generated
vendored
@@ -19,6 +19,7 @@
|
|||||||
package grpc
|
package grpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
@@ -27,6 +28,7 @@ import (
|
|||||||
"google.golang.org/grpc/connectivity"
|
"google.golang.org/grpc/connectivity"
|
||||||
"google.golang.org/grpc/grpclog"
|
"google.golang.org/grpc/grpclog"
|
||||||
"google.golang.org/grpc/resolver"
|
"google.golang.org/grpc/resolver"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
type balancerWrapperBuilder struct {
|
type balancerWrapperBuilder struct {
|
||||||
@@ -34,7 +36,13 @@ type balancerWrapperBuilder struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (bwb *balancerWrapperBuilder) Build(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.Balancer {
|
func (bwb *balancerWrapperBuilder) Build(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.Balancer {
|
||||||
bwb.b.Start(cc.Target(), BalancerConfig{
|
targetAddr := cc.Target()
|
||||||
|
targetSplitted := strings.Split(targetAddr, ":///")
|
||||||
|
if len(targetSplitted) >= 2 {
|
||||||
|
targetAddr = targetSplitted[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
bwb.b.Start(targetAddr, BalancerConfig{
|
||||||
DialCreds: opts.DialCreds,
|
DialCreds: opts.DialCreds,
|
||||||
Dialer: opts.Dialer,
|
Dialer: opts.Dialer,
|
||||||
})
|
})
|
||||||
@@ -43,10 +51,11 @@ func (bwb *balancerWrapperBuilder) Build(cc balancer.ClientConn, opts balancer.B
|
|||||||
balancer: bwb.b,
|
balancer: bwb.b,
|
||||||
pickfirst: pickfirst,
|
pickfirst: pickfirst,
|
||||||
cc: cc,
|
cc: cc,
|
||||||
|
targetAddr: targetAddr,
|
||||||
startCh: make(chan struct{}),
|
startCh: make(chan struct{}),
|
||||||
conns: make(map[resolver.Address]balancer.SubConn),
|
conns: make(map[resolver.Address]balancer.SubConn),
|
||||||
connSt: make(map[balancer.SubConn]*scState),
|
connSt: make(map[balancer.SubConn]*scState),
|
||||||
csEvltr: &connectivityStateEvaluator{},
|
csEvltr: &balancer.ConnectivityStateEvaluator{},
|
||||||
state: connectivity.Idle,
|
state: connectivity.Idle,
|
||||||
}
|
}
|
||||||
cc.UpdateBalancerState(connectivity.Idle, bw)
|
cc.UpdateBalancerState(connectivity.Idle, bw)
|
||||||
@@ -69,10 +78,7 @@ type balancerWrapper struct {
|
|||||||
pickfirst bool
|
pickfirst bool
|
||||||
|
|
||||||
cc balancer.ClientConn
|
cc balancer.ClientConn
|
||||||
|
targetAddr string // Target without the scheme.
|
||||||
// To aggregate the connectivity state.
|
|
||||||
csEvltr *connectivityStateEvaluator
|
|
||||||
state connectivity.State
|
|
||||||
|
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
conns map[resolver.Address]balancer.SubConn
|
conns map[resolver.Address]balancer.SubConn
|
||||||
@@ -82,18 +88,21 @@ type balancerWrapper struct {
|
|||||||
// - NewSubConn is created, cc wants to notify balancer of state changes;
|
// - NewSubConn is created, cc wants to notify balancer of state changes;
|
||||||
// - Build hasn't return, cc doesn't have access to balancer.
|
// - Build hasn't return, cc doesn't have access to balancer.
|
||||||
startCh chan struct{}
|
startCh chan struct{}
|
||||||
|
|
||||||
|
// To aggregate the connectivity state.
|
||||||
|
csEvltr *balancer.ConnectivityStateEvaluator
|
||||||
|
state connectivity.State
|
||||||
}
|
}
|
||||||
|
|
||||||
// lbWatcher watches the Notify channel of the balancer and manages
|
// lbWatcher watches the Notify channel of the balancer and manages
|
||||||
// connections accordingly.
|
// connections accordingly.
|
||||||
func (bw *balancerWrapper) lbWatcher() {
|
func (bw *balancerWrapper) lbWatcher() {
|
||||||
<-bw.startCh
|
<-bw.startCh
|
||||||
grpclog.Infof("balancerWrapper: is pickfirst: %v\n", bw.pickfirst)
|
|
||||||
notifyCh := bw.balancer.Notify()
|
notifyCh := bw.balancer.Notify()
|
||||||
if notifyCh == nil {
|
if notifyCh == nil {
|
||||||
// There's no resolver in the balancer. Connect directly.
|
// There's no resolver in the balancer. Connect directly.
|
||||||
a := resolver.Address{
|
a := resolver.Address{
|
||||||
Addr: bw.cc.Target(),
|
Addr: bw.targetAddr,
|
||||||
Type: resolver.Backend,
|
Type: resolver.Backend,
|
||||||
}
|
}
|
||||||
sc, err := bw.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{})
|
sc, err := bw.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{})
|
||||||
@@ -103,7 +112,7 @@ func (bw *balancerWrapper) lbWatcher() {
|
|||||||
bw.mu.Lock()
|
bw.mu.Lock()
|
||||||
bw.conns[a] = sc
|
bw.conns[a] = sc
|
||||||
bw.connSt[sc] = &scState{
|
bw.connSt[sc] = &scState{
|
||||||
addr: Address{Addr: bw.cc.Target()},
|
addr: Address{Addr: bw.targetAddr},
|
||||||
s: connectivity.Idle,
|
s: connectivity.Idle,
|
||||||
}
|
}
|
||||||
bw.mu.Unlock()
|
bw.mu.Unlock()
|
||||||
@@ -165,10 +174,10 @@ func (bw *balancerWrapper) lbWatcher() {
|
|||||||
sc.Connect()
|
sc.Connect()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
oldSC.UpdateAddresses(newAddrs)
|
|
||||||
bw.mu.Lock()
|
bw.mu.Lock()
|
||||||
bw.connSt[oldSC].addr = addrs[0]
|
bw.connSt[oldSC].addr = addrs[0]
|
||||||
bw.mu.Unlock()
|
bw.mu.Unlock()
|
||||||
|
oldSC.UpdateAddresses(newAddrs)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var (
|
var (
|
||||||
@@ -221,7 +230,6 @@ func (bw *balancerWrapper) lbWatcher() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (bw *balancerWrapper) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
|
func (bw *balancerWrapper) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
|
||||||
grpclog.Infof("balancerWrapper: handle subconn state change: %p, %v", sc, s)
|
|
||||||
bw.mu.Lock()
|
bw.mu.Lock()
|
||||||
defer bw.mu.Unlock()
|
defer bw.mu.Unlock()
|
||||||
scSt, ok := bw.connSt[sc]
|
scSt, ok := bw.connSt[sc]
|
||||||
@@ -240,7 +248,7 @@ func (bw *balancerWrapper) HandleSubConnStateChange(sc balancer.SubConn, s conne
|
|||||||
scSt.down(errConnClosing)
|
scSt.down(errConnClosing)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sa := bw.csEvltr.recordTransition(oldS, s)
|
sa := bw.csEvltr.RecordTransition(oldS, s)
|
||||||
if bw.state != sa {
|
if bw.state != sa {
|
||||||
bw.state = sa
|
bw.state = sa
|
||||||
}
|
}
|
||||||
@@ -249,7 +257,6 @@ func (bw *balancerWrapper) HandleSubConnStateChange(sc balancer.SubConn, s conne
|
|||||||
// Remove state for this sc.
|
// Remove state for this sc.
|
||||||
delete(bw.connSt, sc)
|
delete(bw.connSt, sc)
|
||||||
}
|
}
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bw *balancerWrapper) HandleResolvedAddrs([]resolver.Address, error) {
|
func (bw *balancerWrapper) HandleResolvedAddrs([]resolver.Address, error) {
|
||||||
@@ -262,7 +269,6 @@ func (bw *balancerWrapper) HandleResolvedAddrs([]resolver.Address, error) {
|
|||||||
}
|
}
|
||||||
// There should be a resolver inside the balancer.
|
// There should be a resolver inside the balancer.
|
||||||
// All updates here, if any, are ignored.
|
// All updates here, if any, are ignored.
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bw *balancerWrapper) Close() {
|
func (bw *balancerWrapper) Close() {
|
||||||
@@ -274,7 +280,6 @@ func (bw *balancerWrapper) Close() {
|
|||||||
close(bw.startCh)
|
close(bw.startCh)
|
||||||
}
|
}
|
||||||
bw.balancer.Close()
|
bw.balancer.Close()
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// The picker is the balancerWrapper itself.
|
// The picker is the balancerWrapper itself.
|
||||||
@@ -310,58 +315,14 @@ func (bw *balancerWrapper) Pick(ctx context.Context, opts balancer.PickOptions)
|
|||||||
Metadata: a.Metadata,
|
Metadata: a.Metadata,
|
||||||
}]
|
}]
|
||||||
if !ok && failfast {
|
if !ok && failfast {
|
||||||
return nil, nil, Errorf(codes.Unavailable, "there is no connection available")
|
return nil, nil, status.Errorf(codes.Unavailable, "there is no connection available")
|
||||||
}
|
}
|
||||||
if s, ok := bw.connSt[sc]; failfast && (!ok || s.s != connectivity.Ready) {
|
if s, ok := bw.connSt[sc]; failfast && (!ok || s.s != connectivity.Ready) {
|
||||||
// If the returned sc is not ready and RPC is failfast,
|
// If the returned sc is not ready and RPC is failfast,
|
||||||
// return error, and this RPC will fail.
|
// return error, and this RPC will fail.
|
||||||
return nil, nil, Errorf(codes.Unavailable, "there is no connection available")
|
return nil, nil, status.Errorf(codes.Unavailable, "there is no connection available")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return sc, done, nil
|
return sc, done, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// connectivityStateEvaluator gets updated by addrConns when their
|
|
||||||
// states transition, based on which it evaluates the state of
|
|
||||||
// ClientConn.
|
|
||||||
type connectivityStateEvaluator struct {
|
|
||||||
mu sync.Mutex
|
|
||||||
numReady uint64 // Number of addrConns in ready state.
|
|
||||||
numConnecting uint64 // Number of addrConns in connecting state.
|
|
||||||
numTransientFailure uint64 // Number of addrConns in transientFailure.
|
|
||||||
}
|
|
||||||
|
|
||||||
// recordTransition records state change happening in every subConn and based on
|
|
||||||
// that it evaluates what aggregated state should be.
|
|
||||||
// It can only transition between Ready, Connecting and TransientFailure. Other states,
|
|
||||||
// Idle and Shutdown are transitioned into by ClientConn; in the beginning of the connection
|
|
||||||
// before any subConn is created ClientConn is in idle state. In the end when ClientConn
|
|
||||||
// closes it is in Shutdown state.
|
|
||||||
// TODO Note that in later releases, a ClientConn with no activity will be put into an Idle state.
|
|
||||||
func (cse *connectivityStateEvaluator) recordTransition(oldState, newState connectivity.State) connectivity.State {
|
|
||||||
cse.mu.Lock()
|
|
||||||
defer cse.mu.Unlock()
|
|
||||||
|
|
||||||
// Update counters.
|
|
||||||
for idx, state := range []connectivity.State{oldState, newState} {
|
|
||||||
updateVal := 2*uint64(idx) - 1 // -1 for oldState and +1 for new.
|
|
||||||
switch state {
|
|
||||||
case connectivity.Ready:
|
|
||||||
cse.numReady += updateVal
|
|
||||||
case connectivity.Connecting:
|
|
||||||
cse.numConnecting += updateVal
|
|
||||||
case connectivity.TransientFailure:
|
|
||||||
cse.numTransientFailure += updateVal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Evaluate.
|
|
||||||
if cse.numReady > 0 {
|
|
||||||
return connectivity.Ready
|
|
||||||
}
|
|
||||||
if cse.numConnecting > 0 {
|
|
||||||
return connectivity.Connecting
|
|
||||||
}
|
|
||||||
return connectivity.TransientFailure
|
|
||||||
}
|
|
||||||
|
304
vendor/google.golang.org/grpc/call.go
generated
vendored
304
vendor/google.golang.org/grpc/call.go
generated
vendored
@@ -19,289 +19,75 @@
|
|||||||
package grpc
|
package grpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"io"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"golang.org/x/net/trace"
|
|
||||||
"google.golang.org/grpc/balancer"
|
|
||||||
"google.golang.org/grpc/codes"
|
|
||||||
"google.golang.org/grpc/peer"
|
|
||||||
"google.golang.org/grpc/stats"
|
|
||||||
"google.golang.org/grpc/status"
|
|
||||||
"google.golang.org/grpc/transport"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// recvResponse receives and parses an RPC response.
|
// Invoke sends the RPC request on the wire and returns after response is
|
||||||
// On error, it returns the error and indicates whether the call should be retried.
|
// received. This is typically called by generated code.
|
||||||
//
|
//
|
||||||
// TODO(zhaoq): Check whether the received message sequence is valid.
|
// All errors returned by Invoke are compatible with the status package.
|
||||||
// TODO ctx is used for stats collection and processing. It is the context passed from the application.
|
func (cc *ClientConn) Invoke(ctx context.Context, method string, args, reply interface{}, opts ...CallOption) error {
|
||||||
func recvResponse(ctx context.Context, dopts dialOptions, t transport.ClientTransport, c *callInfo, stream *transport.Stream, reply interface{}) (err error) {
|
// allow interceptor to see all applicable call options, which means those
|
||||||
// Try to acquire header metadata from the server if there is any.
|
// configured as defaults from dial option as well as per-call options
|
||||||
defer func() {
|
opts = combine(cc.dopts.callOptions, opts)
|
||||||
if err != nil {
|
|
||||||
if _, ok := err.(transport.ConnectionError); !ok {
|
|
||||||
t.CloseStream(stream, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
c.headerMD, err = stream.Header()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
p := &parser{r: stream}
|
|
||||||
var inPayload *stats.InPayload
|
|
||||||
if dopts.copts.StatsHandler != nil {
|
|
||||||
inPayload = &stats.InPayload{
|
|
||||||
Client: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for {
|
|
||||||
if c.maxReceiveMessageSize == nil {
|
|
||||||
return Errorf(codes.Internal, "callInfo maxReceiveMessageSize field uninitialized(nil)")
|
|
||||||
}
|
|
||||||
if err = recv(p, dopts.codec, stream, dopts.dc, reply, *c.maxReceiveMessageSize, inPayload); err != nil {
|
|
||||||
if err == io.EOF {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if inPayload != nil && err == io.EOF && stream.Status().Code() == codes.OK {
|
|
||||||
// TODO in the current implementation, inTrailer may be handled before inPayload in some cases.
|
|
||||||
// Fix the order if necessary.
|
|
||||||
dopts.copts.StatsHandler.HandleRPC(ctx, inPayload)
|
|
||||||
}
|
|
||||||
c.trailerMD = stream.Trailer()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// sendRequest writes out various information of an RPC such as Context and Message.
|
|
||||||
func sendRequest(ctx context.Context, dopts dialOptions, compressor Compressor, c *callInfo, callHdr *transport.CallHdr, stream *transport.Stream, t transport.ClientTransport, args interface{}, opts *transport.Options) (err error) {
|
|
||||||
defer func() {
|
|
||||||
if err != nil {
|
|
||||||
// If err is connection error, t will be closed, no need to close stream here.
|
|
||||||
if _, ok := err.(transport.ConnectionError); !ok {
|
|
||||||
t.CloseStream(stream, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
var (
|
|
||||||
cbuf *bytes.Buffer
|
|
||||||
outPayload *stats.OutPayload
|
|
||||||
)
|
|
||||||
if compressor != nil {
|
|
||||||
cbuf = new(bytes.Buffer)
|
|
||||||
}
|
|
||||||
if dopts.copts.StatsHandler != nil {
|
|
||||||
outPayload = &stats.OutPayload{
|
|
||||||
Client: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hdr, data, err := encode(dopts.codec, args, compressor, cbuf, outPayload)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if c.maxSendMessageSize == nil {
|
|
||||||
return Errorf(codes.Internal, "callInfo maxSendMessageSize field uninitialized(nil)")
|
|
||||||
}
|
|
||||||
if len(data) > *c.maxSendMessageSize {
|
|
||||||
return Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", len(data), *c.maxSendMessageSize)
|
|
||||||
}
|
|
||||||
err = t.Write(stream, hdr, data, opts)
|
|
||||||
if err == nil && outPayload != nil {
|
|
||||||
outPayload.SentTime = time.Now()
|
|
||||||
dopts.copts.StatsHandler.HandleRPC(ctx, outPayload)
|
|
||||||
}
|
|
||||||
// t.NewStream(...) could lead to an early rejection of the RPC (e.g., the service/method
|
|
||||||
// does not exist.) so that t.Write could get io.EOF from wait(...). Leave the following
|
|
||||||
// recvResponse to get the final status.
|
|
||||||
if err != nil && err != io.EOF {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Sent successfully.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Invoke sends the RPC request on the wire and returns after response is received.
|
|
||||||
// Invoke is called by generated code. Also users can call Invoke directly when it
|
|
||||||
// is really needed in their use cases.
|
|
||||||
func Invoke(ctx context.Context, method string, args, reply interface{}, cc *ClientConn, opts ...CallOption) error {
|
|
||||||
if cc.dopts.unaryInt != nil {
|
if cc.dopts.unaryInt != nil {
|
||||||
return cc.dopts.unaryInt(ctx, method, args, reply, cc, invoke, opts...)
|
return cc.dopts.unaryInt(ctx, method, args, reply, cc, invoke, opts...)
|
||||||
}
|
}
|
||||||
return invoke(ctx, method, args, reply, cc, opts...)
|
return invoke(ctx, method, args, reply, cc, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func invoke(ctx context.Context, method string, args, reply interface{}, cc *ClientConn, opts ...CallOption) (e error) {
|
func combine(o1 []CallOption, o2 []CallOption) []CallOption {
|
||||||
c := defaultCallInfo()
|
// we don't use append because o1 could have extra capacity whose
|
||||||
mc := cc.GetMethodConfig(method)
|
// elements would be overwritten, which could cause inadvertent
|
||||||
if mc.WaitForReady != nil {
|
// sharing (and race connditions) between concurrent calls
|
||||||
c.failFast = !*mc.WaitForReady
|
if len(o1) == 0 {
|
||||||
|
return o2
|
||||||
|
} else if len(o2) == 0 {
|
||||||
|
return o1
|
||||||
}
|
}
|
||||||
|
ret := make([]CallOption, len(o1)+len(o2))
|
||||||
|
copy(ret, o1)
|
||||||
|
copy(ret[len(o1):], o2)
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
if mc.Timeout != nil && *mc.Timeout >= 0 {
|
// Invoke sends the RPC request on the wire and returns after response is
|
||||||
var cancel context.CancelFunc
|
// received. This is typically called by generated code.
|
||||||
ctx, cancel = context.WithTimeout(ctx, *mc.Timeout)
|
//
|
||||||
defer cancel()
|
// DEPRECATED: Use ClientConn.Invoke instead.
|
||||||
}
|
func Invoke(ctx context.Context, method string, args, reply interface{}, cc *ClientConn, opts ...CallOption) error {
|
||||||
|
return cc.Invoke(ctx, method, args, reply, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
opts = append(cc.dopts.callOptions, opts...)
|
var unaryStreamDesc = &StreamDesc{ServerStreams: false, ClientStreams: false}
|
||||||
for _, o := range opts {
|
|
||||||
if err := o.before(c); err != nil {
|
|
||||||
return toRPCErr(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
for _, o := range opts {
|
|
||||||
o.after(c)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
c.maxSendMessageSize = getMaxSize(mc.MaxReqSize, c.maxSendMessageSize, defaultClientMaxSendMessageSize)
|
func invoke(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, opts ...CallOption) error {
|
||||||
c.maxReceiveMessageSize = getMaxSize(mc.MaxRespSize, c.maxReceiveMessageSize, defaultClientMaxReceiveMessageSize)
|
// TODO: implement retries in clientStream and make this simply
|
||||||
|
// newClientStream, SendMsg, RecvMsg.
|
||||||
if EnableTracing {
|
firstAttempt := true
|
||||||
c.traceInfo.tr = trace.New("grpc.Sent."+methodFamily(method), method)
|
|
||||||
defer c.traceInfo.tr.Finish()
|
|
||||||
c.traceInfo.firstLine.client = true
|
|
||||||
if deadline, ok := ctx.Deadline(); ok {
|
|
||||||
c.traceInfo.firstLine.deadline = deadline.Sub(time.Now())
|
|
||||||
}
|
|
||||||
c.traceInfo.tr.LazyLog(&c.traceInfo.firstLine, false)
|
|
||||||
// TODO(dsymonds): Arrange for c.traceInfo.firstLine.remoteAddr to be set.
|
|
||||||
defer func() {
|
|
||||||
if e != nil {
|
|
||||||
c.traceInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{e}}, true)
|
|
||||||
c.traceInfo.tr.SetError()
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
ctx = newContextWithRPCInfo(ctx, c.failFast)
|
|
||||||
sh := cc.dopts.copts.StatsHandler
|
|
||||||
if sh != nil {
|
|
||||||
ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: c.failFast})
|
|
||||||
begin := &stats.Begin{
|
|
||||||
Client: true,
|
|
||||||
BeginTime: time.Now(),
|
|
||||||
FailFast: c.failFast,
|
|
||||||
}
|
|
||||||
sh.HandleRPC(ctx, begin)
|
|
||||||
defer func() {
|
|
||||||
end := &stats.End{
|
|
||||||
Client: true,
|
|
||||||
EndTime: time.Now(),
|
|
||||||
Error: e,
|
|
||||||
}
|
|
||||||
sh.HandleRPC(ctx, end)
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
topts := &transport.Options{
|
|
||||||
Last: true,
|
|
||||||
Delay: false,
|
|
||||||
}
|
|
||||||
for {
|
for {
|
||||||
var (
|
csInt, err := newClientStream(ctx, unaryStreamDesc, cc, method, opts...)
|
||||||
err error
|
|
||||||
t transport.ClientTransport
|
|
||||||
stream *transport.Stream
|
|
||||||
// Record the done handler from Balancer.Get(...). It is called once the
|
|
||||||
// RPC has completed or failed.
|
|
||||||
done func(balancer.DoneInfo)
|
|
||||||
)
|
|
||||||
// TODO(zhaoq): Need a formal spec of fail-fast.
|
|
||||||
callHdr := &transport.CallHdr{
|
|
||||||
Host: cc.authority,
|
|
||||||
Method: method,
|
|
||||||
}
|
|
||||||
if cc.dopts.cp != nil {
|
|
||||||
callHdr.SendCompress = cc.dopts.cp.Type()
|
|
||||||
}
|
|
||||||
if c.creds != nil {
|
|
||||||
callHdr.Creds = c.creds
|
|
||||||
}
|
|
||||||
|
|
||||||
t, done, err = cc.getTransport(ctx, c.failFast)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// TODO(zhaoq): Probably revisit the error handling.
|
|
||||||
if _, ok := status.FromError(err); ok {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err == errConnClosing || err == errConnUnavailable {
|
cs := csInt.(*clientStream)
|
||||||
if c.failFast {
|
if err := cs.SendMsg(req); err != nil {
|
||||||
return Errorf(codes.Unavailable, "%v", err)
|
if !cs.c.failFast && cs.attempt.s.Unprocessed() && firstAttempt {
|
||||||
}
|
// TODO: Add a field to header for grpc-transparent-retry-attempts
|
||||||
|
firstAttempt = false
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// All the other errors are treated as Internal errors.
|
return err
|
||||||
return Errorf(codes.Internal, "%v", err)
|
|
||||||
}
|
}
|
||||||
if c.traceInfo.tr != nil {
|
if err := cs.RecvMsg(reply); err != nil {
|
||||||
c.traceInfo.tr.LazyLog(&payload{sent: true, msg: args}, true)
|
if !cs.c.failFast && cs.attempt.s.Unprocessed() && firstAttempt {
|
||||||
}
|
// TODO: Add a field to header for grpc-transparent-retry-attempts
|
||||||
stream, err = t.NewStream(ctx, callHdr)
|
firstAttempt = false
|
||||||
if err != nil {
|
|
||||||
if done != nil {
|
|
||||||
if _, ok := err.(transport.ConnectionError); ok {
|
|
||||||
// If error is connection error, transport was sending data on wire,
|
|
||||||
// and we are not sure if anything has been sent on wire.
|
|
||||||
// If error is not connection error, we are sure nothing has been sent.
|
|
||||||
updateRPCInfoInContext(ctx, rpcInfo{bytesSent: true, bytesReceived: false})
|
|
||||||
}
|
|
||||||
done(balancer.DoneInfo{Err: err})
|
|
||||||
}
|
|
||||||
if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast {
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return toRPCErr(err)
|
return err
|
||||||
}
|
}
|
||||||
if peer, ok := peer.FromContext(stream.Context()); ok {
|
return nil
|
||||||
c.peer = peer
|
|
||||||
}
|
|
||||||
err = sendRequest(ctx, cc.dopts, cc.dopts.cp, c, callHdr, stream, t, args, topts)
|
|
||||||
if err != nil {
|
|
||||||
if done != nil {
|
|
||||||
updateRPCInfoInContext(ctx, rpcInfo{
|
|
||||||
bytesSent: stream.BytesSent(),
|
|
||||||
bytesReceived: stream.BytesReceived(),
|
|
||||||
})
|
|
||||||
done(balancer.DoneInfo{Err: err})
|
|
||||||
}
|
|
||||||
// Retry a non-failfast RPC when
|
|
||||||
// i) there is a connection error; or
|
|
||||||
// ii) the server started to drain before this RPC was initiated.
|
|
||||||
if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return toRPCErr(err)
|
|
||||||
}
|
|
||||||
err = recvResponse(ctx, cc.dopts, t, c, stream, reply)
|
|
||||||
if err != nil {
|
|
||||||
if done != nil {
|
|
||||||
updateRPCInfoInContext(ctx, rpcInfo{
|
|
||||||
bytesSent: stream.BytesSent(),
|
|
||||||
bytesReceived: stream.BytesReceived(),
|
|
||||||
})
|
|
||||||
done(balancer.DoneInfo{Err: err})
|
|
||||||
}
|
|
||||||
if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return toRPCErr(err)
|
|
||||||
}
|
|
||||||
if c.traceInfo.tr != nil {
|
|
||||||
c.traceInfo.tr.LazyLog(&payload{sent: false, msg: reply}, true)
|
|
||||||
}
|
|
||||||
t.CloseStream(stream, nil)
|
|
||||||
if done != nil {
|
|
||||||
updateRPCInfoInContext(ctx, rpcInfo{
|
|
||||||
bytesSent: stream.BytesSent(),
|
|
||||||
bytesReceived: stream.BytesReceived(),
|
|
||||||
})
|
|
||||||
done(balancer.DoneInfo{Err: err})
|
|
||||||
}
|
|
||||||
return stream.Status().Err()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
910
vendor/google.golang.org/grpc/clientconn.go
generated
vendored
910
vendor/google.golang.org/grpc/clientconn.go
generated
vendored
File diff suppressed because it is too large
Load Diff
88
vendor/google.golang.org/grpc/codec.go
generated
vendored
88
vendor/google.golang.org/grpc/codec.go
generated
vendored
@@ -19,86 +19,32 @@
|
|||||||
package grpc
|
package grpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"google.golang.org/grpc/encoding"
|
||||||
"sync"
|
_ "google.golang.org/grpc/encoding/proto" // to register the Codec for "proto"
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// baseCodec contains the functionality of both Codec and encoding.Codec, but
|
||||||
|
// omits the name/string, which vary between the two and are not needed for
|
||||||
|
// anything besides the registry in the encoding package.
|
||||||
|
type baseCodec interface {
|
||||||
|
Marshal(v interface{}) ([]byte, error)
|
||||||
|
Unmarshal(data []byte, v interface{}) error
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ baseCodec = Codec(nil)
|
||||||
|
var _ baseCodec = encoding.Codec(nil)
|
||||||
|
|
||||||
// Codec defines the interface gRPC uses to encode and decode messages.
|
// Codec defines the interface gRPC uses to encode and decode messages.
|
||||||
// Note that implementations of this interface must be thread safe;
|
// Note that implementations of this interface must be thread safe;
|
||||||
// a Codec's methods can be called from concurrent goroutines.
|
// a Codec's methods can be called from concurrent goroutines.
|
||||||
|
//
|
||||||
|
// Deprecated: use encoding.Codec instead.
|
||||||
type Codec interface {
|
type Codec interface {
|
||||||
// Marshal returns the wire format of v.
|
// Marshal returns the wire format of v.
|
||||||
Marshal(v interface{}) ([]byte, error)
|
Marshal(v interface{}) ([]byte, error)
|
||||||
// Unmarshal parses the wire format into v.
|
// Unmarshal parses the wire format into v.
|
||||||
Unmarshal(data []byte, v interface{}) error
|
Unmarshal(data []byte, v interface{}) error
|
||||||
// String returns the name of the Codec implementation. The returned
|
// String returns the name of the Codec implementation. This is unused by
|
||||||
// string will be used as part of content type in transmission.
|
// gRPC.
|
||||||
String() string
|
String() string
|
||||||
}
|
}
|
||||||
|
|
||||||
// protoCodec is a Codec implementation with protobuf. It is the default codec for gRPC.
|
|
||||||
type protoCodec struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
type cachedProtoBuffer struct {
|
|
||||||
lastMarshaledSize uint32
|
|
||||||
proto.Buffer
|
|
||||||
}
|
|
||||||
|
|
||||||
func capToMaxInt32(val int) uint32 {
|
|
||||||
if val > math.MaxInt32 {
|
|
||||||
return uint32(math.MaxInt32)
|
|
||||||
}
|
|
||||||
return uint32(val)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p protoCodec) marshal(v interface{}, cb *cachedProtoBuffer) ([]byte, error) {
|
|
||||||
protoMsg := v.(proto.Message)
|
|
||||||
newSlice := make([]byte, 0, cb.lastMarshaledSize)
|
|
||||||
|
|
||||||
cb.SetBuf(newSlice)
|
|
||||||
cb.Reset()
|
|
||||||
if err := cb.Marshal(protoMsg); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
out := cb.Bytes()
|
|
||||||
cb.lastMarshaledSize = capToMaxInt32(len(out))
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p protoCodec) Marshal(v interface{}) ([]byte, error) {
|
|
||||||
cb := protoBufferPool.Get().(*cachedProtoBuffer)
|
|
||||||
out, err := p.marshal(v, cb)
|
|
||||||
|
|
||||||
// put back buffer and lose the ref to the slice
|
|
||||||
cb.SetBuf(nil)
|
|
||||||
protoBufferPool.Put(cb)
|
|
||||||
return out, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p protoCodec) Unmarshal(data []byte, v interface{}) error {
|
|
||||||
cb := protoBufferPool.Get().(*cachedProtoBuffer)
|
|
||||||
cb.SetBuf(data)
|
|
||||||
v.(proto.Message).Reset()
|
|
||||||
err := cb.Unmarshal(v.(proto.Message))
|
|
||||||
cb.SetBuf(nil)
|
|
||||||
protoBufferPool.Put(cb)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (protoCodec) String() string {
|
|
||||||
return "proto"
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
protoBufferPool = &sync.Pool{
|
|
||||||
New: func() interface{} {
|
|
||||||
return &cachedProtoBuffer{
|
|
||||||
Buffer: proto.Buffer{},
|
|
||||||
lastMarshaledSize: 16,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
66
vendor/google.golang.org/grpc/codes/code_string.go
generated
vendored
66
vendor/google.golang.org/grpc/codes/code_string.go
generated
vendored
@@ -1,16 +1,62 @@
|
|||||||
// Code generated by "stringer -type=Code"; DO NOT EDIT.
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2017 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 codes
|
package codes
|
||||||
|
|
||||||
import "fmt"
|
import "strconv"
|
||||||
|
|
||||||
const _Code_name = "OKCanceledUnknownInvalidArgumentDeadlineExceededNotFoundAlreadyExistsPermissionDeniedResourceExhaustedFailedPreconditionAbortedOutOfRangeUnimplementedInternalUnavailableDataLossUnauthenticated"
|
func (c Code) String() string {
|
||||||
|
switch c {
|
||||||
var _Code_index = [...]uint8{0, 2, 10, 17, 32, 48, 56, 69, 85, 102, 120, 127, 137, 150, 158, 169, 177, 192}
|
case OK:
|
||||||
|
return "OK"
|
||||||
func (i Code) String() string {
|
case Canceled:
|
||||||
if i >= Code(len(_Code_index)-1) {
|
return "Canceled"
|
||||||
return fmt.Sprintf("Code(%d)", i)
|
case Unknown:
|
||||||
|
return "Unknown"
|
||||||
|
case InvalidArgument:
|
||||||
|
return "InvalidArgument"
|
||||||
|
case DeadlineExceeded:
|
||||||
|
return "DeadlineExceeded"
|
||||||
|
case NotFound:
|
||||||
|
return "NotFound"
|
||||||
|
case AlreadyExists:
|
||||||
|
return "AlreadyExists"
|
||||||
|
case PermissionDenied:
|
||||||
|
return "PermissionDenied"
|
||||||
|
case ResourceExhausted:
|
||||||
|
return "ResourceExhausted"
|
||||||
|
case FailedPrecondition:
|
||||||
|
return "FailedPrecondition"
|
||||||
|
case Aborted:
|
||||||
|
return "Aborted"
|
||||||
|
case OutOfRange:
|
||||||
|
return "OutOfRange"
|
||||||
|
case Unimplemented:
|
||||||
|
return "Unimplemented"
|
||||||
|
case Internal:
|
||||||
|
return "Internal"
|
||||||
|
case Unavailable:
|
||||||
|
return "Unavailable"
|
||||||
|
case DataLoss:
|
||||||
|
return "DataLoss"
|
||||||
|
case Unauthenticated:
|
||||||
|
return "Unauthenticated"
|
||||||
|
default:
|
||||||
|
return "Code(" + strconv.FormatInt(int64(c), 10) + ")"
|
||||||
}
|
}
|
||||||
return _Code_name[_Code_index[i]:_Code_index[i+1]]
|
|
||||||
}
|
}
|
||||||
|
65
vendor/google.golang.org/grpc/codes/codes.go
generated
vendored
65
vendor/google.golang.org/grpc/codes/codes.go
generated
vendored
@@ -20,11 +20,14 @@
|
|||||||
// consistent across various languages.
|
// consistent across various languages.
|
||||||
package codes
|
package codes
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
// A Code is an unsigned 32-bit error code as defined in the gRPC spec.
|
// A Code is an unsigned 32-bit error code as defined in the gRPC spec.
|
||||||
type Code uint32
|
type Code uint32
|
||||||
|
|
||||||
//go:generate stringer -type=Code
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// OK is returned on success.
|
// OK is returned on success.
|
||||||
OK Code = 0
|
OK Code = 0
|
||||||
@@ -68,10 +71,6 @@ const (
|
|||||||
// instead for those errors).
|
// instead for those errors).
|
||||||
PermissionDenied Code = 7
|
PermissionDenied Code = 7
|
||||||
|
|
||||||
// Unauthenticated indicates the request does not have valid
|
|
||||||
// authentication credentials for the operation.
|
|
||||||
Unauthenticated Code = 16
|
|
||||||
|
|
||||||
// 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.
|
||||||
ResourceExhausted Code = 8
|
ResourceExhausted Code = 8
|
||||||
@@ -141,4 +140,58 @@ const (
|
|||||||
|
|
||||||
// DataLoss indicates unrecoverable data loss or corruption.
|
// DataLoss indicates unrecoverable data loss or corruption.
|
||||||
DataLoss Code = 15
|
DataLoss Code = 15
|
||||||
|
|
||||||
|
// Unauthenticated indicates the request does not have valid
|
||||||
|
// authentication credentials for the operation.
|
||||||
|
Unauthenticated Code = 16
|
||||||
|
|
||||||
|
_maxCode = 17
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var strToCode = map[string]Code{
|
||||||
|
`"OK"`: OK,
|
||||||
|
`"CANCELLED"`:/* [sic] */ Canceled,
|
||||||
|
`"UNKNOWN"`: Unknown,
|
||||||
|
`"INVALID_ARGUMENT"`: InvalidArgument,
|
||||||
|
`"DEADLINE_EXCEEDED"`: DeadlineExceeded,
|
||||||
|
`"NOT_FOUND"`: NotFound,
|
||||||
|
`"ALREADY_EXISTS"`: AlreadyExists,
|
||||||
|
`"PERMISSION_DENIED"`: PermissionDenied,
|
||||||
|
`"RESOURCE_EXHAUSTED"`: ResourceExhausted,
|
||||||
|
`"FAILED_PRECONDITION"`: FailedPrecondition,
|
||||||
|
`"ABORTED"`: Aborted,
|
||||||
|
`"OUT_OF_RANGE"`: OutOfRange,
|
||||||
|
`"UNIMPLEMENTED"`: Unimplemented,
|
||||||
|
`"INTERNAL"`: Internal,
|
||||||
|
`"UNAVAILABLE"`: Unavailable,
|
||||||
|
`"DATA_LOSS"`: DataLoss,
|
||||||
|
`"UNAUTHENTICATED"`: Unauthenticated,
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON unmarshals b into the Code.
|
||||||
|
func (c *Code) UnmarshalJSON(b []byte) error {
|
||||||
|
// From json.Unmarshaler: By convention, to approximate the behavior of
|
||||||
|
// Unmarshal itself, Unmarshalers implement UnmarshalJSON([]byte("null")) as
|
||||||
|
// a no-op.
|
||||||
|
if string(b) == "null" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if c == nil {
|
||||||
|
return fmt.Errorf("nil receiver passed to UnmarshalJSON")
|
||||||
|
}
|
||||||
|
|
||||||
|
if ci, err := strconv.ParseUint(string(b), 10, 32); err == nil {
|
||||||
|
if ci >= _maxCode {
|
||||||
|
return fmt.Errorf("invalid code: %q", ci)
|
||||||
|
}
|
||||||
|
|
||||||
|
*c = Code(ci)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if jc, ok := strToCode[string(b)]; ok {
|
||||||
|
*c = jc
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return fmt.Errorf("invalid code: %q", string(b))
|
||||||
|
}
|
||||||
|
27
vendor/google.golang.org/grpc/credentials/credentials.go
generated
vendored
27
vendor/google.golang.org/grpc/credentials/credentials.go
generated
vendored
@@ -34,10 +34,8 @@ import (
|
|||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
// alpnProtoStr are the specified application level protocols for gRPC.
|
||||||
// alpnProtoStr are the specified application level protocols for gRPC.
|
var alpnProtoStr = []string{"h2"}
|
||||||
alpnProtoStr = []string{"h2"}
|
|
||||||
)
|
|
||||||
|
|
||||||
// PerRPCCredentials defines the common interface for the credentials which need to
|
// PerRPCCredentials defines the common interface for the credentials which need to
|
||||||
// attach security information to every RPC (e.g., oauth2).
|
// attach security information to every RPC (e.g., oauth2).
|
||||||
@@ -45,8 +43,9 @@ type PerRPCCredentials interface {
|
|||||||
// GetRequestMetadata gets the current request metadata, refreshing
|
// GetRequestMetadata gets the current request metadata, refreshing
|
||||||
// tokens if required. This should be called by the transport layer on
|
// tokens if required. This should be called by the transport layer on
|
||||||
// each request, and the data should be populated in headers or other
|
// each request, and the data should be populated in headers or other
|
||||||
// context. uri is the URI of the entry point for the request. When
|
// context. If a status code is returned, it will be used as the status
|
||||||
// supported by the underlying implementation, ctx can be used for
|
// for the RPC. uri is the URI of the entry point for the request.
|
||||||
|
// When supported by the underlying implementation, ctx can be used for
|
||||||
// timeout and cancellation.
|
// timeout and cancellation.
|
||||||
// TODO(zhaoq): Define the set of the qualified keys instead of leaving
|
// TODO(zhaoq): Define the set of the qualified keys instead of leaving
|
||||||
// it as an arbitrary string.
|
// it as an arbitrary string.
|
||||||
@@ -74,11 +73,9 @@ type AuthInfo interface {
|
|||||||
AuthType() string
|
AuthType() string
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
// ErrConnDispatched indicates that rawConn has been dispatched out of gRPC
|
||||||
// ErrConnDispatched indicates that rawConn has been dispatched out of gRPC
|
// and the caller should not close rawConn.
|
||||||
// and the caller should not close rawConn.
|
var ErrConnDispatched = errors.New("credentials: rawConn is dispatched out of gRPC")
|
||||||
ErrConnDispatched = errors.New("credentials: rawConn is dispatched out of gRPC")
|
|
||||||
)
|
|
||||||
|
|
||||||
// TransportCredentials defines the common interface for all the live gRPC wire
|
// TransportCredentials defines the common interface for all the live gRPC wire
|
||||||
// protocols and supported transport security protocols (e.g., TLS, SSL).
|
// protocols and supported transport security protocols (e.g., TLS, SSL).
|
||||||
@@ -135,15 +132,15 @@ func (c tlsCreds) Info() ProtocolInfo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *tlsCreds) ClientHandshake(ctx context.Context, addr string, rawConn net.Conn) (_ net.Conn, _ AuthInfo, err error) {
|
func (c *tlsCreds) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (_ net.Conn, _ AuthInfo, err error) {
|
||||||
// use local cfg to avoid clobbering ServerName if using multiple endpoints
|
// use local cfg to avoid clobbering ServerName if using multiple endpoints
|
||||||
cfg := cloneTLSConfig(c.config)
|
cfg := cloneTLSConfig(c.config)
|
||||||
if cfg.ServerName == "" {
|
if cfg.ServerName == "" {
|
||||||
colonPos := strings.LastIndex(addr, ":")
|
colonPos := strings.LastIndex(authority, ":")
|
||||||
if colonPos == -1 {
|
if colonPos == -1 {
|
||||||
colonPos = len(addr)
|
colonPos = len(authority)
|
||||||
}
|
}
|
||||||
cfg.ServerName = addr[:colonPos]
|
cfg.ServerName = authority[:colonPos]
|
||||||
}
|
}
|
||||||
conn := tls.Client(rawConn, cfg)
|
conn := tls.Client(rawConn, cfg)
|
||||||
errChannel := make(chan error, 1)
|
errChannel := make(chan error, 1)
|
||||||
|
26
vendor/google.golang.org/grpc/encoding/BUILD
generated
vendored
Normal file
26
vendor/google.golang.org/grpc/encoding/BUILD
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["encoding.go"],
|
||||||
|
importmap = "k8s.io/kubernetes/vendor/google.golang.org/grpc/encoding",
|
||||||
|
importpath = "google.golang.org/grpc/encoding",
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [
|
||||||
|
":package-srcs",
|
||||||
|
"//vendor/google.golang.org/grpc/encoding/proto:all-srcs",
|
||||||
|
],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
118
vendor/google.golang.org/grpc/encoding/encoding.go
generated
vendored
Normal file
118
vendor/google.golang.org/grpc/encoding/encoding.go
generated
vendored
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2017 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 encoding defines the interface for the compressor and codec, and
|
||||||
|
// functions to register and retrieve compressors and codecs.
|
||||||
|
//
|
||||||
|
// This package is EXPERIMENTAL.
|
||||||
|
package encoding
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Identity specifies the optional encoding for uncompressed streams.
|
||||||
|
// It is intended for grpc internal use only.
|
||||||
|
const Identity = "identity"
|
||||||
|
|
||||||
|
// Compressor is used for compressing and decompressing when sending or
|
||||||
|
// receiving messages.
|
||||||
|
type Compressor interface {
|
||||||
|
// Compress writes the data written to wc to w after compressing it. If an
|
||||||
|
// error occurs while initializing the compressor, that error is returned
|
||||||
|
// instead.
|
||||||
|
Compress(w io.Writer) (io.WriteCloser, error)
|
||||||
|
// Decompress reads data from r, decompresses it, and provides the
|
||||||
|
// uncompressed data via the returned io.Reader. If an error occurs while
|
||||||
|
// initializing the decompressor, that error is returned instead.
|
||||||
|
Decompress(r io.Reader) (io.Reader, error)
|
||||||
|
// Name is the name of the compression codec and is used to set the content
|
||||||
|
// coding header. The result must be static; the result cannot change
|
||||||
|
// between calls.
|
||||||
|
Name() string
|
||||||
|
}
|
||||||
|
|
||||||
|
var registeredCompressor = make(map[string]Compressor)
|
||||||
|
|
||||||
|
// RegisterCompressor registers the compressor with gRPC by its name. It can
|
||||||
|
// be activated when sending an RPC via grpc.UseCompressor(). It will be
|
||||||
|
// automatically accessed when receiving a message based on the content coding
|
||||||
|
// header. Servers also use it to send a response with the same encoding as
|
||||||
|
// the request.
|
||||||
|
//
|
||||||
|
// NOTE: this function must only be called during initialization time (i.e. in
|
||||||
|
// an init() function), and is not thread-safe. If multiple Compressors are
|
||||||
|
// registered with the same name, the one registered last will take effect.
|
||||||
|
func RegisterCompressor(c Compressor) {
|
||||||
|
registeredCompressor[c.Name()] = c
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCompressor returns Compressor for the given compressor name.
|
||||||
|
func GetCompressor(name string) Compressor {
|
||||||
|
return registeredCompressor[name]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Codec defines the interface gRPC uses to encode and decode messages. Note
|
||||||
|
// that implementations of this interface must be thread safe; a Codec's
|
||||||
|
// methods can be called from concurrent goroutines.
|
||||||
|
type Codec interface {
|
||||||
|
// Marshal returns the wire format of v.
|
||||||
|
Marshal(v interface{}) ([]byte, error)
|
||||||
|
// Unmarshal parses the wire format into v.
|
||||||
|
Unmarshal(data []byte, v interface{}) error
|
||||||
|
// Name returns the name of the Codec implementation. The returned string
|
||||||
|
// will be used as part of content type in transmission. The result must be
|
||||||
|
// static; the result cannot change between calls.
|
||||||
|
Name() string
|
||||||
|
}
|
||||||
|
|
||||||
|
var registeredCodecs = make(map[string]Codec)
|
||||||
|
|
||||||
|
// RegisterCodec registers the provided Codec for use with all gRPC clients and
|
||||||
|
// servers.
|
||||||
|
//
|
||||||
|
// The Codec will be stored and looked up by result of its Name() method, which
|
||||||
|
// should match the content-subtype of the encoding handled by the Codec. This
|
||||||
|
// is case-insensitive, and is stored and looked up as lowercase. If the
|
||||||
|
// result of calling Name() is an empty string, RegisterCodec will panic. See
|
||||||
|
// Content-Type on
|
||||||
|
// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for
|
||||||
|
// more details.
|
||||||
|
//
|
||||||
|
// NOTE: this function must only be called during initialization time (i.e. in
|
||||||
|
// an init() function), and is not thread-safe. If multiple Compressors are
|
||||||
|
// registered with the same name, the one registered last will take effect.
|
||||||
|
func RegisterCodec(codec Codec) {
|
||||||
|
if codec == nil {
|
||||||
|
panic("cannot register a nil Codec")
|
||||||
|
}
|
||||||
|
contentSubtype := strings.ToLower(codec.Name())
|
||||||
|
if contentSubtype == "" {
|
||||||
|
panic("cannot register Codec with empty string result for String()")
|
||||||
|
}
|
||||||
|
registeredCodecs[contentSubtype] = codec
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCodec gets a registered Codec by content-subtype, or nil if no Codec is
|
||||||
|
// registered for the content-subtype.
|
||||||
|
//
|
||||||
|
// The content-subtype is expected to be lowercase.
|
||||||
|
func GetCodec(contentSubtype string) Codec {
|
||||||
|
return registeredCodecs[contentSubtype]
|
||||||
|
}
|
27
vendor/google.golang.org/grpc/encoding/proto/BUILD
generated
vendored
Normal file
27
vendor/google.golang.org/grpc/encoding/proto/BUILD
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["proto.go"],
|
||||||
|
importmap = "k8s.io/kubernetes/vendor/google.golang.org/grpc/encoding/proto",
|
||||||
|
importpath = "google.golang.org/grpc/encoding/proto",
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
deps = [
|
||||||
|
"//vendor/github.com/golang/protobuf/proto:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/encoding:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
110
vendor/google.golang.org/grpc/encoding/proto/proto.go
generated
vendored
Normal file
110
vendor/google.golang.org/grpc/encoding/proto/proto.go
generated
vendored
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2018 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 proto defines the protobuf codec. Importing this package will
|
||||||
|
// register the codec.
|
||||||
|
package proto
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/golang/protobuf/proto"
|
||||||
|
"google.golang.org/grpc/encoding"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Name is the name registered for the proto compressor.
|
||||||
|
const Name = "proto"
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
encoding.RegisterCodec(codec{})
|
||||||
|
}
|
||||||
|
|
||||||
|
// codec is a Codec implementation with protobuf. It is the default codec for gRPC.
|
||||||
|
type codec struct{}
|
||||||
|
|
||||||
|
type cachedProtoBuffer struct {
|
||||||
|
lastMarshaledSize uint32
|
||||||
|
proto.Buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
func capToMaxInt32(val int) uint32 {
|
||||||
|
if val > math.MaxInt32 {
|
||||||
|
return uint32(math.MaxInt32)
|
||||||
|
}
|
||||||
|
return uint32(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
func marshal(v interface{}, cb *cachedProtoBuffer) ([]byte, error) {
|
||||||
|
protoMsg := v.(proto.Message)
|
||||||
|
newSlice := make([]byte, 0, cb.lastMarshaledSize)
|
||||||
|
|
||||||
|
cb.SetBuf(newSlice)
|
||||||
|
cb.Reset()
|
||||||
|
if err := cb.Marshal(protoMsg); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
out := cb.Bytes()
|
||||||
|
cb.lastMarshaledSize = capToMaxInt32(len(out))
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (codec) Marshal(v interface{}) ([]byte, error) {
|
||||||
|
if pm, ok := v.(proto.Marshaler); ok {
|
||||||
|
// object can marshal itself, no need for buffer
|
||||||
|
return pm.Marshal()
|
||||||
|
}
|
||||||
|
|
||||||
|
cb := protoBufferPool.Get().(*cachedProtoBuffer)
|
||||||
|
out, err := marshal(v, cb)
|
||||||
|
|
||||||
|
// put back buffer and lose the ref to the slice
|
||||||
|
cb.SetBuf(nil)
|
||||||
|
protoBufferPool.Put(cb)
|
||||||
|
return out, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (codec) Unmarshal(data []byte, v interface{}) error {
|
||||||
|
protoMsg := v.(proto.Message)
|
||||||
|
protoMsg.Reset()
|
||||||
|
|
||||||
|
if pu, ok := protoMsg.(proto.Unmarshaler); ok {
|
||||||
|
// object can unmarshal itself, no need for buffer
|
||||||
|
return pu.Unmarshal(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
cb := protoBufferPool.Get().(*cachedProtoBuffer)
|
||||||
|
cb.SetBuf(data)
|
||||||
|
err := cb.Unmarshal(protoMsg)
|
||||||
|
cb.SetBuf(nil)
|
||||||
|
protoBufferPool.Put(cb)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (codec) Name() string {
|
||||||
|
return Name
|
||||||
|
}
|
||||||
|
|
||||||
|
var protoBufferPool = &sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
return &cachedProtoBuffer{
|
||||||
|
Buffer: proto.Buffer{},
|
||||||
|
lastMarshaledSize: 16,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
37
vendor/google.golang.org/grpc/envconfig.go
generated
vendored
Normal file
37
vendor/google.golang.org/grpc/envconfig.go
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2018 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 grpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
envConfigPrefix = "GRPC_GO_"
|
||||||
|
envConfigStickinessStr = envConfigPrefix + "STICKINESS"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
envConfigStickinessOn bool
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
envConfigStickinessOn = strings.EqualFold(os.Getenv(envConfigStickinessStr), "on")
|
||||||
|
}
|
70
vendor/google.golang.org/grpc/go16.go
generated
vendored
Normal file
70
vendor/google.golang.org/grpc/go16.go
generated
vendored
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
// +build go1.6,!go1.7
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2016 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 grpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
|
"google.golang.org/grpc/transport"
|
||||||
|
)
|
||||||
|
|
||||||
|
// dialContext connects to the address on the named network.
|
||||||
|
func dialContext(ctx context.Context, network, address string) (net.Conn, error) {
|
||||||
|
return (&net.Dialer{Cancel: ctx.Done()}).Dial(network, address)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendHTTPRequest(ctx context.Context, req *http.Request, conn net.Conn) error {
|
||||||
|
req.Cancel = ctx.Done()
|
||||||
|
if err := req.Write(conn); err != nil {
|
||||||
|
return fmt.Errorf("failed to write the HTTP request: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// toRPCErr converts an error into an error from the status package.
|
||||||
|
func toRPCErr(err error) error {
|
||||||
|
if err == nil || err == io.EOF {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, ok := status.FromError(err); ok {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
switch e := err.(type) {
|
||||||
|
case transport.StreamError:
|
||||||
|
return status.Error(e.Code, e.Desc)
|
||||||
|
case transport.ConnectionError:
|
||||||
|
return status.Error(codes.Unavailable, e.Desc)
|
||||||
|
default:
|
||||||
|
switch err {
|
||||||
|
case context.DeadlineExceeded:
|
||||||
|
return status.Error(codes.DeadlineExceeded, err.Error())
|
||||||
|
case context.Canceled:
|
||||||
|
return status.Error(codes.Canceled, err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return status.Error(codes.Unknown, err.Error())
|
||||||
|
}
|
71
vendor/google.golang.org/grpc/go17.go
generated
vendored
Normal file
71
vendor/google.golang.org/grpc/go17.go
generated
vendored
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
// +build go1.7
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2016 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 grpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
netctx "golang.org/x/net/context"
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
|
"google.golang.org/grpc/transport"
|
||||||
|
)
|
||||||
|
|
||||||
|
// dialContext connects to the address on the named network.
|
||||||
|
func dialContext(ctx context.Context, network, address string) (net.Conn, error) {
|
||||||
|
return (&net.Dialer{}).DialContext(ctx, network, address)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendHTTPRequest(ctx context.Context, req *http.Request, conn net.Conn) error {
|
||||||
|
req = req.WithContext(ctx)
|
||||||
|
if err := req.Write(conn); err != nil {
|
||||||
|
return fmt.Errorf("failed to write the HTTP request: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// toRPCErr converts an error into an error from the status package.
|
||||||
|
func toRPCErr(err error) error {
|
||||||
|
if err == nil || err == io.EOF {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, ok := status.FromError(err); ok {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
switch e := err.(type) {
|
||||||
|
case transport.StreamError:
|
||||||
|
return status.Error(e.Code, e.Desc)
|
||||||
|
case transport.ConnectionError:
|
||||||
|
return status.Error(codes.Unavailable, e.Desc)
|
||||||
|
default:
|
||||||
|
switch err {
|
||||||
|
case context.DeadlineExceeded, netctx.DeadlineExceeded:
|
||||||
|
return status.Error(codes.DeadlineExceeded, err.Error())
|
||||||
|
case context.Canceled, netctx.Canceled:
|
||||||
|
return status.Error(codes.Canceled, err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return status.Error(codes.Unknown, err.Error())
|
||||||
|
}
|
704
vendor/google.golang.org/grpc/grpclb.go
generated
vendored
704
vendor/google.golang.org/grpc/grpclb.go
generated
vendored
@@ -1,704 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright 2016 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 grpc
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"math/rand"
|
|
||||||
"net"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc/codes"
|
|
||||||
lbmpb "google.golang.org/grpc/grpclb/grpc_lb_v1/messages"
|
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
"google.golang.org/grpc/metadata"
|
|
||||||
"google.golang.org/grpc/naming"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Client API for LoadBalancer service.
|
|
||||||
// Mostly copied from generated pb.go file.
|
|
||||||
// To avoid circular dependency.
|
|
||||||
type loadBalancerClient struct {
|
|
||||||
cc *ClientConn
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *loadBalancerClient) BalanceLoad(ctx context.Context, opts ...CallOption) (*balanceLoadClientStream, error) {
|
|
||||||
desc := &StreamDesc{
|
|
||||||
StreamName: "BalanceLoad",
|
|
||||||
ServerStreams: true,
|
|
||||||
ClientStreams: true,
|
|
||||||
}
|
|
||||||
stream, err := NewClientStream(ctx, desc, c.cc, "/grpc.lb.v1.LoadBalancer/BalanceLoad", opts...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
x := &balanceLoadClientStream{stream}
|
|
||||||
return x, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type balanceLoadClientStream struct {
|
|
||||||
ClientStream
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *balanceLoadClientStream) Send(m *lbmpb.LoadBalanceRequest) error {
|
|
||||||
return x.ClientStream.SendMsg(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *balanceLoadClientStream) Recv() (*lbmpb.LoadBalanceResponse, error) {
|
|
||||||
m := new(lbmpb.LoadBalanceResponse)
|
|
||||||
if err := x.ClientStream.RecvMsg(m); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return m, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewGRPCLBBalancer creates a grpclb load balancer.
|
|
||||||
func NewGRPCLBBalancer(r naming.Resolver) Balancer {
|
|
||||||
return &grpclbBalancer{
|
|
||||||
r: r,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type remoteBalancerInfo struct {
|
|
||||||
addr string
|
|
||||||
// the server name used for authentication with the remote LB server.
|
|
||||||
name string
|
|
||||||
}
|
|
||||||
|
|
||||||
// grpclbAddrInfo consists of the information of a backend server.
|
|
||||||
type grpclbAddrInfo struct {
|
|
||||||
addr Address
|
|
||||||
connected bool
|
|
||||||
// dropForRateLimiting indicates whether this particular request should be
|
|
||||||
// dropped by the client for rate limiting.
|
|
||||||
dropForRateLimiting bool
|
|
||||||
// dropForLoadBalancing indicates whether this particular request should be
|
|
||||||
// dropped by the client for load balancing.
|
|
||||||
dropForLoadBalancing bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type grpclbBalancer struct {
|
|
||||||
r naming.Resolver
|
|
||||||
target string
|
|
||||||
mu sync.Mutex
|
|
||||||
seq int // a sequence number to make sure addrCh does not get stale addresses.
|
|
||||||
w naming.Watcher
|
|
||||||
addrCh chan []Address
|
|
||||||
rbs []remoteBalancerInfo
|
|
||||||
addrs []*grpclbAddrInfo
|
|
||||||
next int
|
|
||||||
waitCh chan struct{}
|
|
||||||
done bool
|
|
||||||
rand *rand.Rand
|
|
||||||
|
|
||||||
clientStats lbmpb.ClientStats
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *grpclbBalancer) watchAddrUpdates(w naming.Watcher, ch chan []remoteBalancerInfo) error {
|
|
||||||
updates, err := w.Next()
|
|
||||||
if err != nil {
|
|
||||||
grpclog.Warningf("grpclb: failed to get next addr update from watcher: %v", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
b.mu.Lock()
|
|
||||||
defer b.mu.Unlock()
|
|
||||||
if b.done {
|
|
||||||
return ErrClientConnClosing
|
|
||||||
}
|
|
||||||
for _, update := range updates {
|
|
||||||
switch update.Op {
|
|
||||||
case naming.Add:
|
|
||||||
var exist bool
|
|
||||||
for _, v := range b.rbs {
|
|
||||||
// TODO: Is the same addr with different server name a different balancer?
|
|
||||||
if update.Addr == v.addr {
|
|
||||||
exist = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if exist {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
md, ok := update.Metadata.(*naming.AddrMetadataGRPCLB)
|
|
||||||
if !ok {
|
|
||||||
// TODO: Revisit the handling here and may introduce some fallback mechanism.
|
|
||||||
grpclog.Errorf("The name resolution contains unexpected metadata %v", update.Metadata)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
switch md.AddrType {
|
|
||||||
case naming.Backend:
|
|
||||||
// TODO: Revisit the handling here and may introduce some fallback mechanism.
|
|
||||||
grpclog.Errorf("The name resolution does not give grpclb addresses")
|
|
||||||
continue
|
|
||||||
case naming.GRPCLB:
|
|
||||||
b.rbs = append(b.rbs, remoteBalancerInfo{
|
|
||||||
addr: update.Addr,
|
|
||||||
name: md.ServerName,
|
|
||||||
})
|
|
||||||
default:
|
|
||||||
grpclog.Errorf("Received unknow address type %d", md.AddrType)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
case naming.Delete:
|
|
||||||
for i, v := range b.rbs {
|
|
||||||
if update.Addr == v.addr {
|
|
||||||
copy(b.rbs[i:], b.rbs[i+1:])
|
|
||||||
b.rbs = b.rbs[:len(b.rbs)-1]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
grpclog.Errorf("Unknown update.Op %v", update.Op)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// TODO: Fall back to the basic round-robin load balancing if the resulting address is
|
|
||||||
// not a load balancer.
|
|
||||||
select {
|
|
||||||
case <-ch:
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
ch <- b.rbs
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func convertDuration(d *lbmpb.Duration) time.Duration {
|
|
||||||
if d == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return time.Duration(d.Seconds)*time.Second + time.Duration(d.Nanos)*time.Nanosecond
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *grpclbBalancer) processServerList(l *lbmpb.ServerList, seq int) {
|
|
||||||
if l == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
servers := l.GetServers()
|
|
||||||
var (
|
|
||||||
sl []*grpclbAddrInfo
|
|
||||||
addrs []Address
|
|
||||||
)
|
|
||||||
for _, s := range servers {
|
|
||||||
md := metadata.Pairs("lb-token", s.LoadBalanceToken)
|
|
||||||
ip := net.IP(s.IpAddress)
|
|
||||||
ipStr := ip.String()
|
|
||||||
if ip.To4() == nil {
|
|
||||||
// Add square brackets to ipv6 addresses, otherwise net.Dial() and
|
|
||||||
// net.SplitHostPort() will return too many colons error.
|
|
||||||
ipStr = fmt.Sprintf("[%s]", ipStr)
|
|
||||||
}
|
|
||||||
addr := Address{
|
|
||||||
Addr: fmt.Sprintf("%s:%d", ipStr, s.Port),
|
|
||||||
Metadata: &md,
|
|
||||||
}
|
|
||||||
sl = append(sl, &grpclbAddrInfo{
|
|
||||||
addr: addr,
|
|
||||||
dropForRateLimiting: s.DropForRateLimiting,
|
|
||||||
dropForLoadBalancing: s.DropForLoadBalancing,
|
|
||||||
})
|
|
||||||
addrs = append(addrs, addr)
|
|
||||||
}
|
|
||||||
b.mu.Lock()
|
|
||||||
defer b.mu.Unlock()
|
|
||||||
if b.done || seq < b.seq {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if len(sl) > 0 {
|
|
||||||
// reset b.next to 0 when replacing the server list.
|
|
||||||
b.next = 0
|
|
||||||
b.addrs = sl
|
|
||||||
b.addrCh <- addrs
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *grpclbBalancer) sendLoadReport(s *balanceLoadClientStream, interval time.Duration, done <-chan struct{}) {
|
|
||||||
ticker := time.NewTicker(interval)
|
|
||||||
defer ticker.Stop()
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-ticker.C:
|
|
||||||
case <-done:
|
|
||||||
return
|
|
||||||
}
|
|
||||||
b.mu.Lock()
|
|
||||||
stats := b.clientStats
|
|
||||||
b.clientStats = lbmpb.ClientStats{} // Clear the stats.
|
|
||||||
b.mu.Unlock()
|
|
||||||
t := time.Now()
|
|
||||||
stats.Timestamp = &lbmpb.Timestamp{
|
|
||||||
Seconds: t.Unix(),
|
|
||||||
Nanos: int32(t.Nanosecond()),
|
|
||||||
}
|
|
||||||
if err := s.Send(&lbmpb.LoadBalanceRequest{
|
|
||||||
LoadBalanceRequestType: &lbmpb.LoadBalanceRequest_ClientStats{
|
|
||||||
ClientStats: &stats,
|
|
||||||
},
|
|
||||||
}); err != nil {
|
|
||||||
grpclog.Errorf("grpclb: failed to send load report: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *grpclbBalancer) callRemoteBalancer(lbc *loadBalancerClient, seq int) (retry bool) {
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
|
||||||
defer cancel()
|
|
||||||
stream, err := lbc.BalanceLoad(ctx)
|
|
||||||
if err != nil {
|
|
||||||
grpclog.Errorf("grpclb: failed to perform RPC to the remote balancer %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
b.mu.Lock()
|
|
||||||
if b.done {
|
|
||||||
b.mu.Unlock()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
b.mu.Unlock()
|
|
||||||
initReq := &lbmpb.LoadBalanceRequest{
|
|
||||||
LoadBalanceRequestType: &lbmpb.LoadBalanceRequest_InitialRequest{
|
|
||||||
InitialRequest: &lbmpb.InitialLoadBalanceRequest{
|
|
||||||
Name: b.target,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
if err := stream.Send(initReq); err != nil {
|
|
||||||
grpclog.Errorf("grpclb: failed to send init request: %v", err)
|
|
||||||
// TODO: backoff on retry?
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
reply, err := stream.Recv()
|
|
||||||
if err != nil {
|
|
||||||
grpclog.Errorf("grpclb: failed to recv init response: %v", err)
|
|
||||||
// TODO: backoff on retry?
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
initResp := reply.GetInitialResponse()
|
|
||||||
if initResp == nil {
|
|
||||||
grpclog.Errorf("grpclb: reply from remote balancer did not include initial response.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// TODO: Support delegation.
|
|
||||||
if initResp.LoadBalancerDelegate != "" {
|
|
||||||
// delegation
|
|
||||||
grpclog.Errorf("TODO: Delegation is not supported yet.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
streamDone := make(chan struct{})
|
|
||||||
defer close(streamDone)
|
|
||||||
b.mu.Lock()
|
|
||||||
b.clientStats = lbmpb.ClientStats{} // Clear client stats.
|
|
||||||
b.mu.Unlock()
|
|
||||||
if d := convertDuration(initResp.ClientStatsReportInterval); d > 0 {
|
|
||||||
go b.sendLoadReport(stream, d, streamDone)
|
|
||||||
}
|
|
||||||
// Retrieve the server list.
|
|
||||||
for {
|
|
||||||
reply, err := stream.Recv()
|
|
||||||
if err != nil {
|
|
||||||
grpclog.Errorf("grpclb: failed to recv server list: %v", err)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
b.mu.Lock()
|
|
||||||
if b.done || seq < b.seq {
|
|
||||||
b.mu.Unlock()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
b.seq++ // tick when receiving a new list of servers.
|
|
||||||
seq = b.seq
|
|
||||||
b.mu.Unlock()
|
|
||||||
if serverList := reply.GetServerList(); serverList != nil {
|
|
||||||
b.processServerList(serverList, seq)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *grpclbBalancer) Start(target string, config BalancerConfig) error {
|
|
||||||
b.rand = rand.New(rand.NewSource(time.Now().Unix()))
|
|
||||||
// TODO: Fall back to the basic direct connection if there is no name resolver.
|
|
||||||
if b.r == nil {
|
|
||||||
return errors.New("there is no name resolver installed")
|
|
||||||
}
|
|
||||||
b.target = target
|
|
||||||
b.mu.Lock()
|
|
||||||
if b.done {
|
|
||||||
b.mu.Unlock()
|
|
||||||
return ErrClientConnClosing
|
|
||||||
}
|
|
||||||
b.addrCh = make(chan []Address)
|
|
||||||
w, err := b.r.Resolve(target)
|
|
||||||
if err != nil {
|
|
||||||
b.mu.Unlock()
|
|
||||||
grpclog.Errorf("grpclb: failed to resolve address: %v, err: %v", target, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
b.w = w
|
|
||||||
b.mu.Unlock()
|
|
||||||
balancerAddrsCh := make(chan []remoteBalancerInfo, 1)
|
|
||||||
// Spawn a goroutine to monitor the name resolution of remote load balancer.
|
|
||||||
go func() {
|
|
||||||
for {
|
|
||||||
if err := b.watchAddrUpdates(w, balancerAddrsCh); err != nil {
|
|
||||||
grpclog.Warningf("grpclb: the naming watcher stops working due to %v.\n", err)
|
|
||||||
close(balancerAddrsCh)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
// Spawn a goroutine to talk to the remote load balancer.
|
|
||||||
go func() {
|
|
||||||
var (
|
|
||||||
cc *ClientConn
|
|
||||||
// ccError is closed when there is an error in the current cc.
|
|
||||||
// A new rb should be picked from rbs and connected.
|
|
||||||
ccError chan struct{}
|
|
||||||
rb *remoteBalancerInfo
|
|
||||||
rbs []remoteBalancerInfo
|
|
||||||
rbIdx int
|
|
||||||
)
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
if ccError != nil {
|
|
||||||
select {
|
|
||||||
case <-ccError:
|
|
||||||
default:
|
|
||||||
close(ccError)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if cc != nil {
|
|
||||||
cc.Close()
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
for {
|
|
||||||
var ok bool
|
|
||||||
select {
|
|
||||||
case rbs, ok = <-balancerAddrsCh:
|
|
||||||
if !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
foundIdx := -1
|
|
||||||
if rb != nil {
|
|
||||||
for i, trb := range rbs {
|
|
||||||
if trb == *rb {
|
|
||||||
foundIdx = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if foundIdx >= 0 {
|
|
||||||
if foundIdx >= 1 {
|
|
||||||
// Move the address in use to the beginning of the list.
|
|
||||||
b.rbs[0], b.rbs[foundIdx] = b.rbs[foundIdx], b.rbs[0]
|
|
||||||
rbIdx = 0
|
|
||||||
}
|
|
||||||
continue // If found, don't dial new cc.
|
|
||||||
} else if len(rbs) > 0 {
|
|
||||||
// Pick a random one from the list, instead of always using the first one.
|
|
||||||
if l := len(rbs); l > 1 && rb != nil {
|
|
||||||
tmpIdx := b.rand.Intn(l - 1)
|
|
||||||
b.rbs[0], b.rbs[tmpIdx] = b.rbs[tmpIdx], b.rbs[0]
|
|
||||||
}
|
|
||||||
rbIdx = 0
|
|
||||||
rb = &rbs[0]
|
|
||||||
} else {
|
|
||||||
// foundIdx < 0 && len(rbs) <= 0.
|
|
||||||
rb = nil
|
|
||||||
}
|
|
||||||
case <-ccError:
|
|
||||||
ccError = nil
|
|
||||||
if rbIdx < len(rbs)-1 {
|
|
||||||
rbIdx++
|
|
||||||
rb = &rbs[rbIdx]
|
|
||||||
} else {
|
|
||||||
rb = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if rb == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if cc != nil {
|
|
||||||
cc.Close()
|
|
||||||
}
|
|
||||||
// Talk to the remote load balancer to get the server list.
|
|
||||||
var (
|
|
||||||
err error
|
|
||||||
dopts []DialOption
|
|
||||||
)
|
|
||||||
if creds := config.DialCreds; creds != nil {
|
|
||||||
if rb.name != "" {
|
|
||||||
if err := creds.OverrideServerName(rb.name); err != nil {
|
|
||||||
grpclog.Warningf("grpclb: failed to override the server name in the credentials: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dopts = append(dopts, WithTransportCredentials(creds))
|
|
||||||
} else {
|
|
||||||
dopts = append(dopts, WithInsecure())
|
|
||||||
}
|
|
||||||
if dialer := config.Dialer; dialer != nil {
|
|
||||||
// WithDialer takes a different type of function, so we instead use a special DialOption here.
|
|
||||||
dopts = append(dopts, func(o *dialOptions) { o.copts.Dialer = dialer })
|
|
||||||
}
|
|
||||||
dopts = append(dopts, WithBlock())
|
|
||||||
ccError = make(chan struct{})
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
|
||||||
cc, err = DialContext(ctx, rb.addr, dopts...)
|
|
||||||
cancel()
|
|
||||||
if err != nil {
|
|
||||||
grpclog.Warningf("grpclb: failed to setup a connection to the remote balancer %v: %v", rb.addr, err)
|
|
||||||
close(ccError)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
b.mu.Lock()
|
|
||||||
b.seq++ // tick when getting a new balancer address
|
|
||||||
seq := b.seq
|
|
||||||
b.next = 0
|
|
||||||
b.mu.Unlock()
|
|
||||||
go func(cc *ClientConn, ccError chan struct{}) {
|
|
||||||
lbc := &loadBalancerClient{cc}
|
|
||||||
b.callRemoteBalancer(lbc, seq)
|
|
||||||
cc.Close()
|
|
||||||
select {
|
|
||||||
case <-ccError:
|
|
||||||
default:
|
|
||||||
close(ccError)
|
|
||||||
}
|
|
||||||
}(cc, ccError)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *grpclbBalancer) down(addr Address, err error) {
|
|
||||||
b.mu.Lock()
|
|
||||||
defer b.mu.Unlock()
|
|
||||||
for _, a := range b.addrs {
|
|
||||||
if addr == a.addr {
|
|
||||||
a.connected = false
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *grpclbBalancer) Up(addr Address) func(error) {
|
|
||||||
b.mu.Lock()
|
|
||||||
defer b.mu.Unlock()
|
|
||||||
if b.done {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
var cnt int
|
|
||||||
for _, a := range b.addrs {
|
|
||||||
if a.addr == addr {
|
|
||||||
if a.connected {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
a.connected = true
|
|
||||||
}
|
|
||||||
if a.connected && !a.dropForRateLimiting && !a.dropForLoadBalancing {
|
|
||||||
cnt++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// addr is the only one which is connected. Notify the Get() callers who are blocking.
|
|
||||||
if cnt == 1 && b.waitCh != nil {
|
|
||||||
close(b.waitCh)
|
|
||||||
b.waitCh = nil
|
|
||||||
}
|
|
||||||
return func(err error) {
|
|
||||||
b.down(addr, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *grpclbBalancer) Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), err error) {
|
|
||||||
var ch chan struct{}
|
|
||||||
b.mu.Lock()
|
|
||||||
if b.done {
|
|
||||||
b.mu.Unlock()
|
|
||||||
err = ErrClientConnClosing
|
|
||||||
return
|
|
||||||
}
|
|
||||||
seq := b.seq
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
put = func() {
|
|
||||||
s, ok := rpcInfoFromContext(ctx)
|
|
||||||
if !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
b.mu.Lock()
|
|
||||||
defer b.mu.Unlock()
|
|
||||||
if b.done || seq < b.seq {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
b.clientStats.NumCallsFinished++
|
|
||||||
if !s.bytesSent {
|
|
||||||
b.clientStats.NumCallsFinishedWithClientFailedToSend++
|
|
||||||
} else if s.bytesReceived {
|
|
||||||
b.clientStats.NumCallsFinishedKnownReceived++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
b.clientStats.NumCallsStarted++
|
|
||||||
if len(b.addrs) > 0 {
|
|
||||||
if b.next >= len(b.addrs) {
|
|
||||||
b.next = 0
|
|
||||||
}
|
|
||||||
next := b.next
|
|
||||||
for {
|
|
||||||
a := b.addrs[next]
|
|
||||||
next = (next + 1) % len(b.addrs)
|
|
||||||
if a.connected {
|
|
||||||
if !a.dropForRateLimiting && !a.dropForLoadBalancing {
|
|
||||||
addr = a.addr
|
|
||||||
b.next = next
|
|
||||||
b.mu.Unlock()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !opts.BlockingWait {
|
|
||||||
b.next = next
|
|
||||||
if a.dropForLoadBalancing {
|
|
||||||
b.clientStats.NumCallsFinished++
|
|
||||||
b.clientStats.NumCallsFinishedWithDropForLoadBalancing++
|
|
||||||
} else if a.dropForRateLimiting {
|
|
||||||
b.clientStats.NumCallsFinished++
|
|
||||||
b.clientStats.NumCallsFinishedWithDropForRateLimiting++
|
|
||||||
}
|
|
||||||
b.mu.Unlock()
|
|
||||||
err = Errorf(codes.Unavailable, "%s drops requests", a.addr.Addr)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if next == b.next {
|
|
||||||
// Has iterated all the possible address but none is connected.
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !opts.BlockingWait {
|
|
||||||
b.clientStats.NumCallsFinished++
|
|
||||||
b.clientStats.NumCallsFinishedWithClientFailedToSend++
|
|
||||||
b.mu.Unlock()
|
|
||||||
err = Errorf(codes.Unavailable, "there is no address available")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// Wait on b.waitCh for non-failfast RPCs.
|
|
||||||
if b.waitCh == nil {
|
|
||||||
ch = make(chan struct{})
|
|
||||||
b.waitCh = ch
|
|
||||||
} else {
|
|
||||||
ch = b.waitCh
|
|
||||||
}
|
|
||||||
b.mu.Unlock()
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-ctx.Done():
|
|
||||||
b.mu.Lock()
|
|
||||||
b.clientStats.NumCallsFinished++
|
|
||||||
b.clientStats.NumCallsFinishedWithClientFailedToSend++
|
|
||||||
b.mu.Unlock()
|
|
||||||
err = ctx.Err()
|
|
||||||
return
|
|
||||||
case <-ch:
|
|
||||||
b.mu.Lock()
|
|
||||||
if b.done {
|
|
||||||
b.clientStats.NumCallsFinished++
|
|
||||||
b.clientStats.NumCallsFinishedWithClientFailedToSend++
|
|
||||||
b.mu.Unlock()
|
|
||||||
err = ErrClientConnClosing
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(b.addrs) > 0 {
|
|
||||||
if b.next >= len(b.addrs) {
|
|
||||||
b.next = 0
|
|
||||||
}
|
|
||||||
next := b.next
|
|
||||||
for {
|
|
||||||
a := b.addrs[next]
|
|
||||||
next = (next + 1) % len(b.addrs)
|
|
||||||
if a.connected {
|
|
||||||
if !a.dropForRateLimiting && !a.dropForLoadBalancing {
|
|
||||||
addr = a.addr
|
|
||||||
b.next = next
|
|
||||||
b.mu.Unlock()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !opts.BlockingWait {
|
|
||||||
b.next = next
|
|
||||||
if a.dropForLoadBalancing {
|
|
||||||
b.clientStats.NumCallsFinished++
|
|
||||||
b.clientStats.NumCallsFinishedWithDropForLoadBalancing++
|
|
||||||
} else if a.dropForRateLimiting {
|
|
||||||
b.clientStats.NumCallsFinished++
|
|
||||||
b.clientStats.NumCallsFinishedWithDropForRateLimiting++
|
|
||||||
}
|
|
||||||
b.mu.Unlock()
|
|
||||||
err = Errorf(codes.Unavailable, "drop requests for the addreess %s", a.addr.Addr)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if next == b.next {
|
|
||||||
// Has iterated all the possible address but none is connected.
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// The newly added addr got removed by Down() again.
|
|
||||||
if b.waitCh == nil {
|
|
||||||
ch = make(chan struct{})
|
|
||||||
b.waitCh = ch
|
|
||||||
} else {
|
|
||||||
ch = b.waitCh
|
|
||||||
}
|
|
||||||
b.mu.Unlock()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *grpclbBalancer) Notify() <-chan []Address {
|
|
||||||
return b.addrCh
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *grpclbBalancer) Close() error {
|
|
||||||
b.mu.Lock()
|
|
||||||
defer b.mu.Unlock()
|
|
||||||
if b.done {
|
|
||||||
return errBalancerClosed
|
|
||||||
}
|
|
||||||
b.done = true
|
|
||||||
if b.waitCh != nil {
|
|
||||||
close(b.waitCh)
|
|
||||||
}
|
|
||||||
if b.addrCh != nil {
|
|
||||||
close(b.addrCh)
|
|
||||||
}
|
|
||||||
if b.w != nil {
|
|
||||||
b.w.Close()
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
6
vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages/BUILD
generated
vendored
6
vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages/BUILD
generated
vendored
@@ -6,7 +6,11 @@ go_library(
|
|||||||
importmap = "k8s.io/kubernetes/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages",
|
importmap = "k8s.io/kubernetes/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages",
|
||||||
importpath = "google.golang.org/grpc/grpclb/grpc_lb_v1/messages",
|
importpath = "google.golang.org/grpc/grpclb/grpc_lb_v1/messages",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"],
|
deps = [
|
||||||
|
"//vendor/github.com/golang/protobuf/proto:go_default_library",
|
||||||
|
"//vendor/github.com/golang/protobuf/ptypes/duration:go_default_library",
|
||||||
|
"//vendor/github.com/golang/protobuf/ptypes/timestamp:go_default_library",
|
||||||
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
filegroup(
|
filegroup(
|
||||||
|
507
vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages/messages.pb.go
generated
vendored
507
vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages/messages.pb.go
generated
vendored
@@ -1,28 +1,13 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// source: grpc_lb_v1/messages/messages.proto
|
// source: grpc_lb_v1/messages/messages.proto
|
||||||
|
|
||||||
/*
|
|
||||||
Package messages is a generated protocol buffer package.
|
|
||||||
|
|
||||||
It is generated from these files:
|
|
||||||
grpc_lb_v1/messages/messages.proto
|
|
||||||
|
|
||||||
It has these top-level messages:
|
|
||||||
Duration
|
|
||||||
Timestamp
|
|
||||||
LoadBalanceRequest
|
|
||||||
InitialLoadBalanceRequest
|
|
||||||
ClientStats
|
|
||||||
LoadBalanceResponse
|
|
||||||
InitialLoadBalanceResponse
|
|
||||||
ServerList
|
|
||||||
Server
|
|
||||||
*/
|
|
||||||
package messages
|
package messages
|
||||||
|
|
||||||
import proto "github.com/golang/protobuf/proto"
|
import proto "github.com/golang/protobuf/proto"
|
||||||
import fmt "fmt"
|
import fmt "fmt"
|
||||||
import math "math"
|
import math "math"
|
||||||
|
import duration "github.com/golang/protobuf/ptypes/duration"
|
||||||
|
import timestamp "github.com/golang/protobuf/ptypes/timestamp"
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
var _ = proto.Marshal
|
var _ = proto.Marshal
|
||||||
@@ -35,90 +20,49 @@ var _ = math.Inf
|
|||||||
// proto package needs to be updated.
|
// proto package needs to be updated.
|
||||||
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||||
|
|
||||||
type Duration struct {
|
|
||||||
// Signed seconds of the span of time. Must be from -315,576,000,000
|
|
||||||
// to +315,576,000,000 inclusive.
|
|
||||||
Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"`
|
|
||||||
// Signed fractions of a second at nanosecond resolution of the span
|
|
||||||
// of time. Durations less than one second are represented with a 0
|
|
||||||
// `seconds` field and a positive or negative `nanos` field. For durations
|
|
||||||
// of one second or more, a non-zero value for the `nanos` field must be
|
|
||||||
// of the same sign as the `seconds` field. Must be from -999,999,999
|
|
||||||
// to +999,999,999 inclusive.
|
|
||||||
Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Duration) Reset() { *m = Duration{} }
|
|
||||||
func (m *Duration) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*Duration) ProtoMessage() {}
|
|
||||||
func (*Duration) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
|
||||||
|
|
||||||
func (m *Duration) GetSeconds() int64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Seconds
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Duration) GetNanos() int32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Nanos
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
type Timestamp struct {
|
|
||||||
// Represents seconds of UTC time since Unix epoch
|
|
||||||
// 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
|
|
||||||
// 9999-12-31T23:59:59Z inclusive.
|
|
||||||
Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"`
|
|
||||||
// Non-negative fractions of a second at nanosecond resolution. Negative
|
|
||||||
// second values with fractions must still have non-negative nanos values
|
|
||||||
// that count forward in time. Must be from 0 to 999,999,999
|
|
||||||
// inclusive.
|
|
||||||
Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Timestamp) Reset() { *m = Timestamp{} }
|
|
||||||
func (m *Timestamp) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*Timestamp) ProtoMessage() {}
|
|
||||||
func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
|
|
||||||
|
|
||||||
func (m *Timestamp) GetSeconds() int64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Seconds
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Timestamp) GetNanos() int32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Nanos
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
type LoadBalanceRequest struct {
|
type LoadBalanceRequest struct {
|
||||||
// Types that are valid to be assigned to LoadBalanceRequestType:
|
// Types that are valid to be assigned to LoadBalanceRequestType:
|
||||||
// *LoadBalanceRequest_InitialRequest
|
// *LoadBalanceRequest_InitialRequest
|
||||||
// *LoadBalanceRequest_ClientStats
|
// *LoadBalanceRequest_ClientStats
|
||||||
LoadBalanceRequestType isLoadBalanceRequest_LoadBalanceRequestType `protobuf_oneof:"load_balance_request_type"`
|
LoadBalanceRequestType isLoadBalanceRequest_LoadBalanceRequestType `protobuf_oneof:"load_balance_request_type"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *LoadBalanceRequest) Reset() { *m = LoadBalanceRequest{} }
|
func (m *LoadBalanceRequest) Reset() { *m = LoadBalanceRequest{} }
|
||||||
func (m *LoadBalanceRequest) String() string { return proto.CompactTextString(m) }
|
func (m *LoadBalanceRequest) String() string { return proto.CompactTextString(m) }
|
||||||
func (*LoadBalanceRequest) ProtoMessage() {}
|
func (*LoadBalanceRequest) ProtoMessage() {}
|
||||||
func (*LoadBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
|
func (*LoadBalanceRequest) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_messages_b3d89fcb5aa158f8, []int{0}
|
||||||
|
}
|
||||||
|
func (m *LoadBalanceRequest) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_LoadBalanceRequest.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *LoadBalanceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_LoadBalanceRequest.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (dst *LoadBalanceRequest) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_LoadBalanceRequest.Merge(dst, src)
|
||||||
|
}
|
||||||
|
func (m *LoadBalanceRequest) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_LoadBalanceRequest.Size(m)
|
||||||
|
}
|
||||||
|
func (m *LoadBalanceRequest) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_LoadBalanceRequest.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_LoadBalanceRequest proto.InternalMessageInfo
|
||||||
|
|
||||||
type isLoadBalanceRequest_LoadBalanceRequestType interface {
|
type isLoadBalanceRequest_LoadBalanceRequestType interface {
|
||||||
isLoadBalanceRequest_LoadBalanceRequestType()
|
isLoadBalanceRequest_LoadBalanceRequestType()
|
||||||
}
|
}
|
||||||
|
|
||||||
type LoadBalanceRequest_InitialRequest struct {
|
type LoadBalanceRequest_InitialRequest struct {
|
||||||
InitialRequest *InitialLoadBalanceRequest `protobuf:"bytes,1,opt,name=initial_request,json=initialRequest,oneof"`
|
InitialRequest *InitialLoadBalanceRequest `protobuf:"bytes,1,opt,name=initial_request,json=initialRequest,proto3,oneof"`
|
||||||
}
|
}
|
||||||
type LoadBalanceRequest_ClientStats struct {
|
type LoadBalanceRequest_ClientStats struct {
|
||||||
ClientStats *ClientStats `protobuf:"bytes,2,opt,name=client_stats,json=clientStats,oneof"`
|
ClientStats *ClientStats `protobuf:"bytes,2,opt,name=client_stats,json=clientStats,proto3,oneof"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*LoadBalanceRequest_InitialRequest) isLoadBalanceRequest_LoadBalanceRequestType() {}
|
func (*LoadBalanceRequest_InitialRequest) isLoadBalanceRequest_LoadBalanceRequestType() {}
|
||||||
@@ -204,12 +148,12 @@ func _LoadBalanceRequest_OneofSizer(msg proto.Message) (n int) {
|
|||||||
switch x := m.LoadBalanceRequestType.(type) {
|
switch x := m.LoadBalanceRequestType.(type) {
|
||||||
case *LoadBalanceRequest_InitialRequest:
|
case *LoadBalanceRequest_InitialRequest:
|
||||||
s := proto.Size(x.InitialRequest)
|
s := proto.Size(x.InitialRequest)
|
||||||
n += proto.SizeVarint(1<<3 | proto.WireBytes)
|
n += 1 // tag and wire
|
||||||
n += proto.SizeVarint(uint64(s))
|
n += proto.SizeVarint(uint64(s))
|
||||||
n += s
|
n += s
|
||||||
case *LoadBalanceRequest_ClientStats:
|
case *LoadBalanceRequest_ClientStats:
|
||||||
s := proto.Size(x.ClientStats)
|
s := proto.Size(x.ClientStats)
|
||||||
n += proto.SizeVarint(2<<3 | proto.WireBytes)
|
n += 1 // tag and wire
|
||||||
n += proto.SizeVarint(uint64(s))
|
n += proto.SizeVarint(uint64(s))
|
||||||
n += s
|
n += s
|
||||||
case nil:
|
case nil:
|
||||||
@@ -220,15 +164,37 @@ func _LoadBalanceRequest_OneofSizer(msg proto.Message) (n int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type InitialLoadBalanceRequest struct {
|
type InitialLoadBalanceRequest struct {
|
||||||
// Name of load balanced service (IE, balancer.service.com)
|
// Name of load balanced service (IE, balancer.service.com). Its
|
||||||
// length should be less than 256 bytes.
|
// length should be less than 256 bytes.
|
||||||
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
|
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *InitialLoadBalanceRequest) Reset() { *m = InitialLoadBalanceRequest{} }
|
func (m *InitialLoadBalanceRequest) Reset() { *m = InitialLoadBalanceRequest{} }
|
||||||
func (m *InitialLoadBalanceRequest) String() string { return proto.CompactTextString(m) }
|
func (m *InitialLoadBalanceRequest) String() string { return proto.CompactTextString(m) }
|
||||||
func (*InitialLoadBalanceRequest) ProtoMessage() {}
|
func (*InitialLoadBalanceRequest) ProtoMessage() {}
|
||||||
func (*InitialLoadBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
|
func (*InitialLoadBalanceRequest) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_messages_b3d89fcb5aa158f8, []int{1}
|
||||||
|
}
|
||||||
|
func (m *InitialLoadBalanceRequest) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_InitialLoadBalanceRequest.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *InitialLoadBalanceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_InitialLoadBalanceRequest.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (dst *InitialLoadBalanceRequest) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_InitialLoadBalanceRequest.Merge(dst, src)
|
||||||
|
}
|
||||||
|
func (m *InitialLoadBalanceRequest) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_InitialLoadBalanceRequest.Size(m)
|
||||||
|
}
|
||||||
|
func (m *InitialLoadBalanceRequest) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_InitialLoadBalanceRequest.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_InitialLoadBalanceRequest proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *InitialLoadBalanceRequest) GetName() string {
|
func (m *InitialLoadBalanceRequest) GetName() string {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
@@ -237,34 +203,101 @@ func (m *InitialLoadBalanceRequest) GetName() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Contains the number of calls finished for a particular load balance token.
|
||||||
|
type ClientStatsPerToken struct {
|
||||||
|
// See Server.load_balance_token.
|
||||||
|
LoadBalanceToken string `protobuf:"bytes,1,opt,name=load_balance_token,json=loadBalanceToken,proto3" json:"load_balance_token,omitempty"`
|
||||||
|
// The total number of RPCs that finished associated with the token.
|
||||||
|
NumCalls int64 `protobuf:"varint,2,opt,name=num_calls,json=numCalls,proto3" json:"num_calls,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ClientStatsPerToken) Reset() { *m = ClientStatsPerToken{} }
|
||||||
|
func (m *ClientStatsPerToken) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*ClientStatsPerToken) ProtoMessage() {}
|
||||||
|
func (*ClientStatsPerToken) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_messages_b3d89fcb5aa158f8, []int{2}
|
||||||
|
}
|
||||||
|
func (m *ClientStatsPerToken) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_ClientStatsPerToken.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *ClientStatsPerToken) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_ClientStatsPerToken.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (dst *ClientStatsPerToken) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_ClientStatsPerToken.Merge(dst, src)
|
||||||
|
}
|
||||||
|
func (m *ClientStatsPerToken) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_ClientStatsPerToken.Size(m)
|
||||||
|
}
|
||||||
|
func (m *ClientStatsPerToken) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_ClientStatsPerToken.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_ClientStatsPerToken proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *ClientStatsPerToken) GetLoadBalanceToken() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.LoadBalanceToken
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ClientStatsPerToken) GetNumCalls() int64 {
|
||||||
|
if m != nil {
|
||||||
|
return m.NumCalls
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
// Contains client level statistics that are useful to load balancing. Each
|
// Contains client level statistics that are useful to load balancing. Each
|
||||||
// count except the timestamp should be reset to zero after reporting the stats.
|
// count except the timestamp should be reset to zero after reporting the stats.
|
||||||
type ClientStats struct {
|
type ClientStats struct {
|
||||||
// The timestamp of generating the report.
|
// The timestamp of generating the report.
|
||||||
Timestamp *Timestamp `protobuf:"bytes,1,opt,name=timestamp" json:"timestamp,omitempty"`
|
Timestamp *timestamp.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
|
||||||
// The total number of RPCs that started.
|
// The total number of RPCs that started.
|
||||||
NumCallsStarted int64 `protobuf:"varint,2,opt,name=num_calls_started,json=numCallsStarted" json:"num_calls_started,omitempty"`
|
NumCallsStarted int64 `protobuf:"varint,2,opt,name=num_calls_started,json=numCallsStarted,proto3" json:"num_calls_started,omitempty"`
|
||||||
// The total number of RPCs that finished.
|
// The total number of RPCs that finished.
|
||||||
NumCallsFinished int64 `protobuf:"varint,3,opt,name=num_calls_finished,json=numCallsFinished" json:"num_calls_finished,omitempty"`
|
NumCallsFinished int64 `protobuf:"varint,3,opt,name=num_calls_finished,json=numCallsFinished,proto3" json:"num_calls_finished,omitempty"`
|
||||||
// The total number of RPCs that were dropped by the client because of rate
|
|
||||||
// limiting.
|
|
||||||
NumCallsFinishedWithDropForRateLimiting int64 `protobuf:"varint,4,opt,name=num_calls_finished_with_drop_for_rate_limiting,json=numCallsFinishedWithDropForRateLimiting" json:"num_calls_finished_with_drop_for_rate_limiting,omitempty"`
|
|
||||||
// The total number of RPCs that were dropped by the client because of load
|
|
||||||
// balancing.
|
|
||||||
NumCallsFinishedWithDropForLoadBalancing int64 `protobuf:"varint,5,opt,name=num_calls_finished_with_drop_for_load_balancing,json=numCallsFinishedWithDropForLoadBalancing" json:"num_calls_finished_with_drop_for_load_balancing,omitempty"`
|
|
||||||
// The total number of RPCs that failed to reach a server except dropped RPCs.
|
// The total number of RPCs that failed to reach a server except dropped RPCs.
|
||||||
NumCallsFinishedWithClientFailedToSend int64 `protobuf:"varint,6,opt,name=num_calls_finished_with_client_failed_to_send,json=numCallsFinishedWithClientFailedToSend" json:"num_calls_finished_with_client_failed_to_send,omitempty"`
|
NumCallsFinishedWithClientFailedToSend int64 `protobuf:"varint,6,opt,name=num_calls_finished_with_client_failed_to_send,json=numCallsFinishedWithClientFailedToSend,proto3" json:"num_calls_finished_with_client_failed_to_send,omitempty"`
|
||||||
// The total number of RPCs that finished and are known to have been received
|
// The total number of RPCs that finished and are known to have been received
|
||||||
// by a server.
|
// by a server.
|
||||||
NumCallsFinishedKnownReceived int64 `protobuf:"varint,7,opt,name=num_calls_finished_known_received,json=numCallsFinishedKnownReceived" json:"num_calls_finished_known_received,omitempty"`
|
NumCallsFinishedKnownReceived int64 `protobuf:"varint,7,opt,name=num_calls_finished_known_received,json=numCallsFinishedKnownReceived,proto3" json:"num_calls_finished_known_received,omitempty"`
|
||||||
|
// The list of dropped calls.
|
||||||
|
CallsFinishedWithDrop []*ClientStatsPerToken `protobuf:"bytes,8,rep,name=calls_finished_with_drop,json=callsFinishedWithDrop,proto3" json:"calls_finished_with_drop,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ClientStats) Reset() { *m = ClientStats{} }
|
func (m *ClientStats) Reset() { *m = ClientStats{} }
|
||||||
func (m *ClientStats) String() string { return proto.CompactTextString(m) }
|
func (m *ClientStats) String() string { return proto.CompactTextString(m) }
|
||||||
func (*ClientStats) ProtoMessage() {}
|
func (*ClientStats) ProtoMessage() {}
|
||||||
func (*ClientStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
|
func (*ClientStats) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_messages_b3d89fcb5aa158f8, []int{3}
|
||||||
|
}
|
||||||
|
func (m *ClientStats) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_ClientStats.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *ClientStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_ClientStats.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (dst *ClientStats) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_ClientStats.Merge(dst, src)
|
||||||
|
}
|
||||||
|
func (m *ClientStats) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_ClientStats.Size(m)
|
||||||
|
}
|
||||||
|
func (m *ClientStats) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_ClientStats.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
func (m *ClientStats) GetTimestamp() *Timestamp {
|
var xxx_messageInfo_ClientStats proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *ClientStats) GetTimestamp() *timestamp.Timestamp {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.Timestamp
|
return m.Timestamp
|
||||||
}
|
}
|
||||||
@@ -285,20 +318,6 @@ func (m *ClientStats) GetNumCallsFinished() int64 {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ClientStats) GetNumCallsFinishedWithDropForRateLimiting() int64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.NumCallsFinishedWithDropForRateLimiting
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *ClientStats) GetNumCallsFinishedWithDropForLoadBalancing() int64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.NumCallsFinishedWithDropForLoadBalancing
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *ClientStats) GetNumCallsFinishedWithClientFailedToSend() int64 {
|
func (m *ClientStats) GetNumCallsFinishedWithClientFailedToSend() int64 {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.NumCallsFinishedWithClientFailedToSend
|
return m.NumCallsFinishedWithClientFailedToSend
|
||||||
@@ -313,27 +332,56 @@ func (m *ClientStats) GetNumCallsFinishedKnownReceived() int64 {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *ClientStats) GetCallsFinishedWithDrop() []*ClientStatsPerToken {
|
||||||
|
if m != nil {
|
||||||
|
return m.CallsFinishedWithDrop
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type LoadBalanceResponse struct {
|
type LoadBalanceResponse struct {
|
||||||
// Types that are valid to be assigned to LoadBalanceResponseType:
|
// Types that are valid to be assigned to LoadBalanceResponseType:
|
||||||
// *LoadBalanceResponse_InitialResponse
|
// *LoadBalanceResponse_InitialResponse
|
||||||
// *LoadBalanceResponse_ServerList
|
// *LoadBalanceResponse_ServerList
|
||||||
LoadBalanceResponseType isLoadBalanceResponse_LoadBalanceResponseType `protobuf_oneof:"load_balance_response_type"`
|
LoadBalanceResponseType isLoadBalanceResponse_LoadBalanceResponseType `protobuf_oneof:"load_balance_response_type"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *LoadBalanceResponse) Reset() { *m = LoadBalanceResponse{} }
|
func (m *LoadBalanceResponse) Reset() { *m = LoadBalanceResponse{} }
|
||||||
func (m *LoadBalanceResponse) String() string { return proto.CompactTextString(m) }
|
func (m *LoadBalanceResponse) String() string { return proto.CompactTextString(m) }
|
||||||
func (*LoadBalanceResponse) ProtoMessage() {}
|
func (*LoadBalanceResponse) ProtoMessage() {}
|
||||||
func (*LoadBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
|
func (*LoadBalanceResponse) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_messages_b3d89fcb5aa158f8, []int{4}
|
||||||
|
}
|
||||||
|
func (m *LoadBalanceResponse) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_LoadBalanceResponse.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *LoadBalanceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_LoadBalanceResponse.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (dst *LoadBalanceResponse) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_LoadBalanceResponse.Merge(dst, src)
|
||||||
|
}
|
||||||
|
func (m *LoadBalanceResponse) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_LoadBalanceResponse.Size(m)
|
||||||
|
}
|
||||||
|
func (m *LoadBalanceResponse) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_LoadBalanceResponse.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_LoadBalanceResponse proto.InternalMessageInfo
|
||||||
|
|
||||||
type isLoadBalanceResponse_LoadBalanceResponseType interface {
|
type isLoadBalanceResponse_LoadBalanceResponseType interface {
|
||||||
isLoadBalanceResponse_LoadBalanceResponseType()
|
isLoadBalanceResponse_LoadBalanceResponseType()
|
||||||
}
|
}
|
||||||
|
|
||||||
type LoadBalanceResponse_InitialResponse struct {
|
type LoadBalanceResponse_InitialResponse struct {
|
||||||
InitialResponse *InitialLoadBalanceResponse `protobuf:"bytes,1,opt,name=initial_response,json=initialResponse,oneof"`
|
InitialResponse *InitialLoadBalanceResponse `protobuf:"bytes,1,opt,name=initial_response,json=initialResponse,proto3,oneof"`
|
||||||
}
|
}
|
||||||
type LoadBalanceResponse_ServerList struct {
|
type LoadBalanceResponse_ServerList struct {
|
||||||
ServerList *ServerList `protobuf:"bytes,2,opt,name=server_list,json=serverList,oneof"`
|
ServerList *ServerList `protobuf:"bytes,2,opt,name=server_list,json=serverList,proto3,oneof"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*LoadBalanceResponse_InitialResponse) isLoadBalanceResponse_LoadBalanceResponseType() {}
|
func (*LoadBalanceResponse_InitialResponse) isLoadBalanceResponse_LoadBalanceResponseType() {}
|
||||||
@@ -419,12 +467,12 @@ func _LoadBalanceResponse_OneofSizer(msg proto.Message) (n int) {
|
|||||||
switch x := m.LoadBalanceResponseType.(type) {
|
switch x := m.LoadBalanceResponseType.(type) {
|
||||||
case *LoadBalanceResponse_InitialResponse:
|
case *LoadBalanceResponse_InitialResponse:
|
||||||
s := proto.Size(x.InitialResponse)
|
s := proto.Size(x.InitialResponse)
|
||||||
n += proto.SizeVarint(1<<3 | proto.WireBytes)
|
n += 1 // tag and wire
|
||||||
n += proto.SizeVarint(uint64(s))
|
n += proto.SizeVarint(uint64(s))
|
||||||
n += s
|
n += s
|
||||||
case *LoadBalanceResponse_ServerList:
|
case *LoadBalanceResponse_ServerList:
|
||||||
s := proto.Size(x.ServerList)
|
s := proto.Size(x.ServerList)
|
||||||
n += proto.SizeVarint(2<<3 | proto.WireBytes)
|
n += 1 // tag and wire
|
||||||
n += proto.SizeVarint(uint64(s))
|
n += proto.SizeVarint(uint64(s))
|
||||||
n += s
|
n += s
|
||||||
case nil:
|
case nil:
|
||||||
@@ -440,17 +488,39 @@ type InitialLoadBalanceResponse struct {
|
|||||||
// the response, the client should open a separate connection to the
|
// the response, the client should open a separate connection to the
|
||||||
// load_balancer_delegate and call the BalanceLoad method. Its length should
|
// load_balancer_delegate and call the BalanceLoad method. Its length should
|
||||||
// be less than 64 bytes.
|
// be less than 64 bytes.
|
||||||
LoadBalancerDelegate string `protobuf:"bytes,1,opt,name=load_balancer_delegate,json=loadBalancerDelegate" json:"load_balancer_delegate,omitempty"`
|
LoadBalancerDelegate string `protobuf:"bytes,1,opt,name=load_balancer_delegate,json=loadBalancerDelegate,proto3" json:"load_balancer_delegate,omitempty"`
|
||||||
// This interval defines how often the client should send the client stats
|
// This interval defines how often the client should send the client stats
|
||||||
// to the load balancer. Stats should only be reported when the duration is
|
// to the load balancer. Stats should only be reported when the duration is
|
||||||
// positive.
|
// positive.
|
||||||
ClientStatsReportInterval *Duration `protobuf:"bytes,2,opt,name=client_stats_report_interval,json=clientStatsReportInterval" json:"client_stats_report_interval,omitempty"`
|
ClientStatsReportInterval *duration.Duration `protobuf:"bytes,2,opt,name=client_stats_report_interval,json=clientStatsReportInterval,proto3" json:"client_stats_report_interval,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *InitialLoadBalanceResponse) Reset() { *m = InitialLoadBalanceResponse{} }
|
func (m *InitialLoadBalanceResponse) Reset() { *m = InitialLoadBalanceResponse{} }
|
||||||
func (m *InitialLoadBalanceResponse) String() string { return proto.CompactTextString(m) }
|
func (m *InitialLoadBalanceResponse) String() string { return proto.CompactTextString(m) }
|
||||||
func (*InitialLoadBalanceResponse) ProtoMessage() {}
|
func (*InitialLoadBalanceResponse) ProtoMessage() {}
|
||||||
func (*InitialLoadBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
|
func (*InitialLoadBalanceResponse) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_messages_b3d89fcb5aa158f8, []int{5}
|
||||||
|
}
|
||||||
|
func (m *InitialLoadBalanceResponse) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_InitialLoadBalanceResponse.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *InitialLoadBalanceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_InitialLoadBalanceResponse.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (dst *InitialLoadBalanceResponse) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_InitialLoadBalanceResponse.Merge(dst, src)
|
||||||
|
}
|
||||||
|
func (m *InitialLoadBalanceResponse) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_InitialLoadBalanceResponse.Size(m)
|
||||||
|
}
|
||||||
|
func (m *InitialLoadBalanceResponse) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_InitialLoadBalanceResponse.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_InitialLoadBalanceResponse proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *InitialLoadBalanceResponse) GetLoadBalancerDelegate() string {
|
func (m *InitialLoadBalanceResponse) GetLoadBalancerDelegate() string {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
@@ -459,7 +529,7 @@ func (m *InitialLoadBalanceResponse) GetLoadBalancerDelegate() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *InitialLoadBalanceResponse) GetClientStatsReportInterval() *Duration {
|
func (m *InitialLoadBalanceResponse) GetClientStatsReportInterval() *duration.Duration {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.ClientStatsReportInterval
|
return m.ClientStatsReportInterval
|
||||||
}
|
}
|
||||||
@@ -471,13 +541,35 @@ type ServerList struct {
|
|||||||
// be updated when server resolutions change or as needed to balance load
|
// be updated when server resolutions change or as needed to balance load
|
||||||
// across more servers. The client should consume the server list in order
|
// across more servers. The client should consume the server list in order
|
||||||
// unless instructed otherwise via the client_config.
|
// unless instructed otherwise via the client_config.
|
||||||
Servers []*Server `protobuf:"bytes,1,rep,name=servers" json:"servers,omitempty"`
|
Servers []*Server `protobuf:"bytes,1,rep,name=servers,proto3" json:"servers,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ServerList) Reset() { *m = ServerList{} }
|
func (m *ServerList) Reset() { *m = ServerList{} }
|
||||||
func (m *ServerList) String() string { return proto.CompactTextString(m) }
|
func (m *ServerList) String() string { return proto.CompactTextString(m) }
|
||||||
func (*ServerList) ProtoMessage() {}
|
func (*ServerList) ProtoMessage() {}
|
||||||
func (*ServerList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
|
func (*ServerList) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_messages_b3d89fcb5aa158f8, []int{6}
|
||||||
|
}
|
||||||
|
func (m *ServerList) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_ServerList.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *ServerList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_ServerList.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (dst *ServerList) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_ServerList.Merge(dst, src)
|
||||||
|
}
|
||||||
|
func (m *ServerList) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_ServerList.Size(m)
|
||||||
|
}
|
||||||
|
func (m *ServerList) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_ServerList.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_ServerList proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *ServerList) GetServers() []*Server {
|
func (m *ServerList) GetServers() []*Server {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
@@ -486,35 +578,52 @@ func (m *ServerList) GetServers() []*Server {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Contains server information. When none of the [drop_for_*] fields are true,
|
// Contains server information. When the drop field is not true, use the other
|
||||||
// use the other fields. When drop_for_rate_limiting is true, ignore all other
|
// fields.
|
||||||
// fields. Use drop_for_load_balancing only when it is true and
|
|
||||||
// drop_for_rate_limiting is false.
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
// A resolved address for the server, serialized in network-byte-order. It may
|
// A resolved address for the server, serialized in network-byte-order. It may
|
||||||
// either be an IPv4 or IPv6 address.
|
// either be an IPv4 or IPv6 address.
|
||||||
IpAddress []byte `protobuf:"bytes,1,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"`
|
IpAddress []byte `protobuf:"bytes,1,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"`
|
||||||
// A resolved port number for the server.
|
// A resolved port number for the server.
|
||||||
Port int32 `protobuf:"varint,2,opt,name=port" json:"port,omitempty"`
|
Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
|
||||||
// An opaque but printable token given to the frontend for each pick. All
|
// An opaque but printable token given to the frontend for each pick. All
|
||||||
// frontend requests for that pick must include the token in its initial
|
// frontend requests for that pick must include the token in its initial
|
||||||
// metadata. The token is used by the backend to verify the request and to
|
// metadata. The token is used by the backend to verify the request and to
|
||||||
// allow the backend to report load to the gRPC LB system.
|
// allow the backend to report load to the gRPC LB system. The token is also
|
||||||
//
|
// used in client stats for reporting dropped calls.
|
||||||
// Its length is variable but less than 50 bytes.
|
LoadBalanceToken string `protobuf:"bytes,3,opt,name=load_balance_token,json=loadBalanceToken,proto3" json:"load_balance_token,omitempty"`
|
||||||
LoadBalanceToken string `protobuf:"bytes,3,opt,name=load_balance_token,json=loadBalanceToken" json:"load_balance_token,omitempty"`
|
// Indicates whether this particular request should be dropped by the client.
|
||||||
// Indicates whether this particular request should be dropped by the client
|
// If the request is dropped, there will be a corresponding entry in
|
||||||
// for rate limiting.
|
// ClientStats.calls_finished_with_drop.
|
||||||
DropForRateLimiting bool `protobuf:"varint,4,opt,name=drop_for_rate_limiting,json=dropForRateLimiting" json:"drop_for_rate_limiting,omitempty"`
|
Drop bool `protobuf:"varint,4,opt,name=drop,proto3" json:"drop,omitempty"`
|
||||||
// Indicates whether this particular request should be dropped by the client
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
// for load balancing.
|
XXX_unrecognized []byte `json:"-"`
|
||||||
DropForLoadBalancing bool `protobuf:"varint,5,opt,name=drop_for_load_balancing,json=dropForLoadBalancing" json:"drop_for_load_balancing,omitempty"`
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Server) Reset() { *m = Server{} }
|
func (m *Server) Reset() { *m = Server{} }
|
||||||
func (m *Server) String() string { return proto.CompactTextString(m) }
|
func (m *Server) String() string { return proto.CompactTextString(m) }
|
||||||
func (*Server) ProtoMessage() {}
|
func (*Server) ProtoMessage() {}
|
||||||
func (*Server) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
|
func (*Server) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_messages_b3d89fcb5aa158f8, []int{7}
|
||||||
|
}
|
||||||
|
func (m *Server) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_Server.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *Server) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_Server.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (dst *Server) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_Server.Merge(dst, src)
|
||||||
|
}
|
||||||
|
func (m *Server) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_Server.Size(m)
|
||||||
|
}
|
||||||
|
func (m *Server) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_Server.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_Server proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *Server) GetIpAddress() []byte {
|
func (m *Server) GetIpAddress() []byte {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
@@ -537,25 +646,17 @@ func (m *Server) GetLoadBalanceToken() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Server) GetDropForRateLimiting() bool {
|
func (m *Server) GetDrop() bool {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.DropForRateLimiting
|
return m.Drop
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Server) GetDropForLoadBalancing() bool {
|
|
||||||
if m != nil {
|
|
||||||
return m.DropForLoadBalancing
|
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
proto.RegisterType((*Duration)(nil), "grpc.lb.v1.Duration")
|
|
||||||
proto.RegisterType((*Timestamp)(nil), "grpc.lb.v1.Timestamp")
|
|
||||||
proto.RegisterType((*LoadBalanceRequest)(nil), "grpc.lb.v1.LoadBalanceRequest")
|
proto.RegisterType((*LoadBalanceRequest)(nil), "grpc.lb.v1.LoadBalanceRequest")
|
||||||
proto.RegisterType((*InitialLoadBalanceRequest)(nil), "grpc.lb.v1.InitialLoadBalanceRequest")
|
proto.RegisterType((*InitialLoadBalanceRequest)(nil), "grpc.lb.v1.InitialLoadBalanceRequest")
|
||||||
|
proto.RegisterType((*ClientStatsPerToken)(nil), "grpc.lb.v1.ClientStatsPerToken")
|
||||||
proto.RegisterType((*ClientStats)(nil), "grpc.lb.v1.ClientStats")
|
proto.RegisterType((*ClientStats)(nil), "grpc.lb.v1.ClientStats")
|
||||||
proto.RegisterType((*LoadBalanceResponse)(nil), "grpc.lb.v1.LoadBalanceResponse")
|
proto.RegisterType((*LoadBalanceResponse)(nil), "grpc.lb.v1.LoadBalanceResponse")
|
||||||
proto.RegisterType((*InitialLoadBalanceResponse)(nil), "grpc.lb.v1.InitialLoadBalanceResponse")
|
proto.RegisterType((*InitialLoadBalanceResponse)(nil), "grpc.lb.v1.InitialLoadBalanceResponse")
|
||||||
@@ -563,53 +664,55 @@ func init() {
|
|||||||
proto.RegisterType((*Server)(nil), "grpc.lb.v1.Server")
|
proto.RegisterType((*Server)(nil), "grpc.lb.v1.Server")
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { proto.RegisterFile("grpc_lb_v1/messages/messages.proto", fileDescriptor0) }
|
func init() {
|
||||||
|
proto.RegisterFile("grpc_lb_v1/messages/messages.proto", fileDescriptor_messages_b3d89fcb5aa158f8)
|
||||||
var fileDescriptor0 = []byte{
|
}
|
||||||
// 709 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xdd, 0x4e, 0x1b, 0x3b,
|
var fileDescriptor_messages_b3d89fcb5aa158f8 = []byte{
|
||||||
0x10, 0x26, 0x27, 0x01, 0x92, 0x09, 0x3a, 0xe4, 0x98, 0x1c, 0x08, 0x14, 0x24, 0xba, 0x52, 0x69,
|
// 708 bytes of a gzipped FileDescriptorProto
|
||||||
0x54, 0xd1, 0x20, 0xa0, 0xbd, 0xe8, 0xcf, 0x45, 0x1b, 0x10, 0x0a, 0x2d, 0x17, 0x95, 0x43, 0x55,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x54, 0x61, 0x4f, 0xf3, 0x36,
|
||||||
0xa9, 0x52, 0x65, 0x39, 0xd9, 0x21, 0x58, 0x6c, 0xec, 0xad, 0xed, 0x04, 0xf5, 0x11, 0xfa, 0x28,
|
0x10, 0x26, 0x6b, 0xe8, 0xdb, 0x5e, 0x5f, 0x8d, 0xce, 0x6c, 0x2c, 0x2d, 0x30, 0x58, 0xa4, 0x21,
|
||||||
0x7d, 0x8c, 0xaa, 0xcf, 0xd0, 0xf7, 0xa9, 0xd6, 0xbb, 0x9b, 0x5d, 0x20, 0x80, 0x7a, 0x67, 0x8f,
|
0x34, 0xb1, 0x54, 0xc0, 0x3e, 0x6c, 0xd2, 0x3e, 0x6c, 0x05, 0xa1, 0xc2, 0xf8, 0x80, 0x52, 0xa4,
|
||||||
0xbf, 0xf9, 0xbe, 0xf1, 0xac, 0xbf, 0x59, 0xf0, 0x06, 0x3a, 0xec, 0xb3, 0xa0, 0xc7, 0xc6, 0xbb,
|
0x4d, 0x48, 0x93, 0xe7, 0x36, 0x26, 0x58, 0xb8, 0x76, 0x66, 0xbb, 0x45, 0xfb, 0xbc, 0xff, 0x33,
|
||||||
0x3b, 0x43, 0x34, 0x86, 0x0f, 0xd0, 0x4c, 0x16, 0xad, 0x50, 0x2b, 0xab, 0x08, 0x44, 0x98, 0x56,
|
0xed, 0x2f, 0x4c, 0xfb, 0x63, 0x53, 0xec, 0xa4, 0x0d, 0x2d, 0xd5, 0xfb, 0x25, 0x72, 0xee, 0x9e,
|
||||||
0xd0, 0x6b, 0x8d, 0x77, 0xbd, 0x97, 0x50, 0x3e, 0x1c, 0x69, 0x6e, 0x85, 0x92, 0xa4, 0x01, 0xf3,
|
0x7b, 0xee, 0xce, 0x77, 0x8f, 0x21, 0x4c, 0x55, 0x36, 0xc6, 0x7c, 0x84, 0x67, 0xa7, 0xbd, 0x09,
|
||||||
0x06, 0xfb, 0x4a, 0xfa, 0xa6, 0x51, 0xd8, 0x2c, 0x34, 0x8b, 0x34, 0xdd, 0x92, 0x3a, 0xcc, 0x4a,
|
0xd5, 0x9a, 0xa4, 0x54, 0xcf, 0x0f, 0x51, 0xa6, 0xa4, 0x91, 0x08, 0x72, 0x4c, 0xc4, 0x47, 0xd1,
|
||||||
0x2e, 0x95, 0x69, 0xfc, 0xb3, 0x59, 0x68, 0xce, 0xd2, 0x78, 0xe3, 0xbd, 0x82, 0xca, 0xa9, 0x18,
|
0xec, 0xb4, 0xfb, 0x45, 0x2a, 0x65, 0xca, 0x69, 0xcf, 0x7a, 0x46, 0xd3, 0xc7, 0x5e, 0x32, 0x55,
|
||||||
0xa2, 0xb1, 0x7c, 0x18, 0xfe, 0x75, 0xf2, 0xcf, 0x02, 0x90, 0x13, 0xc5, 0xfd, 0x36, 0x0f, 0xb8,
|
0xc4, 0x30, 0x29, 0x1c, 0xb6, 0x7b, 0xb0, 0xec, 0x37, 0x6c, 0x42, 0xb5, 0x21, 0x93, 0xcc, 0x01,
|
||||||
0xec, 0x23, 0xc5, 0xaf, 0x23, 0x34, 0x96, 0x7c, 0x80, 0x45, 0x21, 0x85, 0x15, 0x3c, 0x60, 0x3a,
|
0xc2, 0x7f, 0x3d, 0x40, 0xb7, 0x92, 0x24, 0x7d, 0xc2, 0x89, 0x18, 0xd3, 0x98, 0xfe, 0x31, 0xa5,
|
||||||
0x0e, 0x39, 0xba, 0xea, 0xde, 0xa3, 0x56, 0x56, 0x75, 0xeb, 0x38, 0x86, 0xdc, 0xcc, 0xef, 0xcc,
|
0xda, 0xa0, 0x3b, 0xd8, 0x62, 0x82, 0x19, 0x46, 0x38, 0x56, 0xce, 0x14, 0x78, 0x87, 0xde, 0x71,
|
||||||
0xd0, 0x7f, 0x93, 0xfc, 0x94, 0xf1, 0x35, 0x2c, 0xf4, 0x03, 0x81, 0xd2, 0x32, 0x63, 0xb9, 0x8d,
|
0xeb, 0xec, 0xab, 0x68, 0x91, 0x3d, 0xba, 0x76, 0x90, 0xd5, 0xf8, 0xc1, 0x46, 0xfc, 0x71, 0x11,
|
||||||
0xab, 0xa8, 0xee, 0xad, 0xe4, 0xe9, 0x0e, 0xdc, 0x79, 0x37, 0x3a, 0xee, 0xcc, 0xd0, 0x6a, 0x3f,
|
0x5f, 0x32, 0xfe, 0x00, 0xef, 0xc7, 0x9c, 0x51, 0x61, 0xb0, 0x36, 0xc4, 0xe8, 0xe0, 0x23, 0x4b,
|
||||||
0xdb, 0xb6, 0x1f, 0xc0, 0x6a, 0xa0, 0xb8, 0xcf, 0x7a, 0xb1, 0x4c, 0x5a, 0x14, 0xb3, 0xdf, 0x42,
|
0xf7, 0x79, 0x95, 0xee, 0xc2, 0xfa, 0x87, 0xb9, 0x7b, 0xb0, 0x11, 0xb7, 0xc6, 0x8b, 0xdf, 0xfe,
|
||||||
0xf4, 0x76, 0x60, 0xf5, 0xd6, 0x4a, 0x08, 0x81, 0x92, 0xe4, 0x43, 0x74, 0xe5, 0x57, 0xa8, 0x5b,
|
0x2e, 0x74, 0xb8, 0x24, 0x09, 0x1e, 0xb9, 0x34, 0x65, 0x51, 0xd8, 0xfc, 0x99, 0xd1, 0xb0, 0x07,
|
||||||
0x7b, 0xdf, 0x4b, 0x50, 0xcd, 0x89, 0x91, 0x7d, 0xa8, 0xd8, 0xb4, 0x83, 0xc9, 0x3d, 0xff, 0xcf,
|
0x9d, 0xb5, 0x95, 0x20, 0x04, 0xbe, 0x20, 0x13, 0x6a, 0xcb, 0x6f, 0xc6, 0xf6, 0x1c, 0xfe, 0x0e,
|
||||||
0x17, 0x36, 0x69, 0x2f, 0xcd, 0x70, 0xe4, 0x09, 0xfc, 0x27, 0x47, 0x43, 0xd6, 0xe7, 0x41, 0x60,
|
0xdb, 0x95, 0x5c, 0x77, 0x54, 0xdd, 0xcb, 0x67, 0x2a, 0xd0, 0x09, 0xa0, 0x57, 0x49, 0x4c, 0x6e,
|
||||||
0xa2, 0x3b, 0x69, 0x8b, 0xbe, 0xbb, 0x55, 0x91, 0x2e, 0xca, 0xd1, 0xf0, 0x20, 0x8a, 0x77, 0xe3,
|
0x2d, 0x02, 0xdb, 0x7c, 0x41, 0xed, 0xd0, 0xbb, 0xd0, 0x14, 0xd3, 0x09, 0x1e, 0x13, 0xce, 0x5d,
|
||||||
0x30, 0xd9, 0x06, 0x92, 0x61, 0xcf, 0x84, 0x14, 0xe6, 0x1c, 0xfd, 0x46, 0xd1, 0x81, 0x6b, 0x29,
|
0x37, 0xb5, 0xb8, 0x21, 0xa6, 0x93, 0x8b, 0xfc, 0x3f, 0xfc, 0xa7, 0x06, 0xad, 0x4a, 0x0a, 0xf4,
|
||||||
0xf8, 0x28, 0x89, 0x13, 0x06, 0xad, 0x9b, 0x68, 0x76, 0x29, 0xec, 0x39, 0xf3, 0xb5, 0x0a, 0xd9,
|
0x1d, 0x34, 0xe7, 0x37, 0x5f, 0xdc, 0x64, 0x37, 0x72, 0xb3, 0x89, 0xca, 0xd9, 0x44, 0xf7, 0x25,
|
||||||
0x99, 0xd2, 0x4c, 0x73, 0x8b, 0x2c, 0x10, 0x43, 0x61, 0x85, 0x1c, 0x34, 0x4a, 0x8e, 0xe9, 0xf1,
|
0x22, 0x5e, 0x80, 0xd1, 0xd7, 0xf0, 0xc9, 0x3c, 0x4d, 0x7e, 0x75, 0xca, 0xd0, 0xa4, 0x48, 0xb7,
|
||||||
0x75, 0xa6, 0x4f, 0xc2, 0x9e, 0x1f, 0x6a, 0x15, 0x1e, 0x29, 0x4d, 0xb9, 0xc5, 0x93, 0x04, 0x4e,
|
0x55, 0xa6, 0x1b, 0x3a, 0x73, 0xde, 0xc0, 0x02, 0xfb, 0xc8, 0x04, 0xd3, 0x4f, 0x34, 0x09, 0x6a,
|
||||||
0x38, 0xec, 0xdc, 0x2b, 0x90, 0x6b, 0x77, 0xa4, 0x30, 0xeb, 0x14, 0x9a, 0x77, 0x28, 0x64, 0xbd,
|
0x16, 0xdc, 0x2e, 0xc1, 0x57, 0x85, 0x1d, 0xfd, 0x06, 0xdf, 0xac, 0xa2, 0xf1, 0x0b, 0x33, 0x4f,
|
||||||
0x8f, 0x24, 0xbe, 0xc0, 0xd3, 0xdb, 0x24, 0x92, 0x67, 0x70, 0xc6, 0x45, 0x80, 0x3e, 0xb3, 0x8a,
|
0xb8, 0x98, 0xd4, 0x23, 0x61, 0x9c, 0x26, 0xd8, 0x48, 0xac, 0xa9, 0x48, 0x82, 0xba, 0x25, 0x3a,
|
||||||
0x19, 0x94, 0x7e, 0x63, 0xce, 0x09, 0x6c, 0x4d, 0x13, 0x88, 0x3f, 0xd5, 0x91, 0xc3, 0x9f, 0xaa,
|
0x5a, 0x26, 0xfa, 0x85, 0x99, 0x27, 0xd7, 0xeb, 0x95, 0xc5, 0xdf, 0xcb, 0x21, 0x15, 0x09, 0x1a,
|
||||||
0x2e, 0x4a, 0x9f, 0x74, 0xe0, 0xe1, 0x14, 0xfa, 0x0b, 0xa9, 0x2e, 0x25, 0xd3, 0xd8, 0x47, 0x31,
|
0xc0, 0x97, 0x6f, 0xd0, 0x3f, 0x0b, 0xf9, 0x22, 0xb0, 0xa2, 0x63, 0xca, 0x66, 0x34, 0x09, 0xde,
|
||||||
0x46, 0xbf, 0x31, 0xef, 0x28, 0x37, 0xae, 0x53, 0xbe, 0x8f, 0x50, 0x34, 0x01, 0x79, 0xbf, 0x0a,
|
0x59, 0xca, 0xfd, 0x65, 0xca, 0x9f, 0x73, 0x54, 0x5c, 0x80, 0xd0, 0xaf, 0x10, 0xbc, 0x55, 0x64,
|
||||||
0xb0, 0x74, 0xe5, 0xd9, 0x98, 0x50, 0x49, 0x83, 0xa4, 0x0b, 0xb5, 0xcc, 0x01, 0x71, 0x2c, 0x79,
|
0xa2, 0x64, 0x16, 0x34, 0x0e, 0x6b, 0xc7, 0xad, 0xb3, 0x83, 0x35, 0x6b, 0x54, 0x8e, 0x36, 0xfe,
|
||||||
0x1a, 0x5b, 0xf7, 0x59, 0x20, 0x46, 0x77, 0x66, 0xe8, 0xe2, 0xc4, 0x03, 0x09, 0xe9, 0x0b, 0xa8,
|
0x6c, 0xbc, 0x5c, 0xf1, 0xa5, 0x92, 0xd9, 0x8d, 0xdf, 0xf0, 0xdb, 0x9b, 0x37, 0x7e, 0x63, 0xb3,
|
||||||
0x1a, 0xd4, 0x63, 0xd4, 0x2c, 0x10, 0xc6, 0x26, 0x1e, 0x58, 0xce, 0xf3, 0x75, 0xdd, 0xf1, 0x89,
|
0x5d, 0x0f, 0xff, 0xf3, 0x60, 0xfb, 0xd5, 0xfe, 0xe8, 0x4c, 0x0a, 0x4d, 0xd1, 0x10, 0xda, 0x0b,
|
||||||
0x70, 0x1e, 0x02, 0x33, 0xd9, 0xb5, 0xd7, 0x61, 0xed, 0x9a, 0x03, 0x62, 0xce, 0xd8, 0x02, 0x3f,
|
0x29, 0x38, 0x5b, 0x31, 0xc1, 0xa3, 0x0f, 0x69, 0xc1, 0xa1, 0x07, 0x1b, 0xf1, 0xd6, 0x5c, 0x0c,
|
||||||
0x0a, 0xb0, 0x76, 0x7b, 0x29, 0xe4, 0x19, 0x2c, 0xe7, 0x93, 0x35, 0xf3, 0x31, 0xc0, 0x01, 0xb7,
|
0x05, 0xe9, 0xf7, 0xd0, 0xd2, 0x54, 0xcd, 0xa8, 0xc2, 0x9c, 0x69, 0x53, 0x88, 0x61, 0xa7, 0xca,
|
||||||
0xa9, 0x2d, 0xea, 0x41, 0x96, 0xa4, 0x0f, 0x93, 0x33, 0xf2, 0x11, 0xd6, 0xf3, 0x96, 0x65, 0x1a,
|
0x37, 0xb4, 0xee, 0x5b, 0x66, 0xc5, 0x04, 0x7a, 0xfe, 0xd7, 0xdf, 0x83, 0xee, 0x92, 0x14, 0x1c,
|
||||||
0x43, 0xa5, 0x2d, 0x13, 0xd2, 0xa2, 0x1e, 0xf3, 0x20, 0x29, 0xbf, 0x9e, 0x2f, 0x3f, 0x1d, 0x62,
|
0xa7, 0xd3, 0xc2, 0xdf, 0x1e, 0x74, 0xd7, 0x97, 0x82, 0xbe, 0x85, 0x9d, 0x6a, 0xb0, 0xc2, 0x09,
|
||||||
0x74, 0x35, 0xe7, 0x5e, 0xea, 0xf2, 0x8e, 0x93, 0x34, 0xef, 0x0d, 0x40, 0x76, 0x4b, 0xb2, 0x1d,
|
0xe5, 0x34, 0x25, 0xa6, 0xd4, 0xc7, 0xa7, 0x95, 0x35, 0x57, 0x97, 0x85, 0x0f, 0x3d, 0xc0, 0x5e,
|
||||||
0x0d, 0xac, 0x68, 0x17, 0x0d, 0xac, 0x62, 0xb3, 0xba, 0x47, 0x6e, 0xb6, 0x83, 0xa6, 0x90, 0x77,
|
0x55, 0xbb, 0x58, 0xd1, 0x4c, 0x2a, 0x83, 0x99, 0x30, 0x54, 0xcd, 0x08, 0x2f, 0xca, 0xef, 0xac,
|
||||||
0xa5, 0x72, 0xb1, 0x56, 0xf2, 0x7e, 0x17, 0x60, 0x2e, 0x3e, 0x21, 0x1b, 0x00, 0x22, 0x64, 0xdc,
|
0x2c, 0xf4, 0x65, 0xf1, 0x18, 0xc5, 0x9d, 0x8a, 0x96, 0x63, 0x1b, 0x7c, 0x5d, 0xc4, 0x86, 0x3f,
|
||||||
0xf7, 0x35, 0x9a, 0x78, 0xe4, 0x2d, 0xd0, 0x8a, 0x08, 0xdf, 0xc6, 0x81, 0xc8, 0xfd, 0x91, 0x76,
|
0x02, 0x2c, 0x5a, 0x45, 0x27, 0xf0, 0xce, 0xb5, 0xaa, 0x03, 0xcf, 0x4e, 0x16, 0xad, 0xde, 0x49,
|
||||||
0x32, 0xf3, 0xdc, 0x3a, 0x32, 0xe3, 0x95, 0x4e, 0x5a, 0x75, 0x81, 0xd2, 0x99, 0xb1, 0x42, 0x6b,
|
0x5c, 0x42, 0x6e, 0xfc, 0x46, 0xad, 0xed, 0x87, 0x7f, 0x79, 0x50, 0x77, 0x1e, 0xb4, 0x0f, 0xc0,
|
||||||
0xb9, 0x46, 0x9c, 0x46, 0x71, 0xb2, 0x0f, 0xcb, 0x77, 0x98, 0xae, 0x4c, 0x97, 0xfc, 0x29, 0x06,
|
0x32, 0x4c, 0x92, 0x44, 0x51, 0xad, 0x6d, 0x4b, 0xef, 0xe3, 0x26, 0xcb, 0x7e, 0x72, 0x86, 0xfc,
|
||||||
0x7b, 0x0e, 0x2b, 0x77, 0x19, 0xa9, 0x4c, 0xeb, 0xfe, 0x14, 0xd3, 0xb4, 0xe1, 0x73, 0x39, 0xfd,
|
0x2d, 0xc8, 0x73, 0xdb, 0x7a, 0x37, 0x63, 0x7b, 0x5e, 0x23, 0xfa, 0xda, 0x1a, 0xd1, 0x23, 0xf0,
|
||||||
0x47, 0xf4, 0xe6, 0xdc, 0x4f, 0x62, 0xff, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x36, 0x86,
|
0xed, 0xda, 0xf9, 0x87, 0xde, 0x71, 0x23, 0xb6, 0x67, 0xb7, 0x3e, 0xfd, 0xf3, 0x87, 0xd3, 0xa2,
|
||||||
0xa6, 0x4a, 0x06, 0x00, 0x00,
|
0xfd, 0x54, 0x72, 0x22, 0xd2, 0x48, 0xaa, 0xb4, 0x97, 0xd7, 0x6e, 0x3f, 0x7c, 0xd4, 0x7b, 0xe3,
|
||||||
|
0x65, 0x1f, 0xd5, 0xed, 0x55, 0x9d, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xc8, 0x88, 0xe6, 0xf4,
|
||||||
|
0xf7, 0x05, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
82
vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages/messages.proto
generated
vendored
82
vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages/messages.proto
generated
vendored
@@ -14,35 +14,11 @@
|
|||||||
|
|
||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
|
|
||||||
|
import "google/protobuf/duration.proto";
|
||||||
|
import "google/protobuf/timestamp.proto";
|
||||||
|
|
||||||
package grpc.lb.v1;
|
package grpc.lb.v1;
|
||||||
option go_package = "messages";
|
option go_package = "google.golang.org/grpc/grpclb/grpc_lb_v1/messages";
|
||||||
|
|
||||||
message Duration {
|
|
||||||
// Signed seconds of the span of time. Must be from -315,576,000,000
|
|
||||||
// to +315,576,000,000 inclusive.
|
|
||||||
int64 seconds = 1;
|
|
||||||
|
|
||||||
// Signed fractions of a second at nanosecond resolution of the span
|
|
||||||
// of time. Durations less than one second are represented with a 0
|
|
||||||
// `seconds` field and a positive or negative `nanos` field. For durations
|
|
||||||
// of one second or more, a non-zero value for the `nanos` field must be
|
|
||||||
// of the same sign as the `seconds` field. Must be from -999,999,999
|
|
||||||
// to +999,999,999 inclusive.
|
|
||||||
int32 nanos = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message Timestamp {
|
|
||||||
// Represents seconds of UTC time since Unix epoch
|
|
||||||
// 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
|
|
||||||
// 9999-12-31T23:59:59Z inclusive.
|
|
||||||
int64 seconds = 1;
|
|
||||||
|
|
||||||
// Non-negative fractions of a second at nanosecond resolution. Negative
|
|
||||||
// second values with fractions must still have non-negative nanos values
|
|
||||||
// that count forward in time. Must be from 0 to 999,999,999
|
|
||||||
// inclusive.
|
|
||||||
int32 nanos = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message LoadBalanceRequest {
|
message LoadBalanceRequest {
|
||||||
oneof load_balance_request_type {
|
oneof load_balance_request_type {
|
||||||
@@ -56,16 +32,25 @@ message LoadBalanceRequest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
message InitialLoadBalanceRequest {
|
message InitialLoadBalanceRequest {
|
||||||
// Name of load balanced service (IE, balancer.service.com)
|
// Name of load balanced service (IE, balancer.service.com). Its
|
||||||
// length should be less than 256 bytes.
|
// length should be less than 256 bytes.
|
||||||
string name = 1;
|
string name = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Contains the number of calls finished for a particular load balance token.
|
||||||
|
message ClientStatsPerToken {
|
||||||
|
// See Server.load_balance_token.
|
||||||
|
string load_balance_token = 1;
|
||||||
|
|
||||||
|
// The total number of RPCs that finished associated with the token.
|
||||||
|
int64 num_calls = 2;
|
||||||
|
}
|
||||||
|
|
||||||
// Contains client level statistics that are useful to load balancing. Each
|
// Contains client level statistics that are useful to load balancing. Each
|
||||||
// count except the timestamp should be reset to zero after reporting the stats.
|
// count except the timestamp should be reset to zero after reporting the stats.
|
||||||
message ClientStats {
|
message ClientStats {
|
||||||
// The timestamp of generating the report.
|
// The timestamp of generating the report.
|
||||||
Timestamp timestamp = 1;
|
google.protobuf.Timestamp timestamp = 1;
|
||||||
|
|
||||||
// The total number of RPCs that started.
|
// The total number of RPCs that started.
|
||||||
int64 num_calls_started = 2;
|
int64 num_calls_started = 2;
|
||||||
@@ -73,20 +58,17 @@ message ClientStats {
|
|||||||
// The total number of RPCs that finished.
|
// The total number of RPCs that finished.
|
||||||
int64 num_calls_finished = 3;
|
int64 num_calls_finished = 3;
|
||||||
|
|
||||||
// The total number of RPCs that were dropped by the client because of rate
|
|
||||||
// limiting.
|
|
||||||
int64 num_calls_finished_with_drop_for_rate_limiting = 4;
|
|
||||||
|
|
||||||
// The total number of RPCs that were dropped by the client because of load
|
|
||||||
// balancing.
|
|
||||||
int64 num_calls_finished_with_drop_for_load_balancing = 5;
|
|
||||||
|
|
||||||
// The total number of RPCs that failed to reach a server except dropped RPCs.
|
// The total number of RPCs that failed to reach a server except dropped RPCs.
|
||||||
int64 num_calls_finished_with_client_failed_to_send = 6;
|
int64 num_calls_finished_with_client_failed_to_send = 6;
|
||||||
|
|
||||||
// The total number of RPCs that finished and are known to have been received
|
// The total number of RPCs that finished and are known to have been received
|
||||||
// by a server.
|
// by a server.
|
||||||
int64 num_calls_finished_known_received = 7;
|
int64 num_calls_finished_known_received = 7;
|
||||||
|
|
||||||
|
// The list of dropped calls.
|
||||||
|
repeated ClientStatsPerToken calls_finished_with_drop = 8;
|
||||||
|
|
||||||
|
reserved 4, 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
message LoadBalanceResponse {
|
message LoadBalanceResponse {
|
||||||
@@ -111,7 +93,7 @@ message InitialLoadBalanceResponse {
|
|||||||
// This interval defines how often the client should send the client stats
|
// This interval defines how often the client should send the client stats
|
||||||
// to the load balancer. Stats should only be reported when the duration is
|
// to the load balancer. Stats should only be reported when the duration is
|
||||||
// positive.
|
// positive.
|
||||||
Duration client_stats_report_interval = 2;
|
google.protobuf.Duration client_stats_report_interval = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ServerList {
|
message ServerList {
|
||||||
@@ -125,10 +107,8 @@ message ServerList {
|
|||||||
reserved 3;
|
reserved 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Contains server information. When none of the [drop_for_*] fields are true,
|
// Contains server information. When the drop field is not true, use the other
|
||||||
// use the other fields. When drop_for_rate_limiting is true, ignore all other
|
// fields.
|
||||||
// fields. Use drop_for_load_balancing only when it is true and
|
|
||||||
// drop_for_rate_limiting is false.
|
|
||||||
message Server {
|
message Server {
|
||||||
// A resolved address for the server, serialized in network-byte-order. It may
|
// A resolved address for the server, serialized in network-byte-order. It may
|
||||||
// either be an IPv4 or IPv6 address.
|
// either be an IPv4 or IPv6 address.
|
||||||
@@ -140,16 +120,14 @@ message Server {
|
|||||||
// An opaque but printable token given to the frontend for each pick. All
|
// An opaque but printable token given to the frontend for each pick. All
|
||||||
// frontend requests for that pick must include the token in its initial
|
// frontend requests for that pick must include the token in its initial
|
||||||
// metadata. The token is used by the backend to verify the request and to
|
// metadata. The token is used by the backend to verify the request and to
|
||||||
// allow the backend to report load to the gRPC LB system.
|
// allow the backend to report load to the gRPC LB system. The token is also
|
||||||
//
|
// used in client stats for reporting dropped calls.
|
||||||
// Its length is variable but less than 50 bytes.
|
|
||||||
string load_balance_token = 3;
|
string load_balance_token = 3;
|
||||||
|
|
||||||
// Indicates whether this particular request should be dropped by the client
|
// Indicates whether this particular request should be dropped by the client.
|
||||||
// for rate limiting.
|
// If the request is dropped, there will be a corresponding entry in
|
||||||
bool drop_for_rate_limiting = 4;
|
// ClientStats.calls_finished_with_drop.
|
||||||
|
bool drop = 4;
|
||||||
|
|
||||||
// Indicates whether this particular request should be dropped by the client
|
reserved 5;
|
||||||
// for load balancing.
|
|
||||||
bool drop_for_load_balancing = 5;
|
|
||||||
}
|
}
|
||||||
|
3
vendor/google.golang.org/grpc/grpclog/grpclog.go
generated
vendored
3
vendor/google.golang.org/grpc/grpclog/grpclog.go
generated
vendored
@@ -105,18 +105,21 @@ func Fatalln(args ...interface{}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Print prints to the logger. Arguments are handled in the manner of fmt.Print.
|
// Print prints to the logger. Arguments are handled in the manner of fmt.Print.
|
||||||
|
//
|
||||||
// Deprecated: use Info.
|
// Deprecated: use Info.
|
||||||
func Print(args ...interface{}) {
|
func Print(args ...interface{}) {
|
||||||
logger.Info(args...)
|
logger.Info(args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Printf prints to the logger. Arguments are handled in the manner of fmt.Printf.
|
// Printf prints to the logger. Arguments are handled in the manner of fmt.Printf.
|
||||||
|
//
|
||||||
// Deprecated: use Infof.
|
// Deprecated: use Infof.
|
||||||
func Printf(format string, args ...interface{}) {
|
func Printf(format string, args ...interface{}) {
|
||||||
logger.Infof(format, args...)
|
logger.Infof(format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Println prints to the logger. Arguments are handled in the manner of fmt.Println.
|
// Println prints to the logger. Arguments are handled in the manner of fmt.Println.
|
||||||
|
//
|
||||||
// Deprecated: use Infoln.
|
// Deprecated: use Infoln.
|
||||||
func Println(args ...interface{}) {
|
func Println(args ...interface{}) {
|
||||||
logger.Infoln(args...)
|
logger.Infoln(args...)
|
||||||
|
2
vendor/google.golang.org/grpc/grpclog/logger.go
generated
vendored
2
vendor/google.golang.org/grpc/grpclog/logger.go
generated
vendored
@@ -19,6 +19,7 @@
|
|||||||
package grpclog
|
package grpclog
|
||||||
|
|
||||||
// Logger mimics golang's standard Logger as an interface.
|
// Logger mimics golang's standard Logger as an interface.
|
||||||
|
//
|
||||||
// Deprecated: use LoggerV2.
|
// Deprecated: use LoggerV2.
|
||||||
type Logger interface {
|
type Logger interface {
|
||||||
Fatal(args ...interface{})
|
Fatal(args ...interface{})
|
||||||
@@ -31,6 +32,7 @@ type Logger interface {
|
|||||||
|
|
||||||
// SetLogger sets the logger that is used in grpc. Call only from
|
// SetLogger sets the logger that is used in grpc. Call only from
|
||||||
// init() functions.
|
// init() functions.
|
||||||
|
//
|
||||||
// Deprecated: use SetLoggerV2.
|
// Deprecated: use SetLoggerV2.
|
||||||
func SetLogger(l Logger) {
|
func SetLogger(l Logger) {
|
||||||
logger = &loggerWrapper{Logger: l}
|
logger = &loggerWrapper{Logger: l}
|
||||||
|
2
vendor/google.golang.org/grpc/health/BUILD
generated
vendored
2
vendor/google.golang.org/grpc/health/BUILD
generated
vendored
@@ -8,9 +8,9 @@ go_library(
|
|||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
"//vendor/golang.org/x/net/context:go_default_library",
|
"//vendor/golang.org/x/net/context:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc:go_default_library",
|
|
||||||
"//vendor/google.golang.org/grpc/codes:go_default_library",
|
"//vendor/google.golang.org/grpc/codes:go_default_library",
|
||||||
"//vendor/google.golang.org/grpc/health/grpc_health_v1:go_default_library",
|
"//vendor/google.golang.org/grpc/health/grpc_health_v1:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/status:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
113
vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go
generated
vendored
113
vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go
generated
vendored
@@ -1,16 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// source: grpc_health_v1/health.proto
|
// source: grpc/health/v1/health.proto
|
||||||
|
|
||||||
/*
|
|
||||||
Package grpc_health_v1 is a generated protocol buffer package.
|
|
||||||
|
|
||||||
It is generated from these files:
|
|
||||||
grpc_health_v1/health.proto
|
|
||||||
|
|
||||||
It has these top-level messages:
|
|
||||||
HealthCheckRequest
|
|
||||||
HealthCheckResponse
|
|
||||||
*/
|
|
||||||
package grpc_health_v1
|
package grpc_health_v1
|
||||||
|
|
||||||
import proto "github.com/golang/protobuf/proto"
|
import proto "github.com/golang/protobuf/proto"
|
||||||
@@ -56,17 +46,39 @@ func (x HealthCheckResponse_ServingStatus) String() string {
|
|||||||
return proto.EnumName(HealthCheckResponse_ServingStatus_name, int32(x))
|
return proto.EnumName(HealthCheckResponse_ServingStatus_name, int32(x))
|
||||||
}
|
}
|
||||||
func (HealthCheckResponse_ServingStatus) EnumDescriptor() ([]byte, []int) {
|
func (HealthCheckResponse_ServingStatus) EnumDescriptor() ([]byte, []int) {
|
||||||
return fileDescriptor0, []int{1, 0}
|
return fileDescriptor_health_85731b6c49265086, []int{1, 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
type HealthCheckRequest struct {
|
type HealthCheckRequest struct {
|
||||||
Service string `protobuf:"bytes,1,opt,name=service" json:"service,omitempty"`
|
Service string `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *HealthCheckRequest) Reset() { *m = HealthCheckRequest{} }
|
func (m *HealthCheckRequest) Reset() { *m = HealthCheckRequest{} }
|
||||||
func (m *HealthCheckRequest) String() string { return proto.CompactTextString(m) }
|
func (m *HealthCheckRequest) String() string { return proto.CompactTextString(m) }
|
||||||
func (*HealthCheckRequest) ProtoMessage() {}
|
func (*HealthCheckRequest) ProtoMessage() {}
|
||||||
func (*HealthCheckRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
func (*HealthCheckRequest) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_health_85731b6c49265086, []int{0}
|
||||||
|
}
|
||||||
|
func (m *HealthCheckRequest) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_HealthCheckRequest.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *HealthCheckRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_HealthCheckRequest.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (dst *HealthCheckRequest) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_HealthCheckRequest.Merge(dst, src)
|
||||||
|
}
|
||||||
|
func (m *HealthCheckRequest) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_HealthCheckRequest.Size(m)
|
||||||
|
}
|
||||||
|
func (m *HealthCheckRequest) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_HealthCheckRequest.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_HealthCheckRequest proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *HealthCheckRequest) GetService() string {
|
func (m *HealthCheckRequest) GetService() string {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
@@ -76,13 +88,35 @@ func (m *HealthCheckRequest) GetService() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type HealthCheckResponse struct {
|
type HealthCheckResponse struct {
|
||||||
Status HealthCheckResponse_ServingStatus `protobuf:"varint,1,opt,name=status,enum=grpc.health.v1.HealthCheckResponse_ServingStatus" json:"status,omitempty"`
|
Status HealthCheckResponse_ServingStatus `protobuf:"varint,1,opt,name=status,proto3,enum=grpc.health.v1.HealthCheckResponse_ServingStatus" json:"status,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *HealthCheckResponse) Reset() { *m = HealthCheckResponse{} }
|
func (m *HealthCheckResponse) Reset() { *m = HealthCheckResponse{} }
|
||||||
func (m *HealthCheckResponse) String() string { return proto.CompactTextString(m) }
|
func (m *HealthCheckResponse) String() string { return proto.CompactTextString(m) }
|
||||||
func (*HealthCheckResponse) ProtoMessage() {}
|
func (*HealthCheckResponse) ProtoMessage() {}
|
||||||
func (*HealthCheckResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
|
func (*HealthCheckResponse) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_health_85731b6c49265086, []int{1}
|
||||||
|
}
|
||||||
|
func (m *HealthCheckResponse) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_HealthCheckResponse.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *HealthCheckResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_HealthCheckResponse.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (dst *HealthCheckResponse) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_HealthCheckResponse.Merge(dst, src)
|
||||||
|
}
|
||||||
|
func (m *HealthCheckResponse) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_HealthCheckResponse.Size(m)
|
||||||
|
}
|
||||||
|
func (m *HealthCheckResponse) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_HealthCheckResponse.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_HealthCheckResponse proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *HealthCheckResponse) GetStatus() HealthCheckResponse_ServingStatus {
|
func (m *HealthCheckResponse) GetStatus() HealthCheckResponse_ServingStatus {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
@@ -105,8 +139,9 @@ var _ grpc.ClientConn
|
|||||||
// is compatible with the grpc package it is being compiled against.
|
// is compatible with the grpc package it is being compiled against.
|
||||||
const _ = grpc.SupportPackageIsVersion4
|
const _ = grpc.SupportPackageIsVersion4
|
||||||
|
|
||||||
// Client API for Health service
|
// HealthClient is the client API for Health service.
|
||||||
|
//
|
||||||
|
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
|
||||||
type HealthClient interface {
|
type HealthClient interface {
|
||||||
Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error)
|
Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error)
|
||||||
}
|
}
|
||||||
@@ -121,15 +156,14 @@ func NewHealthClient(cc *grpc.ClientConn) HealthClient {
|
|||||||
|
|
||||||
func (c *healthClient) Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) {
|
func (c *healthClient) Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) {
|
||||||
out := new(HealthCheckResponse)
|
out := new(HealthCheckResponse)
|
||||||
err := grpc.Invoke(ctx, "/grpc.health.v1.Health/Check", in, out, c.cc, opts...)
|
err := c.cc.Invoke(ctx, "/grpc.health.v1.Health/Check", in, out, opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Server API for Health service
|
// HealthServer is the server API for Health service.
|
||||||
|
|
||||||
type HealthServer interface {
|
type HealthServer interface {
|
||||||
Check(context.Context, *HealthCheckRequest) (*HealthCheckResponse, error)
|
Check(context.Context, *HealthCheckRequest) (*HealthCheckResponse, error)
|
||||||
}
|
}
|
||||||
@@ -166,25 +200,28 @@ var _Health_serviceDesc = grpc.ServiceDesc{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
Streams: []grpc.StreamDesc{},
|
Streams: []grpc.StreamDesc{},
|
||||||
Metadata: "grpc_health_v1/health.proto",
|
Metadata: "grpc/health/v1/health.proto",
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { proto.RegisterFile("grpc_health_v1/health.proto", fileDescriptor0) }
|
func init() { proto.RegisterFile("grpc/health/v1/health.proto", fileDescriptor_health_85731b6c49265086) }
|
||||||
|
|
||||||
var fileDescriptor0 = []byte{
|
var fileDescriptor_health_85731b6c49265086 = []byte{
|
||||||
// 213 bytes of a gzipped FileDescriptorProto
|
// 271 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0x2f, 0x2a, 0x48,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0x2f, 0x2a, 0x48,
|
||||||
0x8e, 0xcf, 0x48, 0x4d, 0xcc, 0x29, 0xc9, 0x88, 0x2f, 0x33, 0xd4, 0x87, 0xb0, 0xf4, 0x0a, 0x8a,
|
0xd6, 0xcf, 0x48, 0x4d, 0xcc, 0x29, 0xc9, 0xd0, 0x2f, 0x33, 0x84, 0xb2, 0xf4, 0x0a, 0x8a, 0xf2,
|
||||||
0xf2, 0x4b, 0xf2, 0x85, 0xf8, 0x40, 0x92, 0x7a, 0x50, 0xa1, 0x32, 0x43, 0x25, 0x3d, 0x2e, 0x21,
|
0x4b, 0xf2, 0x85, 0xf8, 0x40, 0x92, 0x7a, 0x50, 0xa1, 0x32, 0x43, 0x25, 0x3d, 0x2e, 0x21, 0x0f,
|
||||||
0x0f, 0x30, 0xc7, 0x39, 0x23, 0x35, 0x39, 0x3b, 0x28, 0xb5, 0xb0, 0x34, 0xb5, 0xb8, 0x44, 0x48,
|
0x30, 0xc7, 0x39, 0x23, 0x35, 0x39, 0x3b, 0x28, 0xb5, 0xb0, 0x34, 0xb5, 0xb8, 0x44, 0x48, 0x82,
|
||||||
0x82, 0x8b, 0xbd, 0x38, 0xb5, 0xa8, 0x2c, 0x33, 0x39, 0x55, 0x82, 0x51, 0x81, 0x51, 0x83, 0x33,
|
0x8b, 0xbd, 0x38, 0xb5, 0xa8, 0x2c, 0x33, 0x39, 0x55, 0x82, 0x51, 0x81, 0x51, 0x83, 0x33, 0x08,
|
||||||
0x08, 0xc6, 0x55, 0x9a, 0xc3, 0xc8, 0x25, 0x8c, 0xa2, 0xa1, 0xb8, 0x20, 0x3f, 0xaf, 0x38, 0x55,
|
0xc6, 0x55, 0x9a, 0xc3, 0xc8, 0x25, 0x8c, 0xa2, 0xa1, 0xb8, 0x20, 0x3f, 0xaf, 0x38, 0x55, 0xc8,
|
||||||
0xc8, 0x93, 0x8b, 0xad, 0xb8, 0x24, 0xb1, 0xa4, 0xb4, 0x18, 0xac, 0x81, 0xcf, 0xc8, 0x50, 0x0f,
|
0x93, 0x8b, 0xad, 0xb8, 0x24, 0xb1, 0xa4, 0xb4, 0x18, 0xac, 0x81, 0xcf, 0xc8, 0x50, 0x0f, 0xd5,
|
||||||
0xd5, 0x22, 0x3d, 0x2c, 0x9a, 0xf4, 0x82, 0x41, 0x86, 0xe6, 0xa5, 0x07, 0x83, 0x35, 0x06, 0x41,
|
0x22, 0x3d, 0x2c, 0x9a, 0xf4, 0x82, 0x41, 0x86, 0xe6, 0xa5, 0x07, 0x83, 0x35, 0x06, 0x41, 0x0d,
|
||||||
0x0d, 0x50, 0xb2, 0xe2, 0xe2, 0x45, 0x91, 0x10, 0xe2, 0xe6, 0x62, 0x0f, 0xf5, 0xf3, 0xf6, 0xf3,
|
0x50, 0xb2, 0xe2, 0xe2, 0x45, 0x91, 0x10, 0xe2, 0xe6, 0x62, 0x0f, 0xf5, 0xf3, 0xf6, 0xf3, 0x0f,
|
||||||
0x0f, 0xf7, 0x13, 0x60, 0x00, 0x71, 0x82, 0x5d, 0x83, 0xc2, 0x3c, 0xfd, 0xdc, 0x05, 0x18, 0x85,
|
0xf7, 0x13, 0x60, 0x00, 0x71, 0x82, 0x5d, 0x83, 0xc2, 0x3c, 0xfd, 0xdc, 0x05, 0x18, 0x85, 0xf8,
|
||||||
0xf8, 0xb9, 0xb8, 0xfd, 0xfc, 0x43, 0xe2, 0x61, 0x02, 0x4c, 0x46, 0x51, 0x5c, 0x6c, 0x10, 0x8b,
|
0xb9, 0xb8, 0xfd, 0xfc, 0x43, 0xe2, 0x61, 0x02, 0x4c, 0x46, 0x51, 0x5c, 0x6c, 0x10, 0x8b, 0x84,
|
||||||
0x84, 0x02, 0xb8, 0x58, 0xc1, 0x96, 0x09, 0x29, 0xe1, 0x75, 0x09, 0xd8, 0xbf, 0x52, 0xca, 0x44,
|
0x02, 0xb8, 0x58, 0xc1, 0x96, 0x09, 0x29, 0xe1, 0x75, 0x09, 0xd8, 0xbf, 0x52, 0xca, 0x44, 0xb8,
|
||||||
0xb8, 0x36, 0x89, 0x0d, 0x1c, 0x82, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x53, 0x2b, 0x65,
|
0xd6, 0x29, 0x91, 0x4b, 0x30, 0x33, 0x1f, 0x4d, 0xa1, 0x13, 0x37, 0x44, 0x65, 0x00, 0x28, 0x70,
|
||||||
0x20, 0x60, 0x01, 0x00, 0x00,
|
0x03, 0x18, 0xa3, 0x74, 0xd2, 0xf3, 0xf3, 0xd3, 0x73, 0x52, 0xf5, 0xd2, 0xf3, 0x73, 0x12, 0xf3,
|
||||||
|
0xd2, 0xf5, 0xf2, 0x8b, 0xd2, 0xf5, 0x91, 0x63, 0x03, 0xc4, 0x8e, 0x87, 0xb0, 0xe3, 0xcb, 0x0c,
|
||||||
|
0x57, 0x31, 0xf1, 0xb9, 0x83, 0x4c, 0x83, 0x18, 0xa1, 0x17, 0x66, 0x98, 0xc4, 0x06, 0x8e, 0x24,
|
||||||
|
0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xec, 0x66, 0x81, 0xcb, 0xc3, 0x01, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
34
vendor/google.golang.org/grpc/health/grpc_health_v1/health.proto
generated
vendored
34
vendor/google.golang.org/grpc/health/grpc_health_v1/health.proto
generated
vendored
@@ -1,34 +0,0 @@
|
|||||||
// Copyright 2017 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.
|
|
||||||
|
|
||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
package grpc.health.v1;
|
|
||||||
|
|
||||||
message HealthCheckRequest {
|
|
||||||
string service = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message HealthCheckResponse {
|
|
||||||
enum ServingStatus {
|
|
||||||
UNKNOWN = 0;
|
|
||||||
SERVING = 1;
|
|
||||||
NOT_SERVING = 2;
|
|
||||||
}
|
|
||||||
ServingStatus status = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
service Health{
|
|
||||||
rpc Check(HealthCheckRequest) returns (HealthCheckResponse);
|
|
||||||
}
|
|
6
vendor/google.golang.org/grpc/health/health.go
generated
vendored
6
vendor/google.golang.org/grpc/health/health.go
generated
vendored
@@ -16,7 +16,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//go:generate protoc --go_out=plugins=grpc:. grpc_health_v1/health.proto
|
//go:generate ./regenerate.sh
|
||||||
|
|
||||||
// Package health provides some utility functions to health-check a server. The implementation
|
// Package health provides some utility functions to health-check a server. The implementation
|
||||||
// is based on protobuf. Users need to write their own implementations if other IDLs are used.
|
// is based on protobuf. Users need to write their own implementations if other IDLs are used.
|
||||||
@@ -26,9 +26,9 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"google.golang.org/grpc"
|
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
healthpb "google.golang.org/grpc/health/grpc_health_v1"
|
healthpb "google.golang.org/grpc/health/grpc_health_v1"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Server implements `service Health`.
|
// Server implements `service Health`.
|
||||||
@@ -60,7 +60,7 @@ func (s *Server) Check(ctx context.Context, in *healthpb.HealthCheckRequest) (*h
|
|||||||
Status: status,
|
Status: status,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
return nil, grpc.Errorf(codes.NotFound, "unknown service")
|
return nil, status.Error(codes.NotFound, "unknown service")
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetServingStatus is called when need to reset the serving status of a service
|
// SetServingStatus is called when need to reset the serving status of a service
|
||||||
|
33
vendor/google.golang.org/grpc/health/regenerate.sh
generated
vendored
Executable file
33
vendor/google.golang.org/grpc/health/regenerate.sh
generated
vendored
Executable file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Copyright 2018 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.
|
||||||
|
|
||||||
|
set -eux -o pipefail
|
||||||
|
|
||||||
|
TMP=$(mktemp -d)
|
||||||
|
|
||||||
|
function finish {
|
||||||
|
rm -rf "$TMP"
|
||||||
|
}
|
||||||
|
trap finish EXIT
|
||||||
|
|
||||||
|
pushd "$TMP"
|
||||||
|
mkdir -p grpc/health/v1
|
||||||
|
curl https://raw.githubusercontent.com/grpc/grpc-proto/master/grpc/health/v1/health.proto > grpc/health/v1/health.proto
|
||||||
|
|
||||||
|
protoc --go_out=plugins=grpc,paths=source_relative:. -I. grpc/health/v1/*.proto
|
||||||
|
popd
|
||||||
|
rm -f grpc_health_v1/*.pb.go
|
||||||
|
cp "$TMP"/grpc/health/v1/*.pb.go grpc_health_v1/
|
||||||
|
|
4
vendor/google.golang.org/grpc/interceptor.go
generated
vendored
4
vendor/google.golang.org/grpc/interceptor.go
generated
vendored
@@ -48,7 +48,9 @@ type UnaryServerInfo struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// UnaryHandler defines the handler invoked by UnaryServerInterceptor to complete the normal
|
// UnaryHandler defines the handler invoked by UnaryServerInterceptor to complete the normal
|
||||||
// execution of a unary RPC.
|
// execution of a unary RPC. If a UnaryHandler returns an error, it should be produced by the
|
||||||
|
// status package, or else gRPC will use codes.Unknown as the status code and err.Error() as
|
||||||
|
// the status message of the RPC.
|
||||||
type UnaryHandler func(ctx context.Context, req interface{}) (interface{}, error)
|
type UnaryHandler func(ctx context.Context, req interface{}) (interface{}, error)
|
||||||
|
|
||||||
// UnaryServerInterceptor provides a hook to intercept the execution of a unary RPC on the server. info
|
// UnaryServerInterceptor provides a hook to intercept the execution of a unary RPC on the server. info
|
||||||
|
7
vendor/google.golang.org/grpc/internal/BUILD
generated
vendored
7
vendor/google.golang.org/grpc/internal/BUILD
generated
vendored
@@ -17,7 +17,12 @@ filegroup(
|
|||||||
|
|
||||||
filegroup(
|
filegroup(
|
||||||
name = "all-srcs",
|
name = "all-srcs",
|
||||||
srcs = [":package-srcs"],
|
srcs = [
|
||||||
|
":package-srcs",
|
||||||
|
"//vendor/google.golang.org/grpc/internal/backoff:all-srcs",
|
||||||
|
"//vendor/google.golang.org/grpc/internal/channelz:all-srcs",
|
||||||
|
"//vendor/google.golang.org/grpc/internal/grpcrand:all-srcs",
|
||||||
|
],
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
)
|
)
|
||||||
|
24
vendor/google.golang.org/grpc/internal/backoff/BUILD
generated
vendored
Normal file
24
vendor/google.golang.org/grpc/internal/backoff/BUILD
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["backoff.go"],
|
||||||
|
importmap = "k8s.io/kubernetes/vendor/google.golang.org/grpc/internal/backoff",
|
||||||
|
importpath = "google.golang.org/grpc/internal/backoff",
|
||||||
|
visibility = ["//vendor/google.golang.org/grpc:__subpackages__"],
|
||||||
|
deps = ["//vendor/google.golang.org/grpc/internal/grpcrand:go_default_library"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
78
vendor/google.golang.org/grpc/internal/backoff/backoff.go
generated
vendored
Normal file
78
vendor/google.golang.org/grpc/internal/backoff/backoff.go
generated
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2017 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 backoff implement the backoff strategy for gRPC.
|
||||||
|
//
|
||||||
|
// This is kept in internal until the gRPC project decides whether or not to
|
||||||
|
// allow alternative backoff strategies.
|
||||||
|
package backoff
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"google.golang.org/grpc/internal/grpcrand"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Strategy defines the methodology for backing off after a grpc connection
|
||||||
|
// failure.
|
||||||
|
//
|
||||||
|
type Strategy interface {
|
||||||
|
// Backoff returns the amount of time to wait before the next retry given
|
||||||
|
// the number of consecutive failures.
|
||||||
|
Backoff(retries int) time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
// baseDelay is the amount of time to wait before retrying after the first
|
||||||
|
// failure.
|
||||||
|
baseDelay = 1.0 * time.Second
|
||||||
|
// factor is applied to the backoff after each retry.
|
||||||
|
factor = 1.6
|
||||||
|
// jitter provides a range to randomize backoff delays.
|
||||||
|
jitter = 0.2
|
||||||
|
)
|
||||||
|
|
||||||
|
// Exponential implements exponential backoff algorithm as defined in
|
||||||
|
// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md.
|
||||||
|
type Exponential struct {
|
||||||
|
// MaxDelay is the upper bound of backoff delay.
|
||||||
|
MaxDelay time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
// Backoff returns the amount of time to wait before the next retry given the
|
||||||
|
// number of retries.
|
||||||
|
func (bc Exponential) Backoff(retries int) time.Duration {
|
||||||
|
if retries == 0 {
|
||||||
|
return baseDelay
|
||||||
|
}
|
||||||
|
backoff, max := float64(baseDelay), float64(bc.MaxDelay)
|
||||||
|
for backoff < max && retries > 0 {
|
||||||
|
backoff *= factor
|
||||||
|
retries--
|
||||||
|
}
|
||||||
|
if backoff > max {
|
||||||
|
backoff = max
|
||||||
|
}
|
||||||
|
// Randomize backoff delays so that if a cluster of requests start at
|
||||||
|
// the same time, they won't operate in lockstep.
|
||||||
|
backoff *= 1 + jitter*(grpcrand.Float64()*2-1)
|
||||||
|
if backoff < 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return time.Duration(backoff)
|
||||||
|
}
|
30
vendor/google.golang.org/grpc/internal/channelz/BUILD
generated
vendored
Normal file
30
vendor/google.golang.org/grpc/internal/channelz/BUILD
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"funcs.go",
|
||||||
|
"types.go",
|
||||||
|
],
|
||||||
|
importmap = "k8s.io/kubernetes/vendor/google.golang.org/grpc/internal/channelz",
|
||||||
|
importpath = "google.golang.org/grpc/internal/channelz",
|
||||||
|
visibility = ["//vendor/google.golang.org/grpc:__subpackages__"],
|
||||||
|
deps = [
|
||||||
|
"//vendor/google.golang.org/grpc/connectivity:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/grpclog:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
573
vendor/google.golang.org/grpc/internal/channelz/funcs.go
generated
vendored
Normal file
573
vendor/google.golang.org/grpc/internal/channelz/funcs.go
generated
vendored
Normal file
@@ -0,0 +1,573 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2018 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 channelz defines APIs for enabling channelz service, entry
|
||||||
|
// registration/deletion, and accessing channelz data. It also defines channelz
|
||||||
|
// metric struct formats.
|
||||||
|
//
|
||||||
|
// All APIs in this package are experimental.
|
||||||
|
package channelz
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sort"
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
|
"google.golang.org/grpc/grpclog"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
db dbWrapper
|
||||||
|
idGen idGenerator
|
||||||
|
// EntryPerPage defines the number of channelz entries to be shown on a web page.
|
||||||
|
EntryPerPage = 50
|
||||||
|
curState int32
|
||||||
|
)
|
||||||
|
|
||||||
|
// TurnOn turns on channelz data collection.
|
||||||
|
func TurnOn() {
|
||||||
|
if !IsOn() {
|
||||||
|
NewChannelzStorage()
|
||||||
|
atomic.StoreInt32(&curState, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsOn returns whether channelz data collection is on.
|
||||||
|
func IsOn() bool {
|
||||||
|
return atomic.CompareAndSwapInt32(&curState, 1, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// dbWarpper wraps around a reference to internal channelz data storage, and
|
||||||
|
// provide synchronized functionality to set and get the reference.
|
||||||
|
type dbWrapper struct {
|
||||||
|
mu sync.RWMutex
|
||||||
|
DB *channelMap
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dbWrapper) set(db *channelMap) {
|
||||||
|
d.mu.Lock()
|
||||||
|
d.DB = db
|
||||||
|
d.mu.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dbWrapper) get() *channelMap {
|
||||||
|
d.mu.RLock()
|
||||||
|
defer d.mu.RUnlock()
|
||||||
|
return d.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewChannelzStorage initializes channelz data storage and id generator.
|
||||||
|
//
|
||||||
|
// Note: This function is exported for testing purpose only. User should not call
|
||||||
|
// it in most cases.
|
||||||
|
func NewChannelzStorage() {
|
||||||
|
db.set(&channelMap{
|
||||||
|
topLevelChannels: make(map[int64]struct{}),
|
||||||
|
channels: make(map[int64]*channel),
|
||||||
|
listenSockets: make(map[int64]*listenSocket),
|
||||||
|
normalSockets: make(map[int64]*normalSocket),
|
||||||
|
servers: make(map[int64]*server),
|
||||||
|
subChannels: make(map[int64]*subChannel),
|
||||||
|
})
|
||||||
|
idGen.reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTopChannels returns a slice of top channel's ChannelMetric, along with a
|
||||||
|
// boolean indicating whether there's more top channels to be queried for.
|
||||||
|
//
|
||||||
|
// The arg id specifies that only top channel with id at or above it will be included
|
||||||
|
// in the result. The returned slice is up to a length of EntryPerPage, and is
|
||||||
|
// sorted in ascending id order.
|
||||||
|
func GetTopChannels(id int64) ([]*ChannelMetric, bool) {
|
||||||
|
return db.get().GetTopChannels(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetServers returns a slice of server's ServerMetric, along with a
|
||||||
|
// boolean indicating whether there's more servers to be queried for.
|
||||||
|
//
|
||||||
|
// The arg id specifies that only server with id at or above it will be included
|
||||||
|
// in the result. The returned slice is up to a length of EntryPerPage, and is
|
||||||
|
// sorted in ascending id order.
|
||||||
|
func GetServers(id int64) ([]*ServerMetric, bool) {
|
||||||
|
return db.get().GetServers(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetServerSockets returns a slice of server's (identified by id) normal socket's
|
||||||
|
// SocketMetric, along with a boolean indicating whether there's more sockets to
|
||||||
|
// be queried for.
|
||||||
|
//
|
||||||
|
// The arg startID specifies that only sockets with id at or above it will be
|
||||||
|
// included in the result. The returned slice is up to a length of EntryPerPage,
|
||||||
|
// and is sorted in ascending id order.
|
||||||
|
func GetServerSockets(id int64, startID int64) ([]*SocketMetric, bool) {
|
||||||
|
return db.get().GetServerSockets(id, startID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetChannel returns the ChannelMetric for the channel (identified by id).
|
||||||
|
func GetChannel(id int64) *ChannelMetric {
|
||||||
|
return db.get().GetChannel(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSubChannel returns the SubChannelMetric for the subchannel (identified by id).
|
||||||
|
func GetSubChannel(id int64) *SubChannelMetric {
|
||||||
|
return db.get().GetSubChannel(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSocket returns the SocketInternalMetric for the socket (identified by id).
|
||||||
|
func GetSocket(id int64) *SocketMetric {
|
||||||
|
return db.get().GetSocket(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterChannel registers the given channel c in channelz database with ref
|
||||||
|
// as its reference name, and add it to the child list of its parent (identified
|
||||||
|
// by pid). pid = 0 means no parent. It returns the unique channelz tracking id
|
||||||
|
// assigned to this channel.
|
||||||
|
func RegisterChannel(c Channel, pid int64, ref string) int64 {
|
||||||
|
id := idGen.genID()
|
||||||
|
cn := &channel{
|
||||||
|
refName: ref,
|
||||||
|
c: c,
|
||||||
|
subChans: make(map[int64]string),
|
||||||
|
nestedChans: make(map[int64]string),
|
||||||
|
id: id,
|
||||||
|
pid: pid,
|
||||||
|
}
|
||||||
|
if pid == 0 {
|
||||||
|
db.get().addChannel(id, cn, true, pid, ref)
|
||||||
|
} else {
|
||||||
|
db.get().addChannel(id, cn, false, pid, ref)
|
||||||
|
}
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterSubChannel registers the given channel c in channelz database with ref
|
||||||
|
// as its reference name, and add it to the child list of its parent (identified
|
||||||
|
// by pid). It returns the unique channelz tracking id assigned to this subchannel.
|
||||||
|
func RegisterSubChannel(c Channel, pid int64, ref string) int64 {
|
||||||
|
if pid == 0 {
|
||||||
|
grpclog.Error("a SubChannel's parent id cannot be 0")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
id := idGen.genID()
|
||||||
|
sc := &subChannel{
|
||||||
|
refName: ref,
|
||||||
|
c: c,
|
||||||
|
sockets: make(map[int64]string),
|
||||||
|
id: id,
|
||||||
|
pid: pid,
|
||||||
|
}
|
||||||
|
db.get().addSubChannel(id, sc, pid, ref)
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterServer registers the given server s in channelz database. It returns
|
||||||
|
// the unique channelz tracking id assigned to this server.
|
||||||
|
func RegisterServer(s Server, ref string) int64 {
|
||||||
|
id := idGen.genID()
|
||||||
|
svr := &server{
|
||||||
|
refName: ref,
|
||||||
|
s: s,
|
||||||
|
sockets: make(map[int64]string),
|
||||||
|
listenSockets: make(map[int64]string),
|
||||||
|
id: id,
|
||||||
|
}
|
||||||
|
db.get().addServer(id, svr)
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterListenSocket registers the given listen socket s in channelz database
|
||||||
|
// with ref as its reference name, and add it to the child list of its parent
|
||||||
|
// (identified by pid). It returns the unique channelz tracking id assigned to
|
||||||
|
// this listen socket.
|
||||||
|
func RegisterListenSocket(s Socket, pid int64, ref string) int64 {
|
||||||
|
if pid == 0 {
|
||||||
|
grpclog.Error("a ListenSocket's parent id cannot be 0")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
id := idGen.genID()
|
||||||
|
ls := &listenSocket{refName: ref, s: s, id: id, pid: pid}
|
||||||
|
db.get().addListenSocket(id, ls, pid, ref)
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterNormalSocket registers the given normal socket s in channelz database
|
||||||
|
// with ref as its reference name, and add it to the child list of its parent
|
||||||
|
// (identified by pid). It returns the unique channelz tracking id assigned to
|
||||||
|
// this normal socket.
|
||||||
|
func RegisterNormalSocket(s Socket, pid int64, ref string) int64 {
|
||||||
|
if pid == 0 {
|
||||||
|
grpclog.Error("a NormalSocket's parent id cannot be 0")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
id := idGen.genID()
|
||||||
|
ns := &normalSocket{refName: ref, s: s, id: id, pid: pid}
|
||||||
|
db.get().addNormalSocket(id, ns, pid, ref)
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveEntry removes an entry with unique channelz trakcing id to be id from
|
||||||
|
// channelz database.
|
||||||
|
func RemoveEntry(id int64) {
|
||||||
|
db.get().removeEntry(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// channelMap is the storage data structure for channelz.
|
||||||
|
// Methods of channelMap can be divided in two two categories with respect to locking.
|
||||||
|
// 1. Methods acquire the global lock.
|
||||||
|
// 2. Methods that can only be called when global lock is held.
|
||||||
|
// A second type of method need always to be called inside a first type of method.
|
||||||
|
type channelMap struct {
|
||||||
|
mu sync.RWMutex
|
||||||
|
topLevelChannels map[int64]struct{}
|
||||||
|
servers map[int64]*server
|
||||||
|
channels map[int64]*channel
|
||||||
|
subChannels map[int64]*subChannel
|
||||||
|
listenSockets map[int64]*listenSocket
|
||||||
|
normalSockets map[int64]*normalSocket
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channelMap) addServer(id int64, s *server) {
|
||||||
|
c.mu.Lock()
|
||||||
|
s.cm = c
|
||||||
|
c.servers[id] = s
|
||||||
|
c.mu.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channelMap) addChannel(id int64, cn *channel, isTopChannel bool, pid int64, ref string) {
|
||||||
|
c.mu.Lock()
|
||||||
|
cn.cm = c
|
||||||
|
c.channels[id] = cn
|
||||||
|
if isTopChannel {
|
||||||
|
c.topLevelChannels[id] = struct{}{}
|
||||||
|
} else {
|
||||||
|
c.findEntry(pid).addChild(id, cn)
|
||||||
|
}
|
||||||
|
c.mu.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channelMap) addSubChannel(id int64, sc *subChannel, pid int64, ref string) {
|
||||||
|
c.mu.Lock()
|
||||||
|
sc.cm = c
|
||||||
|
c.subChannels[id] = sc
|
||||||
|
c.findEntry(pid).addChild(id, sc)
|
||||||
|
c.mu.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channelMap) addListenSocket(id int64, ls *listenSocket, pid int64, ref string) {
|
||||||
|
c.mu.Lock()
|
||||||
|
ls.cm = c
|
||||||
|
c.listenSockets[id] = ls
|
||||||
|
c.findEntry(pid).addChild(id, ls)
|
||||||
|
c.mu.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channelMap) addNormalSocket(id int64, ns *normalSocket, pid int64, ref string) {
|
||||||
|
c.mu.Lock()
|
||||||
|
ns.cm = c
|
||||||
|
c.normalSockets[id] = ns
|
||||||
|
c.findEntry(pid).addChild(id, ns)
|
||||||
|
c.mu.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
// removeEntry triggers the removal of an entry, which may not indeed delete the
|
||||||
|
// entry, if it has to wait on the deletion of its children, or may lead to a chain
|
||||||
|
// of entry deletion. For example, deleting the last socket of a gracefully shutting
|
||||||
|
// down server will lead to the server being also deleted.
|
||||||
|
func (c *channelMap) removeEntry(id int64) {
|
||||||
|
c.mu.Lock()
|
||||||
|
c.findEntry(id).triggerDelete()
|
||||||
|
c.mu.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
// c.mu must be held by the caller.
|
||||||
|
func (c *channelMap) findEntry(id int64) entry {
|
||||||
|
var v entry
|
||||||
|
var ok bool
|
||||||
|
if v, ok = c.channels[id]; ok {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
if v, ok = c.subChannels[id]; ok {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
if v, ok = c.servers[id]; ok {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
if v, ok = c.listenSockets[id]; ok {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
if v, ok = c.normalSockets[id]; ok {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
return &dummyEntry{idNotFound: id}
|
||||||
|
}
|
||||||
|
|
||||||
|
// c.mu must be held by the caller
|
||||||
|
// deleteEntry simply deletes an entry from the channelMap. Before calling this
|
||||||
|
// method, caller must check this entry is ready to be deleted, i.e removeEntry()
|
||||||
|
// has been called on it, and no children still exist.
|
||||||
|
// Conditionals are ordered by the expected frequency of deletion of each entity
|
||||||
|
// type, in order to optimize performance.
|
||||||
|
func (c *channelMap) deleteEntry(id int64) {
|
||||||
|
var ok bool
|
||||||
|
if _, ok = c.normalSockets[id]; ok {
|
||||||
|
delete(c.normalSockets, id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if _, ok = c.subChannels[id]; ok {
|
||||||
|
delete(c.subChannels, id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if _, ok = c.channels[id]; ok {
|
||||||
|
delete(c.channels, id)
|
||||||
|
delete(c.topLevelChannels, id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if _, ok = c.listenSockets[id]; ok {
|
||||||
|
delete(c.listenSockets, id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if _, ok = c.servers[id]; ok {
|
||||||
|
delete(c.servers, id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type int64Slice []int64
|
||||||
|
|
||||||
|
func (s int64Slice) Len() int { return len(s) }
|
||||||
|
func (s int64Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||||
|
func (s int64Slice) Less(i, j int) bool { return s[i] < s[j] }
|
||||||
|
|
||||||
|
func copyMap(m map[int64]string) map[int64]string {
|
||||||
|
n := make(map[int64]string)
|
||||||
|
for k, v := range m {
|
||||||
|
n[k] = v
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func min(a, b int) int {
|
||||||
|
if a < b {
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channelMap) GetTopChannels(id int64) ([]*ChannelMetric, bool) {
|
||||||
|
c.mu.RLock()
|
||||||
|
l := len(c.topLevelChannels)
|
||||||
|
ids := make([]int64, 0, l)
|
||||||
|
cns := make([]*channel, 0, min(l, EntryPerPage))
|
||||||
|
|
||||||
|
for k := range c.topLevelChannels {
|
||||||
|
ids = append(ids, k)
|
||||||
|
}
|
||||||
|
sort.Sort(int64Slice(ids))
|
||||||
|
idx := sort.Search(len(ids), func(i int) bool { return ids[i] >= id })
|
||||||
|
count := 0
|
||||||
|
var end bool
|
||||||
|
var t []*ChannelMetric
|
||||||
|
for i, v := range ids[idx:] {
|
||||||
|
if count == EntryPerPage {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if cn, ok := c.channels[v]; ok {
|
||||||
|
cns = append(cns, cn)
|
||||||
|
t = append(t, &ChannelMetric{
|
||||||
|
NestedChans: copyMap(cn.nestedChans),
|
||||||
|
SubChans: copyMap(cn.subChans),
|
||||||
|
})
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
if i == len(ids[idx:])-1 {
|
||||||
|
end = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.mu.RUnlock()
|
||||||
|
if count == 0 {
|
||||||
|
end = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, cn := range cns {
|
||||||
|
t[i].ChannelData = cn.c.ChannelzMetric()
|
||||||
|
t[i].ID = cn.id
|
||||||
|
t[i].RefName = cn.refName
|
||||||
|
}
|
||||||
|
return t, end
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channelMap) GetServers(id int64) ([]*ServerMetric, bool) {
|
||||||
|
c.mu.RLock()
|
||||||
|
l := len(c.servers)
|
||||||
|
ids := make([]int64, 0, l)
|
||||||
|
ss := make([]*server, 0, min(l, EntryPerPage))
|
||||||
|
for k := range c.servers {
|
||||||
|
ids = append(ids, k)
|
||||||
|
}
|
||||||
|
sort.Sort(int64Slice(ids))
|
||||||
|
idx := sort.Search(len(ids), func(i int) bool { return ids[i] >= id })
|
||||||
|
count := 0
|
||||||
|
var end bool
|
||||||
|
var s []*ServerMetric
|
||||||
|
for i, v := range ids[idx:] {
|
||||||
|
if count == EntryPerPage {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if svr, ok := c.servers[v]; ok {
|
||||||
|
ss = append(ss, svr)
|
||||||
|
s = append(s, &ServerMetric{
|
||||||
|
ListenSockets: copyMap(svr.listenSockets),
|
||||||
|
})
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
if i == len(ids[idx:])-1 {
|
||||||
|
end = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.mu.RUnlock()
|
||||||
|
if count == 0 {
|
||||||
|
end = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, svr := range ss {
|
||||||
|
s[i].ServerData = svr.s.ChannelzMetric()
|
||||||
|
s[i].ID = svr.id
|
||||||
|
s[i].RefName = svr.refName
|
||||||
|
}
|
||||||
|
return s, end
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channelMap) GetServerSockets(id int64, startID int64) ([]*SocketMetric, bool) {
|
||||||
|
var svr *server
|
||||||
|
var ok bool
|
||||||
|
c.mu.RLock()
|
||||||
|
if svr, ok = c.servers[id]; !ok {
|
||||||
|
// server with id doesn't exist.
|
||||||
|
c.mu.RUnlock()
|
||||||
|
return nil, true
|
||||||
|
}
|
||||||
|
svrskts := svr.sockets
|
||||||
|
l := len(svrskts)
|
||||||
|
ids := make([]int64, 0, l)
|
||||||
|
sks := make([]*normalSocket, 0, min(l, EntryPerPage))
|
||||||
|
for k := range svrskts {
|
||||||
|
ids = append(ids, k)
|
||||||
|
}
|
||||||
|
sort.Sort((int64Slice(ids)))
|
||||||
|
idx := sort.Search(len(ids), func(i int) bool { return ids[i] >= id })
|
||||||
|
count := 0
|
||||||
|
var end bool
|
||||||
|
for i, v := range ids[idx:] {
|
||||||
|
if count == EntryPerPage {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if ns, ok := c.normalSockets[v]; ok {
|
||||||
|
sks = append(sks, ns)
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
if i == len(ids[idx:])-1 {
|
||||||
|
end = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.mu.RUnlock()
|
||||||
|
if count == 0 {
|
||||||
|
end = true
|
||||||
|
}
|
||||||
|
var s []*SocketMetric
|
||||||
|
for _, ns := range sks {
|
||||||
|
sm := &SocketMetric{}
|
||||||
|
sm.SocketData = ns.s.ChannelzMetric()
|
||||||
|
sm.ID = ns.id
|
||||||
|
sm.RefName = ns.refName
|
||||||
|
s = append(s, sm)
|
||||||
|
}
|
||||||
|
return s, end
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channelMap) GetChannel(id int64) *ChannelMetric {
|
||||||
|
cm := &ChannelMetric{}
|
||||||
|
var cn *channel
|
||||||
|
var ok bool
|
||||||
|
c.mu.RLock()
|
||||||
|
if cn, ok = c.channels[id]; !ok {
|
||||||
|
// channel with id doesn't exist.
|
||||||
|
c.mu.RUnlock()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
cm.NestedChans = copyMap(cn.nestedChans)
|
||||||
|
cm.SubChans = copyMap(cn.subChans)
|
||||||
|
c.mu.RUnlock()
|
||||||
|
cm.ChannelData = cn.c.ChannelzMetric()
|
||||||
|
cm.ID = cn.id
|
||||||
|
cm.RefName = cn.refName
|
||||||
|
return cm
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channelMap) GetSubChannel(id int64) *SubChannelMetric {
|
||||||
|
cm := &SubChannelMetric{}
|
||||||
|
var sc *subChannel
|
||||||
|
var ok bool
|
||||||
|
c.mu.RLock()
|
||||||
|
if sc, ok = c.subChannels[id]; !ok {
|
||||||
|
// subchannel with id doesn't exist.
|
||||||
|
c.mu.RUnlock()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
cm.Sockets = copyMap(sc.sockets)
|
||||||
|
c.mu.RUnlock()
|
||||||
|
cm.ChannelData = sc.c.ChannelzMetric()
|
||||||
|
cm.ID = sc.id
|
||||||
|
cm.RefName = sc.refName
|
||||||
|
return cm
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channelMap) GetSocket(id int64) *SocketMetric {
|
||||||
|
sm := &SocketMetric{}
|
||||||
|
c.mu.RLock()
|
||||||
|
if ls, ok := c.listenSockets[id]; ok {
|
||||||
|
c.mu.RUnlock()
|
||||||
|
sm.SocketData = ls.s.ChannelzMetric()
|
||||||
|
sm.ID = ls.id
|
||||||
|
sm.RefName = ls.refName
|
||||||
|
return sm
|
||||||
|
}
|
||||||
|
if ns, ok := c.normalSockets[id]; ok {
|
||||||
|
c.mu.RUnlock()
|
||||||
|
sm.SocketData = ns.s.ChannelzMetric()
|
||||||
|
sm.ID = ns.id
|
||||||
|
sm.RefName = ns.refName
|
||||||
|
return sm
|
||||||
|
}
|
||||||
|
c.mu.RUnlock()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type idGenerator struct {
|
||||||
|
id int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *idGenerator) reset() {
|
||||||
|
atomic.StoreInt64(&i.id, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *idGenerator) genID() int64 {
|
||||||
|
return atomic.AddInt64(&i.id, 1)
|
||||||
|
}
|
418
vendor/google.golang.org/grpc/internal/channelz/types.go
generated
vendored
Normal file
418
vendor/google.golang.org/grpc/internal/channelz/types.go
generated
vendored
Normal file
@@ -0,0 +1,418 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2018 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 channelz
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"google.golang.org/grpc/connectivity"
|
||||||
|
"google.golang.org/grpc/grpclog"
|
||||||
|
)
|
||||||
|
|
||||||
|
// entry represents a node in the channelz database.
|
||||||
|
type entry interface {
|
||||||
|
// addChild adds a child e, whose channelz id is id to child list
|
||||||
|
addChild(id int64, e entry)
|
||||||
|
// deleteChild deletes a child with channelz id to be id from child list
|
||||||
|
deleteChild(id int64)
|
||||||
|
// triggerDelete tries to delete self from channelz database. However, if child
|
||||||
|
// list is not empty, then deletion from the database is on hold until the last
|
||||||
|
// child is deleted from database.
|
||||||
|
triggerDelete()
|
||||||
|
// deleteSelfIfReady check whether triggerDelete() has been called before, and whether child
|
||||||
|
// list is now empty. If both conditions are met, then delete self from database.
|
||||||
|
deleteSelfIfReady()
|
||||||
|
}
|
||||||
|
|
||||||
|
// dummyEntry is a fake entry to handle entry not found case.
|
||||||
|
type dummyEntry struct {
|
||||||
|
idNotFound int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dummyEntry) addChild(id int64, e entry) {
|
||||||
|
// Note: It is possible for a normal program to reach here under race condition.
|
||||||
|
// For example, there could be a race between ClientConn.Close() info being propagated
|
||||||
|
// to addrConn and http2Client. ClientConn.Close() cancel the context and result
|
||||||
|
// in http2Client to error. The error info is then caught by transport monitor
|
||||||
|
// and before addrConn.tearDown() is called in side ClientConn.Close(). Therefore,
|
||||||
|
// 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
|
||||||
|
// 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)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dummyEntry) deleteChild(id int64) {
|
||||||
|
// It is possible for a normal program to reach here under race condition.
|
||||||
|
// 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)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dummyEntry) triggerDelete() {
|
||||||
|
grpclog.Warningf("attempt to delete an entry (id=%d) that doesn't currently exist", d.idNotFound)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*dummyEntry) deleteSelfIfReady() {
|
||||||
|
// code should not reach here. deleteSelfIfReady is always called on an existing entry.
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChannelMetric defines the info channelz provides for a specific Channel, which
|
||||||
|
// includes ChannelInternalMetric and channelz-specific data, such as channelz id,
|
||||||
|
// child list, etc.
|
||||||
|
type ChannelMetric struct {
|
||||||
|
// ID is the channelz id of this channel.
|
||||||
|
ID int64
|
||||||
|
// RefName is the human readable reference string of this channel.
|
||||||
|
RefName string
|
||||||
|
// ChannelData contains channel internal metric reported by the channel through
|
||||||
|
// ChannelzMetric().
|
||||||
|
ChannelData *ChannelInternalMetric
|
||||||
|
// NestedChans tracks the nested channel type children of this channel in the format of
|
||||||
|
// a map from nested channel channelz id to corresponding reference string.
|
||||||
|
NestedChans map[int64]string
|
||||||
|
// SubChans tracks the subchannel type children of this channel in the format of a
|
||||||
|
// map from subchannel channelz id to corresponding reference string.
|
||||||
|
SubChans map[int64]string
|
||||||
|
// Sockets tracks the socket type children of this channel in the format of a map
|
||||||
|
// from socket channelz id to corresponding reference string.
|
||||||
|
// Note current grpc implementation doesn't allow channel having sockets directly,
|
||||||
|
// therefore, this is field is unused.
|
||||||
|
Sockets map[int64]string
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubChannelMetric defines the info channelz provides for a specific SubChannel,
|
||||||
|
// which includes ChannelInternalMetric and channelz-specific data, such as
|
||||||
|
// channelz id, child list, etc.
|
||||||
|
type SubChannelMetric struct {
|
||||||
|
// ID is the channelz id of this subchannel.
|
||||||
|
ID int64
|
||||||
|
// RefName is the human readable reference string of this subchannel.
|
||||||
|
RefName string
|
||||||
|
// ChannelData contains subchannel internal metric reported by the subchannel
|
||||||
|
// through ChannelzMetric().
|
||||||
|
ChannelData *ChannelInternalMetric
|
||||||
|
// NestedChans tracks the nested channel type children of this subchannel in the format of
|
||||||
|
// a map from nested channel channelz id to corresponding reference string.
|
||||||
|
// Note current grpc implementation doesn't allow subchannel to have nested channels
|
||||||
|
// as children, therefore, this field is unused.
|
||||||
|
NestedChans map[int64]string
|
||||||
|
// SubChans tracks the subchannel type children of this subchannel in the format of a
|
||||||
|
// map from subchannel channelz id to corresponding reference string.
|
||||||
|
// Note current grpc implementation doesn't allow subchannel to have subchannels
|
||||||
|
// as children, therefore, this field is unused.
|
||||||
|
SubChans map[int64]string
|
||||||
|
// Sockets tracks the socket type children of this subchannel in the format of a map
|
||||||
|
// from socket channelz id to corresponding reference string.
|
||||||
|
Sockets map[int64]string
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChannelInternalMetric defines the struct that the implementor of Channel interface
|
||||||
|
// should return from ChannelzMetric().
|
||||||
|
type ChannelInternalMetric struct {
|
||||||
|
// current connectivity state of the channel.
|
||||||
|
State connectivity.State
|
||||||
|
// The target this channel originally tried to connect to. May be absent
|
||||||
|
Target string
|
||||||
|
// The number of calls started on the channel.
|
||||||
|
CallsStarted int64
|
||||||
|
// The number of calls that have completed with an OK status.
|
||||||
|
CallsSucceeded int64
|
||||||
|
// The number of calls that have a completed with a non-OK status.
|
||||||
|
CallsFailed int64
|
||||||
|
// The last time a call was started on the channel.
|
||||||
|
LastCallStartedTimestamp time.Time
|
||||||
|
//TODO: trace
|
||||||
|
}
|
||||||
|
|
||||||
|
// Channel is the interface that should be satisfied in order to be tracked by
|
||||||
|
// channelz as Channel or SubChannel.
|
||||||
|
type Channel interface {
|
||||||
|
ChannelzMetric() *ChannelInternalMetric
|
||||||
|
}
|
||||||
|
|
||||||
|
type channel struct {
|
||||||
|
refName string
|
||||||
|
c Channel
|
||||||
|
closeCalled bool
|
||||||
|
nestedChans map[int64]string
|
||||||
|
subChans map[int64]string
|
||||||
|
id int64
|
||||||
|
pid int64
|
||||||
|
cm *channelMap
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channel) addChild(id int64, e entry) {
|
||||||
|
switch v := e.(type) {
|
||||||
|
case *subChannel:
|
||||||
|
c.subChans[id] = v.refName
|
||||||
|
case *channel:
|
||||||
|
c.nestedChans[id] = v.refName
|
||||||
|
default:
|
||||||
|
grpclog.Errorf("cannot add a child (id = %d) of type %T to a channel", id, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channel) deleteChild(id int64) {
|
||||||
|
delete(c.subChans, id)
|
||||||
|
delete(c.nestedChans, id)
|
||||||
|
c.deleteSelfIfReady()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channel) triggerDelete() {
|
||||||
|
c.closeCalled = true
|
||||||
|
c.deleteSelfIfReady()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *channel) deleteSelfIfReady() {
|
||||||
|
if !c.closeCalled || len(c.subChans)+len(c.nestedChans) != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.cm.deleteEntry(c.id)
|
||||||
|
// not top channel
|
||||||
|
if c.pid != 0 {
|
||||||
|
c.cm.findEntry(c.pid).deleteChild(c.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type subChannel struct {
|
||||||
|
refName string
|
||||||
|
c Channel
|
||||||
|
closeCalled bool
|
||||||
|
sockets map[int64]string
|
||||||
|
id int64
|
||||||
|
pid int64
|
||||||
|
cm *channelMap
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sc *subChannel) addChild(id int64, e entry) {
|
||||||
|
if v, ok := e.(*normalSocket); ok {
|
||||||
|
sc.sockets[id] = v.refName
|
||||||
|
} else {
|
||||||
|
grpclog.Errorf("cannot add a child (id = %d) of type %T to a subChannel", id, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sc *subChannel) deleteChild(id int64) {
|
||||||
|
delete(sc.sockets, id)
|
||||||
|
sc.deleteSelfIfReady()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sc *subChannel) triggerDelete() {
|
||||||
|
sc.closeCalled = true
|
||||||
|
sc.deleteSelfIfReady()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sc *subChannel) deleteSelfIfReady() {
|
||||||
|
if !sc.closeCalled || len(sc.sockets) != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sc.cm.deleteEntry(sc.id)
|
||||||
|
sc.cm.findEntry(sc.pid).deleteChild(sc.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SocketMetric defines the info channelz provides for a specific Socket, which
|
||||||
|
// includes SocketInternalMetric and channelz-specific data, such as channelz id, etc.
|
||||||
|
type SocketMetric struct {
|
||||||
|
// ID is the channelz id of this socket.
|
||||||
|
ID int64
|
||||||
|
// RefName is the human readable reference string of this socket.
|
||||||
|
RefName string
|
||||||
|
// SocketData contains socket internal metric reported by the socket through
|
||||||
|
// ChannelzMetric().
|
||||||
|
SocketData *SocketInternalMetric
|
||||||
|
}
|
||||||
|
|
||||||
|
// SocketInternalMetric defines the struct that the implementor of Socket interface
|
||||||
|
// should return from ChannelzMetric().
|
||||||
|
type SocketInternalMetric struct {
|
||||||
|
// The number of streams that have been started.
|
||||||
|
StreamsStarted int64
|
||||||
|
// The number of streams that have ended successfully:
|
||||||
|
// On client side, receiving frame with eos bit set.
|
||||||
|
// On server side, sending frame with eos bit set.
|
||||||
|
StreamsSucceeded int64
|
||||||
|
// The number of streams that have ended unsuccessfully:
|
||||||
|
// On client side, termination without receiving frame with eos bit set.
|
||||||
|
// On server side, termination without sending frame with eos bit set.
|
||||||
|
StreamsFailed int64
|
||||||
|
// The number of messages successfully sent on this socket.
|
||||||
|
MessagesSent int64
|
||||||
|
MessagesReceived int64
|
||||||
|
// The number of keep alives sent. This is typically implemented with HTTP/2
|
||||||
|
// ping messages.
|
||||||
|
KeepAlivesSent int64
|
||||||
|
// The last time a stream was created by this endpoint. Usually unset for
|
||||||
|
// servers.
|
||||||
|
LastLocalStreamCreatedTimestamp time.Time
|
||||||
|
// The last time a stream was created by the remote endpoint. Usually unset
|
||||||
|
// for clients.
|
||||||
|
LastRemoteStreamCreatedTimestamp time.Time
|
||||||
|
// The last time a message was sent by this endpoint.
|
||||||
|
LastMessageSentTimestamp time.Time
|
||||||
|
// The last time a message was received by this endpoint.
|
||||||
|
LastMessageReceivedTimestamp time.Time
|
||||||
|
// The amount of window, granted to the local endpoint by the remote endpoint.
|
||||||
|
// This may be slightly out of date due to network latency. This does NOT
|
||||||
|
// include stream level or TCP level flow control info.
|
||||||
|
LocalFlowControlWindow int64
|
||||||
|
// The amount of window, granted to the remote endpoint by the local endpoint.
|
||||||
|
// This may be slightly out of date due to network latency. This does NOT
|
||||||
|
// include stream level or TCP level flow control info.
|
||||||
|
RemoteFlowControlWindow int64
|
||||||
|
// The locally bound address.
|
||||||
|
LocalAddr net.Addr
|
||||||
|
// The remote bound address. May be absent.
|
||||||
|
RemoteAddr net.Addr
|
||||||
|
// Optional, represents the name of the remote endpoint, if different than
|
||||||
|
// the original target name.
|
||||||
|
RemoteName string
|
||||||
|
//TODO: socket options
|
||||||
|
//TODO: Security
|
||||||
|
}
|
||||||
|
|
||||||
|
// Socket is the interface that should be satisfied in order to be tracked by
|
||||||
|
// channelz as Socket.
|
||||||
|
type Socket interface {
|
||||||
|
ChannelzMetric() *SocketInternalMetric
|
||||||
|
}
|
||||||
|
|
||||||
|
type listenSocket struct {
|
||||||
|
refName string
|
||||||
|
s Socket
|
||||||
|
id int64
|
||||||
|
pid int64
|
||||||
|
cm *channelMap
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *listenSocket) deleteChild(id int64) {
|
||||||
|
grpclog.Errorf("cannot delete a child (id = %d) from a listen socket", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *listenSocket) triggerDelete() {
|
||||||
|
ls.cm.deleteEntry(ls.id)
|
||||||
|
ls.cm.findEntry(ls.pid).deleteChild(ls.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *listenSocket) deleteSelfIfReady() {
|
||||||
|
grpclog.Errorf("cannot call deleteSelfIfReady on a listen socket")
|
||||||
|
}
|
||||||
|
|
||||||
|
type normalSocket struct {
|
||||||
|
refName string
|
||||||
|
s Socket
|
||||||
|
id int64
|
||||||
|
pid int64
|
||||||
|
cm *channelMap
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ns *normalSocket) deleteChild(id int64) {
|
||||||
|
grpclog.Errorf("cannot delete a child (id = %d) from a normal socket", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ns *normalSocket) triggerDelete() {
|
||||||
|
ns.cm.deleteEntry(ns.id)
|
||||||
|
ns.cm.findEntry(ns.pid).deleteChild(ns.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ns *normalSocket) deleteSelfIfReady() {
|
||||||
|
grpclog.Errorf("cannot call deleteSelfIfReady on a normal socket")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerMetric defines the info channelz provides for a specific Server, which
|
||||||
|
// includes ServerInternalMetric and channelz-specific data, such as channelz id,
|
||||||
|
// child list, etc.
|
||||||
|
type ServerMetric struct {
|
||||||
|
// ID is the channelz id of this server.
|
||||||
|
ID int64
|
||||||
|
// RefName is the human readable reference string of this server.
|
||||||
|
RefName string
|
||||||
|
// ServerData contains server internal metric reported by the server through
|
||||||
|
// ChannelzMetric().
|
||||||
|
ServerData *ServerInternalMetric
|
||||||
|
// ListenSockets tracks the listener socket type children of this server in the
|
||||||
|
// format of a map from socket channelz id to corresponding reference string.
|
||||||
|
ListenSockets map[int64]string
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerInternalMetric defines the struct that the implementor of Server interface
|
||||||
|
// should return from ChannelzMetric().
|
||||||
|
type ServerInternalMetric struct {
|
||||||
|
// The number of incoming calls started on the server.
|
||||||
|
CallsStarted int64
|
||||||
|
// The number of incoming calls that have completed with an OK status.
|
||||||
|
CallsSucceeded int64
|
||||||
|
// The number of incoming calls that have a completed with a non-OK status.
|
||||||
|
CallsFailed int64
|
||||||
|
// The last time a call was started on the server.
|
||||||
|
LastCallStartedTimestamp time.Time
|
||||||
|
//TODO: trace
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server is the interface to be satisfied in order to be tracked by channelz as
|
||||||
|
// Server.
|
||||||
|
type Server interface {
|
||||||
|
ChannelzMetric() *ServerInternalMetric
|
||||||
|
}
|
||||||
|
|
||||||
|
type server struct {
|
||||||
|
refName string
|
||||||
|
s Server
|
||||||
|
closeCalled bool
|
||||||
|
sockets map[int64]string
|
||||||
|
listenSockets map[int64]string
|
||||||
|
id int64
|
||||||
|
cm *channelMap
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *server) addChild(id int64, e entry) {
|
||||||
|
switch v := e.(type) {
|
||||||
|
case *normalSocket:
|
||||||
|
s.sockets[id] = v.refName
|
||||||
|
case *listenSocket:
|
||||||
|
s.listenSockets[id] = v.refName
|
||||||
|
default:
|
||||||
|
grpclog.Errorf("cannot add a child (id = %d) of type %T to a server", id, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *server) deleteChild(id int64) {
|
||||||
|
delete(s.sockets, id)
|
||||||
|
delete(s.listenSockets, id)
|
||||||
|
s.deleteSelfIfReady()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *server) triggerDelete() {
|
||||||
|
s.closeCalled = true
|
||||||
|
s.deleteSelfIfReady()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *server) deleteSelfIfReady() {
|
||||||
|
if !s.closeCalled || len(s.sockets)+len(s.listenSockets) != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s.cm.deleteEntry(s.id)
|
||||||
|
}
|
23
vendor/google.golang.org/grpc/internal/grpcrand/BUILD
generated
vendored
Normal file
23
vendor/google.golang.org/grpc/internal/grpcrand/BUILD
generated
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["grpcrand.go"],
|
||||||
|
importmap = "k8s.io/kubernetes/vendor/google.golang.org/grpc/internal/grpcrand",
|
||||||
|
importpath = "google.golang.org/grpc/internal/grpcrand",
|
||||||
|
visibility = ["//vendor/google.golang.org/grpc:__subpackages__"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
56
vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go
generated
vendored
Normal file
56
vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go
generated
vendored
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2018 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 grpcrand implements math/rand functions in a concurrent-safe way
|
||||||
|
// with a global random source, independent of math/rand's global source.
|
||||||
|
package grpcrand
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math/rand"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
r = rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
|
mu sync.Mutex
|
||||||
|
)
|
||||||
|
|
||||||
|
// Int63n implements rand.Int63n on the grpcrand global source.
|
||||||
|
func Int63n(n int64) int64 {
|
||||||
|
mu.Lock()
|
||||||
|
res := r.Int63n(n)
|
||||||
|
mu.Unlock()
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Intn implements rand.Intn on the grpcrand global source.
|
||||||
|
func Intn(n int) int {
|
||||||
|
mu.Lock()
|
||||||
|
res := r.Intn(n)
|
||||||
|
mu.Unlock()
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64 implements rand.Float64 on the grpcrand global source.
|
||||||
|
func Float64() float64 {
|
||||||
|
mu.Lock()
|
||||||
|
res := r.Float64()
|
||||||
|
mu.Unlock()
|
||||||
|
return res
|
||||||
|
}
|
30
vendor/google.golang.org/grpc/internal/internal.go
generated
vendored
30
vendor/google.golang.org/grpc/internal/internal.go
generated
vendored
@@ -15,20 +15,22 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Package internal contains gRPC-internal code for testing, to avoid polluting
|
// Package internal contains gRPC-internal code, to avoid polluting
|
||||||
// the godoc of the top-level grpc package.
|
// the godoc of the top-level grpc package. It must not import any grpc
|
||||||
|
// symbols to avoid circular dependencies.
|
||||||
package internal
|
package internal
|
||||||
|
|
||||||
// TestingCloseConns closes all existing transports but keeps
|
var (
|
||||||
// grpcServer.lis accepting new connections.
|
|
||||||
//
|
|
||||||
// The provided grpcServer must be of type *grpc.Server. It is untyped
|
|
||||||
// for circular dependency reasons.
|
|
||||||
var TestingCloseConns func(grpcServer interface{})
|
|
||||||
|
|
||||||
// TestingUseHandlerImpl enables the http.Handler-based server implementation.
|
// TestingUseHandlerImpl enables the http.Handler-based server implementation.
|
||||||
// It must be called before Serve and requires TLS credentials.
|
// It must be called before Serve and requires TLS credentials.
|
||||||
//
|
//
|
||||||
// The provided grpcServer must be of type *grpc.Server. It is untyped
|
// The provided grpcServer must be of type *grpc.Server. It is untyped
|
||||||
// for circular dependency reasons.
|
// for circular dependency reasons.
|
||||||
var TestingUseHandlerImpl func(grpcServer interface{})
|
TestingUseHandlerImpl func(grpcServer interface{})
|
||||||
|
|
||||||
|
// WithContextDialer is exported by clientconn.go
|
||||||
|
WithContextDialer interface{} // func(context.Context, string) (net.Conn, error) grpc.DialOption
|
||||||
|
// WithResolverBuilder is exported by clientconn.go
|
||||||
|
WithResolverBuilder interface{} // func (resolver.Builder) grpc.DialOption
|
||||||
|
)
|
||||||
|
89
vendor/google.golang.org/grpc/metadata/metadata.go
generated
vendored
89
vendor/google.golang.org/grpc/metadata/metadata.go
generated
vendored
@@ -17,7 +17,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Package metadata define the structure of the metadata supported by gRPC library.
|
// Package metadata define the structure of the metadata supported by gRPC library.
|
||||||
// Please refer to https://grpc.io/docs/guides/wire.html for more information about custom-metadata.
|
// Please refer to https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md
|
||||||
|
// for more information about custom-metadata.
|
||||||
package metadata
|
package metadata
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -27,7 +28,9 @@ import (
|
|||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DecodeKeyValue returns k, v, nil. It is deprecated and should not be used.
|
// DecodeKeyValue returns k, v, nil.
|
||||||
|
//
|
||||||
|
// Deprecated: use k and v directly instead.
|
||||||
func DecodeKeyValue(k, v string) (string, string, error) {
|
func DecodeKeyValue(k, v string) (string, string, error) {
|
||||||
return k, v, nil
|
return k, v, nil
|
||||||
}
|
}
|
||||||
@@ -94,6 +97,30 @@ func (md MD) Copy() MD {
|
|||||||
return Join(md)
|
return Join(md)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get obtains the values for a given key.
|
||||||
|
func (md MD) Get(k string) []string {
|
||||||
|
k = strings.ToLower(k)
|
||||||
|
return md[k]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set sets the value of a given key with a slice of values.
|
||||||
|
func (md MD) Set(k string, vals ...string) {
|
||||||
|
if len(vals) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
k = strings.ToLower(k)
|
||||||
|
md[k] = vals
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append adds the values to key k, not overwriting what was already stored at that key.
|
||||||
|
func (md MD) Append(k string, vals ...string) {
|
||||||
|
if len(vals) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
k = strings.ToLower(k)
|
||||||
|
md[k] = append(md[k], vals...)
|
||||||
|
}
|
||||||
|
|
||||||
// Join joins any number of mds into a single MD.
|
// Join joins any number of mds into a single MD.
|
||||||
// The order of values for each key is determined by the order in which
|
// The order of values for each key is determined by the order in which
|
||||||
// the mds containing those values are presented to Join.
|
// the mds containing those values are presented to Join.
|
||||||
@@ -115,9 +142,26 @@ func NewIncomingContext(ctx context.Context, md MD) context.Context {
|
|||||||
return context.WithValue(ctx, mdIncomingKey{}, md)
|
return context.WithValue(ctx, mdIncomingKey{}, md)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewOutgoingContext creates a new context with outgoing md attached.
|
// NewOutgoingContext creates a new context with outgoing md attached. If used
|
||||||
|
// in conjunction with AppendToOutgoingContext, NewOutgoingContext will
|
||||||
|
// overwrite any previously-appended metadata.
|
||||||
func NewOutgoingContext(ctx context.Context, md MD) context.Context {
|
func NewOutgoingContext(ctx context.Context, md MD) context.Context {
|
||||||
return context.WithValue(ctx, mdOutgoingKey{}, md)
|
return context.WithValue(ctx, mdOutgoingKey{}, rawMD{md: md})
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendToOutgoingContext returns a new context with the provided kv merged
|
||||||
|
// with any existing metadata in the context. Please refer to the
|
||||||
|
// documentation of Pairs for a description of kv.
|
||||||
|
func AppendToOutgoingContext(ctx context.Context, kv ...string) context.Context {
|
||||||
|
if len(kv)%2 == 1 {
|
||||||
|
panic(fmt.Sprintf("metadata: AppendToOutgoingContext got an odd number of input pairs for metadata: %d", len(kv)))
|
||||||
|
}
|
||||||
|
md, _ := ctx.Value(mdOutgoingKey{}).(rawMD)
|
||||||
|
added := make([][]string, len(md.added)+1)
|
||||||
|
copy(added, md.added)
|
||||||
|
added[len(added)-1] = make([]string, len(kv))
|
||||||
|
copy(added[len(added)-1], kv)
|
||||||
|
return context.WithValue(ctx, mdOutgoingKey{}, rawMD{md: md.md, added: added})
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromIncomingContext returns the incoming metadata in ctx if it exists. The
|
// FromIncomingContext returns the incoming metadata in ctx if it exists. The
|
||||||
@@ -128,10 +172,39 @@ func FromIncomingContext(ctx context.Context) (md MD, ok bool) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FromOutgoingContextRaw returns the un-merged, intermediary contents
|
||||||
|
// of rawMD. Remember to perform strings.ToLower on the keys. The returned
|
||||||
|
// MD should not be modified. Writing to it may cause races. Modification
|
||||||
|
// should be made to copies of the returned MD.
|
||||||
|
//
|
||||||
|
// This is intended for gRPC-internal use ONLY.
|
||||||
|
func FromOutgoingContextRaw(ctx context.Context) (MD, [][]string, bool) {
|
||||||
|
raw, ok := ctx.Value(mdOutgoingKey{}).(rawMD)
|
||||||
|
if !ok {
|
||||||
|
return nil, nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
return raw.md, raw.added, true
|
||||||
|
}
|
||||||
|
|
||||||
// FromOutgoingContext returns the outgoing metadata in ctx if it exists. The
|
// FromOutgoingContext returns the outgoing metadata in ctx if it exists. The
|
||||||
// returned MD should not be modified. Writing to it may cause races.
|
// returned MD should not be modified. Writing to it may cause races.
|
||||||
// Modification should be made to the copies of the returned MD.
|
// Modification should be made to copies of the returned MD.
|
||||||
func FromOutgoingContext(ctx context.Context) (md MD, ok bool) {
|
func FromOutgoingContext(ctx context.Context) (MD, bool) {
|
||||||
md, ok = ctx.Value(mdOutgoingKey{}).(MD)
|
raw, ok := ctx.Value(mdOutgoingKey{}).(rawMD)
|
||||||
return
|
if !ok {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
mds := make([]MD, 0, len(raw.added)+1)
|
||||||
|
mds = append(mds, raw.md)
|
||||||
|
for _, vv := range raw.added {
|
||||||
|
mds = append(mds, Pairs(vv...))
|
||||||
|
}
|
||||||
|
return Join(mds...), ok
|
||||||
|
}
|
||||||
|
|
||||||
|
type rawMD struct {
|
||||||
|
md MD
|
||||||
|
added [][]string
|
||||||
}
|
}
|
||||||
|
6
vendor/google.golang.org/grpc/naming/dns_resolver.go
generated
vendored
6
vendor/google.golang.org/grpc/naming/dns_resolver.go
generated
vendored
@@ -153,10 +153,10 @@ type ipWatcher struct {
|
|||||||
updateChan chan *Update
|
updateChan chan *Update
|
||||||
}
|
}
|
||||||
|
|
||||||
// Next returns the adrress resolution Update for the target. For IP address,
|
// Next returns the address resolution Update for the target. For IP address,
|
||||||
// the resolution is itself, thus polling name server is unncessary. Therefore,
|
// the resolution is itself, thus polling name server is unnecessary. Therefore,
|
||||||
// Next() will return an Update the first time it is called, and will be blocked
|
// Next() will return an Update the first time it is called, and will be blocked
|
||||||
// for all following calls as no Update exisits until watcher is closed.
|
// for all following calls as no Update exists until watcher is closed.
|
||||||
func (i *ipWatcher) Next() ([]*Update, error) {
|
func (i *ipWatcher) Next() ([]*Update, error) {
|
||||||
u, ok := <-i.updateChan
|
u, ok := <-i.updateChan
|
||||||
if !ok {
|
if !ok {
|
||||||
|
2
vendor/google.golang.org/grpc/naming/go17.go
generated
vendored
2
vendor/google.golang.org/grpc/naming/go17.go
generated
vendored
@@ -1,4 +1,4 @@
|
|||||||
// +build go1.7, !go1.8
|
// +build go1.6,!go1.8
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
|
12
vendor/google.golang.org/grpc/naming/naming.go
generated
vendored
12
vendor/google.golang.org/grpc/naming/naming.go
generated
vendored
@@ -18,20 +18,26 @@
|
|||||||
|
|
||||||
// Package naming defines the naming API and related data structures for gRPC.
|
// Package naming defines the naming API and related data structures for gRPC.
|
||||||
// The interface is EXPERIMENTAL and may be suject to change.
|
// The interface is EXPERIMENTAL and may be suject to change.
|
||||||
|
//
|
||||||
|
// Deprecated: please use package resolver.
|
||||||
package naming
|
package naming
|
||||||
|
|
||||||
// Operation defines the corresponding operations for a name resolution change.
|
// Operation defines the corresponding operations for a name resolution change.
|
||||||
|
//
|
||||||
|
// Deprecated: please use package resolver.
|
||||||
type Operation uint8
|
type Operation uint8
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// Add indicates a new address is added.
|
// Add indicates a new address is added.
|
||||||
Add Operation = iota
|
Add Operation = iota
|
||||||
// Delete indicates an exisiting address is deleted.
|
// Delete indicates an existing address is deleted.
|
||||||
Delete
|
Delete
|
||||||
)
|
)
|
||||||
|
|
||||||
// Update defines a name resolution update. Notice that it is not valid having both
|
// Update defines a name resolution update. Notice that it is not valid having both
|
||||||
// empty string Addr and nil Metadata in an Update.
|
// empty string Addr and nil Metadata in an Update.
|
||||||
|
//
|
||||||
|
// Deprecated: please use package resolver.
|
||||||
type Update struct {
|
type Update struct {
|
||||||
// Op indicates the operation of the update.
|
// Op indicates the operation of the update.
|
||||||
Op Operation
|
Op Operation
|
||||||
@@ -43,12 +49,16 @@ type Update struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Resolver creates a Watcher for a target to track its resolution changes.
|
// Resolver creates a Watcher for a target to track its resolution changes.
|
||||||
|
//
|
||||||
|
// Deprecated: please use package resolver.
|
||||||
type Resolver interface {
|
type Resolver interface {
|
||||||
// Resolve creates a Watcher for target.
|
// Resolve creates a Watcher for target.
|
||||||
Resolve(target string) (Watcher, error)
|
Resolve(target string) (Watcher, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Watcher watches for the updates on the specified target.
|
// Watcher watches for the updates on the specified target.
|
||||||
|
//
|
||||||
|
// Deprecated: please use package resolver.
|
||||||
type Watcher interface {
|
type Watcher interface {
|
||||||
// Next blocks until an update or error happens. It may return one or more
|
// Next blocks until an update or error happens. It may return one or more
|
||||||
// updates. The first call should get the full set of the results. It should
|
// updates. The first call should get the full set of the results. It should
|
||||||
|
203
vendor/google.golang.org/grpc/picker_wrapper.go
generated
vendored
203
vendor/google.golang.org/grpc/picker_wrapper.go
generated
vendored
@@ -19,12 +19,17 @@
|
|||||||
package grpc
|
package grpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
"sync"
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"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/grpclog"
|
||||||
|
"google.golang.org/grpc/internal/channelz"
|
||||||
|
"google.golang.org/grpc/metadata"
|
||||||
|
"google.golang.org/grpc/resolver"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
"google.golang.org/grpc/transport"
|
"google.golang.org/grpc/transport"
|
||||||
)
|
)
|
||||||
@@ -36,13 +41,57 @@ type pickerWrapper struct {
|
|||||||
done bool
|
done bool
|
||||||
blockingCh chan struct{}
|
blockingCh chan struct{}
|
||||||
picker balancer.Picker
|
picker balancer.Picker
|
||||||
|
|
||||||
|
// The latest connection happened.
|
||||||
|
connErrMu sync.Mutex
|
||||||
|
connErr error
|
||||||
|
|
||||||
|
stickinessMDKey atomic.Value
|
||||||
|
stickiness *stickyStore
|
||||||
}
|
}
|
||||||
|
|
||||||
func newPickerWrapper() *pickerWrapper {
|
func newPickerWrapper() *pickerWrapper {
|
||||||
bp := &pickerWrapper{blockingCh: make(chan struct{})}
|
bp := &pickerWrapper{
|
||||||
|
blockingCh: make(chan struct{}),
|
||||||
|
stickiness: newStickyStore(),
|
||||||
|
}
|
||||||
return bp
|
return bp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (bp *pickerWrapper) updateConnectionError(err error) {
|
||||||
|
bp.connErrMu.Lock()
|
||||||
|
bp.connErr = err
|
||||||
|
bp.connErrMu.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bp *pickerWrapper) connectionError() error {
|
||||||
|
bp.connErrMu.Lock()
|
||||||
|
err := bp.connErr
|
||||||
|
bp.connErrMu.Unlock()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bp *pickerWrapper) updateStickinessMDKey(newKey string) {
|
||||||
|
// No need to check ok because mdKey == "" if ok == false.
|
||||||
|
if oldKey, _ := bp.stickinessMDKey.Load().(string); oldKey != newKey {
|
||||||
|
bp.stickinessMDKey.Store(newKey)
|
||||||
|
bp.stickiness.reset(newKey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bp *pickerWrapper) getStickinessMDKey() string {
|
||||||
|
// No need to check ok because mdKey == "" if ok == false.
|
||||||
|
mdKey, _ := bp.stickinessMDKey.Load().(string)
|
||||||
|
return mdKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bp *pickerWrapper) clearStickinessState() {
|
||||||
|
if oldKey := bp.getStickinessMDKey(); oldKey != "" {
|
||||||
|
// There's no need to reset store if mdKey was "".
|
||||||
|
bp.stickiness.reset(oldKey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// updatePicker is called by UpdateBalancerState. It unblocks all blocked pick.
|
// updatePicker is called by UpdateBalancerState. It unblocks all blocked pick.
|
||||||
func (bp *pickerWrapper) updatePicker(p balancer.Picker) {
|
func (bp *pickerWrapper) updatePicker(p balancer.Picker) {
|
||||||
bp.mu.Lock()
|
bp.mu.Lock()
|
||||||
@@ -57,6 +106,23 @@ func (bp *pickerWrapper) updatePicker(p balancer.Picker) {
|
|||||||
bp.mu.Unlock()
|
bp.mu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func doneChannelzWrapper(acw *acBalancerWrapper, done func(balancer.DoneInfo)) func(balancer.DoneInfo) {
|
||||||
|
acw.mu.Lock()
|
||||||
|
ac := acw.ac
|
||||||
|
acw.mu.Unlock()
|
||||||
|
ac.incrCallsStarted()
|
||||||
|
return func(b balancer.DoneInfo) {
|
||||||
|
if b.Err != nil && b.Err != io.EOF {
|
||||||
|
ac.incrCallsFailed()
|
||||||
|
} else {
|
||||||
|
ac.incrCallsSucceeded()
|
||||||
|
}
|
||||||
|
if done != nil {
|
||||||
|
done(b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// pick returns the transport that will be used for the RPC.
|
// pick returns the transport that will be used for the RPC.
|
||||||
// It may block in the following cases:
|
// It may block in the following cases:
|
||||||
// - there's no picker
|
// - there's no picker
|
||||||
@@ -65,6 +131,27 @@ func (bp *pickerWrapper) updatePicker(p balancer.Picker) {
|
|||||||
// - the subConn returned by the current picker is not READY
|
// - the subConn returned by the current picker is not READY
|
||||||
// When one of these situations happens, pick blocks until the picker gets updated.
|
// When one of these situations happens, pick blocks until the picker gets updated.
|
||||||
func (bp *pickerWrapper) pick(ctx context.Context, failfast bool, opts balancer.PickOptions) (transport.ClientTransport, func(balancer.DoneInfo), error) {
|
func (bp *pickerWrapper) pick(ctx context.Context, failfast bool, opts balancer.PickOptions) (transport.ClientTransport, func(balancer.DoneInfo), error) {
|
||||||
|
|
||||||
|
mdKey := bp.getStickinessMDKey()
|
||||||
|
stickyKey, isSticky := stickyKeyFromContext(ctx, mdKey)
|
||||||
|
|
||||||
|
// Potential race here: if stickinessMDKey is updated after the above two
|
||||||
|
// lines, and this pick is a sticky pick, the following put could add an
|
||||||
|
// entry to sticky store with an outdated sticky key.
|
||||||
|
//
|
||||||
|
// The solution: keep the current md key in sticky store, and at the
|
||||||
|
// beginning of each get/put, check the mdkey against store.curMDKey.
|
||||||
|
// - Cons: one more string comparing for each get/put.
|
||||||
|
// - Pros: the string matching happens inside get/put, so the overhead for
|
||||||
|
// non-sticky RPCs will be minimal.
|
||||||
|
|
||||||
|
if isSticky {
|
||||||
|
if t, ok := bp.stickiness.get(mdKey, stickyKey); ok {
|
||||||
|
// Done function returned is always nil.
|
||||||
|
return t, nil, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
p balancer.Picker
|
p balancer.Picker
|
||||||
ch chan struct{}
|
ch chan struct{}
|
||||||
@@ -97,7 +184,7 @@ func (bp *pickerWrapper) pick(ctx context.Context, failfast bool, opts balancer.
|
|||||||
p = bp.picker
|
p = bp.picker
|
||||||
bp.mu.Unlock()
|
bp.mu.Unlock()
|
||||||
|
|
||||||
subConn, put, err := p.Pick(ctx, opts)
|
subConn, done, err := p.Pick(ctx, opts)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
switch err {
|
switch err {
|
||||||
@@ -107,7 +194,7 @@ func (bp *pickerWrapper) pick(ctx context.Context, failfast bool, opts balancer.
|
|||||||
if !failfast {
|
if !failfast {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return nil, nil, status.Errorf(codes.Unavailable, "%v", err)
|
return nil, nil, status.Errorf(codes.Unavailable, "%v, latest connection error: %v", err, bp.connectionError())
|
||||||
default:
|
default:
|
||||||
// err is some other error.
|
// err is some other error.
|
||||||
return nil, nil, toRPCErr(err)
|
return nil, nil, toRPCErr(err)
|
||||||
@@ -120,7 +207,13 @@ func (bp *pickerWrapper) pick(ctx context.Context, failfast bool, opts balancer.
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if t, ok := acw.getAddrConn().getReadyTransport(); ok {
|
if t, ok := acw.getAddrConn().getReadyTransport(); ok {
|
||||||
return t, put, nil
|
if isSticky {
|
||||||
|
bp.stickiness.put(mdKey, stickyKey, acw)
|
||||||
|
}
|
||||||
|
if channelz.IsOn() {
|
||||||
|
return t, doneChannelzWrapper(acw, done), nil
|
||||||
|
}
|
||||||
|
return t, done, nil
|
||||||
}
|
}
|
||||||
grpclog.Infof("blockingPicker: the picked transport is not ready, loop back to repick")
|
grpclog.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.
|
||||||
@@ -139,3 +232,105 @@ func (bp *pickerWrapper) close() {
|
|||||||
bp.done = true
|
bp.done = true
|
||||||
close(bp.blockingCh)
|
close(bp.blockingCh)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const stickinessKeyCountLimit = 1000
|
||||||
|
|
||||||
|
type stickyStoreEntry struct {
|
||||||
|
acw *acBalancerWrapper
|
||||||
|
addr resolver.Address
|
||||||
|
}
|
||||||
|
|
||||||
|
type stickyStore struct {
|
||||||
|
mu sync.Mutex
|
||||||
|
// curMDKey is check before every get/put to avoid races. The operation will
|
||||||
|
// abort immediately when the given mdKey is different from the curMDKey.
|
||||||
|
curMDKey string
|
||||||
|
store *linkedMap
|
||||||
|
}
|
||||||
|
|
||||||
|
func newStickyStore() *stickyStore {
|
||||||
|
return &stickyStore{
|
||||||
|
store: newLinkedMap(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset clears the map in stickyStore, and set the currentMDKey to newMDKey.
|
||||||
|
func (ss *stickyStore) reset(newMDKey string) {
|
||||||
|
ss.mu.Lock()
|
||||||
|
ss.curMDKey = newMDKey
|
||||||
|
ss.store.clear()
|
||||||
|
ss.mu.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
// stickyKey is the key to look up in store. mdKey will be checked against
|
||||||
|
// curMDKey to avoid races.
|
||||||
|
func (ss *stickyStore) put(mdKey, stickyKey string, acw *acBalancerWrapper) {
|
||||||
|
ss.mu.Lock()
|
||||||
|
defer ss.mu.Unlock()
|
||||||
|
if mdKey != ss.curMDKey {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// TODO(stickiness): limit the total number of entries.
|
||||||
|
ss.store.put(stickyKey, &stickyStoreEntry{
|
||||||
|
acw: acw,
|
||||||
|
addr: acw.getAddrConn().getCurAddr(),
|
||||||
|
})
|
||||||
|
if ss.store.len() > stickinessKeyCountLimit {
|
||||||
|
ss.store.removeOldest()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// stickyKey is the key to look up in store. mdKey will be checked against
|
||||||
|
// curMDKey to avoid races.
|
||||||
|
func (ss *stickyStore) get(mdKey, stickyKey string) (transport.ClientTransport, bool) {
|
||||||
|
ss.mu.Lock()
|
||||||
|
defer ss.mu.Unlock()
|
||||||
|
if mdKey != ss.curMDKey {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
entry, ok := ss.store.get(stickyKey)
|
||||||
|
if !ok {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
ac := entry.acw.getAddrConn()
|
||||||
|
if ac.getCurAddr() != entry.addr {
|
||||||
|
ss.store.remove(stickyKey)
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
t, ok := ac.getReadyTransport()
|
||||||
|
if !ok {
|
||||||
|
ss.store.remove(stickyKey)
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
return t, true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get one value from metadata in ctx with key stickinessMDKey.
|
||||||
|
//
|
||||||
|
// It returns "", false if stickinessMDKey is an empty string.
|
||||||
|
func stickyKeyFromContext(ctx context.Context, stickinessMDKey string) (string, bool) {
|
||||||
|
if stickinessMDKey == "" {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
md, added, ok := metadata.FromOutgoingContextRaw(ctx)
|
||||||
|
if !ok {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
if vv, ok := md[stickinessMDKey]; ok {
|
||||||
|
if len(vv) > 0 {
|
||||||
|
return vv[0], true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, ss := range added {
|
||||||
|
for i := 0; i < len(ss)-1; i += 2 {
|
||||||
|
if ss[i] == stickinessMDKey {
|
||||||
|
return ss[i+1], true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
17
vendor/google.golang.org/grpc/pickfirst.go
generated
vendored
17
vendor/google.golang.org/grpc/pickfirst.go
generated
vendored
@@ -26,6 +26,9 @@ import (
|
|||||||
"google.golang.org/grpc/resolver"
|
"google.golang.org/grpc/resolver"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// PickFirstBalancerName is the name of the pick_first balancer.
|
||||||
|
const PickFirstBalancerName = "pick_first"
|
||||||
|
|
||||||
func newPickfirstBuilder() balancer.Builder {
|
func newPickfirstBuilder() balancer.Builder {
|
||||||
return &pickfirstBuilder{}
|
return &pickfirstBuilder{}
|
||||||
}
|
}
|
||||||
@@ -37,7 +40,7 @@ func (*pickfirstBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (*pickfirstBuilder) Name() string {
|
func (*pickfirstBuilder) Name() string {
|
||||||
return "pickfirst"
|
return PickFirstBalancerName
|
||||||
}
|
}
|
||||||
|
|
||||||
type pickfirstBalancer struct {
|
type pickfirstBalancer struct {
|
||||||
@@ -57,14 +60,20 @@ func (b *pickfirstBalancer) HandleResolvedAddrs(addrs []resolver.Address, err er
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
b.cc.UpdateBalancerState(connectivity.Idle, &picker{sc: b.sc})
|
b.cc.UpdateBalancerState(connectivity.Idle, &picker{sc: b.sc})
|
||||||
|
b.sc.Connect()
|
||||||
} else {
|
} else {
|
||||||
b.sc.UpdateAddresses(addrs)
|
b.sc.UpdateAddresses(addrs)
|
||||||
|
b.sc.Connect()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *pickfirstBalancer) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
|
func (b *pickfirstBalancer) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
|
||||||
grpclog.Infof("pickfirstBalancer: HandleSubConnStateChange: %p, %v", sc, s)
|
grpclog.Infof("pickfirstBalancer: HandleSubConnStateChange: %p, %v", sc, s)
|
||||||
if b.sc != sc || s == connectivity.Shutdown {
|
if b.sc != sc {
|
||||||
|
grpclog.Infof("pickfirstBalancer: ignored state change because sc is not recognized")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if s == connectivity.Shutdown {
|
||||||
b.sc = nil
|
b.sc = nil
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -93,3 +102,7 @@ func (p *picker) Pick(ctx context.Context, opts balancer.PickOptions) (balancer.
|
|||||||
}
|
}
|
||||||
return p.sc, nil, nil
|
return p.sc, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
balancer.Register(newPickfirstBuilder())
|
||||||
|
}
|
||||||
|
3
vendor/google.golang.org/grpc/proxy.go
generated
vendored
3
vendor/google.golang.org/grpc/proxy.go
generated
vendored
@@ -82,8 +82,7 @@ func doHTTPConnectHandshake(ctx context.Context, conn net.Conn, addr string) (_
|
|||||||
Header: map[string][]string{"User-Agent": {grpcUA}},
|
Header: map[string][]string{"User-Agent": {grpcUA}},
|
||||||
})
|
})
|
||||||
|
|
||||||
req = req.WithContext(ctx)
|
if err := sendHTTPRequest(ctx, req, conn); err != nil {
|
||||||
if err := req.Write(conn); err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to write the HTTP request: %v", err)
|
return nil, fmt.Errorf("failed to write the HTTP request: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
6
vendor/google.golang.org/grpc/resolver/BUILD
generated
vendored
6
vendor/google.golang.org/grpc/resolver/BUILD
generated
vendored
@@ -17,7 +17,11 @@ filegroup(
|
|||||||
|
|
||||||
filegroup(
|
filegroup(
|
||||||
name = "all-srcs",
|
name = "all-srcs",
|
||||||
srcs = [":package-srcs"],
|
srcs = [
|
||||||
|
":package-srcs",
|
||||||
|
"//vendor/google.golang.org/grpc/resolver/dns:all-srcs",
|
||||||
|
"//vendor/google.golang.org/grpc/resolver/passthrough:all-srcs",
|
||||||
|
],
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
)
|
)
|
||||||
|
33
vendor/google.golang.org/grpc/resolver/dns/BUILD
generated
vendored
Normal file
33
vendor/google.golang.org/grpc/resolver/dns/BUILD
generated
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"dns_resolver.go",
|
||||||
|
"go17.go",
|
||||||
|
"go18.go",
|
||||||
|
],
|
||||||
|
importmap = "k8s.io/kubernetes/vendor/google.golang.org/grpc/resolver/dns",
|
||||||
|
importpath = "google.golang.org/grpc/resolver/dns",
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
deps = [
|
||||||
|
"//vendor/golang.org/x/net/context:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/grpclog:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/internal/grpcrand:go_default_library",
|
||||||
|
"//vendor/google.golang.org/grpc/resolver:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
381
vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go
generated
vendored
Normal file
381
vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go
generated
vendored
Normal file
@@ -0,0 +1,381 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2017 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 dns implements a dns resolver to be installed as the default resolver
|
||||||
|
// in grpc.
|
||||||
|
package dns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
"google.golang.org/grpc/grpclog"
|
||||||
|
"google.golang.org/grpc/internal/grpcrand"
|
||||||
|
"google.golang.org/grpc/resolver"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
resolver.Register(NewBuilder())
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
defaultPort = "443"
|
||||||
|
defaultFreq = time.Minute * 30
|
||||||
|
golang = "GO"
|
||||||
|
// In DNS, service config is encoded in a TXT record via the mechanism
|
||||||
|
// described in RFC-1464 using the attribute name grpc_config.
|
||||||
|
txtAttribute = "grpc_config="
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
errMissingAddr = errors.New("missing address")
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewBuilder creates a dnsBuilder which is used to factory DNS resolvers.
|
||||||
|
func NewBuilder() resolver.Builder {
|
||||||
|
return &dnsBuilder{freq: defaultFreq}
|
||||||
|
}
|
||||||
|
|
||||||
|
type dnsBuilder struct {
|
||||||
|
// frequency of polling the DNS server.
|
||||||
|
freq time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build creates and starts a DNS resolver that watches the name resolution of the target.
|
||||||
|
func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOption) (resolver.Resolver, error) {
|
||||||
|
if target.Authority != "" {
|
||||||
|
return nil, fmt.Errorf("Default DNS resolver does not support custom DNS server")
|
||||||
|
}
|
||||||
|
host, port, err := parseTarget(target.Endpoint)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// IP address.
|
||||||
|
if net.ParseIP(host) != nil {
|
||||||
|
host, _ = formatIP(host)
|
||||||
|
addr := []resolver.Address{{Addr: host + ":" + port}}
|
||||||
|
i := &ipResolver{
|
||||||
|
cc: cc,
|
||||||
|
ip: addr,
|
||||||
|
rn: make(chan struct{}, 1),
|
||||||
|
q: make(chan struct{}),
|
||||||
|
}
|
||||||
|
cc.NewAddress(addr)
|
||||||
|
go i.watcher()
|
||||||
|
return i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DNS address (non-IP).
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
d := &dnsResolver{
|
||||||
|
freq: b.freq,
|
||||||
|
host: host,
|
||||||
|
port: port,
|
||||||
|
ctx: ctx,
|
||||||
|
cancel: cancel,
|
||||||
|
cc: cc,
|
||||||
|
t: time.NewTimer(0),
|
||||||
|
rn: make(chan struct{}, 1),
|
||||||
|
disableServiceConfig: opts.DisableServiceConfig,
|
||||||
|
}
|
||||||
|
|
||||||
|
d.wg.Add(1)
|
||||||
|
go d.watcher()
|
||||||
|
return d, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scheme returns the naming scheme of this resolver builder, which is "dns".
|
||||||
|
func (b *dnsBuilder) Scheme() string {
|
||||||
|
return "dns"
|
||||||
|
}
|
||||||
|
|
||||||
|
// ipResolver watches for the name resolution update for an IP address.
|
||||||
|
type ipResolver struct {
|
||||||
|
cc resolver.ClientConn
|
||||||
|
ip []resolver.Address
|
||||||
|
// rn channel is used by ResolveNow() to force an immediate resolution of the target.
|
||||||
|
rn chan struct{}
|
||||||
|
q chan struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResolveNow resend the address it stores, no resolution is needed.
|
||||||
|
func (i *ipResolver) ResolveNow(opt resolver.ResolveNowOption) {
|
||||||
|
select {
|
||||||
|
case i.rn <- struct{}{}:
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close closes the ipResolver.
|
||||||
|
func (i *ipResolver) Close() {
|
||||||
|
close(i.q)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *ipResolver) watcher() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-i.rn:
|
||||||
|
i.cc.NewAddress(i.ip)
|
||||||
|
case <-i.q:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// dnsResolver watches for the name resolution update for a non-IP target.
|
||||||
|
type dnsResolver struct {
|
||||||
|
freq time.Duration
|
||||||
|
host string
|
||||||
|
port string
|
||||||
|
ctx context.Context
|
||||||
|
cancel context.CancelFunc
|
||||||
|
cc resolver.ClientConn
|
||||||
|
// rn channel is used by ResolveNow() to force an immediate resolution of the target.
|
||||||
|
rn chan struct{}
|
||||||
|
t *time.Timer
|
||||||
|
// wg is used to enforce Close() to return after the watcher() goroutine has finished.
|
||||||
|
// Otherwise, data race will be possible. [Race Example] in dns_resolver_test we
|
||||||
|
// replace the real lookup functions with mocked ones to facilitate testing.
|
||||||
|
// If Close() doesn't wait for watcher() goroutine finishes, race detector sometimes
|
||||||
|
// will warns lookup (READ the lookup function pointers) inside watcher() goroutine
|
||||||
|
// has data race with replaceNetFunc (WRITE the lookup function pointers).
|
||||||
|
wg sync.WaitGroup
|
||||||
|
disableServiceConfig bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResolveNow invoke an immediate resolution of the target that this dnsResolver watches.
|
||||||
|
func (d *dnsResolver) ResolveNow(opt resolver.ResolveNowOption) {
|
||||||
|
select {
|
||||||
|
case d.rn <- struct{}{}:
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close closes the dnsResolver.
|
||||||
|
func (d *dnsResolver) Close() {
|
||||||
|
d.cancel()
|
||||||
|
d.wg.Wait()
|
||||||
|
d.t.Stop()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dnsResolver) watcher() {
|
||||||
|
defer d.wg.Done()
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-d.ctx.Done():
|
||||||
|
return
|
||||||
|
case <-d.t.C:
|
||||||
|
case <-d.rn:
|
||||||
|
}
|
||||||
|
result, sc := d.lookup()
|
||||||
|
// Next lookup should happen after an interval defined by d.freq.
|
||||||
|
d.t.Reset(d.freq)
|
||||||
|
d.cc.NewServiceConfig(sc)
|
||||||
|
d.cc.NewAddress(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dnsResolver) lookupSRV() []resolver.Address {
|
||||||
|
var newAddrs []resolver.Address
|
||||||
|
_, srvs, err := lookupSRV(d.ctx, "grpclb", "tcp", d.host)
|
||||||
|
if err != nil {
|
||||||
|
grpclog.Infof("grpc: failed dns SRV record lookup due to %v.\n", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
for _, s := range srvs {
|
||||||
|
lbAddrs, err := lookupHost(d.ctx, s.Target)
|
||||||
|
if err != nil {
|
||||||
|
grpclog.Infof("grpc: failed load balancer address dns lookup due to %v.\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, a := range lbAddrs {
|
||||||
|
a, ok := formatIP(a)
|
||||||
|
if !ok {
|
||||||
|
grpclog.Errorf("grpc: failed IP parsing due to %v.\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
addr := a + ":" + strconv.Itoa(int(s.Port))
|
||||||
|
newAddrs = append(newAddrs, resolver.Address{Addr: addr, Type: resolver.GRPCLB, ServerName: s.Target})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newAddrs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dnsResolver) lookupTXT() string {
|
||||||
|
ss, err := lookupTXT(d.ctx, d.host)
|
||||||
|
if err != nil {
|
||||||
|
grpclog.Infof("grpc: failed dns TXT record lookup due to %v.\n", err)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
var res string
|
||||||
|
for _, s := range ss {
|
||||||
|
res += s
|
||||||
|
}
|
||||||
|
|
||||||
|
// TXT record must have "grpc_config=" attribute in order to be used as service config.
|
||||||
|
if !strings.HasPrefix(res, txtAttribute) {
|
||||||
|
grpclog.Warningf("grpc: TXT record %v missing %v attribute", res, txtAttribute)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return strings.TrimPrefix(res, txtAttribute)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dnsResolver) lookupHost() []resolver.Address {
|
||||||
|
var newAddrs []resolver.Address
|
||||||
|
addrs, err := lookupHost(d.ctx, d.host)
|
||||||
|
if err != nil {
|
||||||
|
grpclog.Warningf("grpc: failed dns A record lookup due to %v.\n", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
for _, a := range addrs {
|
||||||
|
a, ok := formatIP(a)
|
||||||
|
if !ok {
|
||||||
|
grpclog.Errorf("grpc: failed IP parsing due to %v.\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
addr := a + ":" + d.port
|
||||||
|
newAddrs = append(newAddrs, resolver.Address{Addr: addr})
|
||||||
|
}
|
||||||
|
return newAddrs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dnsResolver) lookup() ([]resolver.Address, string) {
|
||||||
|
newAddrs := d.lookupSRV()
|
||||||
|
// Support fallback to non-balancer address.
|
||||||
|
newAddrs = append(newAddrs, d.lookupHost()...)
|
||||||
|
if d.disableServiceConfig {
|
||||||
|
return newAddrs, ""
|
||||||
|
}
|
||||||
|
sc := d.lookupTXT()
|
||||||
|
return newAddrs, canaryingSC(sc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// formatIP returns ok = false if addr is not a valid textual representation of an IP address.
|
||||||
|
// If addr is an IPv4 address, return the addr and ok = true.
|
||||||
|
// If addr is an IPv6 address, return the addr enclosed in square brackets and ok = true.
|
||||||
|
func formatIP(addr string) (addrIP string, ok bool) {
|
||||||
|
ip := net.ParseIP(addr)
|
||||||
|
if ip == nil {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
if ip.To4() != nil {
|
||||||
|
return addr, true
|
||||||
|
}
|
||||||
|
return "[" + addr + "]", true
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseTarget takes the user input target string, returns formatted host and port info.
|
||||||
|
// If target doesn't specify a port, set the port to be the defaultPort.
|
||||||
|
// If target is in IPv6 format and host-name is enclosed in sqarue brackets, brackets
|
||||||
|
// are strippd when setting the host.
|
||||||
|
// examples:
|
||||||
|
// target: "www.google.com" returns host: "www.google.com", port: "443"
|
||||||
|
// target: "ipv4-host:80" returns host: "ipv4-host", port: "80"
|
||||||
|
// target: "[ipv6-host]" returns host: "ipv6-host", port: "443"
|
||||||
|
// target: ":80" returns host: "localhost", port: "80"
|
||||||
|
// target: ":" returns host: "localhost", port: "443"
|
||||||
|
func parseTarget(target string) (host, port string, err error) {
|
||||||
|
if target == "" {
|
||||||
|
return "", "", errMissingAddr
|
||||||
|
}
|
||||||
|
if ip := net.ParseIP(target); ip != nil {
|
||||||
|
// target is an IPv4 or IPv6(without brackets) address
|
||||||
|
return target, defaultPort, nil
|
||||||
|
}
|
||||||
|
if host, port, err = net.SplitHostPort(target); err == nil {
|
||||||
|
// target has port, i.e ipv4-host:port, [ipv6-host]:port, host-name:port
|
||||||
|
if host == "" {
|
||||||
|
// Keep consistent with net.Dial(): If the host is empty, as in ":80", the local system is assumed.
|
||||||
|
host = "localhost"
|
||||||
|
}
|
||||||
|
if port == "" {
|
||||||
|
// If the port field is empty(target ends with colon), e.g. "[::1]:", defaultPort is used.
|
||||||
|
port = defaultPort
|
||||||
|
}
|
||||||
|
return host, port, nil
|
||||||
|
}
|
||||||
|
if host, port, err = net.SplitHostPort(target + ":" + defaultPort); err == nil {
|
||||||
|
// target doesn't have port
|
||||||
|
return host, port, nil
|
||||||
|
}
|
||||||
|
return "", "", fmt.Errorf("invalid target address %v, error info: %v", target, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type rawChoice struct {
|
||||||
|
ClientLanguage *[]string `json:"clientLanguage,omitempty"`
|
||||||
|
Percentage *int `json:"percentage,omitempty"`
|
||||||
|
ClientHostName *[]string `json:"clientHostName,omitempty"`
|
||||||
|
ServiceConfig *json.RawMessage `json:"serviceConfig,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func containsString(a *[]string, b string) bool {
|
||||||
|
if a == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
for _, c := range *a {
|
||||||
|
if c == b {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func chosenByPercentage(a *int) bool {
|
||||||
|
if a == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return grpcrand.Intn(100)+1 <= *a
|
||||||
|
}
|
||||||
|
|
||||||
|
func canaryingSC(js string) string {
|
||||||
|
if js == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
var rcs []rawChoice
|
||||||
|
err := json.Unmarshal([]byte(js), &rcs)
|
||||||
|
if err != nil {
|
||||||
|
grpclog.Warningf("grpc: failed to parse service config json string due to %v.\n", err)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
cliHostname, err := os.Hostname()
|
||||||
|
if err != nil {
|
||||||
|
grpclog.Warningf("grpc: failed to get client hostname due to %v.\n", err)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
var sc string
|
||||||
|
for _, c := range rcs {
|
||||||
|
if !containsString(c.ClientLanguage, golang) ||
|
||||||
|
!chosenByPercentage(c.Percentage) ||
|
||||||
|
!containsString(c.ClientHostName, cliHostname) ||
|
||||||
|
c.ServiceConfig == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
sc = string(*c.ServiceConfig)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return sc
|
||||||
|
}
|
35
vendor/google.golang.org/grpc/resolver/dns/go17.go
generated
vendored
Normal file
35
vendor/google.golang.org/grpc/resolver/dns/go17.go
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
// +build go1.6, !go1.8
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2017 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 dns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
lookupHost = func(ctx context.Context, host string) ([]string, error) { return net.LookupHost(host) }
|
||||||
|
lookupSRV = func(ctx context.Context, service, proto, name string) (string, []*net.SRV, error) {
|
||||||
|
return net.LookupSRV(service, proto, name)
|
||||||
|
}
|
||||||
|
lookupTXT = func(ctx context.Context, name string) ([]string, error) { return net.LookupTXT(name) }
|
||||||
|
)
|
29
vendor/google.golang.org/grpc/resolver/dns/go18.go
generated
vendored
Normal file
29
vendor/google.golang.org/grpc/resolver/dns/go18.go
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
// +build go1.8
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2017 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 dns
|
||||||
|
|
||||||
|
import "net"
|
||||||
|
|
||||||
|
var (
|
||||||
|
lookupHost = net.DefaultResolver.LookupHost
|
||||||
|
lookupSRV = net.DefaultResolver.LookupSRV
|
||||||
|
lookupTXT = net.DefaultResolver.LookupTXT
|
||||||
|
)
|
24
vendor/google.golang.org/grpc/resolver/passthrough/BUILD
generated
vendored
Normal file
24
vendor/google.golang.org/grpc/resolver/passthrough/BUILD
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["passthrough.go"],
|
||||||
|
importmap = "k8s.io/kubernetes/vendor/google.golang.org/grpc/resolver/passthrough",
|
||||||
|
importpath = "google.golang.org/grpc/resolver/passthrough",
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
deps = ["//vendor/google.golang.org/grpc/resolver:go_default_library"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
57
vendor/google.golang.org/grpc/resolver/passthrough/passthrough.go
generated
vendored
Normal file
57
vendor/google.golang.org/grpc/resolver/passthrough/passthrough.go
generated
vendored
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2017 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 passthrough implements a pass-through resolver. It sends the target
|
||||||
|
// name without scheme back to gRPC as resolved address.
|
||||||
|
package passthrough
|
||||||
|
|
||||||
|
import "google.golang.org/grpc/resolver"
|
||||||
|
|
||||||
|
const scheme = "passthrough"
|
||||||
|
|
||||||
|
type passthroughBuilder struct{}
|
||||||
|
|
||||||
|
func (*passthroughBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOption) (resolver.Resolver, error) {
|
||||||
|
r := &passthroughResolver{
|
||||||
|
target: target,
|
||||||
|
cc: cc,
|
||||||
|
}
|
||||||
|
r.start()
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*passthroughBuilder) Scheme() string {
|
||||||
|
return scheme
|
||||||
|
}
|
||||||
|
|
||||||
|
type passthroughResolver struct {
|
||||||
|
target resolver.Target
|
||||||
|
cc resolver.ClientConn
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *passthroughResolver) start() {
|
||||||
|
r.cc.NewAddress([]resolver.Address{{Addr: r.target.Endpoint}})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*passthroughResolver) ResolveNow(o resolver.ResolveNowOption) {}
|
||||||
|
|
||||||
|
func (*passthroughResolver) Close() {}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
resolver.Register(&passthroughBuilder{})
|
||||||
|
}
|
47
vendor/google.golang.org/grpc/resolver/resolver.go
generated
vendored
47
vendor/google.golang.org/grpc/resolver/resolver.go
generated
vendored
@@ -24,42 +24,42 @@ var (
|
|||||||
// m is a map from scheme to resolver builder.
|
// m is a map from scheme to resolver builder.
|
||||||
m = make(map[string]Builder)
|
m = make(map[string]Builder)
|
||||||
// defaultScheme is the default scheme to use.
|
// defaultScheme is the default scheme to use.
|
||||||
defaultScheme string
|
defaultScheme = "passthrough"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO(bar) install dns resolver in init(){}.
|
// TODO(bar) install dns resolver in init(){}.
|
||||||
|
|
||||||
// Register registers the resolver builder to the resolver map.
|
// Register registers the resolver builder to the resolver map. b.Scheme will be
|
||||||
// b.Scheme will be used as the scheme registered with this builder.
|
// used as the scheme registered with this builder.
|
||||||
|
//
|
||||||
|
// NOTE: this function must only be called during initialization time (i.e. in
|
||||||
|
// an init() function), and is not thread-safe. If multiple Resolvers are
|
||||||
|
// registered with the same name, the one registered last will take effect.
|
||||||
func Register(b Builder) {
|
func Register(b Builder) {
|
||||||
m[b.Scheme()] = b
|
m[b.Scheme()] = b
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get returns the resolver builder registered with the given scheme.
|
// Get returns the resolver builder registered with the given scheme.
|
||||||
// If no builder is register with the scheme, the default scheme will
|
//
|
||||||
// be used.
|
// If no builder is register with the scheme, nil will be returned.
|
||||||
// If the default scheme is not modified, "dns" will be the default
|
|
||||||
// scheme, and the preinstalled dns resolver will be used.
|
|
||||||
// If the default scheme is modified, and a resolver is registered with
|
|
||||||
// the scheme, that resolver will be returned.
|
|
||||||
// If the default scheme is modified, and no resolver is registered with
|
|
||||||
// the scheme, nil will be returned.
|
|
||||||
func Get(scheme string) Builder {
|
func Get(scheme string) Builder {
|
||||||
if b, ok := m[scheme]; ok {
|
if b, ok := m[scheme]; ok {
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
if b, ok := m[defaultScheme]; ok {
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetDefaultScheme sets the default scheme that will be used.
|
// SetDefaultScheme sets the default scheme that will be used.
|
||||||
// The default default scheme is "dns".
|
// The default default scheme is "passthrough".
|
||||||
func SetDefaultScheme(scheme string) {
|
func SetDefaultScheme(scheme string) {
|
||||||
defaultScheme = scheme
|
defaultScheme = scheme
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultScheme gets the default scheme that will be used.
|
||||||
|
func GetDefaultScheme() string {
|
||||||
|
return defaultScheme
|
||||||
|
}
|
||||||
|
|
||||||
// AddressType indicates the address type returned by name resolution.
|
// AddressType indicates the address type returned by name resolution.
|
||||||
type AddressType uint8
|
type AddressType uint8
|
||||||
|
|
||||||
@@ -78,7 +78,9 @@ type Address struct {
|
|||||||
// Type is the type of this address.
|
// Type is the type of this address.
|
||||||
Type AddressType
|
Type AddressType
|
||||||
// ServerName is the name of this address.
|
// ServerName is the name of this address.
|
||||||
// It's the name of the grpc load balancer, which will be used for authentication.
|
//
|
||||||
|
// e.g. if Type is GRPCLB, ServerName should be the name of the remote load
|
||||||
|
// balancer, not the name of the backend.
|
||||||
ServerName string
|
ServerName string
|
||||||
// Metadata is the information associated with Addr, which may be used
|
// Metadata is the information associated with Addr, which may be used
|
||||||
// to make load balancing decision.
|
// to make load balancing decision.
|
||||||
@@ -88,10 +90,17 @@ type Address struct {
|
|||||||
// BuildOption includes additional information for the builder to create
|
// BuildOption includes additional information for the builder to create
|
||||||
// the resolver.
|
// the resolver.
|
||||||
type BuildOption struct {
|
type BuildOption struct {
|
||||||
|
// DisableServiceConfig indicates whether resolver should fetch service config data.
|
||||||
|
DisableServiceConfig bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClientConn contains the callbacks for resolver to notify any updates
|
// ClientConn contains the callbacks for resolver to notify any updates
|
||||||
// to the gRPC ClientConn.
|
// to the gRPC ClientConn.
|
||||||
|
//
|
||||||
|
// This interface is to be implemented by gRPC. Users should not need a
|
||||||
|
// brand new implementation of this interface. For the situations like
|
||||||
|
// testing, the new implementation should embed this interface. This allows
|
||||||
|
// gRPC to add new methods to this interface.
|
||||||
type ClientConn interface {
|
type ClientConn interface {
|
||||||
// NewAddress is called by resolver to notify ClientConn a new list
|
// NewAddress is called by resolver to notify ClientConn a new list
|
||||||
// of resolved addresses.
|
// of resolved addresses.
|
||||||
@@ -128,8 +137,10 @@ type ResolveNowOption struct{}
|
|||||||
// Resolver watches for the updates on the specified target.
|
// Resolver watches for the updates on the specified target.
|
||||||
// Updates include address updates and service config updates.
|
// Updates include address updates and service config updates.
|
||||||
type Resolver interface {
|
type Resolver interface {
|
||||||
// ResolveNow will be called by gRPC to try to resolve the target name again.
|
// ResolveNow will be called by gRPC to try to resolve the target name
|
||||||
// It's just a hint, resolver can ignore this if it's not necessary.
|
// again. It's just a hint, resolver can ignore this if it's not necessary.
|
||||||
|
//
|
||||||
|
// It could be called multiple times concurrently.
|
||||||
ResolveNow(ResolveNowOption)
|
ResolveNow(ResolveNowOption)
|
||||||
// Close closes the resolver.
|
// Close closes the resolver.
|
||||||
Close()
|
Close()
|
||||||
|
73
vendor/google.golang.org/grpc/resolver_conn_wrapper.go
generated
vendored
73
vendor/google.golang.org/grpc/resolver_conn_wrapper.go
generated
vendored
@@ -19,6 +19,7 @@
|
|||||||
package grpc
|
package grpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"google.golang.org/grpc/grpclog"
|
"google.golang.org/grpc/grpclog"
|
||||||
@@ -36,39 +37,43 @@ type ccResolverWrapper struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// split2 returns the values from strings.SplitN(s, sep, 2).
|
// split2 returns the values from strings.SplitN(s, sep, 2).
|
||||||
// If sep is not found, it returns "", s instead.
|
// If sep is not found, it returns ("", s, false) instead.
|
||||||
func split2(s, sep string) (string, string) {
|
func split2(s, sep string) (string, string, bool) {
|
||||||
spl := strings.SplitN(s, sep, 2)
|
spl := strings.SplitN(s, sep, 2)
|
||||||
if len(spl) < 2 {
|
if len(spl) < 2 {
|
||||||
return "", s
|
return "", "", false
|
||||||
}
|
}
|
||||||
return spl[0], spl[1]
|
return spl[0], spl[1], true
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseTarget splits target into a struct containing scheme, authority and
|
// parseTarget splits target into a struct containing scheme, authority and
|
||||||
// endpoint.
|
// endpoint.
|
||||||
|
//
|
||||||
|
// If target is not a valid scheme://authority/endpoint, it returns {Endpoint:
|
||||||
|
// target}.
|
||||||
func parseTarget(target string) (ret resolver.Target) {
|
func parseTarget(target string) (ret resolver.Target) {
|
||||||
ret.Scheme, ret.Endpoint = split2(target, "://")
|
var ok bool
|
||||||
ret.Authority, ret.Endpoint = split2(ret.Endpoint, "/")
|
ret.Scheme, ret.Endpoint, ok = split2(target, "://")
|
||||||
|
if !ok {
|
||||||
|
return resolver.Target{Endpoint: target}
|
||||||
|
}
|
||||||
|
ret.Authority, ret.Endpoint, ok = split2(ret.Endpoint, "/")
|
||||||
|
if !ok {
|
||||||
|
return resolver.Target{Endpoint: target}
|
||||||
|
}
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
// newCCResolverWrapper parses cc.target for scheme and gets the resolver
|
// newCCResolverWrapper parses cc.target for scheme and gets the resolver
|
||||||
// builder for this scheme. It then builds the resolver and starts the
|
// builder for this scheme and builds the resolver. The monitoring goroutine
|
||||||
// monitoring goroutine for it.
|
// for it is not started yet and can be created by calling start().
|
||||||
//
|
//
|
||||||
// This function could return nil, nil, in tests for old behaviors.
|
// If withResolverBuilder dial option is set, the specified resolver will be
|
||||||
// TODO(bar) never return nil, nil when DNS becomes the default resolver.
|
// used instead.
|
||||||
func newCCResolverWrapper(cc *ClientConn) (*ccResolverWrapper, error) {
|
func newCCResolverWrapper(cc *ClientConn) (*ccResolverWrapper, error) {
|
||||||
target := parseTarget(cc.target)
|
rb := cc.dopts.resolverBuilder
|
||||||
grpclog.Infof("dialing to target with scheme: %q", target.Scheme)
|
|
||||||
|
|
||||||
rb := resolver.Get(target.Scheme)
|
|
||||||
if rb == nil {
|
if rb == nil {
|
||||||
// TODO(bar) return error when DNS becomes the default (implemented and
|
return nil, fmt.Errorf("could not get resolver for scheme: %q", cc.parsedTarget.Scheme)
|
||||||
// registered by DNS package).
|
|
||||||
grpclog.Infof("could not get resolver for scheme: %q", target.Scheme)
|
|
||||||
return nil, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ccr := &ccResolverWrapper{
|
ccr := &ccResolverWrapper{
|
||||||
@@ -79,15 +84,18 @@ func newCCResolverWrapper(cc *ClientConn) (*ccResolverWrapper, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
ccr.resolver, err = rb.Build(target, ccr, resolver.BuildOption{})
|
ccr.resolver, err = rb.Build(cc.parsedTarget, ccr, resolver.BuildOption{DisableServiceConfig: cc.dopts.disableServiceConfig})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
go ccr.watcher()
|
|
||||||
return ccr, nil
|
return ccr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// watcher processes address updates and service config updates sequencially.
|
func (ccr *ccResolverWrapper) start() {
|
||||||
|
go ccr.watcher()
|
||||||
|
}
|
||||||
|
|
||||||
|
// watcher processes address updates and service config updates sequentially.
|
||||||
// Otherwise, we need to resolve possible races between address and service
|
// Otherwise, we need to resolve possible races between address and service
|
||||||
// config (e.g. they specify different balancer types).
|
// config (e.g. they specify different balancer types).
|
||||||
func (ccr *ccResolverWrapper) watcher() {
|
func (ccr *ccResolverWrapper) watcher() {
|
||||||
@@ -100,20 +108,31 @@ func (ccr *ccResolverWrapper) watcher() {
|
|||||||
|
|
||||||
select {
|
select {
|
||||||
case addrs := <-ccr.addrCh:
|
case addrs := <-ccr.addrCh:
|
||||||
grpclog.Infof("ccResolverWrapper: sending new addresses to balancer wrapper: %v", addrs)
|
select {
|
||||||
// TODO(bar switching) this should never be nil. Pickfirst should be default.
|
case <-ccr.done:
|
||||||
if ccr.cc.balancerWrapper != nil {
|
return
|
||||||
// TODO(bar switching) create balancer if it's nil?
|
default:
|
||||||
ccr.cc.balancerWrapper.handleResolvedAddrs(addrs, nil)
|
|
||||||
}
|
}
|
||||||
|
grpclog.Infof("ccResolverWrapper: sending new addresses to cc: %v", addrs)
|
||||||
|
ccr.cc.handleResolvedAddrs(addrs, nil)
|
||||||
case sc := <-ccr.scCh:
|
case sc := <-ccr.scCh:
|
||||||
|
select {
|
||||||
|
case <-ccr.done:
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
}
|
||||||
grpclog.Infof("ccResolverWrapper: got new service config: %v", sc)
|
grpclog.Infof("ccResolverWrapper: got new service config: %v", sc)
|
||||||
|
ccr.cc.handleServiceConfig(sc)
|
||||||
case <-ccr.done:
|
case <-ccr.done:
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ccr *ccResolverWrapper) resolveNow(o resolver.ResolveNowOption) {
|
||||||
|
ccr.resolver.ResolveNow(o)
|
||||||
|
}
|
||||||
|
|
||||||
func (ccr *ccResolverWrapper) close() {
|
func (ccr *ccResolverWrapper) close() {
|
||||||
ccr.resolver.Close()
|
ccr.resolver.Close()
|
||||||
close(ccr.done)
|
close(ccr.done)
|
||||||
@@ -129,7 +148,7 @@ func (ccr *ccResolverWrapper) NewAddress(addrs []resolver.Address) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewServiceConfig is called by the resolver implemenetion to send service
|
// NewServiceConfig is called by the resolver implemenetion to send service
|
||||||
// configs to gPRC.
|
// configs to gRPC.
|
||||||
func (ccr *ccResolverWrapper) NewServiceConfig(sc string) {
|
func (ccr *ccResolverWrapper) NewServiceConfig(sc string) {
|
||||||
select {
|
select {
|
||||||
case <-ccr.scCh:
|
case <-ccr.scCh:
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user