Merge pull request #23019 from alex-mohr/oplimit

Auto commit by PR queue bot
This commit is contained in:
k8s-merge-robot 2016-03-19 02:26:56 -07:00
commit 0fe049f9ff

View File

@ -34,6 +34,7 @@ import (
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/cloudprovider"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
"k8s.io/kubernetes/pkg/util"
utilerrors "k8s.io/kubernetes/pkg/util/errors" utilerrors "k8s.io/kubernetes/pkg/util/errors"
netsets "k8s.io/kubernetes/pkg/util/net/sets" netsets "k8s.io/kubernetes/pkg/util/net/sets"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
@ -80,6 +81,7 @@ type GCECloud struct {
managedZones []string // List of zones we are spanning (for Ubernetes-Lite, primarily when running on master) managedZones []string // List of zones we are spanning (for Ubernetes-Lite, primarily when running on master)
networkURL string networkURL string
useMetadataServer bool useMetadataServer bool
operationPollRateLimiter util.RateLimiter
} }
type Config struct { type Config struct {
@ -296,6 +298,8 @@ func CreateGCECloud(projectID, region, zone string, managedZones []string, netwo
glog.Infof("managing multiple zones: %v", managedZones) glog.Infof("managing multiple zones: %v", managedZones)
} }
operationPollRateLimiter := util.NewTokenBucketRateLimiter(10, 100) // 10 qps, 100 bucket size.
return &GCECloud{ return &GCECloud{
service: svc, service: svc,
containerService: containerSvc, containerService: containerSvc,
@ -305,6 +309,7 @@ func CreateGCECloud(projectID, region, zone string, managedZones []string, netwo
managedZones: managedZones, managedZones: managedZones,
networkURL: networkURL, networkURL: networkURL,
useMetadataServer: useMetadataServer, useMetadataServer: useMetadataServer,
operationPollRateLimiter: operationPollRateLimiter,
}, nil }, nil
} }
@ -373,7 +378,7 @@ func (gce *GCECloud) targetPoolURL(name, region string) string {
return fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/regions/%s/targetPools/%s", gce.projectID, region, name) return fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/regions/%s/targetPools/%s", gce.projectID, region, name)
} }
func waitForOp(op *compute.Operation, getOperation func(operationName string) (*compute.Operation, error)) error { func (gce *GCECloud) waitForOp(op *compute.Operation, getOperation func(operationName string) (*compute.Operation, error)) error {
if op == nil { if op == nil {
return fmt.Errorf("operation must not be nil") return fmt.Errorf("operation must not be nil")
} }
@ -384,9 +389,15 @@ func waitForOp(op *compute.Operation, getOperation func(operationName string) (*
opName := op.Name opName := op.Name
return wait.Poll(operationPollInterval, operationPollTimeoutDuration, func() (bool, error) { return wait.Poll(operationPollInterval, operationPollTimeoutDuration, func() (bool, error) {
start := time.Now()
gce.operationPollRateLimiter.Accept()
duration := time.Now().Sub(start)
if duration > 5*time.Second {
glog.Infof("pollOperation: waited %v for %v", duration, opName)
}
pollOp, err := getOperation(opName) pollOp, err := getOperation(opName)
if err != nil { if err != nil {
glog.Warningf("GCE poll operation failed: %v", err) glog.Warningf("GCE poll operation %s failed: pollOp: [%v] err: [%v] getErrorFromOp: [%v]", opName, pollOp, err, getErrorFromOp(pollOp))
} }
return opIsDone(pollOp), getErrorFromOp(pollOp) return opIsDone(pollOp), getErrorFromOp(pollOp)
}) })
@ -410,19 +421,19 @@ func getErrorFromOp(op *compute.Operation) error {
} }
func (gce *GCECloud) waitForGlobalOp(op *compute.Operation) error { func (gce *GCECloud) waitForGlobalOp(op *compute.Operation) error {
return waitForOp(op, func(operationName string) (*compute.Operation, error) { return gce.waitForOp(op, func(operationName string) (*compute.Operation, error) {
return gce.service.GlobalOperations.Get(gce.projectID, operationName).Do() return gce.service.GlobalOperations.Get(gce.projectID, operationName).Do()
}) })
} }
func (gce *GCECloud) waitForRegionOp(op *compute.Operation, region string) error { func (gce *GCECloud) waitForRegionOp(op *compute.Operation, region string) error {
return waitForOp(op, func(operationName string) (*compute.Operation, error) { return gce.waitForOp(op, func(operationName string) (*compute.Operation, error) {
return gce.service.RegionOperations.Get(gce.projectID, region, operationName).Do() return gce.service.RegionOperations.Get(gce.projectID, region, operationName).Do()
}) })
} }
func (gce *GCECloud) waitForZoneOp(op *compute.Operation, zone string) error { func (gce *GCECloud) waitForZoneOp(op *compute.Operation, zone string) error {
return waitForOp(op, func(operationName string) (*compute.Operation, error) { return gce.waitForOp(op, func(operationName string) (*compute.Operation, error) {
return gce.service.ZoneOperations.Get(gce.projectID, zone, operationName).Do() return gce.service.ZoneOperations.Get(gce.projectID, zone, operationName).Do()
}) })
} }
@ -2366,7 +2377,7 @@ func (gce *GCECloud) getInstanceByName(name string) (*gceInstance, error) {
zone := gce.managedZones[0] zone := gce.managedZones[0]
res, err := gce.service.Instances.Get(gce.projectID, zone, name).Do() res, err := gce.service.Instances.Get(gce.projectID, zone, name).Do()
if err != nil { if err != nil {
glog.Errorf("Failed to retrieve TargetInstance resource for instance: %s", name) glog.Errorf("getInstanceByName/single-zone: failed to get instance %s; err: %v", name, err)
if isHTTPErrorCode(err, http.StatusNotFound) { if isHTTPErrorCode(err, http.StatusNotFound) {
return nil, cloudprovider.InstanceNotFound return nil, cloudprovider.InstanceNotFound
} }
@ -2383,6 +2394,7 @@ func (gce *GCECloud) getInstanceByName(name string) (*gceInstance, error) {
instances, err := gce.getInstancesByNames([]string{name}) instances, err := gce.getInstancesByNames([]string{name})
if err != nil { if err != nil {
glog.Errorf("getInstanceByName/multiple-zones: failed to get instance %s; err: %v", name, err)
return nil, err return nil, err
} }
if len(instances) != 1 || instances[0] == nil { if len(instances) != 1 || instances[0] == nil {